fix: strip Kilo Gateway sub-provider prefix from model trigger label

This commit is contained in:
Mark IJbema
2026-03-05 15:40:23 +01:00
parent 6b5292f310
commit 4bc5f63ab5
3 changed files with 35 additions and 11 deletions
@@ -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")
@@ -172,7 +172,7 @@ export const ModelSelectorBase: Component<ModelSelectorBaseProps> = (props) => {
const triggerLabel = () =>
buildTriggerLabel(
selectedModel()?.name,
selectedModel()?.providerName,
selectedModel()?.providerID,
props.value,
props.allowClear ?? false,
props.clearLabel ?? "",
@@ -14,21 +14,22 @@ export function isFree(model: Pick<EnrichedModel, "inputPrice">): 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}`
}