diff --git a/ui/src/ui/chat-model-ref.test.ts b/ui/src/ui/chat-model-ref.test.ts index a0ec9d749b8..4e26a913c14 100644 --- a/ui/src/ui/chat-model-ref.test.ts +++ b/ui/src/ui/chat-model-ref.test.ts @@ -29,6 +29,12 @@ describe("chat-model-ref helpers", () => { }); }); + it("preserves already-qualified model refs without prepending provider", () => { + expect(resolveServerChatModelValue("ollama/qwen3:30b", "openai-codex")).toBe( + "ollama/qwen3:30b", + ); + }); + it("normalizes raw overrides when the catalog match is unique", () => { expect(normalizeChatModelOverrideValue(createChatModelOverride("gpt-5-mini"), catalog)).toBe( "openai/gpt-5-mini", diff --git a/ui/src/ui/chat-model-ref.ts b/ui/src/ui/chat-model-ref.ts index 7b54ec5e2b0..deb819fa8e3 100644 --- a/ui/src/ui/chat-model-ref.ts +++ b/ui/src/ui/chat-model-ref.ts @@ -25,6 +25,11 @@ export function buildQualifiedChatModelValue(model: string, provider?: string | if (!trimmedModel) { return ""; } + // Preserve already-qualified model refs (provider/model) as-is. + // This avoids prepending an unrelated/default provider. + if (trimmedModel.includes("/")) { + return trimmedModel; + } const trimmedProvider = provider?.trim(); return trimmedProvider ? `${trimmedProvider}/${trimmedModel}` : trimmedModel; }