Repository navigation
feat(claude): add Claude Sonnet 5.5 and correct Sonnet 5 pricing - #15035
Merged
diegosouzapw merged 1 commit intoOct 6, 2026
Merged
Conversation
ggiak
reviewed
Sep 29, 2026
ggiak
left a comment
Contributor
There was a problem hiding this comment.
🤖 Automated review — a8d8a24
5 important · 5 nits · 1 pre-existing · effort high
External facts not verifiable from the repo: the $2/$10 Sonnet 5 / 5.5 list price, and whether Sonnet 5.5 rejects
temperature/top_p/top_kand needs the 1M-context beta the way Sonnet 5 does. Please confirm these against Anthropic's docs. The findings below judge whether the repo is internally consistent with what this PR claims.
🔴 Important
open-sse/config/providers/registry/claude/index.ts:100—claude-sonnet-5-5is not added to any provider registry (claude,anthropic,vertex,vertex/partner). The sibling Opus 5.5 PR (#14546) added it to all of these.
Fails when:cc/claude-sonnet-5-5oranthropic/claude-sonnet-5-5is requested. The model is missing from/v1/modelsand the provider catalogs.getUnsupportedParams()(open-sse/config/providerRegistry.ts:261) finds nounsupportedParams, so a client-senttemperature/top_pis forwarded. Sonnet 5 lists these because the adaptive-only model returns 400 on them, and the new spec marks 5.5adaptiveThinkingOnly: truetoo. There are also nosupportedThinkingEfforts, which causes finding 2.open-sse/executors/base/reasoningEffort.ts:624— the executor sanitizer still forwardseffort: "max"for Sonnet 5.5. The model has no registrysupportedThinkingEfforts, andsupportsXHighdefaults to true, so the body is returned unchanged.supportsClaudeMaxEffortis not read on this path.
Fails when: a native Anthropic or Claude Code request withoutput_config.effort: "max"is sent toclaude-sonnet-5-5. Upstream receivesmaxand returns the 400 this PR is meant to prevent. A registry entry withsupportedThinkingEfforts: ["low","medium","high","xhigh"]would lowermaxtoxhighhere.src/shared/constants/modelSpecs.ts:408— only the exact idclaude-sonnet-5-5gets the new spec. Dated,-thinkingand dotted ids fall through to prefix matching, where the earlierclaude-sonnet-5key wins. There is also noclaude-sonnet-5.5dot alias, although 4.6 has one.
Fails when:getCanonicalModelSpecIdresolvesclaude-sonnet-5-5-20260915,claude-sonnet-5-5-thinkingandclaude-sonnet-5.5toclaude-sonnet-5(checked at the PR head).rejectsThinkingDisabledandrejectsForcedToolChoicethen never apply, sothinking: {type:"disabled"}ortool_choice: {type:"any"}passes through and upstream returns 400.src/shared/constants/pricing/frontier-labs.ts:222— noclaude-sonnet-5-5key in theanthropicDEFAULT_PRICING table, and none in thecctable inoauth-subscriptions.ts. #14546 addedclaude-opus-5-5to both.getPricingForModel(src/shared/constants/pricing.ts:18) matches exact keys only.
Fails when: usage foranthropic/claude-sonnet-5-5orcc/claude-sonnet-5-5resolves to null pricing, so it is costed at $0 unless the synced LiteLLM/models.dev layer has the model. The new test does not catch this:getModelPricing("claude", …)passes only through the genericKNOWN_MODEL_PRICINGfallback inproviderCostData.ts.src/shared/constants/pricing/oauth-subscriptions.ts:81— the Sonnet 5 price change was applied toCLAUDE_SONNET_5_PRICING(anthropic) andKNOWN_MODEL_PRICING, but thecctable still pricesclaude-sonnet-5at $3 / $15 / $0.30 cached / $3.75 cache-write.
Fails when: the same model is costed 1.5× higher throughcc/than throughanthropic/, so the dashboard shows two different Sonnet 5 prices. Other tables look consistent:devin.tsis already $2/$10,inference-hosts.ts($1.40/$7) is a host discount, and the kiro table ($3/$15, line 464) is kept on purpose per the updated test comment.
🟡 5 nits (+2 more) · 🟣 1 pre-existing
- 🟡
open-sse/translator/request/openai-to-claude.ts:224— when a model doesn't supportmax, it is lowered tohigh. Sonnet 5.5 acceptsxhigh, somaxshould becomexhigh. Fails when:reasoning_effort: "max"onclaude-sonnet-5-5goes upstream ashigh, two tiers below what was asked.claudeCodeCompatible.ts:462does the same. - 🟡
open-sse/config/providerModels.ts:330— the new pattern only matches the hyphen form, andsupportsClaudeMaxEffortdoes not turn dots into hyphens. Fails when:supportsClaudeMaxEffort("claude-sonnet-5.5")returnstrueandmaxis forwarded. - 🟡
open-sse/config/context1m.ts:17—claude-sonnet-5-5is not eligible for the 1M beta. The digit guard inmodelSupportsContext1mBetarejects it as a child ofclaude-sonnet-5, while the spec sayscontextWindow: 1000000. Fails when: aclaude-sonnet-5-5[1m]request has itscontext-1mbeta header stripped, if 5.5 needs the beta (needs confirmation). - 🟡
open-sse/services/modelFamilyFallback.ts:94— noclaude-sonnet-5-5fallback chain, and no entry insrc/lib/providers/staticModels.ts:44. #14546 added both for Opus 5.5. Fails when: a family fallback fromclaude-sonnet-5-5finds no siblings, and the static catalog does not list the model. - 🟡
src/shared/constants/modelSpecs.ts:409— the comment says "(use between_tools)", butnormalizeThinkingForModeljust deletesthinking. Fails when: a reader expects abetween_toolsrewrite that the code never does. - (+2 more nits) Adding a single model version to
CLAUDE_MAX_EFFORT_UNSUPPORTED_FAMILY_PATTERNS(meant for whole families) is the wrong level; a per-modelsupportedThinkingEffortswould cover every effort path. The four-line pricing comment atshared-tiers.ts:121repeats the values set just below it. - 🟣
open-sse/config/providers/registry/bedrock/index.ts:24— the Bedrock registry lists no Sonnet 5 at all (only 4.6 / 4.5), so Bedrock Sonnet-5-family ids never get registryunsupportedParams. This predates this PR, but #14546 had to add Bedrock sampling stripping for Opus 5.5, and Sonnet 5.5 probably needs the same.
HouMinXi
force-pushed
the
feat/sonnet-5-5
branch
from
September 29, 2026 07:49
4b30b3b to
0c41fda
Compare
Sonnet 5.5 rejects thinking.type disabled and forced tool_choice, and caps reasoning effort at xhigh. Register the model spec with those constraints so normalizeThinkingForModel and normalizeForcedToolChoiceForModel drop the rejected fields, and exclude it from the max effort tier so a max request is lowered to high. The published Sonnet 5 / 5.5 rate is $2 input, $10 output, $0.20 cache reads, $2.50 five-minute cache writes. The catalog still had the retired $3/$15 rate. Signed-off-by: Minxi Hou <houminxi@gmail.com>
HouMinXi
force-pushed
the
feat/sonnet-5-5
branch
from
September 29, 2026 07:50
0c41fda to
cdde4ae
Compare
diegosouzapw
changed the base branch from
release/v3.8.51
to
release/v3.8.52
September 29, 2026 11:17
Owner
|
Re-homed to |
diegosouzapw
merged commit Oct 6, 2026
5be6f03
into
diegosouzapw:release/v3.8.52
11 of 16 checks passed
diegosouzapw
added a commit
to backryun/OmniRoute
that referenced
this pull request
Oct 8, 2026
Resolve: keep the curated Copilot catalog and re-add the release tip's claude-sonnet-5-5 entry (diegosouzapw#15035); union the test-masking allowlist entries.
diegosouzapw
added a commit
to backryun/OmniRoute
that referenced
this pull request
Oct 8, 2026
The release tip added claude-sonnet-5-5 to the curated GitHub Copilot catalog (diegosouzapw#15035); the static fallback list must mirror it so fallback discovery keeps catalog order. Also restore the GLM-5.2 route limits the tip actually serves (128K for HF/Cloudflare/ZenMux) in the models catalog test - this PR does not change those registries. Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
This was referenced Oct 8, 2026
diegosouzapw
added a commit
that referenced
this pull request
Oct 8, 2026
Drains 9 v3.8.52 tip unit reds: 1 production fix (combo family-fallback skipped for request-scoped refusals, regression of #13603) + 8 test alignments to intentional contract changes (#15301 #15132 #15035 #15478 #15310 #15710 #15487), each annotated. Validated on a combined board with #15902 after clean npm ci: 32 previously-red files 327/329 (remaining 2 = quality-rail-gate-membership owned by #15682, and route-namespaces fixed in #15902), typecheck/open-sse/api typecheck, lint, 22 gates.
veseckytomas
added a commit
to veseckytomas/OmniRoute
that referenced
this pull request
Oct 9, 2026
Catalog-only clients (OpenCode, plain OpenAI-SDK pickers) can only select an effort level when it is advertised as a standalone model id. The gateway already accepted and dispatched `<model>-max`, but nothing enumerated it, so the top effort tier was unreachable outside Kiro's Opus 5 special case. Enumerate `-max` for every max-capable Claude model and correct the capability matrix: - claudeEffortLevelsFor() now appends `max` via supportsClaudeMaxEffort(), de-duplicating after extendCodexGpt56EffortValues() so Kiro's provider-native max is not emitted twice. - Export CLAUDE_MAX_EFFORT_LEVEL and widen ClaudeEffortVariantLevel. - Add `max` to all three sibling CLAUDE_EFFORT_SUFFIX_RE copies (kept byte-identical, still deliberately not consolidated) so a `-max` id is never double-suffixed nor combined with a no-think alias. - Drop the claude-sonnet-5-5 max exclusion (operator-verified, diegosouzapw#15035) and add an exact-boundary claude-opus-4-5 exclusion, which supports low/medium/high only. The family boundary keeps a hypothetical 4.50 eligible. The drift guard now treats `-max` as matching and keeps `-highest` non-matching; unsuffixed controls are unchanged.
veseckytomas
added a commit
to veseckytomas/OmniRoute
that referenced
this pull request
Oct 9, 2026
The previous commit enumerated `-max` for every Claude model that was not in an explicit exclusion family, which over-advertised the Sonnet 4.x line. Operator verification against Claude Code confirms `claude-sonnet-4-5` and `claude-sonnet-4-6` top out at high; a `-max` id for them would be silently downgraded by sanitizeReasoningEffortForProvider() rather than rejected, so the picker would show a tier the model never honors. Add a family-boundary `claude-sonnet-4` pattern to CLAUDE_MAX_EFFORT_UNSUPPORTED_FAMILY_PATTERNS. The boundary is deliberately narrow: Opus 4.6/4.8 are a different family and stay max-eligible, and Sonnet 5.5 remains eligible per diegosouzapw#15035. The pre-existing low/medium/high variants for Sonnet 4.x are untouched; only the max tier is withheld.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Claude Sonnet 5.5 (
claude-sonnet-5-5) shipped on 2026-09-28. A request routed to it currently fails upstream in three ways this change closes:thinking: {"type":"disabled"}is rejected. The new model spec setsrejectsThinkingDisabled, sonormalizeThinkingForModeldrops the field and the model uses its adaptive default.tool_choice(any,tool,function) returns 400.rejectsForcedToolChoicemakesnormalizeForcedToolChoiceForModeldrop it back to the default auto behavior.xhigh;maxreturns 400. The model is excluded fromsupportsClaudeMaxEffort, so amaxrequest is lowered tohigh.The published rate for Sonnet 5 and Sonnet 5.5 is $2 input, $10 output, $0.20 cache reads, and $2.50 for a five-minute cache write. The catalog still carried the retired $3/$15 rate.
reasoningis not published as its own rate; $10 follows the output price.Test plan
node --import tsx/esm --test tests/unit/claude-sonnet-5-5.test.ts— 4 passedtests/unit/catalog-updates-v3x.test.tspassed