From 4e9a386cedefb2ae5af65c199c2f0f7d65d2d9f4 Mon Sep 17 00:00:00 2001 From: Sean Goedecke Date: Thu, 4 Jun 2026 17:13:43 +1000 Subject: [PATCH] Fix auto mode fallback for empty model providers (#316174) Fix auto mode with empty model providers Treat an empty current model provider as no provider affinity so Auto Mode still falls back to the first available model with a known endpoint. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../platform/endpoint/node/automodeService.ts | 2 +- .../endpoint/node/test/automodeService.spec.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/extensions/copilot/src/platform/endpoint/node/automodeService.ts b/extensions/copilot/src/platform/endpoint/node/automodeService.ts index 525a387543a..bc7c4682325 100644 --- a/extensions/copilot/src/platform/endpoint/node/automodeService.ts +++ b/extensions/copilot/src/platform/endpoint/node/automodeService.ts @@ -403,7 +403,7 @@ export class AutomodeService extends Disposable implements IAutomodeService { } private _selectDefaultModel(currentModelProvider: string | undefined, availableModels: string[], knownEndpoints: IChatEndpoint[]): IChatEndpoint { - const selectedModel = (currentModelProvider && this._findSameProviderModel(currentModelProvider, availableModels, knownEndpoints)) + const selectedModel = (currentModelProvider ? this._findSameProviderModel(currentModelProvider, availableModels, knownEndpoints) : undefined) ?? this._findFirstAvailableModel(availableModels, knownEndpoints); if (selectedModel) { return selectedModel; diff --git a/extensions/copilot/src/platform/endpoint/node/test/automodeService.spec.ts b/extensions/copilot/src/platform/endpoint/node/test/automodeService.spec.ts index 7734d3da2e3..1f2a640dfcc 100644 --- a/extensions/copilot/src/platform/endpoint/node/test/automodeService.spec.ts +++ b/extensions/copilot/src/platform/endpoint/node/test/automodeService.spec.ts @@ -433,6 +433,24 @@ describe('AutomodeService', () => { expect(secondResult).toBe(firstResult); }); + it('should fall back to first available model when the current provider is empty', async () => { + const openaiEndpoint = createEndpoint('gpt-4o', 'OpenAI'); + const chamomileEndpoint = createEndpoint('chamomile', ''); + + mockApiResponse(['chamomile'], 'token-empty-provider'); + + automodeService = createService(); + const chatRequest: Partial = { + location: ChatLocation.Panel, + prompt: 'test', + sessionId: 'session-empty-provider' + }; + + const firstResult = await automodeService.resolveAutoModeEndpoint(chatRequest as ChatRequest, [openaiEndpoint, chamomileEndpoint]); + const secondResult = await automodeService.resolveAutoModeEndpoint(chatRequest as ChatRequest, [openaiEndpoint, chamomileEndpoint]); + expect([firstResult.model, secondResult.model]).toEqual(['chamomile', 'chamomile']); + }); + it('should fall back to first known endpoint when no available models match', async () => { mockApiResponse(['unknown-model-1', 'unknown-model-2']);