From 9c7102b73b098e822090b2f93c76be8b6507366f Mon Sep 17 00:00:00 2001 From: ihoooohi <126438794+ihoooohi@users.noreply.github.com> Date: Sat, 25 Apr 2026 18:47:45 +0800 Subject: [PATCH] fix(aliases): stop rewriting canonical claude-opus-4-6-thinking The claude-thinking-legacy-alias pattern previously matched both claude-opus-4-6-thinking and claude-opus-4-7-thinking and mapped them to claude-opus-4-7. After models.dev started shipping claude-opus-4-6-thinking as a real canonical model (e.g. 302ai/claude-opus-4-6-thinking), the pattern collides with the snapshot and trips the pattern-alias-collides-with-snapshot guardrail in collectModelCapabilityGuardrailIssues, which is what has been failing the refresh-model-capabilities cron since 2026-04-20. Tightening the regex to only match claude-opus-4-7-thinking preserves the legacy-id rewrite for the still-non-canonical 4-7-thinking form while letting 4-6-thinking resolve to itself. Refs #3635 --- src/shared/model-capability-aliases.test.ts | 10 ++++++++++ src/shared/model-capability-aliases.ts | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/shared/model-capability-aliases.test.ts b/src/shared/model-capability-aliases.test.ts index b6f5b6641..4581d84c1 100644 --- a/src/shared/model-capability-aliases.test.ts +++ b/src/shared/model-capability-aliases.test.ts @@ -107,4 +107,14 @@ describe("model-capability-aliases", () => { ruleID: "claude-thinking-legacy-alias", }) }) + + test("treats claude-opus-4-6-thinking as canonical, not as a legacy alias", () => { + const result = resolveModelIDAlias("claude-opus-4-6-thinking") + + expect(result).toEqual({ + requestedModelID: "claude-opus-4-6-thinking", + canonicalModelID: "claude-opus-4-6-thinking", + source: "canonical", + }) + }) }) diff --git a/src/shared/model-capability-aliases.ts b/src/shared/model-capability-aliases.ts index fe7ef6b3b..9d1412225 100644 --- a/src/shared/model-capability-aliases.ts +++ b/src/shared/model-capability-aliases.ts @@ -41,8 +41,8 @@ const EXACT_ALIAS_RULES_BY_MODEL: ReadonlyMap = new Map( const PATTERN_ALIAS_RULES: ReadonlyArray = [ { ruleID: "claude-thinking-legacy-alias", - description: "Normalizes legacy Claude Opus thinking suffixes (4-6, 4-7) to the canonical snapshot ID.", - match: (normalizedModelID) => /^claude-opus-4-(?:6|7)-thinking$/.test(normalizedModelID), + description: "Normalizes the legacy claude-opus-4-7-thinking id to the canonical snapshot ID.", + match: (normalizedModelID) => /^claude-opus-4-7-thinking$/.test(normalizedModelID), canonicalize: () => "claude-opus-4-7", }, {