diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f72b12b..26a48228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ This repo is a CortexKit-maintained Anthropic auth monorepo for OpenCode and Pi. ## Unreleased +- Adds Claude Fable 5.2 (`claude-fable-5-2`) on OpenCode 1, OpenCode 2 and Pi, sent the way Claude Code sends it: adaptive thinking, medium default effort, per-message effort and Anthropic's safety fallback. Fast mode stays off for Fable 5.2 until Anthropic enables it for subscription accounts. - Claude subscription requests no longer carry a `service_tier` field a host adds, keeping them in the shape Claude Code sends; API-key requests keep it. ## 2.7.3 diff --git a/packages/core/src/mid-conversation-output-config.ts b/packages/core/src/mid-conversation-output-config.ts index 748995ce..4b06bf6d 100644 --- a/packages/core/src/mid-conversation-output-config.ts +++ b/packages/core/src/mid-conversation-output-config.ts @@ -54,7 +54,7 @@ export function usesPerTurnControl(model: unknown): boolean { /** * Models whose OAuth requests carry `PER_TURN_CONTROL_BETA`: those whose - * Claude Code main beta list includes it (Opus 5.5, Sonnet 5.5, Fable 5.1 and + * Claude Code main beta list includes it (Opus 5.5, Sonnet 5.5, Fable 5.1/5.2 and * Haiku 5.5 in Claude Code 2.1.302). Sending the beta does not by itself make * a model eligible for effort markers; `supportsPerMessageEffort` decides that. */ @@ -69,7 +69,7 @@ export function sendsPerTurnControlBeta(model: unknown): boolean { /** * Whether a request may move effort changes into empty system messages. * - * Models with `effortMarkers: "always"` (Fable 5.1) are always eligible, + * Models with `effortMarkers: "always"` (Fable 5.1/5.2) are always eligible, * whatever the thinking field says. Models with `"with-adaptive-thinking"` * (Opus 5.5, Sonnet 5.5) qualify only with adaptive thinking: Anthropic * rejects a differing per-message effort with HTTP 400 on Sonnet 5.5 @@ -135,7 +135,7 @@ export function applyMidConversationOutputConfig( } const compacted = compactTransitions(transitions) - // Models with `effortMarkers: "always"` (Fable 5.1) always pin top-level + // Models with `effortMarkers: "always"` (Fable 5.1/5.2) always pin top-level // effort. The other models leave a request without an effort change exactly // as the host built it. const pinsEveryRequest = pinsEffortOnEveryRequest(body.model) diff --git a/packages/core/src/model-capabilities.ts b/packages/core/src/model-capabilities.ts index 8dccf6cc..bbc1f9ee 100644 --- a/packages/core/src/model-capabilities.ts +++ b/packages/core/src/model-capabilities.ts @@ -153,6 +153,7 @@ export type ClaudeModelCatalogue = { export type ClaudeRefusalRecoveryFamily = | 'fable-5' | 'fable-5-1' + | 'fable-5-2' | 'opus-5' | 'opus-5-5' @@ -246,6 +247,20 @@ const FABLE_MYTHOS_5_1_CATALOGUE: ClaudeModelCatalogue = { }, } +const FABLE_5_2_CATALOGUE: ClaudeModelCatalogue = { + releaseDate: '2026-11-09', + contextWindow: 1_000_000, + maxOutputTokens: 128_000, + pricing: { + input: 8, + output: 40, + // Anthropic's Claude Fable 5.2 model page lists cache reads at $0.20/M. + cacheRead: 0.2, + cacheWrite5m: 10, + cacheWrite1h: 16, + }, +} + export const CLAUDE_MODEL_CAPABILITIES: readonly ClaudeModelCapabilities[] = [ { id: 'claude-fable-5', @@ -319,6 +334,26 @@ export const CLAUDE_MODEL_CAPABILITIES: readonly ClaudeModelCapabilities[] = [ scopedQuota: 'mythos', fastMode: false, }, + { + id: 'claude-fable-5-2', + name: 'Claude Fable 5.2', + family: 'fable', + idSuffixes: 'any', + catalogue: FABLE_5_2_CATALOGUE, + thinkingModes: ['adaptive'], + rejectsForcedToolChoice: true, + efforts: { variants: ALL_ADAPTIVE_EFFORTS, default: 'medium' }, + effortMarkers: 'always', + turnEndNote: true, + thinkingBindingControls: true, + claudeCodeBetas: claudeCodeBetaLists({ perTurnControl: true }), + serverSideFallback: true, + refusalRecoveryFamily: 'fable-5-2', + scopedQuota: 'fable', + // Claude Code's runtime capability list for 5.2 lacks fast_mode today, so + // we don't send speed: fast until a real request proves subscription accounts accept it. + fastMode: false, + }, { id: 'claude-opus-5', name: 'Claude Opus 5', diff --git a/packages/core/src/models.ts b/packages/core/src/models.ts index a8bd565e..4bce6f7a 100644 --- a/packages/core/src/models.ts +++ b/packages/core/src/models.ts @@ -14,6 +14,7 @@ export { normalizeAnthropicModelId } export const CLAUDE_FABLE_5_MODEL_ID = 'claude-fable-5' export const CLAUDE_MYTHOS_5_MODEL_ID = 'claude-mythos-5' export const CLAUDE_FABLE_5_1_MODEL_ID = 'claude-fable-5-1' +export const CLAUDE_FABLE_5_2_MODEL_ID = 'claude-fable-5-2' export const CLAUDE_MYTHOS_5_1_MODEL_ID = 'claude-mythos-5-1' /** @@ -43,6 +44,7 @@ export const CLAUDE_FABLE_MYTHOS_5_MODEL_IDS = [ CLAUDE_FABLE_5_MODEL_ID, CLAUDE_MYTHOS_5_MODEL_ID, ...CLAUDE_FABLE_MYTHOS_5_1_MODEL_IDS, + CLAUDE_FABLE_5_2_MODEL_ID, ] as const export type ClaudeFableMythos5ModelId = @@ -55,9 +57,12 @@ export const CLAUDE_FABLE_MYTHOS_5_SUMMARIZED_THINKING = { const FABLE_5_CATALOGUE = getClaudeModelCatalogue(CLAUDE_FABLE_5_MODEL_ID) const FABLE_5_1_CATALOGUE = getClaudeModelCatalogue(CLAUDE_FABLE_5_1_MODEL_ID) +const FABLE_5_2_CATALOGUE = getClaudeModelCatalogue(CLAUDE_FABLE_5_2_MODEL_ID) export const CLAUDE_FABLE_MYTHOS_5_PRICING = FABLE_5_CATALOGUE.pricing export const CLAUDE_FABLE_MYTHOS_5_1_PRICING = FABLE_5_1_CATALOGUE.pricing +export const CLAUDE_FABLE_5_2_PRICING = FABLE_5_2_CATALOGUE.pricing +export const CLAUDE_FABLE_5_2_RELEASE_DATE = FABLE_5_2_CATALOGUE.releaseDate export const CLAUDE_FABLE_MYTHOS_5_CONTEXT_WINDOW = FABLE_5_CATALOGUE.contextWindow @@ -118,9 +123,11 @@ export function isClaudeFable51Model(model: unknown) { } export function getClaudeFableMythos5ReleaseDate(model: unknown) { - return isClaudeFableOrMythos51Model(model) - ? CLAUDE_FABLE_MYTHOS_5_1_RELEASE_DATE - : CLAUDE_FABLE_MYTHOS_5_RELEASE_DATE + const row = resolveClaudeModelCapabilities(model) + return ( + (isFableOrMythosRow(row) && row?.catalogue?.releaseDate) || + CLAUDE_FABLE_MYTHOS_5_RELEASE_DATE + ) } export const CLAUDE_SONNET_5_MODEL_ID = 'claude-sonnet-5' diff --git a/packages/core/src/tests/fixtures/model-capabilities-snapshot.json b/packages/core/src/tests/fixtures/model-capabilities-snapshot.json index b81d3ed8..3f2d0df4 100644 --- a/packages/core/src/tests/fixtures/model-capabilities-snapshot.json +++ b/packages/core/src/tests/fixtures/model-capabilities-snapshot.json @@ -1,6 +1,15 @@ { "catalogue": { "CLAUDE_FABLE_5_1_MODEL_ID": "claude-fable-5-1", + "CLAUDE_FABLE_5_2_MODEL_ID": "claude-fable-5-2", + "CLAUDE_FABLE_5_2_PRICING": { + "input": 8, + "output": 40, + "cacheRead": 0.2, + "cacheWrite5m": 10, + "cacheWrite1h": 16 + }, + "CLAUDE_FABLE_5_2_RELEASE_DATE": "2026-11-09", "CLAUDE_FABLE_5_MODEL_ID": "claude-fable-5", "CLAUDE_FABLE_MYTHOS_5_1_MODEL_IDS": [ "claude-fable-5-1", @@ -31,7 +40,8 @@ "claude-fable-5", "claude-mythos-5", "claude-fable-5-1", - "claude-mythos-5-1" + "claude-mythos-5-1", + "claude-fable-5-2" ], "CLAUDE_FABLE_MYTHOS_5_MODEL_SPECS": { "claude-fable-5": { @@ -51,6 +61,10 @@ "id": "claude-mythos-5-1", "name": "Claude Mythos 5.1", "limited": true + }, + "claude-fable-5-2": { + "id": "claude-fable-5-2", + "name": "Claude Fable 5.2" } }, "CLAUDE_FABLE_MYTHOS_5_PRICING": { @@ -1123,6 +1137,628 @@ "withoutReplayableThinking": false } }, + "claude-fable-5-2": { + "normalized": "claude-fable-5-2", + "predicates": { + "isClaudeFable51Model": false, + "isClaudeFableOrMythos51Model": false, + "isClaudeFableOrMythos5Model": true, + "isClaudeHaiku55Model": false, + "isClaudeOpus55Model": false, + "isClaudeOpus5FamilyModel": false, + "isClaudeOpus5Model": false, + "isClaudeSonnet55Model": false, + "isClaudeSonnet5Model": false, + "isOpenAIReasoningSignature": false + }, + "fableMythosReleaseDate": "2026-11-09", + "fastMode": false, + "stickyRouteFamily": "fable", + "nativeQuotaScope": "fable", + "betas": { + "main": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "mainWithNoteStructuredFastAndExtra": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,structured-outputs-2025-12-15,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,extra-beta-2026-01-01", + "title": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07", + "titleStructured": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,structured-outputs-2025-12-15,cache-diagnosis-2026-04-07", + "quota": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01", + "quotaWithNote": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-system-clear-at-2026-08-21" + }, + "effort": { + "sendsPerTurnControlBeta": true, + "usesPerTurnControl": false, + "defaultAdaptiveEffort": "medium", + "supportsPerMessageEffort": { + "adaptive": true, + "disabled": true, + "between_tools": true, + "absent": true + }, + "midConversation": { + "adaptive/none/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/none/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "xhigh" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/single/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/single/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/change/noConfig": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "adaptive/change/xhigh": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "absent/none/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/none/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "xhigh" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/single/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/single/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/change/noConfig": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "absent/change/xhigh": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + } + } + }, + "turnEndNote": { + "supportsTurnEndNote": true, + "inserted": 1, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null, + "text": true + }, + "assistant", + "user" + ] + }, + "thinkingBinding": { + "account-default/adaptive": { + "applied": false, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "account-default/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "account-default/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "account-default/absent": { + "applied": false, + "thinking": null + }, + "error/adaptive": { + "applied": true, + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "error" + } + } + }, + "error/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "error/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "error/absent": { + "applied": false, + "thinking": null + }, + "drop_block/adaptive": { + "applied": true, + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + } + }, + "drop_block/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "drop_block/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "drop_block/absent": { + "applied": false, + "thinking": null + }, + "withoutReplayableThinking": false + } + }, + "claude-fable-5-2-20261109[1m]": { + "normalized": "claude-fable-5-2-20261109", + "predicates": { + "isClaudeFable51Model": false, + "isClaudeFableOrMythos51Model": false, + "isClaudeFableOrMythos5Model": true, + "isClaudeHaiku55Model": false, + "isClaudeOpus55Model": false, + "isClaudeOpus5FamilyModel": false, + "isClaudeOpus5Model": false, + "isClaudeSonnet55Model": false, + "isClaudeSonnet5Model": false, + "isOpenAIReasoningSignature": false + }, + "fableMythosReleaseDate": "2026-11-09", + "fastMode": false, + "stickyRouteFamily": "fable", + "nativeQuotaScope": "fable", + "betas": { + "main": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "mainWithNoteStructuredFastAndExtra": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,structured-outputs-2025-12-15,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,extra-beta-2026-01-01", + "title": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07", + "titleStructured": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,structured-outputs-2025-12-15,cache-diagnosis-2026-04-07", + "quota": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01", + "quotaWithNote": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-system-clear-at-2026-08-21" + }, + "effort": { + "sendsPerTurnControlBeta": true, + "usesPerTurnControl": false, + "defaultAdaptiveEffort": "medium", + "supportsPerMessageEffort": { + "adaptive": true, + "disabled": true, + "between_tools": true, + "absent": true + }, + "midConversation": { + "adaptive/none/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/none/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "xhigh" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/single/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/single/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "adaptive/change/noConfig": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "adaptive/change/xhigh": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "absent/none/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/none/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "xhigh" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/single/noConfig": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/single/xhigh": { + "result": { + "applied": true, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user", "assistant", "user", "assistant", "user"] + }, + "absent/change/noConfig": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + }, + "absent/change/xhigh": { + "result": { + "applied": true, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + }, + "text": false + }, + "user" + ] + } + } + }, + "turnEndNote": { + "supportsTurnEndNote": true, + "inserted": 1, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null, + "text": true + }, + "assistant", + "user" + ] + }, + "thinkingBinding": { + "account-default/adaptive": { + "applied": false, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "account-default/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "account-default/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "account-default/absent": { + "applied": false, + "thinking": null + }, + "error/adaptive": { + "applied": true, + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "error" + } + } + }, + "error/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "error/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "error/absent": { + "applied": false, + "thinking": null + }, + "drop_block/adaptive": { + "applied": true, + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + } + }, + "drop_block/disabled": { + "applied": false, + "thinking": { + "type": "disabled" + } + }, + "drop_block/between_tools": { + "applied": false, + "thinking": { + "type": "between_tools" + } + }, + "drop_block/absent": { + "applied": false, + "thinking": null + }, + "withoutReplayableThinking": false + } + }, "claude-opus-5": { "normalized": "claude-opus-5", "predicates": { diff --git a/packages/core/src/tests/model-capabilities-snapshot.test.ts b/packages/core/src/tests/model-capabilities-snapshot.test.ts index 8a908470..73976826 100644 --- a/packages/core/src/tests/model-capabilities-snapshot.test.ts +++ b/packages/core/src/tests/model-capabilities-snapshot.test.ts @@ -38,6 +38,8 @@ const PROBE_MODELS = [ 'claude-mythos-5', 'claude-fable-5-1', 'claude-mythos-5-1', + 'claude-fable-5-2', + 'claude-fable-5-2-20261109[1m]', 'claude-opus-5', 'claude-opus-5-5', 'claude-sonnet-5', diff --git a/packages/core/src/tests/model-capabilities.test.ts b/packages/core/src/tests/model-capabilities.test.ts index c3da3496..dd2d18d3 100644 --- a/packages/core/src/tests/model-capabilities.test.ts +++ b/packages/core/src/tests/model-capabilities.test.ts @@ -21,6 +21,40 @@ const snapshot = JSON.parse( ) as { models: Record } describe('model capability table', () => { + test('Fable 5.2 resolves ahead of the Fable 5 prefix, including suffixed ids', () => { + for (const id of ['claude-fable-5-2', 'claude-fable-5-2-20261109[1m]']) { + expect(resolveClaudeModelCapabilities(id)).toMatchObject({ + id: 'claude-fable-5-2', + name: 'Claude Fable 5.2', + thinkingModes: ['adaptive'], + rejectsForcedToolChoice: true, + efforts: { + variants: ['low', 'medium', 'high', 'xhigh', 'max'], + default: 'medium', + }, + effortMarkers: 'always', + turnEndNote: true, + thinkingBindingControls: true, + serverSideFallback: true, + refusalRecoveryFamily: 'fable-5-2', + scopedQuota: 'fable', + fastMode: false, + catalogue: { + releaseDate: '2026-11-09', + contextWindow: 1_000_000, + maxOutputTokens: 128_000, + pricing: { + input: 8, + output: 40, + cacheRead: 0.2, + cacheWrite5m: 10, + cacheWrite1h: 16, + }, + }, + }) + } + }) + test('ids are unique', () => { const ids = CLAUDE_MODEL_CAPABILITIES.map((row) => row.id) expect(new Set(ids).size).toBe(ids.length) diff --git a/packages/core/src/tests/models.test.ts b/packages/core/src/tests/models.test.ts index 98b5c1bd..e148a1de 100644 --- a/packages/core/src/tests/models.test.ts +++ b/packages/core/src/tests/models.test.ts @@ -1,4 +1,6 @@ import { describe, expect, test } from 'bun:test' +import * as models from '../models' + import { CLAUDE_FABLE_5_1_MODEL_ID, CLAUDE_FABLE_MYTHOS_5_1_MODEL_IDS, @@ -31,6 +33,26 @@ import { normalizeAnthropicModelId, } from '../models' +test('Fable 5.2 has independent pricing, registration and release date aliases', () => { + expect(models.CLAUDE_FABLE_5_2_MODEL_ID).toBe('claude-fable-5-2') + expect(models.CLAUDE_FABLE_5_2_PRICING).toEqual({ + input: 8, + output: 40, + cacheRead: 0.2, + cacheWrite5m: 10, + cacheWrite1h: 16, + }) + expect(models.CLAUDE_FABLE_5_2_PRICING).not.toBe( + models.CLAUDE_FABLE_MYTHOS_5_1_PRICING, + ) + expect(models.CLAUDE_FABLE_5_2_RELEASE_DATE).toBe('2026-11-09') + expect(models.CLAUDE_FABLE_MYTHOS_5_MODEL_IDS).toContain('claude-fable-5-2') + expect( + models.getClaudeFableMythos5ReleaseDate('claude-fable-5-2-20261109[1m]'), + ).toBe('2026-11-09') + expect(models.isClaudeFable51Model('claude-fable-5-2')).toBe(false) +}) + describe('Claude Fable/Mythos 5.1 models', () => { test('exposes both 5.1 model ids and complete specs', () => { expect(CLAUDE_FABLE_5_1_MODEL_ID).toBe('claude-fable-5-1') diff --git a/packages/opencode/src/effort-history.ts b/packages/opencode/src/effort-history.ts index 66042df2..da1c4754 100644 --- a/packages/opencode/src/effort-history.ts +++ b/packages/opencode/src/effort-history.ts @@ -113,14 +113,14 @@ function isRecord(value: unknown): value is Record { /** * Group a model id into the per-message-effort family whose user turns share - * one effort timeline. Every model that takes effort markers (Fable 5.1, + * one effort timeline. Every model that takes effort markers (Fable 5.1/5.2, * Opus 5.5 and Sonnet 5.5) is its own family, and turns sent to a different * family in the same session are left out: an Opus 5.5 timeline never counts - * Sonnet 5.5 or Fable 5.1 turns, and the reverse. + * Sonnet 5.5 or Fable 5.1/5.2 turns, and the reverse. */ function perMessageEffortFamily(model: unknown): string | undefined { // Models whose capability row allows effort markers; the family is the - // row's id without its `claude-` prefix, such as `fable-5-1`. + // row's id without its `claude-` prefix, such as `fable-5-2`. const capabilities = resolveClaudeModelCapabilities(model) if (!capabilities || capabilities.effortMarkers === 'none') return undefined return capabilities.id.replace(/^claude-/, '') @@ -899,7 +899,7 @@ export function applyOpenCodeEffortMarkers( 'Per-message effort marker request plan mismatch', ) } - // Only models with `effortMarkers: "always"` (Fable 5.1) pin top-level + // Only models with `effortMarkers: "always"` (Fable 5.1/5.2) pin top-level // effort on a request without surviving markers; the other models keep // the host's request unchanged here. if (enabled && pinsEffortOnEveryRequest(body.model)) { @@ -1097,7 +1097,7 @@ export function applyOpenCodeEffortMarkers( rewritten.push(message.value) } body.messages = rewritten - // Models with `effortMarkers: "always"` (Fable 5.1) always pin the earliest + // Models with `effortMarkers: "always"` (Fable 5.1/5.2) always pin the earliest // effort. The other models change top-level effort only when a marker // carries the later effort. if (applyConfig && (inserted > 0 || pinsEffortOnEveryRequest(body.model))) { diff --git a/packages/opencode/src/fable-fallback.ts b/packages/opencode/src/fable-fallback.ts index f6f16a6a..396de3cf 100644 --- a/packages/opencode/src/fable-fallback.ts +++ b/packages/opencode/src/fable-fallback.ts @@ -33,6 +33,7 @@ export function parseSourceWarmTargetId( if ( family !== 'fable-5' && family !== 'fable-5-1' && + family !== 'fable-5-2' && family !== 'opus-5' && family !== 'opus-5-5' ) { @@ -112,7 +113,7 @@ type FableFallbackState = { /** * Models whose content-filter refusal we recover from by downgrading to Opus 4.8 * for a bounded window: capability rows with a `refusalRecoveryFamily` (Fable 5, - * Fable 5.1, Opus 5 and Opus 5.5). Each has a separate source family because + * Fable 5.1, Fable 5.2, Opus 5 and Opus 5.5). Each has a separate source family because * recovery state must not cross-contaminate distinct requested models. All use * Anthropic's `claude-opus-4-8` fallback for the same classifier refusal shape * and recovery period. Mythos has no classifiers and Sonnet 5 is not flagged — diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 00005a71..1ae15452 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -913,6 +913,8 @@ function buildRestoredNotice(modelId: string): string { } function fallbackModelLabel(modelId: string): string { + const row = resolveClaudeModelCapabilities(modelId) + if (row?.id === 'claude-fable-5-2') return row.name.replace(/^Claude /, '') if (isClaudeOpus55Model(modelId)) return 'Opus 5.5' if (isClaudeOpus5Model(modelId)) return 'Opus 5' if (isClaudeFableOrMythos51Model(modelId)) { diff --git a/packages/opencode/src/sidebar-state.ts b/packages/opencode/src/sidebar-state.ts index 30b3c98c..72379026 100644 --- a/packages/opencode/src/sidebar-state.ts +++ b/packages/opencode/src/sidebar-state.ts @@ -137,6 +137,7 @@ import { logger, quotaDisplayProjection, quotaWindowParts, + resolveClaudeModelCapabilities, } from '@cortexkit/anthropic-auth-core' const STATE_FILE_ENV = 'OPENCODE_ANTHROPIC_AUTH_SIDEBAR_STATE_FILE' @@ -859,11 +860,13 @@ export function resolveActiveAccount(state: SidebarState): { } /** - * Pretty label for a recoverable-refusal source model (Fable 5/5.1 or Opus 5). + * Pretty label for a recoverable-refusal source model (Fable or Opus). * Falls back to the raw id for unrecognized ids so the sidebar never goes * blank on a future model that has not yet been cataloged here. */ export function formatFallbackModelLabel(modelId: string | undefined): string { + const row = resolveClaudeModelCapabilities(modelId) + if (row?.id === 'claude-fable-5-2') return row.name.replace(/^Claude /, '') if ( modelId === 'claude-mythos-5-1' || modelId?.startsWith('claude-mythos-5-1-') diff --git a/packages/opencode/src/tests/existing-model-compatibility.test.ts b/packages/opencode/src/tests/existing-model-compatibility.test.ts new file mode 100644 index 00000000..bf521685 --- /dev/null +++ b/packages/opencode/src/tests/existing-model-compatibility.test.ts @@ -0,0 +1,59 @@ +import { expect, test } from 'bun:test' +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { + CLAUDE_MODEL_CAPABILITIES, + resolveClaudeModelCapabilities, + selectClaudeCodeBetas, +} from '@cortexkit/anthropic-auth-core' +import { SERVER_SIDE_FALLBACK_BETA } from '../server-fallback' +import { rewriteRequestBody } from '../transform' + +// Captured before adding Fable 5.2. Keep every existing row's resolved facts, +// request bodies and beta ordering byte-identical when adding the new model. +const snapshotPath = join( + import.meta.dir, + 'fixtures', + 'pre-fable-5-2-models.json', +) + +test('existing model capabilities, request bodies and betas stay byte-identical', async () => { + const rendered: Record = {} + for (const row of CLAUDE_MODEL_CAPABILITIES) { + if (row.id === 'claude-fable-5-2') continue + const requests: Record = {} + for (const thinking of [ + undefined, + { type: 'adaptive', display: 'summarized' }, + { type: 'disabled' }, + ]) { + const body = JSON.parse( + await rewriteRequestBody( + JSON.stringify({ + model: row.id, + max_tokens: 32_000, + messages: [{ role: 'user', content: 'Hello' }], + thinking, + tool_choice: { type: 'any' }, + }), + { serverSideFallbackEnabled: true, fastModeEnabled: true }, + ), + ) + requests[thinking?.type ?? 'absent'] = { + body, + betas: selectClaudeCodeBetas( + body, + body.fallbacks ? [SERVER_SIDE_FALLBACK_BETA] : [], + ), + auxiliaryBetas: selectClaudeCodeBetas(body, [], 'auxiliary'), + } + } + rendered[row.id] = { + capabilities: resolveClaudeModelCapabilities(row.id), + requests, + } + } + const serialized = `${JSON.stringify(rendered, null, 2)}\n` + const recorded = JSON.parse(readFileSync(snapshotPath, 'utf8')) + expect(serialized).toBe(`${JSON.stringify(recorded, null, 2)}\n`) +}) diff --git a/packages/opencode/src/tests/fable-fallback.test.ts b/packages/opencode/src/tests/fable-fallback.test.ts index 1c46b958..be398c24 100644 --- a/packages/opencode/src/tests/fable-fallback.test.ts +++ b/packages/opencode/src/tests/fable-fallback.test.ts @@ -5,6 +5,7 @@ import { FableFallbackManager, type FableSourceWarmInit, parseSourceWarmTargetId, + recoverableRefusalFamily, sourceWarmTargetId, } from '../fable-fallback' import { createStrippedStream } from '../transform' @@ -536,6 +537,38 @@ describe('FableFallbackManager — Opus 5 recovery parity', () => { }) }) +test('tracks Fable 5.2 recovery independently from Fable 5.1 in the same session', () => { + expect(recoverableRefusalFamily('claude-fable-5-2')).toBe('fable-5-2') + expect(parseSourceWarmTargetId('source-warm:session-a:fable-5-2')).toEqual({ + sessionId: 'session-a', + family: 'fable-5-2', + }) + const manager = new FableFallbackManager() + manager.activate( + manager.plan('session-a', body('claude-fable-5-1'))!, + '5.1-account', + ) + const healthy52 = manager.plan('session-a', body('claude-fable-5-2'))! + expect(healthy52).toMatchObject({ + effectiveModel: 'claude-fable-5-2', + downgraded: false, + }) + manager.activate(healthy52, '5.2-account') + const recovered51 = manager.plan('session-a', body('claude-fable-5-1'))! + const recovered52 = manager.plan('session-a', body('claude-fable-5-2'))! + expect(recovered51).toMatchObject({ + effectiveModel: FABLE_FALLBACK_MODEL_ID, + cacheAccountId: '5.1-account', + downgraded: true, + }) + expect(recovered52).toMatchObject({ + effectiveModel: FABLE_FALLBACK_MODEL_ID, + cacheAccountId: '5.2-account', + downgraded: true, + }) + expect(recovered51.cycle).not.toBe(recovered52.cycle) +}) + test('tracks Opus 5.5 recovery independently from Opus 5 in the same session', () => { const manager = new FableFallbackManager() const opus5 = manager.plan('session-a', body('claude-opus-5'))! diff --git a/packages/opencode/src/tests/fixtures/opencode-model-capabilities-snapshot.json b/packages/opencode/src/tests/fixtures/opencode-model-capabilities-snapshot.json index b421efe5..535274a0 100644 --- a/packages/opencode/src/tests/fixtures/opencode-model-capabilities-snapshot.json +++ b/packages/opencode/src/tests/fixtures/opencode-model-capabilities-snapshot.json @@ -534,6 +534,412 @@ } } }, + "claude-fable-5-2": { + "recoverableRefusalFamily": "fable-5-2", + "isRecoverableRefusalModel": true, + "serverSideFallback": { + "enabled": true, + "fallbacks": "default", + "notRequestedFallbacks": null + }, + "nativeVariants": ["custom", "low", "medium", "high", "xhigh", "max"], + "rewrite": { + "plain": { + "model": "claude-fable-5-2", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": null, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "adaptiveForcedTool": { + "model": "claude-fable-5-2", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "max" + }, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "disabledXhigh": { + "model": "claude-fable-5-2", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "xhigh" + }, + "fallbacks": "default", + "temperature": 0.5, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "betweenToolsMax": { + "model": "claude-fable-5-2", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "max" + }, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "budget": { + "model": "claude-fable-5-2", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": null, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + } + }, + "effortMarkers": { + "single": { + "plan": { + "baseline": "low", + "markerCount": 0 + }, + "result": { + "found": 0, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user"] + }, + "single_default": { + "plan": { + "baseline": "medium", + "markerCount": 0 + }, + "result": { + "found": 0, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user"] + }, + "change": { + "plan": { + "baseline": "low", + "markerCount": 1 + }, + "result": { + "found": 1, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + } + }, + "user" + ] + } + } + }, + "claude-fable-5-2-20261109[1m]": { + "recoverableRefusalFamily": "fable-5-2", + "isRecoverableRefusalModel": true, + "serverSideFallback": { + "enabled": true, + "fallbacks": "default", + "notRequestedFallbacks": null + }, + "nativeVariants": ["custom", "low", "medium", "high", "xhigh", "max"], + "rewrite": { + "plain": { + "model": "claude-fable-5-2-20261109[1m]", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": null, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "adaptiveForcedTool": { + "model": "claude-fable-5-2-20261109[1m]", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "max" + }, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "disabledXhigh": { + "model": "claude-fable-5-2-20261109[1m]", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "xhigh" + }, + "fallbacks": "default", + "temperature": 0.5, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "betweenToolsMax": { + "model": "claude-fable-5-2-20261109[1m]", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": { + "effort": "max" + }, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + }, + "budget": { + "model": "claude-fable-5-2-20261109[1m]", + "thinking": { + "type": "adaptive", + "display": "summarized", + "block_binding": { + "prefix_mismatch_behavior": "drop_block" + } + }, + "tool_choice": null, + "output_config": null, + "fallbacks": "default", + "temperature": null, + "messages": [ + "user", + "assistant", + "user", + { + "role": "system", + "clear_at": "next_user_message", + "output_config": null + }, + "assistant", + "user" + ] + } + }, + "effortMarkers": { + "single": { + "plan": { + "baseline": "low", + "markerCount": 0 + }, + "result": { + "found": 0, + "inserted": 0 + }, + "output_config": { + "effort": "low" + }, + "messages": ["user"] + }, + "single_default": { + "plan": { + "baseline": "medium", + "markerCount": 0 + }, + "result": { + "found": 0, + "inserted": 0 + }, + "output_config": { + "effort": "medium" + }, + "messages": ["user"] + }, + "change": { + "plan": { + "baseline": "low", + "markerCount": 1 + }, + "result": { + "found": 1, + "inserted": 1 + }, + "output_config": { + "effort": "low" + }, + "messages": [ + "user", + "assistant", + { + "role": "system", + "clear_at": null, + "output_config": { + "effort": "max" + } + }, + "user" + ] + } + } + }, "claude-opus-5": { "recoverableRefusalFamily": "opus-5", "isRecoverableRefusalModel": true, diff --git a/packages/opencode/src/tests/fixtures/pre-fable-5-2-models.json b/packages/opencode/src/tests/fixtures/pre-fable-5-2-models.json new file mode 100644 index 00000000..2f76702d --- /dev/null +++ b/packages/opencode/src/tests/fixtures/pre-fable-5-2-models.json @@ -0,0 +1,1460 @@ +{ + "claude-fable-5": { + "capabilities": { + "id": "claude-fable-5", + "name": "Claude Fable 5", + "family": "fable", + "idSuffixes": "any", + "catalogue": { + "releaseDate": "2026-06-09", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 10, + "output": 50, + "cacheRead": 1, + "cacheWrite5m": 12.5, + "cacheWrite1h": 20 + } + }, + "thinkingModes": ["adaptive"], + "rejectsForcedToolChoice": false, + "efforts": { + "default": "high" + }, + "effortMarkers": "none", + "turnEndNote": false, + "thinkingBindingControls": false, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05" + ] + }, + "serverSideFallback": true, + "refusalRecoveryFamily": "fable-5", + "scopedQuota": "fable", + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-fable-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=26e9c;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-fable-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=26e9c;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-fable-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=26e9c;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-mythos-5": { + "capabilities": { + "id": "claude-mythos-5", + "name": "Claude Mythos 5", + "family": "mythos", + "idSuffixes": "any", + "limited": true, + "catalogue": { + "releaseDate": "2026-06-09", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 10, + "output": 50, + "cacheRead": 1, + "cacheWrite5m": 12.5, + "cacheWrite1h": 20 + } + }, + "thinkingModes": ["adaptive"], + "rejectsForcedToolChoice": false, + "efforts": { + "default": "high" + }, + "effortMarkers": "none", + "turnEndNote": false, + "thinkingBindingControls": false, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05" + ] + }, + "serverSideFallback": false, + "scopedQuota": "mythos", + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-mythos-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-mythos-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-mythos-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-fable-5-1": { + "capabilities": { + "id": "claude-fable-5-1", + "name": "Claude Fable 5.1", + "family": "fable", + "idSuffixes": "any", + "catalogue": { + "releaseDate": "2026-09-01", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 10, + "output": 50, + "cacheRead": 0.25, + "cacheWrite5m": 12.5, + "cacheWrite1h": 20 + } + }, + "thinkingModes": ["adaptive"], + "rejectsForcedToolChoice": true, + "efforts": { + "variants": ["low", "medium", "high", "xhigh", "max"], + "default": "high" + }, + "effortMarkers": "always", + "turnEndNote": true, + "thinkingBindingControls": true, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01" + ] + }, + "serverSideFallback": true, + "refusalRecoveryFamily": "fable-5-1", + "scopedQuota": "fable", + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-fable-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=8c24e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-fable-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=8c24e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-fable-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=8c24e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-mythos-5-1": { + "capabilities": { + "id": "claude-mythos-5-1", + "name": "Claude Mythos 5.1", + "family": "mythos", + "idSuffixes": "any", + "limited": true, + "catalogue": { + "releaseDate": "2026-09-01", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 10, + "output": 50, + "cacheRead": 0.25, + "cacheWrite5m": 12.5, + "cacheWrite1h": 20 + } + }, + "thinkingModes": ["adaptive"], + "rejectsForcedToolChoice": true, + "efforts": { + "default": "high" + }, + "effortMarkers": "none", + "turnEndNote": false, + "thinkingBindingControls": false, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05" + ] + }, + "serverSideFallback": false, + "scopedQuota": "mythos", + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-mythos-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=dbbd0;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-mythos-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=dbbd0;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-mythos-5-1", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=dbbd0;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-opus-5": { + "capabilities": { + "id": "claude-opus-5", + "name": "Claude Opus 5", + "family": "opus", + "idSuffixes": "any", + "thinkingModes": ["adaptive", "disabled"], + "rejectsForcedToolChoice": false, + "efforts": { + "variants": ["low", "medium", "high", "xhigh", "max"], + "default": "high" + }, + "effortMarkers": "none", + "turnEndNote": false, + "thinkingBindingControls": false, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05" + ] + }, + "serverSideFallback": true, + "refusalRecoveryFamily": "opus-5", + "fastMode": true + }, + "requests": { + "absent": { + "body": { + "model": "claude-opus-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=a4525;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + }, + "adaptive": { + "body": { + "model": "claude-opus-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=a4525;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + }, + "disabled": { + "body": { + "model": "claude-opus-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=1acd6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "disabled" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + } + } + }, + "claude-opus-5-5": { + "capabilities": { + "id": "claude-opus-5-5", + "name": "Claude Opus 5.5", + "family": "opus", + "idSuffixes": "any", + "catalogue": { + "releaseDate": "2026-09-18", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 4, + "output": 20, + "cacheRead": 0.2, + "cacheWrite5m": 5, + "cacheWrite1h": 8 + } + }, + "thinkingModes": ["adaptive"], + "rejectsForcedToolChoice": true, + "efforts": { + "variants": ["low", "medium", "high", "xhigh", "max"], + "default": "medium" + }, + "effortMarkers": "with-adaptive-thinking", + "turnEndNote": true, + "thinkingBindingControls": true, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01" + ] + }, + "serverSideFallback": true, + "refusalRecoveryFamily": "opus-5-5", + "fastMode": true + }, + "requests": { + "absent": { + "body": { + "model": "claude-opus-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=1e52e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + }, + "adaptive": { + "body": { + "model": "claude-opus-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=1e52e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + }, + "disabled": { + "body": { + "model": "claude-opus-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=1e52e;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + }, + "speed": "fast", + "fallbacks": "default" + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07,fast-mode-2026-02-01,server-side-fallback-2026-07-01", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07,fast-mode-2026-02-01" + } + } + }, + "claude-sonnet-5": { + "capabilities": { + "id": "claude-sonnet-5", + "name": "Claude Sonnet 5", + "family": "sonnet", + "idSuffixes": "any", + "thinkingModes": ["adaptive", "disabled"], + "rejectsForcedToolChoice": false, + "efforts": { + "default": "high" + }, + "effortMarkers": "none", + "turnEndNote": false, + "thinkingBindingControls": false, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05" + ] + }, + "serverSideFallback": false, + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-sonnet-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-sonnet-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-sonnet-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=81454;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "disabled" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-sonnet-5-5": { + "capabilities": { + "id": "claude-sonnet-5-5", + "name": "Claude Sonnet 5.5", + "family": "sonnet", + "idSuffixes": "any", + "catalogue": { + "releaseDate": "2026-09-28", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 2, + "output": 10, + "cacheRead": 0.2, + "cacheWrite5m": 2.5, + "cacheWrite1h": 4 + } + }, + "thinkingModes": ["adaptive", "between_tools"], + "rejectsForcedToolChoice": true, + "efforts": { + "variants": ["low", "medium", "high", "xhigh", "max"], + "default": "high" + }, + "effortMarkers": "with-adaptive-thinking", + "turnEndNote": true, + "thinkingBindingControls": true, + "claudeCodeBetas": { + "main": [ + "claude-code-20250219", + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01" + ] + }, + "serverSideFallback": false, + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-sonnet-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=dbbd0;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-sonnet-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=dbbd0;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-sonnet-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=32910;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "max_tokens": 32000, + "thinking": { + "type": "between_tools" + } + }, + "betas": "claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + }, + "claude-haiku-5-5": { + "capabilities": { + "id": "claude-haiku-5-5", + "name": "Claude Haiku 5.5", + "family": "haiku", + "idSuffixes": "dated", + "catalogue": { + "releaseDate": "2026-10-07", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "pricing": { + "input": 0.1, + "output": 0.5, + "cacheRead": 0.01, + "cacheWrite5m": 0.125, + "cacheWrite1h": 0.2 + }, + "longContext": { + "inputTokensAbove": 100000, + "pricing": { + "input": 0.5, + "output": 2.5, + "cacheRead": 0.05, + "cacheWrite5m": 0.625, + "cacheWrite1h": 1 + } + } + }, + "thinkingModes": ["adaptive", "disabled"], + "rejectsForcedToolChoice": false, + "efforts": { + "variants": ["low", "medium", "high", "xhigh", "max"], + "default": "medium" + }, + "effortMarkers": "none", + "turnEndNote": true, + "thinkingBindingControls": true, + "claudeCodeBetas": { + "main": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "claude-code-20250219", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "advanced-tool-use-2025-11-20", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "thinking-binding-controls-2026-08-01", + "thinking-display-updates-2026-08-18", + "extended-cache-ttl-2025-04-11", + "cache-diagnosis-2026-04-07" + ], + "title": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01", + "mid-conversation-tool-changes-2026-07-01", + "mid-conversation-system-clear-at-2026-08-21", + "effort-2025-11-24", + "cache-diagnosis-2026-04-07" + ], + "quota": [ + "oauth-2025-04-20", + "interleaved-thinking-2025-05-14", + "redact-thinking-2026-02-12", + "thinking-token-count-2026-05-13", + "context-management-2025-06-27", + "prompt-caching-scope-2026-01-05", + "per-turn-control-2026-07-01" + ] + }, + "serverSideFallback": false, + "fastMode": false + }, + "requests": { + "absent": { + "body": { + "model": "claude-haiku-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,claude-code-20250219,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "adaptive": { + "body": { + "model": "claude-haiku-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=752b6;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "adaptive", + "display": "summarized" + } + }, + "betas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,claude-code-20250219,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + }, + "disabled": { + "body": { + "model": "claude-haiku-5-5", + "messages": [ + { + "role": "user", + "content": "Hello" + } + ], + "system": [ + { + "type": "text", + "text": "x-anthropic-billing-header: cc_version=2.1.302.804; cc_entrypoint=cli; cch=81454;" + }, + { + "type": "text", + "text": "You are Claude Code, Anthropic's official CLI for Claude." + } + ], + "tool_choice": { + "type": "any" + }, + "max_tokens": 32000, + "thinking": { + "type": "disabled" + } + }, + "betas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,claude-code-20250219,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,advanced-tool-use-2025-11-20,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,thinking-binding-controls-2026-08-01,thinking-display-updates-2026-08-18,extended-cache-ttl-2025-04-11,cache-diagnosis-2026-04-07", + "auxiliaryBetas": "oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,thinking-token-count-2026-05-13,context-management-2025-06-27,prompt-caching-scope-2026-01-05,per-turn-control-2026-07-01,mid-conversation-tool-changes-2026-07-01,mid-conversation-system-clear-at-2026-08-21,effort-2025-11-24,cache-diagnosis-2026-04-07" + } + } + } +} diff --git a/packages/opencode/src/tests/opencode-model-capabilities-snapshot.test.ts b/packages/opencode/src/tests/opencode-model-capabilities-snapshot.test.ts index 77bbc6c2..c1a3817f 100644 --- a/packages/opencode/src/tests/opencode-model-capabilities-snapshot.test.ts +++ b/packages/opencode/src/tests/opencode-model-capabilities-snapshot.test.ts @@ -32,6 +32,8 @@ const PROBE_MODELS = [ 'claude-mythos-5', 'claude-fable-5-1', 'claude-mythos-5-1', + 'claude-fable-5-2', + 'claude-fable-5-2-20261109[1m]', 'claude-opus-5', 'claude-opus-5-5', 'claude-sonnet-5', diff --git a/packages/opencode/src/tests/opencode2-adapter.test.ts b/packages/opencode/src/tests/opencode2-adapter.test.ts index d3df14c6..ba2ca4fd 100644 --- a/packages/opencode/src/tests/opencode2-adapter.test.ts +++ b/packages/opencode/src/tests/opencode2-adapter.test.ts @@ -28,7 +28,11 @@ import type { RequestScope, } from '@cortexkit/common-auth/opencode2' import { BILLING_LINEAGE_REQUEST_HEADER } from '../billing-lineage' -import { EFFORT_PLAN_REQUEST_HEADER } from '../effort-history' +import { + EFFORT_PLAN_REQUEST_HEADER, + encodeOpenCodeEffortPlan, + markOpenCodeEffortTransitions, +} from '../effort-history' import { LANE_START_REQUEST_HEADER } from '../lane-start' import { SERVER_FALLBACK_MARKER_TEXT, @@ -750,6 +754,38 @@ describe('OpenCode 2 native Anthropic adapter: request shape', () => { expect(await signRequestBody(tampered)).not.toBe(tampered) }) + test('Fable 5.2 uses adaptive thinking and default medium effort on OC2', async () => { + const plan = markOpenCodeEffortTransitions([ + { + info: { + id: 'u1', + sessionID: 'ses_fable52', + role: 'user', + model: { providerID: 'anthropic', modelID: 'claude-fable-5-2' }, + }, + parts: [{ type: 'text', text: 'Hello' }], + }, + ])! + expect(plan?.baseline).toBe('medium') + const { source } = makeSource({ + options: { + midConversationEffortEnabled: true, + midConversationEffortPlan: encodeOpenCodeEffortPlan(plan), + fastModeEnabled: true, + }, + }) + const host = new Host(createNativeAnthropicAdapter({ source }).adapter) + const { final } = await host.run( + scopeOf({ modelID: 'claude-fable-5-2' }), + hostRequest({ ...opus55Payload(), model: 'claude-fable-5-2' }), + ) + const body = await bodyOf(final) + expect(body.tool_choice).toBeUndefined() + expect(body.thinking).toEqual({ type: 'adaptive', display: 'summarized' }) + expect(body.output_config).toEqual({ effort: 'medium' }) + expect(body.speed).toBeUndefined() + }) + test('Opus 5.5 drops the forced tool choice and keeps adaptive thinking', async () => { const { source } = makeSource() const host = new Host(createNativeAnthropicAdapter({ source }).adapter) diff --git a/packages/opencode/src/tests/opencode2-models.test.ts b/packages/opencode/src/tests/opencode2-models.test.ts new file mode 100644 index 00000000..9bc47105 --- /dev/null +++ b/packages/opencode/src/tests/opencode2-models.test.ts @@ -0,0 +1,38 @@ +import { expect, test } from 'bun:test' +import { createNativeClaudeModelRules } from '../v2/models' + +test.each(['claude-fable-5-2', 'claude-fable-5-2-20261109'])( + 'OC2 adds adaptive effort variants to host catalogue model %s', + (modelID) => { + const candidate = { + id: `anthropic/${modelID}`, + modelID, + variants: [{ id: 'custom', settings: { effort: 'low' } }], + } + const rules = createNativeClaudeModelRules() + rules.install({ + model: { + transform: (apply: (editor: unknown) => void) => + apply({ + list: () => [candidate], + update: ( + _provider: string, + _id: string, + mutate: (model: typeof candidate) => void, + ) => mutate(candidate), + }), + }, + } as never) + expect(rules.modelId(candidate.id)).toBe(modelID) + expect(candidate.variants).toEqual([ + { id: 'custom', settings: { effort: 'low' } }, + ...['low', 'medium', 'high', 'xhigh', 'max'].map((effort) => ({ + id: effort, + settings: { + effort, + thinking: { type: 'adaptive', display: 'summarized' }, + }, + })), + ]) + }, +) diff --git a/packages/opencode/src/tests/plugin-auth-contract.integration.test.ts b/packages/opencode/src/tests/plugin-auth-contract.integration.test.ts index 0670ac89..3ec96cf4 100644 --- a/packages/opencode/src/tests/plugin-auth-contract.integration.test.ts +++ b/packages/opencode/src/tests/plugin-auth-contract.integration.test.ts @@ -629,6 +629,39 @@ describe('auth.methods', () => { }) describe('provider.models', () => { + test('registers Fable 5.2 on OC1 with its own price, limits and release date', async () => { + const plugin = await getPlugin() + const result = await plugin.provider?.models?.( + { + models: { + 'claude-opus-4-8': { + id: 'claude-opus-4-8', + api: { + id: 'claude-opus-4-8', + type: 'aisdk', + package: '@ai-sdk/anthropic', + }, + }, + }, + } as never, + { auth: { type: 'api' } } as never, + ) + expect(result?.['claude-fable-5-2']).toMatchObject({ + name: 'Claude Fable 5.2', + api: { id: 'claude-fable-5-2' }, + cost: { input: 8, output: 40, cache: { read: 0.2, write: 10 } }, + limit: { context: 1_000_000, output: 128_000 }, + release_date: '2026-11-09', + }) + expect(Object.keys(result?.['claude-fable-5-2']?.variants ?? {})).toEqual([ + 'low', + 'medium', + 'high', + 'xhigh', + 'max', + ]) + }) + beforeEach(async () => { await useTempAccountFile(createFallbackStorage({ accounts: [] })) }) diff --git a/packages/opencode/src/tests/refusal-and-server-fallback.integration.test.ts b/packages/opencode/src/tests/refusal-and-server-fallback.integration.test.ts index 11510676..996b2d63 100644 --- a/packages/opencode/src/tests/refusal-and-server-fallback.integration.test.ts +++ b/packages/opencode/src/tests/refusal-and-server-fallback.integration.test.ts @@ -156,7 +156,8 @@ describe('auth.loader', () => { expect(responseText).toContain(SERVER_FALLBACK_SIGNATURE_PREFIX) }) - test('uses Anthropic server-side fallback for Fable 5.1 and reports transitions', async () => { + const assertServerFallbackTransitions = async (modelId: string) => { + const label = modelId === 'claude-fable-5-2' ? 'Fable 5.2' : 'Fable 5.1' delete process.env.OPENCODE_ANTHROPIC_AUTH_FALLBACK_MODE await useTempAccountFile( createFallbackStorage({ @@ -179,7 +180,7 @@ describe('auth.loader', () => { index: 0, content_block: { type: 'fallback', - from: { model: 'claude-fable-5-1' }, + from: { model: modelId }, to: { model: 'claude-opus-5' }, }, }), @@ -203,7 +204,7 @@ describe('auth.loader', () => { iterations: [ { type: 'message', - model: 'claude-fable-5-1', + model: modelId, input_tokens: 100, output_tokens: 0, }, @@ -221,7 +222,7 @@ describe('auth.loader', () => { const restoredSse = [ frame('message_start', { type: 'message_start', - message: { id: 'msg_restored', model: 'claude-fable-5-1' }, + message: { id: 'msg_restored', model: modelId }, }), frame('content_block_start', { type: 'content_block_start', @@ -242,7 +243,7 @@ describe('auth.loader', () => { iterations: [ { type: 'message', - model: 'claude-fable-5-1', + model: modelId, input_tokens: 100, output_tokens: 2, }, @@ -282,7 +283,7 @@ describe('auth.loader', () => { agent: 'Alfonso - CTO', model: { providerID: 'anthropic', - modelID: 'claude-fable-5-1', + modelID: modelId, variant: 'xhigh', }, }, @@ -293,7 +294,7 @@ describe('auth.loader', () => { role: 'assistant', agent: 'Alfonso - CTO', providerID: 'anthropic', - modelID: 'claude-fable-5-1', + modelID: modelId, variant: 'xhigh', }, }, @@ -313,7 +314,7 @@ describe('auth.loader', () => { method: 'POST', headers: { 'x-session-affinity': 'ses_server_fallback' }, body: JSON.stringify({ - model: 'claude-fable-5-1', + model: modelId, stream: true, messages: [{ role: 'user', content: 'hello' }], }), @@ -337,7 +338,7 @@ describe('auth.loader', () => { ), ) expect(switched.fableRecoveries?.[0]).toMatchObject({ - requestedModelId: 'claude-fable-5-1', + requestedModelId: modelId, targetModelId: 'claude-opus-5', remaining: 0, }) @@ -398,7 +399,9 @@ describe('auth.loader', () => { noReply: true, parts: [ expect.objectContaining({ - text: expect.stringContaining('Anthropic safety fallback'), + text: expect.stringContaining( + `Anthropic safety fallback active: ${label} → Opus 5`, + ), }), ], }), @@ -474,9 +477,7 @@ describe('auth.loader', () => { ), ), ) - expect(restored.fableRecoveries?.[0]?.requestedModelId).toBe( - 'claude-fable-5-1', - ) + expect(restored.fableRecoveries?.[0]?.requestedModelId).toBe(modelId) await plugin.event?.({ event: { type: 'session.idle', @@ -495,7 +496,7 @@ describe('auth.loader', () => { body: expect.objectContaining({ parts: [ expect.objectContaining({ - text: expect.stringContaining('Returning to Fable 5.1'), + text: expect.stringContaining(`Returning to ${label}`), }), ], }), @@ -593,7 +594,7 @@ describe('auth.loader', () => { body: expect.objectContaining({ parts: [ expect.objectContaining({ - text: expect.stringContaining('Returning to Fable 5.1'), + text: expect.stringContaining(`Returning to ${label}`), }), ], }), @@ -628,7 +629,11 @@ describe('auth.loader', () => { }) await waitForMockCall(mockClient.session.promptAsync) expect(mockClient.session.promptAsync).toHaveBeenCalledTimes(1) - }) + } + test.each(['claude-fable-5-1', 'claude-fable-5-2'])( + 'uses Anthropic server-side fallback for %s and reports transitions', + assertServerFallbackTransitions, + ) test('downgrades a filtered Fable session for ten completed Opus responses without source warms', async () => { await useTempAccountFile( diff --git a/packages/opencode/src/tests/sidebar-state.test.ts b/packages/opencode/src/tests/sidebar-state.test.ts index a5aae0c7..baad37b1 100644 --- a/packages/opencode/src/tests/sidebar-state.test.ts +++ b/packages/opencode/src/tests/sidebar-state.test.ts @@ -389,6 +389,12 @@ describe('getFableRecoverySummary', () => { }) describe('formatFallbackModelLabel', () => { + test('formats Fable 5.2 ahead of the generic Fable 5 prefix', () => { + expect(formatFallbackModelLabel('claude-fable-5-2')).toBe('Fable 5.2') + expect(formatFallbackModelLabel('claude-fable-5-2-20261109')).toBe( + 'Fable 5.2', + ) + }) test('formats Fable 5 ids', () => { expect(formatFallbackModelLabel('claude-fable-5')).toBe('Fable 5') expect(formatFallbackModelLabel('claude-fable-5-20260608')).toBe('Fable 5') diff --git a/packages/opencode/src/tests/transform.test.ts b/packages/opencode/src/tests/transform.test.ts index 5ac4fdf9..916da31a 100644 --- a/packages/opencode/src/tests/transform.test.ts +++ b/packages/opencode/src/tests/transform.test.ts @@ -451,6 +451,63 @@ describe('mergeBetaHeaders', () => { }) describe('setOAuthHeaders', () => { + test('Fable 5.2 OAuth uses medium adaptive thinking, 5.1 betas and safety fallback but never speed', async () => { + const request = (model: string) => { + const plan = markOpenCodeEffortTransitions([ + { + info: { + id: 'u1', + sessionID: 'ses_fable52', + role: 'user', + model: { providerID: 'anthropic', modelID: model }, + }, + parts: [{ type: 'text', text: 'Hello' }], + }, + ])! + if (model === 'claude-fable-5-2') expect(plan?.baseline).toBe('medium') + return rewriteRequestBody( + JSON.stringify({ + model, + max_tokens: 128_000, + messages: [{ role: 'user', content: 'Hello' }], + thinking: { type: 'disabled' }, + tool_choice: { type: 'any' }, + speed: 'fast', + }), + { + isOAuth: true, + fastModeEnabled: true, + serverSideFallbackEnabled: true, + midConversationEffortEnabled: true, + midConversationEffortPlan: encodeOpenCodeEffortPlan(plan), + }, + ) + } + const body = JSON.parse(await request('claude-fable-5-2')) + const previous = JSON.parse(await request('claude-fable-5-1')) + expect(body.thinking).toEqual({ type: 'adaptive', display: 'summarized' }) + expect(body.output_config).toEqual({ effort: 'medium' }) + expect(body.fallbacks).toBe('default') + expect(body.speed).toBeUndefined() + expect(body.tool_choice).toBeUndefined() + const headers = new Headers() + const previousHeaders = new Headers() + setOAuthHeaders(headers, 'token', { body }) + setOAuthHeaders(previousHeaders, 'token', { body: previous }) + expect(headers.get('anthropic-beta')).toBe( + previousHeaders.get('anthropic-beta'), + ) + expect(headers.get('anthropic-beta')?.split(',')).toContain( + PER_TURN_CONTROL_BETA, + ) + expect(headers.get('anthropic-beta')?.split(',')).toContain( + SERVER_SIDE_FALLBACK_BETA, + ) + expect(headers.get('anthropic-beta')?.split(',')).not.toContain( + FAST_MODE_BETA, + ) + }) + test('sets authorization bearer token', () => { const headers = new Headers() setOAuthHeaders(headers, 'my-token') diff --git a/packages/pi/src/index.ts b/packages/pi/src/index.ts index f1520162..bcd0e0ff 100644 --- a/packages/pi/src/index.ts +++ b/packages/pi/src/index.ts @@ -136,7 +136,7 @@ export default async function cortexKitPiAnthropicAuth( } } // This hook collects effort history for the per-message effort markers - // that core adds to Fable 5.1, Opus 5.5 and Sonnet 5.5 requests. A host + // that core adds to Fable 5.1/5.2, Opus 5.5 and Sonnet 5.5 requests. A host // whose session entries do not match what this reads must cost the // session its transitions and nothing else: the handler runs before every // turn, and an exception here surfaced as a per-turn extension error while diff --git a/packages/pi/src/stream.ts b/packages/pi/src/stream.ts index bd3dbfc9..d66168ef 100644 --- a/packages/pi/src/stream.ts +++ b/packages/pi/src/stream.ts @@ -375,7 +375,7 @@ function getPiCacheKeepRegistry() { * betas this body needs. Model requests and CacheKeep prewarms both call it: * a prewarm replays a model request's body, and Anthropic needs the same * betas to accept it (for example, the effort beta for the empty - * `role: "system"` effort markers in a Fable 5.1 body). `leadingBetas` appends + * `role: "system"` effort markers in a Fable 5.1/5.2 body). `leadingBetas` appends * adapter-requested feature betas without changing Core's model-beta selection. */ function applyPiOAuthRequestHeaders( diff --git a/packages/pi/src/tests/index.test.ts b/packages/pi/src/tests/index.test.ts index 362d9ee6..d01d762d 100644 --- a/packages/pi/src/tests/index.test.ts +++ b/packages/pi/src/tests/index.test.ts @@ -190,6 +190,23 @@ describe('cortexKitPiAnthropicAuth provider registration', () => { }) }) + test('exposes Claude Fable 5.2 with its own price and limits in Pi', async () => { + const { pi, providers } = mockPi() + await cortexKitPiAnthropicAuth(pi) + expect(providers.get('anthropic')?.models).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: 'claude-fable-5-2', + name: 'Claude Fable 5.2', + reasoning: true, + cost: { input: 8, output: 40, cacheRead: 0.2, cacheWrite: 10 }, + contextWindow: 1_000_000, + maxTokens: 128_000, + }), + ]), + ) + }) + test('exposes Claude Fable and Mythos 5.1 in the Pi Anthropic catalog', async () => { const { pi, providers } = mockPi()