Skip to content

Commit c57b8ae

Browse files
authored
nes: model picker: fix: correct init and model picking order (#2431)
* nes: fetched models should check if they're already known as well * nes: fix: ensure to update undesired models before updating preferred model this's important because there's code that reacts to preferred model change and needs to know latest undesired models * nes: minimize failure possibility * nes: fix: make sure to init undesiredModelsManager earlier than observables use them * nes: don't memorize if exp-configured model is picked
1 parent 09e2d4a commit c57b8ae

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/platform/inlineEdits/node/inlineEditsModelService.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
9595

9696
const tracer = this._tracer.sub('constructor');
9797

98+
this._undesiredModelsManager = new UndesiredModels.Manager(this._vscodeExtensionContext);
99+
98100
this._modelsObs = derived((reader) => {
99101
tracer.trace('computing models');
100102
return this.aggregateModels({
@@ -123,8 +125,6 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
123125
}).recomputeInitiallyAndOnChange(this._store);
124126

125127
this.onModelListUpdated = Event.fromObservableLight(this._modelInfoObs);
126-
127-
this._undesiredModelsManager = new UndesiredModels.Manager(this._vscodeExtensionContext);
128128
}
129129

130130
get modelInfo(): vscode.InlineCompletionModelInfo | undefined {
@@ -162,25 +162,27 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
162162
return;
163163
}
164164

165+
// if currently selected model is from exp config, then mark that model as undesired
166+
if (currentPreferredModel.source === ModelSource.ExpConfig) {
167+
await this._undesiredModelsManager.addUndesiredModelId(currentPreferredModel.modelName);
168+
}
169+
170+
if (this._undesiredModelsManager.isUndesiredModelId(newPreferredModelId)) {
171+
await this._undesiredModelsManager.removeUndesiredModelId(newPreferredModelId);
172+
}
173+
165174
// if user picks same as the default model, we should reset the user setting
166175
// otherwise, update the model
167176
const expectedDefaultModel = this._pickModel({ preferredModelName: 'none', models });
168-
if (newPreferredModelId === expectedDefaultModel.modelName) {
177+
if (newPreferredModel.source === ModelSource.ExpConfig || // because exp-configured model already takes highest priority
178+
(newPreferredModelId === expectedDefaultModel.modelName && !models.some(m => m.source === ModelSource.ExpConfig))
179+
) {
169180
this._tracer.trace(`New preferred model id ${newPreferredModelId} is the same as the default model, resetting user setting.`);
170181
await this._configService.setConfig(ConfigKey.Advanced.InlineEditsPreferredModel, 'none');
171182
} else {
172183
this._tracer.trace(`New preferred model id ${newPreferredModelId} is different from the default model, updating user setting to ${newPreferredModelId}.`);
173184
await this._configService.setConfig(ConfigKey.Advanced.InlineEditsPreferredModel, newPreferredModelId);
174185
}
175-
176-
// if currently selected model is from exp config, then mark that model as undesired
177-
if (currentPreferredModel.source === ModelSource.ExpConfig) {
178-
await this._undesiredModelsManager.addUndesiredModelId(currentPreferredModel.modelName);
179-
}
180-
181-
if (this._undesiredModelsManager.isUndesiredModelId(newPreferredModelId)) {
182-
await this._undesiredModelsManager.removeUndesiredModelId(newPreferredModelId);
183-
}
184186
}
185187

186188
private aggregateModels(
@@ -234,6 +236,10 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
234236
if (!isPromptingStrategy(m.capabilities.promptStrategy)) {
235237
return undefined;
236238
}
239+
if (models.some(knownModel => knownModel.modelName === m.name)) {
240+
tracer.trace(`Fetched model ${m.name} already exists in the model list, skipping.`);
241+
return undefined;
242+
}
237243
return {
238244
modelName: m.name,
239245
promptingStrategy: m.capabilities.promptStrategy,
@@ -263,9 +269,7 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
263269

264270
public selectedModelConfiguration(): ModelConfiguration {
265271
const tracer = this._tracer.sub('selectedModelConfiguration');
266-
const currentModel = this._currentModelObs.get();
267-
tracer.trace(`Current model id: ${currentModel.modelName}`);
268-
const model = this._modelsObs.get().find(m => m.modelName === currentModel.modelName);
272+
const model = this._currentModelObs.get();
269273
if (model) {
270274
tracer.trace(`Selected model found: ${model.modelName}`);
271275
return {

0 commit comments

Comments
 (0)