Skip to content

feat: Claude Opus 5.5 support — catalog, request compat, prompt preset, recommended default at max - #2022

Merged
code-yeongyu merged 7 commits into
mainfrom
feat/claude-opus-5-5-support
Sep 22, 2026
Merged

code-yeongyu merged 7 commits into
mainfrom
feat/claude-opus-5-5-support

Conversation

@code-yeongyu

@code-yeongyu code-yeongyu commented Sep 22, 2026

Copy link
Copy Markdown
Owner

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: no off: null, no supportsDisabledThinking, 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.

  • Catalog (1ca1a143ae): anthropic / amazon-bedrock (global/us/eu/jp/au profiles; bare id profile-only like Opus 5) / openrouter / vercel-ai-gateway rows via one strict generate-models run. 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).
  • Runtime compat (80e450b3f5): thinking.type: disabled and forced tool_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 effort low.
  • Prompt preset (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 resolves opus-5-5 / opus-5.5 before the generic opus-5 substring. o200k probe: claude-opus-5 1899 → claude-opus-5-5 2002 tokens.
  • Defaults (fc3847bf93): RECOMMENDED_DEFAULT_MODELS carries ["claude-opus-5-5", "max"] where ["claude-opus-5", "xhigh"] was; fable-5-1 / fable-5 ladders become opus-5-5:max → opus-5:max → opus-4-8:max → opus-4-6:max; new claude-opus-5-5 ladder opus-5:max → opus-4-8:max → opus-4-6:max. Opus 5 stays selectable. Filed as a Breaking Change in packages/coding-agent/CHANGELOG.md so 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 xhighopus-5 (non-5.5) over packages/*/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"]) and docs/settings.md:86. The 6 that remain are Cursor's own catalog facts (cursor-variant-aliases.json claude-opus-5-thinking-xhigh*, cursor/model-capabilities.ts Opus 5 tiers) — Cursor's model list, not a senpi default; Cursor does not serve 5.5 yet. No shipped default carries claude-opus-5:xhigh after 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 grep claude-opus-5|Opus 5 (non-5.5) over *.md, changelogs/trackers/pico excluded — before 7, after 1. The remaining line is prompt-preset/AGENTS.md:25, the file-tree row describing claude-opus-5.ts itself (Opus 5 stays supported).

Live API evidence (model id as accepted: claude-opus-5-5)

Direct api.anthropic.com with 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.

request result
GET /v1/models/claude-opus-5-5 (server-side-fallback beta) 200: thinking.types.enabled.supported: false, adaptive: true; effort low..max; allowed_fallback_models: ["claude-opus-4-8","claude-opus-5"]
output_config.effort: low, no thinking field 200 end_turn"pong", thinking_tokens 0
tools + tool_choice: auto 200 tool_useget_weather({"city":"Paris"})
thinking: adaptive + effort: max 200 end_turn → thinking block + "pong", thinking_tokens 49
thinking: {type: disabled} refused (gateway 403 "Request not allowed"; documented Anthropic 400 "thinking.type.disabled" is not supported for this model)
tool_choice: {type: any} refused (gateway 403; documented Anthropic 400 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 off same prompt → exit 0, pong (no thinking.type.disabled 400)
  • --thinking low "use the read tool ..." → exit 0, read tool_use in the session, correct answer

RED → GREEN

  • packages/ai: 12 failing (getModel undefined) → 144 passing across 8 suites.
  • preset: 12 failing (ids resolved to claude-opus-5) → 102 passing (incl. Opus 5 exclusion, brand-identity).
  • defaults: 84 passing across 8 pinned suites.
  • bun run check exit 0 and scripts/check-pr-changelog.mjs --base origin/main PASS, both run from the worktree's canonical (symlink-resolved) path rather than through a symlinked parent, which on this machine produces false Type X is not assignable to type X errors from double-resolved package paths. Re-run them from the real path, not through a ~/local-workspaces symlink: behind the symlink TypeScript resolves every module twice and emits a wall of Type '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.tarball resolves, curl -I returns 200, size above 1 MB, tar -tzf entry count above 1000, nested @earendil-works/pi-ai present — 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.

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.
@code-yeongyu

Copy link
Copy Markdown
Owner Author

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 up from models.dev on its own, so the published package already exposes the model — with an incomplete row. Verified by downloading senpi-2026.9.22-3.tgz (HTTP 200, 44,210,616 bytes, 27,066 entries — presence precondition before reading) and reading node_modules/@earendil-works/pi-ai/dist/providers/data/:

"claude-opus-5-5": {
  "thinkingLevelMap": { "xhigh": "xhigh", "max": "max" },
  "compat": { "forceAdaptiveThinking": true, "supportsTemperature": false, "supportsStrictTools": true }
}

Missing there, added here: thinkingLevelMap.off: null and compat.supportsDisabledThinking: false (on 22-3 off is selectable, so a thinking-off turn sends thinking.type: "disabled" and the model 400s), compat.supportsMidConvoEffort: true (no per-message effort), and compat.allowedFallbackModels (no server-side refusal fallback). amazon-bedrock.json on 22-3 also carries the bare anthropic.claude-opus-5-5 id, which is inference-profile-only — this PR emits only the five profiles.

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).
@code-yeongyu
code-yeongyu merged commit 0177317 into main Sep 22, 2026
28 checks passed
@code-yeongyu
code-yeongyu deleted the feat/claude-opus-5-5-support branch September 22, 2026 18:26
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.

1 participant