Skip to content

Commit 480f7d0

Browse files
♻️ refactor(config): 重构配置系统和 AI 提供商配置结构
- 【配置重构】更新配置键名,统一使用 PROVIDERS_ 前缀 - 【类型系统】新增 AIRequestParams 接口的 additionalContext 和 useEmoji 字段 - 【提供商】重构各 AI 提供商配置获取方式,统一使用新的配置结构 - 【架构优化】简化 VSCodeProvider 中的系统提示获取逻辑 - 【命令】重构命令类中的配置获取和更新逻辑,适配新的配置结构
1 parent 36ba4d7 commit 480f7d0

9 files changed

+47
-63
lines changed

src/ai/providers/DashScopeProvider.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ export class DashScopeProvider extends BaseOpenAIProvider {
122122
constructor() {
123123
const configManager = ConfigurationManager.getInstance();
124124
super({
125-
apiKey: configManager.getConfig<string>("DASHSCOPE_API_KEY", false),
125+
apiKey: configManager.getConfig<string>(
126+
"PROVIDERS_DASHSCOPE_APIKEY",
127+
false
128+
),
126129
baseURL: "https://api.dashscope.com/v1/services/chat/completions",
127130
providerId: "dashscope",
128131
providerName: "DashScope",

src/ai/providers/DoubaoProvider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export class DoubaoProvider extends BaseOpenAIProvider {
123123
constructor() {
124124
const configManager = ConfigurationManager.getInstance();
125125
super({
126-
apiKey: configManager.getConfig<string>("DOUBAO_API_KEY", false),
126+
apiKey: configManager.getConfig<string>("PROVIDERS_DOUBAO_APIKEY", false),
127127
baseURL: "https://ark.cn-beijing.volces.com/api/v3/chat/completions",
128128
providerId: "doubao",
129129
providerName: "豆包 AI",

src/ai/providers/OllamaProvider.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import {
88
} from "../types";
99
import { ConfigurationManager } from "../../config/ConfigurationManager";
1010
import { NotificationHandler } from "../../utils/NotificationHandler";
11-
import { generateCommitMessageSystemPrompt } from "../../prompt/prompt";
12-
import { DEFAULT_CONFIG } from "../../config/default";
1311
import { LocalizationManager } from "../../utils/LocalizationManager";
1412
import { generateWithRetry, getSystemPrompt } from "../utils/generateHelper";
1513

@@ -30,7 +28,7 @@ export class OllamaProvider implements AIProvider {
3028
private getBaseUrl(): string {
3129
const configManager = ConfigurationManager.getInstance();
3230
return (
33-
configManager.getConfig<string>("OLLAMA_BASE_URL") ||
31+
configManager.getConfig<string>("PROVIDERS_OLLAMA_BASEURL") ||
3432
"http://localhost:11434"
3533
);
3634
}

src/ai/providers/OpenAIProvider.ts

+4-14
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
import OpenAI from "openai";
2-
import { ChatCompletionMessageParam } from "openai/resources";
31
import { ConfigurationManager } from "../../config/ConfigurationManager";
4-
import {
5-
AIProvider,
6-
AIRequestParams,
7-
AIResponse,
8-
type AIModel,
9-
} from "../types";
2+
import { type AIModel } from "../types";
103
import { NotificationHandler } from "../../utils/NotificationHandler";
11-
import { generateCommitMessageSystemPrompt } from "../../prompt/prompt";
12-
import { DEFAULT_CONFIG } from "../../config/default";
134
import { LocalizationManager } from "../../utils/LocalizationManager";
14-
import { generateWithRetry, getSystemPrompt } from "../utils/generateHelper";
155
import { BaseOpenAIProvider } from "./BaseOpenAIProvider";
166

177
const provider = { id: "openai", name: "OpenAI" } as const;
@@ -71,9 +61,9 @@ export class OpenAIProvider extends BaseOpenAIProvider {
7161
constructor() {
7262
const configManager = ConfigurationManager.getInstance();
7363
super({
74-
apiKey: configManager.getConfig<string>("OPENAI_API_KEY", false),
75-
baseURL: configManager.getConfig<string>("OPENAI_BASE_URL", false),
76-
apiVersion: configManager.getConfig<string>("MODEL", false),
64+
apiKey: configManager.getConfig<string>("PROVIDERS_OPENAI_APIKEY", false),
65+
baseURL: configManager.getConfig<string>("PROVIDERS_OPENAI_BASEURL", false),
66+
apiVersion: configManager.getConfig<string>("BASE_MODEL", false),
7767
providerId: "openai",
7868
providerName: "OpenAI",
7969
models: models,

src/ai/providers/VscodeProvider.ts

+2-10
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
type AIResponse,
88
} from "../types";
99
import { generateCommitMessageSystemPrompt } from "../../prompt/prompt";
10-
import { DEFAULT_CONFIG } from "../../config/default";
1110
import { LocalizationManager } from "../../utils/LocalizationManager";
11+
import { getSystemPrompt } from "../utils/generateHelper";
1212

1313
interface DiffBlock {
1414
header: string;
@@ -48,15 +48,7 @@ export class VSCodeProvider implements AIProvider {
4848

4949
while (true) {
5050
const messages = [
51-
vscode.LanguageModelChatMessage.User(
52-
params.systemPrompt ||
53-
generateCommitMessageSystemPrompt(
54-
params.language || DEFAULT_CONFIG.language,
55-
params.allowMergeCommits || false,
56-
params.splitChangesInSingleFile || false,
57-
params.scm || "git"
58-
)
59-
),
51+
vscode.LanguageModelChatMessage.User(getSystemPrompt(params)),
6052
vscode.LanguageModelChatMessage.User(
6153
params.diff.substring(0, maxCodeCharacters)
6254
),

src/ai/providers/ZhipuAIProvider.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ export class ZhipuAIProvider extends BaseOpenAIProvider {
6464
constructor() {
6565
const configManager = ConfigurationManager.getInstance();
6666
super({
67-
apiKey: configManager.getConfig<string>("ZHIPUAI_API_KEY", false),
67+
apiKey: configManager.getConfig<string>(
68+
"PROVIDERS_ZHIPUAI_APIKEY",
69+
false
70+
),
6871
baseURL: "https://open.bigmodel.cn/api/paas/v4/",
6972
providerId: "zhipu",
7073
providerName: "zhipu",

src/ai/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export interface AIRequestParams {
2626
scm?: "git" | "svn"; // 新增SCM类型
2727
allowMergeCommits?: boolean;
2828
splitChangesInSingleFile?: boolean;
29+
additionalContext: string;
30+
useEmoji: boolean;
2931
}
3032

3133
// 添加通用错误处理接口

src/commands/GenerateCommitCommand.ts

+20-26
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { NotificationHandler } from "../utils/NotificationHandler";
55
import { ProgressHandler } from "../utils/ProgressHandler";
66
import { AIProviderFactory } from "../ai/AIProviderFactory";
77
import { SCMFactory } from "../scm/SCMProvider";
8-
import { getProviderModelConfig } from "../config/types";
8+
import { getProviderModelConfig, type ConfigKey } from "../config/types";
99
import { DISPLAY_NAME } from "../constants";
1010
import { getMaxCharacters } from "../ai/types";
1111
import { LocalizationManager } from "../utils/LocalizationManager";
@@ -35,16 +35,17 @@ export class GenerateCommitCommand extends BaseCommand {
3535
}
3636

3737
const config = ConfigurationManager.getInstance();
38-
await config.updateConfig("OPENAI_BASE_URL", baseURL);
39-
await config.updateConfig("OPENAI_API_KEY", apiKey);
38+
await config.updateConfig("PROVIDERS_OPENAI_BASEURL" as ConfigKey, baseURL);
39+
await config.updateConfig("PROVIDERS_OPENAI_APIKEY" as ConfigKey, apiKey);
4040
return true;
4141
}
4242

4343
private async ensureConfiguration(): Promise<boolean> {
4444
const locManager = LocalizationManager.getInstance();
4545
const config = ConfigurationManager.getInstance();
46-
const baseURL = config.getConfig<string>("OPENAI_BASE_URL", false);
47-
const apiKey = config.getConfig<string>("OPENAI_API_KEY", false);
46+
const configuration = config.getConfiguration();
47+
const baseURL = configuration.providers.openai.baseUrl;
48+
const apiKey = configuration.providers.openai.apiKey;
4849

4950
if (!baseURL || !apiKey) {
5051
const result = await vscode.window.showInformationMessage(
@@ -145,7 +146,8 @@ export class GenerateCommitCommand extends BaseCommand {
145146

146147
const config = ConfigurationManager.getInstance();
147148
const configuration = config.getConfiguration();
148-
let { provider, model } = configuration;
149+
let provider = configuration.base.provider;
150+
let model = configuration.base.model;
149151

150152
if (!provider || !model) {
151153
const result = await this.selectAndUpdateModelConfiguration(
@@ -169,7 +171,6 @@ export class GenerateCommitCommand extends BaseCommand {
169171

170172
const locManager = LocalizationManager.getInstance();
171173
try {
172-
// 检测当前 SCM 类型
173174
const scmProvider = await SCMFactory.detectSCM();
174175
if (!scmProvider) {
175176
await NotificationHandler.error(
@@ -178,12 +179,15 @@ export class GenerateCommitCommand extends BaseCommand {
178179
return;
179180
}
180181

182+
// 获取当前提交消息输入框的内容
183+
const currentInput = await scmProvider.getCommitInput();
184+
181185
const config = ConfigurationManager.getInstance();
182186
const configuration = config.getConfiguration();
183187

184188
// 检查是否已配置 AI 提供商和模型
185-
let provider = configuration.provider;
186-
let model = configuration.model;
189+
let provider = configuration.base.provider;
190+
let model = configuration.base.model;
187191

188192
// 如果没有配置提供商或模型,提示用户选择
189193
if (!provider || !model) {
@@ -201,9 +205,7 @@ export class GenerateCommitCommand extends BaseCommand {
201205
),
202206
async (progress) => {
203207
const selectedFiles = this.getSelectedFiles(resources);
204-
// progress.report({
205-
// message: locManager.getMessage("progress.analyzing.changes"),
206-
// });
208+
207209
const diffContent = await scmProvider.getDiff(selectedFiles);
208210
if (!diffContent) {
209211
await NotificationHandler.info(locManager.getMessage("no.changes"));
@@ -219,25 +221,17 @@ export class GenerateCommitCommand extends BaseCommand {
219221
selectedModel,
220222
} = await this.getModelAndUpdateConfiguration(provider, model);
221223

222-
// if (selectedModel) {
223-
// const maxChars = getMaxCharacters(selectedModel, 2600) - 1000;
224-
// if (diffContent.length > maxChars) {
225-
// throw new Error(
226-
// locManager.format("diff.too.long", diffContent.length, maxChars)
227-
// );
228-
// }
229-
// }
230-
231-
// progress.report({ message: "正在生成提交信息..." });
232-
233224
const result = await aiProvider.generateResponse({
234225
diff: diffContent,
235-
systemPrompt: configuration.systemPrompt,
226+
systemPrompt: configuration.base.systemPrompt,
236227
model: selectedModel,
237-
language: configuration.language,
228+
language: configuration.base.language,
238229
scm: scmProvider.type ?? "git",
239-
allowMergeCommits: configuration.allowMergeCommits,
230+
allowMergeCommits:
231+
configuration.features.commitOptions.allowMergeCommits,
240232
splitChangesInSingleFile: false,
233+
additionalContext: currentInput, // 添加额外上下文
234+
useEmoji: configuration.features.commitOptions.useEmoji, // 添加这一行
241235
});
242236

243237
// progress.report({

src/commands/SelectModelCommand.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ import { ModelPickerService } from "../services/ModelPickerService";
99

1010
export class SelectModelCommand extends BaseCommand {
1111
async execute(): Promise<void> {
12-
if (!(await this.validateConfig())) {
13-
return;
14-
}
12+
// if (!(await this.validateConfig())) {
13+
// return;
14+
// }
1515

1616
const config = ConfigurationManager.getInstance();
1717
const configuration = config.getConfiguration();
1818
const modelSelection = await this.showModelPicker(
19-
configuration.provider,
20-
getProviderModelConfig(configuration, configuration.provider)
19+
configuration.base.provider,
20+
getProviderModelConfig(configuration, configuration.base.provider)
2121
);
2222

2323
if (modelSelection) {
24-
await config.updateConfig("MODEL", modelSelection.model);
25-
await config.updateConfig("PROVIDER", modelSelection.provider);
24+
await config.updateAIConfiguration(
25+
modelSelection.provider,
26+
modelSelection.model
27+
);
2628
await NotificationHandler.info(
2729
"model.update.success",
2830
modelSelection.provider,

0 commit comments

Comments
 (0)