feat: Claude Opus 5.5 support — catalog, request compat, prompt preset, recommended default at max - #2022
Conversation
Strict regeneration against live sources lands Claude Opus 5.5 in the anthropic, amazon-bedrock (global/us/eu/jp/au inference profiles; the bare id is profile-only like Opus 5), openrouter, and vercel-ai-gateway catalogs: 1M context, 128k output, 4/20 per MTok with 0.2 cache reads, xhigh+max, adaptive-only thinking (off is not selectable; supportsDisabledThinking false), per-message effort, and claude-opus-5 as the permitted refusal fallback (the live Models API allowlist is [opus-4-8, opus-5]; opus-4-8 drops out because a managed-effort primary needs a managed-effort target). Carries incidental upstream drift: openrouter batch-variant churn and deepseek/aion/kimi metadata refreshes.
…or Opus 5.5 Opus 5.5 returns 400 for thinking.type disabled/enabled and for tool_choice any/tool. Rows without generated compat (models.json entries, gateways, Bedrock application profiles) now match the family markers: the Messages and Bedrock providers pin effort low instead of sending a disabled block, and getAnthropicCompat defaults supportsForcedToolChoice to false for claude-opus-5-5 / claude-opus-5.5 ids.
Full-core preset on the dieted claude-opus-5 baseline with the deltas Anthropic's Opus 5.5 guide documents for coding agents: the four text-only turn endings the model must not take while work is owed and the two stops it may, explore-before-acting on loosely specified tasks, and delegation framed around elapsed time as a cost. The dotted release resolves before the generic opus-5 substring so Bedrock profiles, Vertex @default and OpenRouter's claude-opus-5.5 all reach it. o200k probe: 1899 -> 2002.
…lback ladders with it The recommended default list carries claude-opus-5-5 at max in the slot claude-opus-5 held at xhigh; the shipped fable-5-1 / fable-5 ladders now step down opus-5-5 -> opus-5 -> opus-4-8 -> opus-4-6, every rung at max, and claude-opus-5-5 gets its own same-family ladder. Opus 5 stays selectable. docs/settings.md follows for recommendedModels, promptPreset and the fallback-chain paragraph.
packages/ai: catalog rows (Added) and the disabled-thinking / forced tool_choice request fixes (Fixed); trackers in changes.md and src/changes.md. packages/coding-agent: the recommended-model and fallback-ladder swap filed as a Breaking Change so a reader asking why their default moved finds it, the new preset under Added; trackers in src/core/changes.md and src/core/extensions/builtin/changes.md.
What 2026.9.22-3 already shipped for Opus 5.5 (verified against the published tarball)The 22-3 release-bot catalog regen picked "claude-opus-5-5": {
"thinkingLevelMap": { "xhigh": "xhigh", "max": "max" },
"compat": { "forceAdaptiveThinking": true, "supportsTemperature": false, "supportsStrictTools": true }
}Missing there, added here: So 22-4 is not only "add Opus 5.5": it repairs a row users can already select on 22-3. |
A reader who selected claude-opus-5-5 on 22-3 and turned thinking off got a 400; the row also lacked per-message effort and the refusal fallback, and Bedrock listed the inference-profile-only bare id. Verified against the published tarball (HTTP 200, 44,210,616 bytes, 27,066 entries) before reading the catalog.
The partial row on 2026.9.22-3 was not the only symptom: no preset matched claude-opus-5-5, so the model ran on the generic system prompt. Verified from the published tarball (no prompt-preset file for the model).
Summary
Claude Opus 5.5 (
claude-opus-5-5, released 2026-09-22) becomes a first-class model and the recommended Opus.This is a fix release, not only a feature. 2026.9.22-3 already exposes
claude-opus-5-5— the release-bot catalog regen pulled it from models.dev — but with a partial row: nooff: null, nosupportsDisabledThinking, no per-message effort, no refusal fallback, the inference-profile-only bare id on Bedrock, and no prompt preset. A user on 22-3 who selects Opus 5.5 and turns thinking off gets a 400, and otherwise runs on the generic system prompt. See the tarball verification comment.1ca1a143ae): anthropic / amazon-bedrock (global/us/eu/jp/au profiles; bare id profile-only like Opus 5) / openrouter / vercel-ai-gateway rows via one strictgenerate-modelsrun. 1M ctx, 128k out, $4/$20 with $0.20 cache reads,xhigh+max, adaptive-only (off: null,supportsDisabledThinking: false), per-message effort,allowedFallbackModels: [claude-opus-5](live Models API allowlist is[opus-4-8, opus-5]; the generator keeps only managed-effort targets).80e450b3f5):thinking.type: disabledand forcedtool_choice(any/ named) are never sent to 5.5, on Messages and Bedrock, including rows with no generated compat (models.json / gateways). A thinking-off turn pins effortlow.5cdb43d11c):claude-opus-5-5.ts— the dieted Opus 5 core plus the coding-agent deltas from Anthropic's Opus 5.5 guide (the four text-only turn endings that count as stopping early while work is owed and the two legitimate stops; explore-before-acting on loosely specified tasks; delegation framed around elapsed time). Matcher resolvesopus-5-5/opus-5.5before the genericopus-5substring. o200k probe: claude-opus-5 1899 → claude-opus-5-5 2002 tokens.fc3847bf93):RECOMMENDED_DEFAULT_MODELScarries["claude-opus-5-5", "max"]where["claude-opus-5", "xhigh"]was; fable-5-1 / fable-5 ladders becomeopus-5-5:max → opus-5:max → opus-4-8:max → opus-4-6:max; newclaude-opus-5-5ladderopus-5:max → opus-4-8:max → opus-4-6:max. Opus 5 stays selectable. Filed as a Breaking Change inpackages/coding-agent/CHANGELOG.mdso a reader asking why their default moved finds it.Product decision (LO, this session, verbatim): "opus 5 사용하도록 되어있는거 ... 다 오푸스 5.5 로", "xhigh 쓰던 애들 다 max 리즈닝으로", "기본 추천 모델에 있어야함 ... 추천리즈닝 맥스".
xhigh → max migration (shipped defaults)
git grep xhigh∩opus-5(non-5.5) overpackages/*/src+packages/*/docs, tests/trackers/catalog excluded — before 8, after 6. The two that moved were the shipped defaults:recommended-models/index.ts:20(["claude-opus-5", "xhigh"]→["claude-opus-5-5", "max"]) anddocs/settings.md:86. The 6 that remain are Cursor's own catalog facts (cursor-variant-aliases.jsonclaude-opus-5-thinking-xhigh*,cursor/model-capabilities.tsOpus 5 tiers) — Cursor's model list, not a senpi default; Cursor does not serve 5.5 yet. No shipped default carriesclaude-opus-5:xhighafter this PR. User-config sites (defaultModel,recommendedModels,retry.fallbackChains) are untouched and get the migration note in the changelog.Docs naming Opus 5 as the pick
git grepclaude-opus-5|Opus 5(non-5.5) over*.md, changelogs/trackers/pico excluded — before 7, after 1. The remaining line isprompt-preset/AGENTS.md:25, the file-tree row describingclaude-opus-5.tsitself (Opus 5 stays supported).Live API evidence (model id as accepted:
claude-opus-5-5)Direct
api.anthropic.comwith the org key returned billing 400 on every request, so the raw shapes went through the Anthropic-Messages gateway this host uses; the negatives come from the live Models API instead.GET /v1/models/claude-opus-5-5(server-side-fallback beta)thinking.types.enabled.supported: false,adaptive: true; effort low..max;allowed_fallback_models: ["claude-opus-4-8","claude-opus-5"]output_config.effort: low, nothinkingfieldend_turn→"pong", thinking_tokens 0tools+tool_choice: autotool_use→get_weather({"city":"Paris"})thinking: adaptive+effort: maxend_turn→ thinking block +"pong", thinking_tokens 49thinking: {type: disabled}"thinking.type.disabled" is not supported for this model)tool_choice: {type: any}tool_choice: type "tool" and "any" are not supported)Headless senpi from this branch (node + tsx, sandbox agent dir, provider re-pointed at the gateway):
--model anthropic/claude-opus-5-5 --thinking max "reply with exactly: pong"→ exit 0,pong--thinking offsame prompt → exit 0,pong(nothinking.type.disabled400)--thinking low"use the read tool ..." → exit 0,readtool_use in the session, correct answerRED → GREEN
packages/ai: 12 failing (getModel undefined) → 144 passing across 8 suites.claude-opus-5) → 102 passing (incl. Opus 5 exclusion, brand-identity).bun run checkexit 0 andscripts/check-pr-changelog.mjs --base origin/mainPASS, both run from the worktree's canonical (symlink-resolved) path rather than through a symlinked parent, which on this machine produces falseType X is not assignable to type Xerrors from double-resolved package paths. Re-run them from the real path, not through a~/local-workspacessymlink: behind the symlink TypeScript resolves every module twice and emits a wall ofType 'X' is not assignable to type 'X'that is a path artifact, not a defect.Verifying the published artifact
.omo/evidence/.../verify-published-opus-5-5.mjs(kept with this run's evidence) checks a published version end to end: preconditions first —dist.tarballresolves,curl -Ireturns 200, size above 1 MB,tar -tzfentry count above 1000, nested@earendil-works/pi-aipresent — and only then the row assertions. npm metadata leads the blob by minutes, and against a 4 KB JSON error body every "X is absent" assertion passes vacuously.Control run against the known-bad 2026.9.22-3: preconditions 5/5 PASS, row assertions 6/7 FAIL, exit 1. The assertions can fail, so a pass on 22-4 will mean something.
Base:
9fff11a3c(post-22-3 stamp). Ships as senpi 2026.9.22-4 once the release lane clears.