404 lines
12 KiB
TypeScript
Raw Normal View History

2023-05-04 07:27:26 +08:00
import * as vscode from 'vscode';
2023-05-10 18:30:17 +08:00
2023-05-05 21:27:40 +08:00
import {
registerOpenChatPanelCommand,
registerAddContextCommand,
registerAskForCodeCommand,
registerAskForFileCommand,
registerAccessKeySettingCommand,
regApplyDiffResultCommand,
registerStatusBarItemClickCommand,
regPythonPathCommand,
registerInstallCommandsCommand,
registerUpdateChatModelsCommand,
2023-12-12 16:39:08 +08:00
registerInstallCommandsPython,
2024-01-18 17:52:55 +08:00
registerDevChatChatCommand,
registerHandleUri,
2023-05-05 21:27:40 +08:00
} from './contributes/commands';
2023-05-31 16:10:53 +08:00
import { regLanguageContext } from './contributes/context';
import { regDevChatView } from './contributes/views';
2023-04-27 14:07:46 +08:00
2023-11-29 23:34:15 +08:00
import { ExtensionContextHolder } from './util/extensionContext';
2023-05-09 08:52:07 +08:00
import { logger } from './util/logger';
2023-05-31 16:10:53 +08:00
import { LoggerChannelVscode } from './util/logger_vscode';
2023-10-12 21:17:41 +08:00
import { createStatusBarItem } from './panel/statusBarView';
2023-05-31 16:10:53 +08:00
import { UiUtilWrapper } from './util/uiUtil';
import { UiUtilVscode } from './util/uiUtil_vscode';
2023-10-26 22:45:31 +08:00
import { ApiKeyManager } from './util/apiKey';
2023-11-29 23:34:15 +08:00
import { startRpcServer } from './ide_services/services';
2023-12-12 16:39:08 +08:00
import { registerCodeLensProvider } from './panel/codeLens';
import { stopDevChatBase } from './handler/sendMessageBase';
import exp from 'constants';
2023-05-19 20:07:34 +08:00
/**
* ABC isProviderHasSetted
* @returns
*/
2023-09-26 14:46:14 +08:00
async function isProviderHasSetted() {
2023-10-26 22:45:31 +08:00
try {
const providerProperty = "Provider.devchat";
const providerConfig: any = UiUtilWrapper.getConfiguration("devchat", providerProperty);
if (providerConfig && Object.keys(providerConfig).length > 0) {
2023-10-26 22:45:31 +08:00
return true;
}
2023-09-26 14:46:14 +08:00
2023-10-26 22:45:31 +08:00
const providerPropertyOpenAI = "Provider.openai";
const providerConfigOpenAI: any = UiUtilWrapper.getConfiguration("devchat", providerPropertyOpenAI);
if (providerConfigOpenAI && Object.keys(providerConfigOpenAI).length > 0) {
2023-10-26 22:45:31 +08:00
return true;
}
const apiOpenaiKey = await ApiKeyManager.getProviderApiKey("openai");
if (apiOpenaiKey) {
return true;
}
const devchatKey = await ApiKeyManager.getProviderApiKey("devchat");
if (devchatKey) {
return true;
}
2023-09-26 14:46:14 +08:00
2023-10-26 22:45:31 +08:00
return false;
} catch (error) {
return false;
}
2023-09-26 14:46:14 +08:00
}
2023-11-30 13:25:18 +08:00
async function configUpdateTo1115() {
const supportModels = [
2023-11-15 10:09:24 +08:00
"Model.gpt-3-5-1106",
"Model.gpt-4-turbo",
];
2023-11-30 13:25:18 +08:00
for (const model of supportModels) {
2023-11-15 10:09:24 +08:00
const modelConfig1: any = UiUtilWrapper.getConfiguration("devchat", model);
if (modelConfig1 && Object.keys(modelConfig1).length === 0) {
2023-11-15 10:09:24 +08:00
let modelConfigNew = {};
modelConfigNew = {"provider": "devchat"};
if (model.startsWith("Model.gpt-")) {
modelConfigNew = {"provider": "openai"};
}
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelConfigNew, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`update Model.ERNIE-Bot error: ${error}`);
}
2023-11-15 10:09:24 +08:00
}
}
}
2023-11-30 13:25:18 +08:00
async function configUpdateTo0924() {
2023-09-26 14:46:14 +08:00
if (await isProviderHasSetted()) {
return ;
}
2023-09-14 16:44:41 +08:00
const defaultModel: any = UiUtilWrapper.getConfiguration("devchat", "defaultModel");
let devchatKey = UiUtilWrapper.getConfiguration('DevChat', 'Access_Key_DevChat');
let openaiKey = UiUtilWrapper.getConfiguration('DevChat', 'Api_Key_OpenAI');
const endpointKey = UiUtilWrapper.getConfiguration('DevChat', 'API_ENDPOINT');
devchatKey = undefined;
openaiKey = undefined;
if (!devchatKey && !openaiKey) {
openaiKey = await UiUtilWrapper.secretStorageGet("openai_OPENAI_API_KEY");
devchatKey = await UiUtilWrapper.secretStorageGet("devchat_OPENAI_API_KEY");
2023-10-09 08:12:51 +08:00
await UiUtilWrapper.storeSecret("openai_OPENAI_API_KEY", "");
await UiUtilWrapper.storeSecret("devchat_OPENAI_API_KEY", "");
}
if (!devchatKey && !openaiKey) {
openaiKey = process.env.OPENAI_API_KEY;
}
let modelConfigNew = {};
2023-09-26 14:46:14 +08:00
let providerConfigNew = {};
if (openaiKey) {
2023-09-26 14:46:14 +08:00
providerConfigNew["access_key"] = openaiKey;
if (endpointKey) {
providerConfigNew["api_base"] = endpointKey;
}
2023-09-26 14:46:14 +08:00
await vscode.workspace.getConfiguration("devchat").update("Provider.openai", providerConfigNew, vscode.ConfigurationTarget.Global);
}
2023-09-26 14:46:14 +08:00
if (devchatKey) {
providerConfigNew["access_key"] = devchatKey;
if (endpointKey) {
providerConfigNew["api_base"] = endpointKey;
}
2023-09-26 14:46:14 +08:00
await vscode.workspace.getConfiguration("devchat").update("Provider.devchat", providerConfigNew, vscode.ConfigurationTarget.Global);
}
2023-11-30 13:25:18 +08:00
const supportModels = [
2023-09-26 14:46:14 +08:00
"Model.gpt-3-5",
2023-11-15 10:09:24 +08:00
"Model.gpt-3-5-1106",
2023-09-26 14:46:14 +08:00
"Model.gpt-3-5-16k",
"Model.gpt-4",
2023-11-14 17:29:54 +08:00
"Model.gpt-4-turbo",
2023-09-26 14:46:14 +08:00
"Model.claude-2",
"Model.xinghuo-2",
"Model.chatglm_pro",
"Model.ERNIE-Bot",
"Model.CodeLlama-34b-Instruct",
2023-10-09 08:42:55 +08:00
"Model.llama-2-70b-chat"
2023-09-26 14:46:14 +08:00
];
2023-11-30 13:25:18 +08:00
for (const model of supportModels) {
2023-09-26 14:46:14 +08:00
const modelConfig1: any = UiUtilWrapper.getConfiguration("devchat", model);
if (modelConfig1 && Object.keys(modelConfig1).length === 0) {
2023-09-26 14:46:14 +08:00
modelConfigNew = {"provider": "devchat"};
2023-10-26 22:45:31 +08:00
if (model.startsWith("Model.gpt-")) {
2023-09-26 14:46:14 +08:00
modelConfigNew = {"provider": "openai"};
}
2023-09-26 14:46:14 +08:00
await vscode.workspace.getConfiguration("devchat").update(model, modelConfigNew, vscode.ConfigurationTarget.Global);
}
}
2023-09-26 14:46:14 +08:00
if (!defaultModel) {
await vscode.workspace.getConfiguration("devchat").update("defaultModel", "claude-2.1", vscode.ConfigurationTarget.Global);
2023-09-26 14:46:14 +08:00
}
}
2023-09-15 13:28:17 +08:00
2023-11-30 13:25:18 +08:00
async function configUpdate0912To0924() {
2023-09-26 14:46:14 +08:00
if (await isProviderHasSetted()) {
return ;
}
2023-11-30 13:25:18 +08:00
const oldModels = [
2023-09-26 14:46:14 +08:00
"Model.gpt-3-5",
"Model.gpt-3-5-16k",
"Model.gpt-4",
"Model.claude-2"
];
2023-11-30 13:25:18 +08:00
for (const model of oldModels) {
2023-09-26 14:46:14 +08:00
const modelConfig: any = UiUtilWrapper.getConfiguration("devchat", model);
if (modelConfig && Object.keys(modelConfig).length !== 0) {
2023-09-26 14:46:14 +08:00
let modelProperties: any = {};
for (const key of Object.keys(modelConfig || {})) {
const property = modelConfig![key];
modelProperties[key] = property;
2023-09-15 13:28:17 +08:00
}
2023-09-26 14:46:14 +08:00
if (modelConfig["api_key"]) {
2023-11-30 13:25:18 +08:00
let providerConfigNew = {};
2023-09-26 14:46:14 +08:00
providerConfigNew["access_key"] = modelConfig["api_key"];
if (modelConfig["api_base"]) {
providerConfigNew["api_base"] = modelConfig["api_base"];
}
if (modelConfig["api_key"].startsWith("DC.")) {
modelProperties["provider"] = "devchat";
await vscode.workspace.getConfiguration("devchat").update("Provider.devchat", providerConfigNew, vscode.ConfigurationTarget.Global);
} else {
modelProperties["provider"] = "openai";
await vscode.workspace.getConfiguration("devchat").update("Provider.openai", providerConfigNew, vscode.ConfigurationTarget.Global);
}
delete modelProperties["api_key"];
delete modelProperties["api_base"];
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelProperties, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`error: ${error}`);
}
2023-09-26 14:46:14 +08:00
} else {
2023-10-26 22:45:31 +08:00
if (!modelProperties["provider"]) {
delete modelProperties["api_base"];
modelProperties["provider"] = "devchat";
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelProperties, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`error: ${error}`);
}
2023-10-26 22:45:31 +08:00
}
2023-09-26 14:46:14 +08:00
}
2023-09-15 13:28:17 +08:00
}
}
}
async function configUpdateto240205() {
// rename Model.CodeLlama-34b-Instruct to Model.CodeLlama-70b
// add new Model.Mixtral-8x7B
// add new Model.Minimax-abab6
const supportModels = [
"Model.CodeLlama-70b",
"Model.Mixtral-8x7B",
"Model.Minimax-abab6"
];
for (const model of supportModels) {
const modelConfig1: any = UiUtilWrapper.getConfiguration("devchat", model);
if (modelConfig1 && Object.keys(modelConfig1).length === 0) {
let modelConfigNew = {};
modelConfigNew = {"provider": "devchat"};
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelConfigNew, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`error: ${error}`);
}
}
}
}
2023-12-27 16:15:39 +08:00
async function setLangDefaultValue() {
const lang = vscode.env.language;
if (!UiUtilWrapper.getConfiguration("DevChat", "Language")) {
if (lang.startsWith("zh-")) {
UiUtilWrapper.updateConfiguration("DevChat", "Language", "zh");
} else {
UiUtilWrapper.updateConfiguration("DevChat", "Language", "en");
}
}
}
2023-05-04 11:50:45 +08:00
2023-12-28 11:41:31 +08:00
async function updateInvalidSettings() {
const oldModels = [
"Model.gpt-3-5",
"Model.gpt-3-5-16k",
"Model.gpt-4",
"Model.claude-2"
];
for (const model of oldModels) {
const modelConfig: any = UiUtilWrapper.getConfiguration("devchat", model);
if (modelConfig && Object.keys(modelConfig).length !== 0) {
2023-12-28 11:41:31 +08:00
let modelProperties: any = {};
for (const key of Object.keys(modelConfig || {})) {
const property = modelConfig![key];
modelProperties[key] = property;
}
if (modelConfig["api_key"]) {
delete modelProperties["api_key"];
delete modelProperties["api_base"];
modelProperties["provider"] = "devchat";
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelProperties, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`error: ${error}`);
}
2023-12-28 11:41:31 +08:00
}
}
}
}
async function updateInvalidDefaultModel() {
const defaultModel: any = UiUtilWrapper.getConfiguration("devchat", "defaultModel");
if (defaultModel === "gpt-3.5-turbo-1106" || defaultModel === "gpt-3.5-turbo-16k") {
try {
await vscode.workspace.getConfiguration("devchat").update("defaultModel", "gpt-3.5-turbo", vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`update Model.ERNIE-Bot error: ${error}`);
}
}
}
// "gpt-3.5-turbo-1106",
// "gpt-3.5-turbo-16k",
async function configSetModelDefaultParams() {
const modelParams = {
"Model.gpt-3-5": {
"max_input_tokens": 13000
},
"Model.gpt-4": {
"max_input_tokens": 6000
},
"Model.gpt-4-turbo": {
"max_input_tokens": 32000
},
"Model.claude-2": {
"max_input_tokens": 32000
},
"Model.xinghuo-2": {
"max_input_tokens": 6000
},
"Model.chatglm_pro": {
"max_input_tokens": 8000
},
"Model.ERNIE-Bot": {
"max_input_tokens": 8000
},
"Model.CodeLlama-70b": {
"max_input_tokens": 4000
},
"Model.Mixtral-8x7B": {
"max_input_tokens": 4000
},
"Model.Minimax-abab6": {
"max_input_tokens": 4000
},
"Model.llama-2-70b-chat": {
"max_input_tokens": 4000
}
};
// set default params
for (const model of Object.keys(modelParams)) {
const modelConfig: any = UiUtilWrapper.getConfiguration("devchat", model);
if (!modelConfig["max_input_tokens"]) {
modelConfig["max_input_tokens"] = modelParams[model]["max_input_tokens"];
try {
await vscode.workspace.getConfiguration("devchat").update(model, modelConfig, vscode.ConfigurationTarget.Global);
} catch (error) {
logger.channel()?.error(`update Model.ERNIE-Bot error: ${error}`);
}
}
}
}
2023-09-26 14:46:14 +08:00
async function activate(context: vscode.ExtensionContext) {
ExtensionContextHolder.context = context;
2023-05-31 16:10:53 +08:00
logger.init(LoggerChannelVscode.getInstance());
UiUtilWrapper.init(new UiUtilVscode());
2023-11-30 13:25:18 +08:00
await configUpdateTo0924();
await configUpdate0912To0924();
await configUpdateTo1115();
2023-12-27 16:15:39 +08:00
await setLangDefaultValue();
2023-12-28 11:41:31 +08:00
await updateInvalidSettings();
await updateInvalidDefaultModel();
await configUpdateto240205();
await configSetModelDefaultParams();
regLanguageContext();
regDevChatView(context);
registerAccessKeySettingCommand(context);
registerOpenChatPanelCommand(context);
registerAddContextCommand(context);
registerAskForCodeCommand(context);
registerAskForFileCommand(context);
registerStatusBarItemClickCommand(context);
2023-05-16 14:24:24 +08:00
registerInstallCommandsCommand(context);
registerUpdateChatModelsCommand(context);
2023-11-23 13:02:02 +08:00
registerInstallCommandsPython(context);
createStatusBarItem(context);
2023-05-18 15:25:46 +08:00
regApplyDiffResultCommand(context);
regPythonPathCommand(context);
2023-12-12 16:39:08 +08:00
registerDevChatChatCommand(context);
registerCodeLensProvider(context);
2023-11-29 23:34:15 +08:00
startRpcServer();
2024-01-18 17:52:55 +08:00
logger.channel()?.info(`registerHandleUri:`);
registerHandleUri(context)
2023-04-14 08:05:41 +08:00
}
async function deactivate() {
// stop devchat
await stopDevChatBase({});
}
exports.activate = activate;
exports.deactivate = deactivate;