Repository navigation
feat(providers): add Claude Opus 5.5 support - #14546
Conversation
Register claude-opus-5-5 on the Anthropic API, Claude OAuth, Bedrock (anthropic.claude-opus-5-5) and Vertex catalogs with native 1M context, 128K output and the five effort tiers. The model spec marks it adaptive-only, rejecting disabled thinking and forced tool_choice, so the existing normalizers strip thinking.type:"disabled", collapse manual budgets and relax any/tool choices before dispatch. Adds $4/$20 pricing (cache read $0.20, write $5), Opus 5 family fallback, Fast Mode defaults, static discovery, and native-1M recognition so the context-1m beta is never forwarded for it.
ggiak
left a comment
There was a problem hiding this comment.
🤖 Automated review — 5f0ef1c
2 important · 5 nits · 2 pre-existing · effort high
🔴 Important
open-sse/config/providers/registry/bedrock/index.ts:24: the Bedrockanthropic.claude-opus-5-5entry has nounsupportedParams. Theclaudeentry atopen-sse/config/providers/registry/claude/index.ts:59stripstemperature/top_p/top_k; the Bedrock one does not.
Fails when: a client sends{model:"bedrock/anthropic.claude-opus-5-5", temperature:0.7}.getUnsupportedParamsreturns[],openAIToBedrockConversesetsinferenceConfig.temperature, and Bedrock rejects the request with a 400.src/shared/constants/modelSpecs.ts:483: the Opus 5.5 spec has no dot-notation alias. Opus 4.8 has one (claude-opus-4.8) at line 512.
Fails when: a client sendsclaude-opus-5.5withthinking:{type:"disabled"}or a forcedtool_choice. The prefix match'claude-opus-5.5'.startsWith('claude-opus-5')picks the Opus 5 spec, sorejectsThinkingDisabled/rejectsForcedToolChoicenever apply. The fields are forwarded and upstream returns a 400.modelHasNativeContext1m("claude-opus-5.5")is also wrong.
🟡 5 nits · 🟣 2 pre-existing
- 🟡
open-sse/services/providerCostData.ts:17: pricing only covers the bareclaude-opus-5-5.
Fails when:getModelPricing("bedrock","anthropic.claude-opus-5-5")misses and falls back to $5/$15 instead of $4/$20. That misprices the Bedrock target for cost-optimized routing and virtual cost. - 🟡
open-sse/config/providers/registry/claude/index.ts:51: putting Opus 5.5 before Opus 5 implicitly moves the opus default.getClaudeCodeDefaultModels().opus, and soANTHROPIC_DEFAULT_OPUS_MODEL, now resolves tocc/claude-opus-5-5.
Fails when: generated Claude Code configs start sending all opus-alias traffic to 5.5, which has a stricter contract (thinking-disabled is dropped, forced tool_choice is relaxed). This happens through array order, not an explicit decision. If it is intended, say so in the PR description. - 🟡
src/lib/providers/claudeFastMode.ts:11: the newclaude-opus-5-5entry is redundant.shouldRequestClaudeFastModealready prefix-matchesclaude-opus-5-.
Fails when: the new test only asserts list membership. Removing the entry would still leave fast mode on for 5.5, so the test does not pin behavior. - 🟡
src/lib/db/settings.ts:213: the defaultclaudeFastMode.supportedModelsis a hand-copied duplicate ofCLAUDE_FAST_MODE_DEFAULT_MODELS.
Fails when: a future model is added to one list and not the other, and the settings-UI default and the runtime default diverge. Using[...CLAUDE_FAST_MODE_DEFAULT_MODELS]removes the duplicate. - 🟡
tests/unit/claude-opus-5-5.test.ts:54: the test asserts that github, ghe-copilot, kiro, claude-web and cursor do NOT expose Opus 5.5.
Fails when: someone lands the follow-up the PR description asks for (adding 5.5 to a verified catalog). This unrelated test then fails by design. - 🟣
open-sse/config/providers/registry/bedrock/index.ts:28: the entry advertisessupportedThinkingEfforts, but the Bedrock Converse translator never mapsreasoning_effortintoadditionalModelRequestFields. The Opus 5 entry has the same gap.
Fails when: a client picks effortmaxforbedrock/anthropic.claude-opus-5-5. The effort is silently dropped. - 🟣
src/lib/providers/claudeFastMode.ts:11: Claude fast-tier pricing is never applied. Only Codex has a fast cost multiplier.
Fails when: Opus 5.5 fast-mode traffic is recorded at $4/$20 while Anthropic bills the fast rate, so usage and budgets under-report spend.
… claude-opus-5.5 Bedrock anthropic.claude-opus-5-5 now declares temperature/top_p/top_k as unsupported, so the Converse translator no longer forwards them into a 400. The Opus 5.5 spec gains a claude-opus-5.5 alias so dot-notation ids stop prefix-matching the Opus 5 spec (which skipped the disabled-thinking and forced tool_choice normalizers), and modelHasNativeContext1m folds dotted versions before matching. The fast-mode test now asserts behavior instead of list membership.
|
Addressed in f76f105:
Focused test: 7/7. Related unit tests (115 files): 1235/1240. The 5 failures are the same ones that fail on the base |
Anthropic's OAuth endpoint rejects claude-opus-5-5 with "Claude Code 2.1.258 does not support this model; version 2.1.280 or newer is required". Values were captured from the real 2.1.280 CLI via a loopback listener: the version and billing revision (d7b) change; the Stainless package (0.112.1) and runtime (v26.3.0) are unchanged. The Devin bridge image pin stays at 2.1.258 until it is live-validated.
|
Added 785b5ce: bump the Claude Code wire identity from
|
|
Thanks @ggiak, this is the most complete of the four Opus 5.5 PRs, and we'll land it as the primary. Two things we checked: One thing before merge: We'd also like to fold in #14557's ≥2.1.280 floor assertion and #14548's |
Connections whose authoritative live catalog was synced before the launch reject claude-opus-5-5 with model_not_found until refreshed, so listing Opus 5.5 first made ANTHROPIC_DEFAULT_OPUS_MODEL point at a model those catalogs refuse. List it after Opus 5 until catalogs catch up. Refs diegosouzapw#14612
Ported from diegosouzapw#14557: guards against a future pin regressing below the 2.1.280 floor Anthropic enforces for claude-opus-5-5. Co-authored-by: PixmaNTS <maxime@maxime-pointet.fr>
Ported from diegosouzapw#14548: requests without an explicit effort get reasoning_effort=medium; a client-chosen effort still wins. Co-authored-by: Minxi Hou <houminxi@gmail.com>
Co-authored-by: Minxi Hou <houminxi@gmail.com>
|
Thanks @diegosouzapw, all four are in (head
Focused suites pass: |
…stry The static catalog path calls getThinkingCapabilityFields with skipCanonicalEffortFallback=true for registry models (src/app/api/v1/models/catalog.ts:730), so a registry entry without declared tiers is listed in /v1/models with no effort_tiers at all. claude-opus-5's modelSpec already has supportsThinking: true, but the registry entry never declared supportedThinkingEfforts, so the model exposed no thinking tiers through the static catalog. Declare supportsReasoning and the tier list [low, medium, high, xhigh, max] on the claude-opus-5 registry entry, matching sibling entries. claude-opus-5-5 itself is intentionally out of scope here; it is covered by upstream PR diegosouzapw#14546. Signed-off-by: Minxi Hou <houminxi@gmail.com>
|
Heads-up on scope so we don't collide: I've narrowed #14548 to only the part this PR doesn't cover — Why that entry needs it: the catalog calls Happy for you to fold those two lines into this PR if you'd rather land it in one place; otherwise #14548 stays a two-line companion that merges cleanly either way — it no longer touches |
…stry The static catalog path calls getThinkingCapabilityFields with skipCanonicalEffortFallback=true for registry models (src/app/api/v1/models/catalog.ts:730), so a registry entry without declared tiers is listed in /v1/models with no effort_tiers at all. claude-opus-5's modelSpec already has supportsThinking: true, but the registry entry never declared supportedThinkingEfforts, so the model exposed no thinking tiers through the static catalog. Declare supportsReasoning and the tier list [low, medium, high, xhigh, max] on the claude-opus-5 registry entry, matching sibling entries. claude-opus-5-5 itself is intentionally out of scope here; it is covered by upstream PR diegosouzapw#14546. Signed-off-by: Minxi Hou <houminxi@gmail.com>
…stry The static catalog path calls getThinkingCapabilityFields with skipCanonicalEffortFallback=true for registry models (src/app/api/v1/models/catalog.ts:730), so a registry entry without declared tiers is listed in /v1/models with no effort_tiers at all. claude-opus-5's modelSpec already has supportsThinking: true, but the registry entry never declared supportedThinkingEfforts, so the model exposed no thinking tiers through the static catalog. Declare supportsReasoning and the tier list [low, medium, high, xhigh, max] on the claude-opus-5 registry entry, matching sibling entries. claude-opus-5-5 itself is intentionally out of scope here; it is covered by upstream PR diegosouzapw#14546. Signed-off-by: Minxi Hou <houminxi@gmail.com>
…stry The static catalog path calls getThinkingCapabilityFields with skipCanonicalEffortFallback=true for registry models (src/app/api/v1/models/catalog.ts:730), so a registry entry without declared tiers is listed in /v1/models with no effort_tiers at all. claude-opus-5's modelSpec already has supportsThinking: true, but the registry entry never declared supportedThinkingEfforts, so the model exposed no thinking tiers through the static catalog. Declare supportsReasoning and the tier list [low, medium, high, xhigh, max] on the claude-opus-5 registry entry, matching sibling entries. claude-opus-5-5 itself is intentionally out of scope here; it is covered by upstream PR diegosouzapw#14546. Signed-off-by: Minxi Hou <houminxi@gmail.com>
…aude Code 2.1.280 identity Adds claude-opus-5-5 to the Anthropic, Claude OAuth, Bedrock and Vertex catalogs with pricing, fast mode and model specs, and bumps the Claude Code wire identity to 2.1.280, as deployed. Drops the vertex registry ESLint suppression the deployed file no longer needs.
Bumps the advertised Claude Code client version 2.1.258 -> 2.1.280 (published on npm as @anthropic-ai/claude-code 2.1.280; build revision 1e2 kept). Merged on its own at the maintainer's request, independent of #14546. Reconciled with the current tip and pinned the newer billing-revision override test to 2.1.280; identity/version suites 65/65, translate-path golden 3/3, typecheck:core clean. Thank you @HouMinXi!
|
Re-homed to |
|
The new claude-opus-5-5 registry entry does not set supportedThinkingEfforts. models.dev lists low, medium, high, xhigh, max for anthropic/claude-opus-5.5 (same set as claude-opus-5 in this registry). Without the array, the dashboard catalog emits no effort_tiers for that id, because static registry models skip the canonical fallback. Sonnet 5.5 in this same PR already lists its tiers (low through xhigh). Opus 5.5 should list low through max the same way, in both the claude and anthropic registries. |
Keep the release Claude Code pin 2.1.280 revision 1e2. Do not restore billing revision d7b or replay the 2.1.258 to 2.1.280 documentation bump. Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
56424dd
into
diegosouzapw:release/v3.8.52
Refs #14612 — covers the first ask (add
claude-opus-5-5to the catalog). The second ask, operator-defined models, is not covered here.Summary
Adds Claude Opus 5.5 (
claude-opus-5-5) on the surfaces where Anthropic lists it at launch: Anthropic API, Claude OAuth, Bedrock (anthropic.claude-opus-5-5) and Vertex/Vertex-partner. The pattern follows #8464 (Opus 5) and #12367 (Fable 5.1).Opus 5.5 has the same context window, output limit and tokenizer as Opus 5 (1M context, 128K output). It costs less: $4 / $20 per MTok, $0.20 cache read and $5 cache write. It also has the same breaking changes Fable 5.1 introduced, so its spec reuses the existing Fable 5.1 flags. No new normalization code was needed:
thinking.type:"disabled"returns 400 at every effort (Opus 5 allowed it up tohigh)rejectsThinkingDisabled, sonormalizeThinkingForModeldrops the field. Does not setmaxEffortWhenThinkingDisabled.budget_tokens/type:"enabled"returns 400adaptiveThinkingOnly, sonormalizeClaudeAdaptiveThinkingcollapses them to adaptive.tool_choice(any/tool) returns 400rejectsForcedToolChoice, sonormalizeForcedToolChoiceForModelrelaxes it and keeps the tools.CONTEXT_1M_NATIVE_MODELS. Theclaude-opus-5-prefix match there doesn't cover-5-5, so an explicit entry is needed. Thecontext-1mbeta is not forwarded.temperature/top_p/top_kgo intounsupportedParamsonanthropicandclaude.Other changes:
claude-opus-5-5→claude-opus-5→claude-opus-4-8→claude-sonnet-5.claudeFastMode.tsand the settings default). Fast mode is available on the Claude API for Opus 5.5.claude-opus-5in theclauderegistry, sogetClaudeCodeDefaultModels().opus(the CLI-toolcc/Opus default,ANTHROPIC_DEFAULT_OPUS_MODEL) staysclaude-opus-5.claude/anthropicvalidate against an authoritative live catalog, and a connection synced before the launch returnsmodel_not_foundforclaude-opus-5-5until its models are refreshed. A test pins this default.medium(defaultReasoningEffort). A client-chosen effort still wins. Ported from [defer] fix(providers): declare claude-opus-5 thinking efforts in claude registry #14548.>= 2.1.280floor assertion on the Claude Code client pin (Anthropic's Opus 5.5 gate). Ported from [defer] fix(providers): bump Claude Code client pin 2.1.258 -> 2.1.280 to clear the Opus 5.5 model gate #14557.no-unused-varssuppression forvertex/index.ts. It was already stale on the base, and touching the file made the pre-commit ESLint step fail.Deliberately not included
Claude Web, GitHub Copilot / GHE Copilot, Kiro, Cursor and Devin each use their own wire model IDs or thinking contracts. I couldn't verify those for Opus 5.5, so the test asserts they do not expose it yet. They should be follow-ups once someone checks them against a live catalog. Also not done: fast-mode-specific pricing ($8 / $40 per Anthropic's docs) and the
computer_toolset_20260801requirement (OmniRoute doesn't translate computer-use tool versions).Operator note
Existing
claude/anthropicconnections need a models refresh (provider page → refresh models) beforeclaude-opus-5-5routes. Until then the live catalog rejects it withmodel_not_found.Credits
defaultReasoningEffort: "medium", from [defer] fix(providers): declare claude-opus-5 thinking efforts in claude registry #14548 (co-authored commits).Validation
tests/unit/claude-opus-5-5.test.tscovers catalogs per provider, unverified surfaces staying unexposed, the spec flags, the thinking and tool-choice normalizers, the fast-mode list, pricing, fallback, the CLI Opus default staying on Opus 5, and themediumeffort default.claude-codex-identity-version-sync: 8/8 pass, including the new>= 2.1.280floor test.pricing-fallbackpinned theKNOWN_MODEL_PRICINGsize (21). Updated it to 22 for the new row.tests/unit/autoCombo/*files are Vitest suites. Run undervitest.mcp.config.tsthey pass (21/21).chatcore-translation-pathsCodex/DeepSeek ×4,qwen38-max-bare-id-alias×1) fail identically on the untouched baseea3c12264b. They are inherited and unrelated to this change.npm run typecheck:coreis clean. ESLint with the suppressions file and Prettier pass on the changed files. All Husky pre-commit gates passed.