Skip to content

Commit c11e001

Browse files
piercebogganCopilot
andcommitted
Fix Language Models UI not refreshing on group add/remove (#309495)
The Language Models view did not auto-update when: - Adding a BYOK model with an invalid configuration (error status) - Removing a BYOK model group Root cause: _resolveAllLanguageModels only checked model cache changes to decide whether to fire onDidChangeLanguageModels. When groups were added/removed but the model set didn't change (e.g., groups with errors or empty groups), the event never fired and the UI stayed stale. Fixes: 1. Add _hasGroupStructureChanged to detect group-level changes (count, names, statuses) independently of model cache changes 2. Add explicit viewModel.refresh() after delete action, matching the pattern already used by the managementCommand path 3. Await configureLanguageModelsProviderGroup in addModelsForVendor and refresh the view model after the add flow completes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2ec2621 commit c11e001

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,7 @@ class ActionsColumnRenderer extends ModelsTableColumnRenderer<IActionsColumnTemp
772772
return;
773773
}
774774
await this.languageModelsService.removeLanguageModelsProviderGroup(vendorEntry.vendor.vendor, vendorEntry.group.name);
775+
this.viewModel.refresh();
775776
}
776777
}));
777778
} else if (vendorEntry.vendor.managementCommand) {
@@ -1336,7 +1337,8 @@ export class ChatModelsWidget extends Disposable {
13361337
}
13371338

13381339
private async addModelsForVendor(vendor: ILanguageModelProviderDescriptor): Promise<void> {
1339-
this.languageModelsService.configureLanguageModelsProviderGroup(vendor.vendor);
1340+
await this.languageModelsService.configureLanguageModelsProviderGroup(vendor.vendor);
1341+
await this.viewModel.refresh();
13401342
}
13411343

13421344
public layout(height: number, width: number): void {

src/vs/workbench/contrib/chat/common/languageModels.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,7 @@ export class LanguageModelsService implements ILanguageModelsService {
926926
}
927927
}
928928

929+
const oldGroups = this._modelsGroups.get(vendorId) ?? [];
929930
this._modelsGroups.set(vendorId, languageModelsGroups);
930931
const oldModels = this._clearModelCache(vendorId);
931932
let hasChanges = false;
@@ -941,6 +942,12 @@ export class LanguageModelsService implements ILanguageModelsService {
941942
this._logService.trace(`[LM] Resolved language models for vendor ${vendorId}`, allModels);
942943
hasChanges = hasChanges || oldModels.size > 0;
943944

945+
// Also detect group structure changes (added/removed groups, status changes)
946+
// so the UI updates even when individual models haven't changed
947+
if (!hasChanges) {
948+
hasChanges = this._hasGroupStructureChanged(oldGroups, languageModelsGroups);
949+
}
950+
944951
// Update per-model configurations for this vendor
945952
this._clearModelConfigurations(vendorId);
946953
for (const [identifier, config] of perModelConfigurations) {
@@ -957,6 +964,24 @@ export class LanguageModelsService implements ILanguageModelsService {
957964
});
958965
}
959966

967+
private _hasGroupStructureChanged(oldGroups: readonly ILanguageModelsGroup[], newGroups: readonly ILanguageModelsGroup[]): boolean {
968+
if (oldGroups.length !== newGroups.length) {
969+
return true;
970+
}
971+
for (let i = 0; i < oldGroups.length; i++) {
972+
const oldGroup = oldGroups[i];
973+
const newGroup = newGroups[i];
974+
if (oldGroup.group?.name !== newGroup.group?.name
975+
|| oldGroup.group?.vendor !== newGroup.group?.vendor
976+
|| oldGroup.status?.message !== newGroup.status?.message
977+
|| oldGroup.status?.severity !== newGroup.status?.severity
978+
|| oldGroup.modelIdentifiers.length !== newGroup.modelIdentifiers.length) {
979+
return true;
980+
}
981+
}
982+
return false;
983+
}
984+
960985
getLanguageModelGroups(vendor: string): ILanguageModelsGroup[] {
961986
return this._modelsGroups.get(vendor) ?? [];
962987
}

0 commit comments

Comments
 (0)