From ec20a82b4eb68813429137e066247dffff2ab2d5 Mon Sep 17 00:00:00 2001 From: Ravi Tharuma Date: Wed, 25 Mar 2026 22:19:51 +0100 Subject: [PATCH] fix(model-capabilities): align gemini aliases and alias lookup --- src/shared/model-capabilities.test.ts | 6 +++--- src/shared/model-capability-aliases.test.ts | 12 +++++++++++- src/shared/model-capability-aliases.ts | 8 ++++---- src/shared/model-capability-guardrails.test.ts | 8 ++++---- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/shared/model-capabilities.test.ts b/src/shared/model-capabilities.test.ts index 4a97002f9..35dc40f8b 100644 --- a/src/shared/model-capabilities.test.ts +++ b/src/shared/model-capabilities.test.ts @@ -27,8 +27,8 @@ describe("getModelCapabilities", () => { }, toolCall: true, }, - "gemini-3.1-pro-preview": { - id: "gemini-3.1-pro-preview", + "gemini-3.1-pro": { + id: "gemini-3.1-pro", family: "gemini", reasoning: true, temperature: true, @@ -193,7 +193,7 @@ describe("getModelCapabilities", () => { }) expect(result).toMatchObject({ - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", family: "gemini", supportsThinking: true, supportsTemperature: true, diff --git a/src/shared/model-capability-aliases.test.ts b/src/shared/model-capability-aliases.test.ts index a164ffb60..9e563fc02 100644 --- a/src/shared/model-capability-aliases.test.ts +++ b/src/shared/model-capability-aliases.test.ts @@ -18,12 +18,22 @@ describe("model-capability-aliases", () => { expect(result).toEqual({ requestedModelID: "gemini-3.1-pro-high", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", source: "exact-alias", ruleID: "gemini-3.1-pro-tier-alias", }) }) + test("does not resolve prototype keys as aliases", () => { + const result = resolveModelIDAlias("constructor") + + expect(result).toEqual({ + requestedModelID: "constructor", + canonicalModelID: "constructor", + source: "canonical", + }) + }) + test("normalizes legacy Claude thinking aliases through a named exact rule", () => { const result = resolveModelIDAlias("claude-opus-4-6-thinking") diff --git a/src/shared/model-capability-aliases.ts b/src/shared/model-capability-aliases.ts index 523755d61..953b5a300 100644 --- a/src/shared/model-capability-aliases.ts +++ b/src/shared/model-capability-aliases.ts @@ -23,13 +23,13 @@ const EXACT_ALIAS_RULES: ReadonlyArray = [ { aliasModelID: "gemini-3.1-pro-high", ruleID: "gemini-3.1-pro-tier-alias", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", rationale: "OmO historically encoded Gemini tier selection in the model name instead of variant metadata.", }, { aliasModelID: "gemini-3.1-pro-low", ruleID: "gemini-3.1-pro-tier-alias", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", rationale: "OmO historically encoded Gemini tier selection in the model name instead of variant metadata.", }, { @@ -52,7 +52,7 @@ const EXACT_ALIAS_RULES: ReadonlyArray = [ }, ] -const EXACT_ALIAS_RULES_BY_MODEL: Readonly> = Object.fromEntries( +const EXACT_ALIAS_RULES_BY_MODEL: ReadonlyMap = new Map( EXACT_ALIAS_RULES.map((rule) => [rule.aliasModelID, rule]), ) @@ -64,7 +64,7 @@ function normalizeLookupModelID(modelID: string): string { export function resolveModelIDAlias(modelID: string): ModelIDAliasResolution { const normalizedModelID = normalizeLookupModelID(modelID) - const exactRule = EXACT_ALIAS_RULES_BY_MODEL[normalizedModelID] + const exactRule = EXACT_ALIAS_RULES_BY_MODEL.get(normalizedModelID) if (exactRule) { return { requestedModelID: normalizedModelID, diff --git a/src/shared/model-capability-guardrails.test.ts b/src/shared/model-capability-guardrails.test.ts index c5e7c54fc..06a9c07eb 100644 --- a/src/shared/model-capability-guardrails.test.ts +++ b/src/shared/model-capability-guardrails.test.ts @@ -29,7 +29,7 @@ describe("model-capability-guardrails", () => { const brokenSnapshot: ModelCapabilitiesSnapshot = { ...bundledSnapshot, models: Object.fromEntries( - Object.entries(bundledSnapshot.models).filter(([modelID]) => modelID !== "gemini-3.1-pro-preview"), + Object.entries(bundledSnapshot.models).filter(([modelID]) => modelID !== "gemini-3.1-pro"), ), } @@ -42,7 +42,7 @@ describe("model-capability-guardrails", () => { expect.objectContaining({ kind: "alias-target-missing-from-snapshot", aliasModelID: "gemini-3.1-pro-high", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", }), ) }) @@ -70,7 +70,7 @@ describe("model-capability-guardrails", () => { expect.objectContaining({ kind: "exact-alias-collides-with-snapshot", aliasModelID: "gemini-3.1-pro-high", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", }), ) }) @@ -84,7 +84,7 @@ describe("model-capability-guardrails", () => { expect.objectContaining({ kind: "built-in-model-relies-on-alias", modelID: "gemini-3.1-pro-high", - canonicalModelID: "gemini-3.1-pro-preview", + canonicalModelID: "gemini-3.1-pro", ruleID: "gemini-3.1-pro-tier-alias", }), )