From 4bc5f63ab55b814cd9a0d66c01ee2cf6a14813eb Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Thu, 5 Mar 2026 15:40:23 +0100 Subject: [PATCH] fix: strip Kilo Gateway sub-provider prefix from model trigger label --- .../tests/unit/model-selector-utils.test.ts | 33 ++++++++++++++++--- .../src/components/shared/ModelSelector.tsx | 2 +- .../components/shared/model-selector-utils.ts | 11 ++++--- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts b/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts index 999936a903d..32f070b4912 100644 --- a/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts +++ b/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts @@ -3,6 +3,7 @@ import { providerSortKey, isFree, buildTriggerLabel, + stripSubProviderPrefix, KILO_GATEWAY_ID, PROVIDER_ORDER, } from "../../webview-ui/src/components/shared/model-selector-utils" @@ -57,17 +58,39 @@ describe("isFree", () => { }) }) -describe("buildTriggerLabel", () => { - it("returns resolved model name when available", () => { - expect(buildTriggerLabel("GPT-4o", undefined, null, false, "", true, labels)).toBe("GPT-4o") +describe("stripSubProviderPrefix", () => { + it("strips prefix before ': '", () => { + expect(stripSubProviderPrefix("Anthropic: Claude Sonnet")).toBe("Claude Sonnet") + expect(stripSubProviderPrefix("OpenAI: GPT-4o")).toBe("GPT-4o") }) - it("strips provider prefix from resolved name when providerName matches", () => { - expect(buildTriggerLabel("Anthropic: Claude Sonnet", "Anthropic", null, false, "", true, labels)).toBe( + it("leaves names without ': ' unchanged", () => { + expect(stripSubProviderPrefix("GPT-4o")).toBe("GPT-4o") + expect(stripSubProviderPrefix("claude-3-5-sonnet")).toBe("claude-3-5-sonnet") + }) +}) + +describe("buildTriggerLabel", () => { + it("returns resolved model name for non-kilo provider unchanged", () => { + expect(buildTriggerLabel("GPT-4o", "openai", null, false, "", true, labels)).toBe("GPT-4o") + }) + + it("strips sub-provider prefix from resolved name for kilo gateway models", () => { + expect(buildTriggerLabel("Anthropic: Claude Sonnet", KILO_GATEWAY_ID, null, false, "", true, labels)).toBe( "Claude Sonnet", ) }) + it("does not strip prefix for non-kilo provider even if name contains ': '", () => { + expect(buildTriggerLabel("Anthropic: Claude Sonnet", "anthropic", null, false, "", true, labels)).toBe( + "Anthropic: Claude Sonnet", + ) + }) + + it("returns resolved name as-is when providerID is undefined", () => { + expect(buildTriggerLabel("GPT-4o", undefined, null, false, "", true, labels)).toBe("GPT-4o") + }) + it("returns modelID for kilo gateway raw selection", () => { const raw = { providerID: "kilo", modelID: "kilo/auto" } expect(buildTriggerLabel(undefined, undefined, raw, false, "", true, labels)).toBe("kilo/auto") diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx b/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx index 983c438ecd7..abfd2e50abc 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx @@ -172,7 +172,7 @@ export const ModelSelectorBase: Component = (props) => { const triggerLabel = () => buildTriggerLabel( selectedModel()?.name, - selectedModel()?.providerName, + selectedModel()?.providerID, props.value, props.allowClear ?? false, props.clearLabel ?? "", diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/model-selector-utils.ts b/packages/kilo-vscode/webview-ui/src/components/shared/model-selector-utils.ts index 9821038b459..771299c5f96 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/model-selector-utils.ts +++ b/packages/kilo-vscode/webview-ui/src/components/shared/model-selector-utils.ts @@ -14,21 +14,22 @@ export function isFree(model: Pick): boolean { return model.inputPrice === 0 } -export function stripProviderPrefix(name: string, providerName: string): string { - const prefix = `${providerName}: ` - return name.startsWith(prefix) ? name.slice(prefix.length) : name +export function stripSubProviderPrefix(name: string): string { + const colon = name.indexOf(": ") + return colon >= 0 ? name.slice(colon + 2) : name } export function buildTriggerLabel( resolvedName: string | undefined, - providerName: string | undefined, + providerID: string | undefined, raw: ModelSelection | null, allowClear: boolean, clearLabel: string, hasProviders: boolean, labels: { select: string; noProviders: string; notSet: string }, ): string { - if (resolvedName) return providerName ? stripProviderPrefix(resolvedName, providerName) : resolvedName + if (resolvedName) + return providerID === KILO_GATEWAY_ID ? stripSubProviderPrefix(resolvedName) : resolvedName if (raw?.providerID && raw?.modelID) { return raw.providerID === KILO_GATEWAY_ID ? raw.modelID : `${raw.providerID} / ${raw.modelID}` }