@@ -9,6 +9,7 @@ import { getProviderModelConfig } from "../config/types";
9
9
import { DISPLAY_NAME } from "../constants" ;
10
10
import { getMaxCharacters } from "../ai/types" ;
11
11
import { LocalizationManager } from "../utils/LocalizationManager" ;
12
+ import { ModelPickerService } from "../services/ModelPickerService" ;
12
13
13
14
export class GenerateCommitCommand extends BaseCommand {
14
15
private async showConfigWizard ( ) : Promise < boolean > {
@@ -135,12 +136,38 @@ export class GenerateCommitCommand extends BaseCommand {
135
136
return { provider : modelSelection . provider , model : modelSelection . model } ;
136
137
}
137
138
138
- async execute ( resources : vscode . SourceControlResourceState [ ] ) : Promise < void > {
139
- const locManager = LocalizationManager . getInstance ( ) ;
139
+ private async handleConfiguration ( ) : Promise <
140
+ { provider : string ; model : string } | undefined
141
+ > {
140
142
if ( ! ( await this . ensureConfiguration ( ) ) || ! ( await this . validateConfig ( ) ) ) {
141
143
return ;
142
144
}
143
145
146
+ const config = ConfigurationManager . getInstance ( ) ;
147
+ const configuration = config . getConfiguration ( ) ;
148
+ let { provider, model } = configuration ;
149
+
150
+ if ( ! provider || ! model ) {
151
+ const result = await this . selectAndUpdateModelConfiguration (
152
+ provider ,
153
+ model
154
+ ) ;
155
+ if ( ! result ) {
156
+ return ;
157
+ }
158
+ return result ;
159
+ }
160
+
161
+ return { provider, model } ;
162
+ }
163
+
164
+ async execute ( resources : vscode . SourceControlResourceState [ ] ) : Promise < void > {
165
+ const configResult = await this . handleConfiguration ( ) ;
166
+ if ( ! configResult ) {
167
+ return ;
168
+ }
169
+
170
+ const locManager = LocalizationManager . getInstance ( ) ;
144
171
try {
145
172
// 检测当前 SCM 类型
146
173
const scmProvider = await SCMFactory . detectSCM ( ) ;
@@ -160,24 +187,6 @@ export class GenerateCommitCommand extends BaseCommand {
160
187
161
188
// 如果没有配置提供商或模型,提示用户选择
162
189
if ( ! provider || ! model ) {
163
- // const modelSelection = await this.showModelPicker(
164
- // provider || "Ollama",
165
- // model || "Ollama"
166
- // );
167
-
168
- // if (!modelSelection) {
169
- // return;
170
- // }
171
-
172
- // // 使用新的封装方法更新配置
173
- // await config.updateAIConfiguration(
174
- // modelSelection.provider,
175
- // modelSelection.model
176
- // );
177
-
178
- // provider = modelSelection.provider;
179
- // model = modelSelection.model;
180
-
181
190
const { provider : newProvider , model : newModel } =
182
191
await this . selectAndUpdateModelConfiguration ( provider , model ) ;
183
192
@@ -244,12 +253,13 @@ export class GenerateCommitCommand extends BaseCommand {
244
253
}
245
254
if ( response ?. content ) {
246
255
try {
247
- // 统一使用 setCommitInput 写入提交信息
248
256
await scmProvider . setCommitInput ( response . content ) ;
249
257
await NotificationHandler . info (
250
258
locManager . format (
251
259
"commit.message.generated" ,
252
- scmProvider . type . toUpperCase ( )
260
+ scmProvider . type . toUpperCase ( ) ,
261
+ provider ,
262
+ model
253
263
)
254
264
) ;
255
265
} catch ( error ) {
@@ -312,68 +322,7 @@ export class GenerateCommitCommand extends BaseCommand {
312
322
] ;
313
323
}
314
324
315
- private async showModelPicker (
316
- currentProvider : string ,
317
- currentModel : string
318
- ) : Promise < { provider : string ; model : string } | undefined > {
319
- const locManager = LocalizationManager . getInstance ( ) ;
320
- try {
321
- const providers = AIProviderFactory . getAllProviders ( ) ;
322
- const modelsMap = new Map < string , string [ ] > ( ) ;
323
-
324
- await Promise . all (
325
- providers . map ( async ( provider ) => {
326
- if ( await provider . isAvailable ( ) ) {
327
- const models = await provider . getModels ( ) ;
328
- modelsMap . set (
329
- provider . getName ( ) ,
330
- models . map ( ( model ) => model . name )
331
- ) ;
332
- }
333
- } )
334
- ) ;
335
-
336
- const items : vscode . QuickPickItem [ ] = [ ] ;
337
- for ( const [ provider , models ] of modelsMap ) {
338
- items . push ( {
339
- label : provider ,
340
- kind : vscode . QuickPickItemKind . Separator ,
341
- } ) ;
342
- models . forEach ( ( model ) => {
343
- items . push ( {
344
- label : model ,
345
- description : provider ,
346
- picked : provider === currentProvider && model === currentModel ,
347
- } ) ;
348
- } ) ;
349
- }
350
-
351
- const quickPick = vscode . window . createQuickPick ( ) ;
352
- quickPick . items = items ;
353
- quickPick . title = locManager . getMessage ( "ai.model.picker.title" ) ;
354
- quickPick . placeholder = locManager . getMessage (
355
- "ai.model.picker.placeholder"
356
- ) ;
357
- quickPick . ignoreFocusOut = true ;
358
-
359
- const result = await new Promise < vscode . QuickPickItem | undefined > (
360
- ( resolve ) => {
361
- quickPick . onDidAccept ( ( ) => resolve ( quickPick . selectedItems [ 0 ] ) ) ;
362
- quickPick . onDidHide ( ( ) => resolve ( undefined ) ) ;
363
- quickPick . show ( ) ;
364
- }
365
- ) ;
366
-
367
- quickPick . dispose ( ) ;
368
-
369
- if ( result && result . description ) {
370
- return { provider : result . description , model : result . label } ;
371
- }
372
- return undefined ;
373
- } catch ( error ) {
374
- console . error ( "获取模型列表失败:" , error ) ;
375
- await NotificationHandler . error ( "获取模型列表失败" ) ;
376
- return undefined ;
377
- }
325
+ private async showModelPicker ( currentProvider : string , currentModel : string ) {
326
+ return ModelPickerService . showModelPicker ( currentProvider , currentModel ) ;
378
327
}
379
328
}
0 commit comments