Skip to content

feat(providers): add Claude Opus 5.5 support - #14546

Merged
diegosouzapw merged 9 commits into
diegosouzapw:release/v3.8.52from
ggiak:feat/claude-opus-5-5
Oct 7, 2026
Merged

diegosouzapw merged 9 commits into
diegosouzapw:release/v3.8.52from
ggiak:feat/claude-opus-5-5

Conversation

@ggiak

@ggiak ggiak commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Refs #14612 — covers the first ask (add claude-opus-5-5 to 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:

Opus 5.5 API behavior What the spec does
thinking.type:"disabled" returns 400 at every effort (Opus 5 allowed it up to high) Sets rejectsThinkingDisabled, so normalizeThinkingForModel drops the field. Does not set maxEffortWhenThinkingDisabled.
budget_tokens / type:"enabled" returns 400 Sets adaptiveThinkingOnly, so normalizeClaudeAdaptiveThinking collapses them to adaptive.
Forced tool_choice (any / tool) returns 400 Sets rejectsForcedToolChoice, so normalizeForcedToolChoiceForModel relaxes it and keeps the tools.
1M context is native Added to CONTEXT_1M_NATIVE_MODELS. The claude-opus-5- prefix match there doesn't cover -5-5, so an explicit entry is needed. The context-1m beta is not forwarded.
Sampling params are rejected temperature / top_p / top_k go into unsupportedParams on anthropic and claude.

Other changes:

  • Family fallback goes claude-opus-5-5 → claude-opus-5 → claude-opus-4-8 → claude-sonnet-5.
  • Added to the Fast Mode default model lists (claudeFastMode.ts and the settings default). Fast mode is available on the Claude API for Opus 5.5.
  • Added to Claude OAuth static discovery. It is listed after claude-opus-5 in the claude registry, so getClaudeCodeDefaultModels().opus (the CLI-tool cc/ Opus default, ANTHROPIC_DEFAULT_OPUS_MODEL) stays claude-opus-5. claude/anthropic validate against an authoritative live catalog, and a connection synced before the launch returns model_not_found for claude-opus-5-5 until its models are refreshed. A test pins this default.
  • Default reasoning effort is medium (defaultReasoningEffort). A client-chosen effort still wins. Ported from [defer] fix(providers): declare claude-opus-5 thinking efforts in claude registry #14548.
  • Added a >= 2.1.280 floor 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.
  • Pruned one stale no-unused-vars suppression for vertex/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_20260801 requirement (OmniRoute doesn't translate computer-use tool versions).

Operator note

Existing claude / anthropic connections need a models refresh (provider page → refresh models) before claude-opus-5-5 routes. Until then the live catalog rejects it with model_not_found.

Credits

Validation

  • New test tests/unit/claude-opus-5-5.test.ts covers 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 the medium effort default.
    • Before the change: 6/7 failed ("anthropic must expose claude-opus-5-5", …). After: 9/9 pass. The effort-default test failed before the spec field was added.
  • claude-codex-identity-version-sync: 8/8 pass, including the new >= 2.1.280 floor test.
  • Ran the 117 existing unit test files that reference these catalogs, specs, pricing, fallback or fast mode: 1234/1242 pass on this branch.
    • pricing-fallback pinned the KNOWN_MODEL_PRICING size (21). Updated it to 22 for the new row.
    • 2 tests/unit/autoCombo/* files are Vitest suites. Run under vitest.mcp.config.ts they pass (21/21).
    • The remaining 5 failures (chatcore-translation-paths Codex/DeepSeek ×4, qwen38-max-bare-id-alias ×1) fail identically on the untouched base ea3c12264b. They are inherited and unrelated to this change.
  • npm run typecheck:core is clean. ESLint with the suppressions file and Prettier pass on the changed files. All Husky pre-commit gates passed.

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
ggiak requested a review from diegosouzapw as a code owner September 22, 2026 18:37

@ggiak ggiak left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Automated review — 5f0ef1c

2 important · 5 nits · 2 pre-existing · effort high

🔴 Important

  1. open-sse/config/providers/registry/bedrock/index.ts:24: the Bedrock anthropic.claude-opus-5-5 entry has no unsupportedParams. The claude entry at open-sse/config/providers/registry/claude/index.ts:59 strips temperature/top_p/top_k; the Bedrock one does not.
    Fails when: a client sends {model:"bedrock/anthropic.claude-opus-5-5", temperature:0.7}. getUnsupportedParams returns [], openAIToBedrockConverse sets inferenceConfig.temperature, and Bedrock rejects the request with a 400.
  2. 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 sends claude-opus-5.5 with thinking:{type:"disabled"} or a forced tool_choice. The prefix match 'claude-opus-5.5'.startsWith('claude-opus-5') picks the Opus 5 spec, so rejectsThinkingDisabled/rejectsForcedToolChoice never 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 bare claude-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 so ANTHROPIC_DEFAULT_OPUS_MODEL, now resolves to cc/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 new claude-opus-5-5 entry is redundant. shouldRequestClaudeFastMode already prefix-matches claude-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 default claudeFastMode.supportedModels is a hand-copied duplicate of CLAUDE_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 advertises supportedThinkingEfforts, but the Bedrock Converse translator never maps reasoning_effort into additionalModelRequestFields. The Opus 5 entry has the same gap.
    Fails when: a client picks effort max for bedrock/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.
@ggiak

ggiak commented Sep 22, 2026

Copy link
Copy Markdown
Contributor Author

Addressed in f76f105:

  • Bedrock sampling params (important): anthropic.claude-opus-5-5 now declares unsupportedParams: ["temperature", "top_p", "top_k"]. The test now includes a Bedrock row. Before the fix, getUnsupportedParams("bedrock", …) returned []. The anthropic.claude-fable-5-1 entry has the same gap on the base; I left it out of this PR.
  • claude-opus-5.5 dot notation (important): the Opus 5.5 spec now has a claude-opus-5.5 alias, so that ID no longer prefix-matches the Opus 5 spec. modelHasNativeContext1m also normalizes dotted versions (5.5 → 5-5) before matching. I didn't add a dotted entry to CONTEXT_1M_NATIVE_MODELS because claude-context-1m-supported-models requires every entry there to match a registry ID. New assertions check the spec identity, the disabled-thinking drop and native 1M for the dotted ID.
  • Fast-mode test: it now calls shouldRequestClaudeFastMode with the toggle on and off, and with a narrowed supportedModels, instead of just checking list membership.
  • Opus default order: this is intended, and the PR description says so. The claude registry lists newest models first, as getClaudeCodeDefaultModels expects.
  • Not changed here: Bedrock pricing falls back to $5/$15 for every Bedrock Claude model, and the Converse translator never maps reasoning_effort. Both predate this PR. Also not changed: the duplicated settings.ts fast-mode default, which is a separate refactor. The tests that assert unverified surfaces don't expose Opus 5.5 stay, mirroring the Fable 5.1 test, so any follow-up that adds a catalog has to change them on purpose.

Focused test: 7/7. Related unit tests (115 files): 1235/1240. The 5 failures are the same ones that fail on the base ea3c12264b.

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.
@ggiak

ggiak commented Sep 22, 2026

Copy link
Copy Markdown
Contributor Author

Added 785b5ce: bump the Claude Code wire identity from 2.1.258 to 2.1.280. The Claude OAuth path rejected Opus 5.5 with 400 Claude Code 2.1.258 does not support this model; version 2.1.280 or newer is required. This follows the same steps as #12604.

  • Captured values: taken from the real 2.1.280 CLI through a loopback listener (authorization redacted). The UA is claude-cli/2.1.280 (external, sdk-cli) and the billing header is cc_version=2.1.280.d7b. X-Stainless-Package-Version 0.112.1 and runtime v26.3.0 are unchanged.
  • Tests first: I moved the drift-guard tests to the new values before bumping the constant. They failed against the old pin (10 failures), and all 156 guard/golden tests pass now.
  • Golden snapshot: only the six User-Agent lines changed. A full UPDATE_GOLDEN=1 regen would also rewrite a DeepSeek entry that has already drifted on the base, so I left that out.
  • Devin bridge: the Docker pin stays at 2.1.258 until someone live-validates it.

@diegosouzapw

Copy link
Copy Markdown
Owner

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: d7b is correct. The 2.1.280 binary computes the suffix per request as sha256("59cf53e54c78" + chars[4,7,20] + version)[:3], which gives 1e2 for 2.1.258 and d7b for 2.1.280 on a short first message. Pricing, 1M context and the thinking/tool_choice flags also match the launch docs.

One thing before merge: claude/anthropic use an authoritative live catalog, so a connection synced in the last 30 days still returns model_not_found for claude-opus-5-5 until it's refreshed (we reproduced it). Since this PR also makes Opus 5.5 the cc/ Opus default, please either keep claude-opus-5 as the CLI default for now, or note the "refresh models" step in the PR body and changelog. Please also reference the issue as Refs #14612 (its second ask, operator-defined models, isn't covered here).

We'd also like to fold in #14557's ≥2.1.280 floor assertion and #14548's defaultReasoningEffort: "medium", with co-author credit to both authors.

ggiak and others added 4 commits September 23, 2026 20:25
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>
@ggiak

ggiak commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @diegosouzapw, all four are in (head 7f2eecc):

Focused suites pass: claude-opus-5-5 9/9, claude-codex-identity-version-sync 8/8, claude-cli-defaults. The DeepSeek/Codex/Qwen failures listed in the PR body are unchanged. The provider translate-path golden snapshot also fails, only on DeepSeek's endpoint format. This branch doesn't touch that, but I haven't re-run it on the base.

HouMinXi added a commit to HouMinXi/OmniRoute that referenced this pull request Sep 24, 2026
…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>
@HouMinXi

Copy link
Copy Markdown
Contributor

Heads-up on scope so we don't collide: I've narrowed #14548 to only the part this PR doesn't cover — claude-opus-5 (not 5.5) gains supportsReasoning + supportedThinkingEfforts: ["low", "medium", "high", "xhigh", "max"] in the claude registry.

Why that entry needs it: the catalog calls getThinkingCapabilityFields(..., skipCanonicalEffortFallback=true) for static registry models (src/app/api/v1/models/catalog.ts:730), so when the registry entry declares no tier list the model gets no effort_tiers in /v1/models at all — the canonical fallback is deliberately skipped there. claude-opus-5's modelSpec has supportsThinking: true, but its registry entry never declared the tiers, so the static catalog exposes the model without thinking tiers. Your new claude-opus-5-5 entry declares them, so 5.5 is covered here.

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 claude-opus-5-5 or modelSpecs.ts, and it keeps your defaultReasoningEffort: "medium" credit intact by simply not duplicating it.

HouMinXi added a commit to HouMinXi/OmniRoute that referenced this pull request Sep 24, 2026
…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>
HouMinXi added a commit to HouMinXi/OmniRoute that referenced this pull request Sep 24, 2026
…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>
HouMinXi added a commit to HouMinXi/OmniRoute that referenced this pull request Sep 24, 2026
…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>
@diegosouzapw diegosouzapw changed the title feat(providers): add Claude Opus 5.5 support [defer] feat(providers): add Claude Opus 5.5 support Sep 25, 2026
@diegosouzapw diegosouzapw added the deferred-v3.8.52 Grande demais / suspeito para o lote atual; precisa de sessão dedicada no ciclo v3.8.52 label Sep 25, 2026
fouadSalkini added a commit to fouadSalkini/OmniRoute that referenced this pull request Sep 26, 2026
…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.
diegosouzapw pushed a commit that referenced this pull request Sep 29, 2026
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!
@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.51 to release/v3.8.52 September 29, 2026 11:21
@diegosouzapw

Copy link
Copy Markdown
Owner

Re-homed to release/v3.8.52: v3.8.51 entered its release freeze, so the branch now belongs to the release captain and development continues on the next cycle. Nothing is wrong with this PR — it just needed a live base. No action needed from you; CI will re-run against the new base.

@diegosouzapw diegosouzapw removed the deferred-v3.8.52 Grande demais / suspeito para o lote atual; precisa de sessão dedicada no ciclo v3.8.52 label Oct 1, 2026
@diegosouzapw diegosouzapw changed the title [defer] feat(providers): add Claude Opus 5.5 support feat(providers): add Claude Opus 5.5 support Oct 1, 2026
@HouMinXi

HouMinXi commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

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>
@diegosouzapw
diegosouzapw merged commit 56424dd into diegosouzapw:release/v3.8.52 Oct 7, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants