The essentials in one table
Fable 5.2 uses the same Messages API as other recent Claude models, with strict rules. Most 400 errors seen during a migration come from the rows below.
| Item | On Fable 5.2 | What fails |
|---|---|---|
model | claude-fable-5-2 on every platform except Amazon Bedrock: anthropic.claude-fable-5-2. | — |
thinking | Omit it, or send {"type": "adaptive"}. Adaptive thinking is always on. | 400 disabled, enabled with budget_tokens, between_tools. |
output_config.effort | low, medium, high (default), xhigh, max. The main control for depth, latency and cost. | adaptive is not an effort level. Effort belongs in output_config. |
temperature, top_p, top_k | Omit them. | 400 any non-default value. top_p defaults to 0.99, so top_p: 1 fails, as does sending temperature and top_p together. With API version 2026-10-21, any value fails. |
tool_choice | auto (default) or none. | 400 any and tool, token counting included. |
| Prefill | Not allowed. Shape the answer through the system prompt. | 400 a final assistant message. |
messages history | Append-only: system and tools frozen, assistant turns sent back unchanged. | 400 a thinking block placed after an edit, on every account. |
max_tokens | Generous, up to 128,000: thinking counts against it. The SDKs require streaming above 21,333. | Too low: a max_tokens stop after the thinking, before any text. |
stop_reason | Check for "refusal" before reading content. | A refusal is an HTTP 200: error-based monitoring never sees it. |
| Data retention | 30 days required (Fable 5.2 is a "Covered Model"). | 400 invalid_request_error for an organization or workspace on ZDR, unless Anthropic expressly authorizes it. |
| Computer use | The computer_toolset_20260801 toolset. | 400 computer_20251124, except on Amazon Bedrock. |
| Advisor tool beta | Advisor claude-fable-5-2 or claude-mythos-5-2. | 400 any other advisor. |
| Structured outputs | Available, except in CMEK organizations (customer-managed encryption keys). | Under CMEK, strict: true and output_config.format are unavailable: validate the output in your code. |
First call
The useful minimum: the model, a comfortable max_tokens, an explicit effort, and refusal handling before reading the text.
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY
message = client.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
output_config={"effort": "high"},
messages=[{"role": "user", "content": "Hello, Claude"}],
)
if message.stop_reason == "refusal":
details = message.stop_details
print("Refusal:", details.category if details else None)
else:
# Thinking blocks come first: select by type.
print("".join(b.text for b in message.content if b.type == "text"))curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2026-10-21" \
-H "content-type: application/json" \
-d '{
"model": "claude-fable-5-2",
"max_tokens": 16000,
"output_config": {"effort": "high"},
"messages": [{"role": "user", "content": "Hello, Claude"}]
}'Spec sheet
Fable 5.2 targets agent sessions that run for hours, deep multi-step research and analysis carried through to the final deliverable. Claude Mythos 5.2 offers the same capabilities, specs and pricing, but only to organizations verified through an Anthropic program such as the Cyber Verification Program.
Against the 5.5 models
| Model | Context | Max output | Price / MTok | Latency | Thinking | Default effort |
|---|---|---|---|---|---|---|
| Claude Fable 5.2 | 1M | 128k | $8 / $40 | Moderate | Adaptive, always on | high |
| Claude Opus 5.5 | 1M | 128k | $4 / $20 | Moderate | Adaptive, always on | medium |
| Claude Sonnet 5.5 | 1M | 128k | $2 / $10 | Fast | Adaptive | high |
| Claude Haiku 5.5 | 1M | 128k | from $0.10 / $0.50 | Fastest | Adaptive | medium |
US dollars, input / output. All four models have reliable knowledge through June 2026. The previous generation, Fable 5.1, cost $10 / $50.
Model IDs by platform
| Platform | Model ID |
|---|---|
| Claude API | claude-fable-5-2 |
| Claude Platform on AWS | claude-fable-5-2 |
| Claude Models on Google Cloud (Anthropic managed) | claude-fable-5-2 |
| Claude Models on Google Cloud (Google managed) | claude-fable-5-2 |
| Microsoft Foundry | claude-fable-5-2 (Anthropic-hosted deployments; fast mode: the claude-fable-5-2-fast deployment) |
| Amazon Bedrock | anthropic.claude-fable-5-2 |
Pricing
| Item | Price / MTok | Good to know |
|---|---|---|
| Input | $8 | Fable 5.1: $10. |
| Output | $40 | Includes all thinking, even when hidden. Fable 5.1: $50. |
| Cache write, 5 min | $10 | Caching starts at 512 tokens. |
| Cache write, 1 h | $16 | |
| Cache read | $0.20 | Fable 5.1: $0.25. Fable 5: $1. |
| Batch API | −50% | On input and output. |
| Fast mode (Claude API) | $16 / $80 | Input / output, with speed: "fast". No beta header needed. |
Availability and limits
- Released November 9, 2026, status active. Retirement not before November 9, 2027.
- Its own rate limit, separate from the combined limit shared by Fable 5.1 and Fable 5. Against Opus 5.5, token limits are lower at every tier. Check them before moving traffic.
- 30-day data retention required. No ZDR without Anthropic's express authorization; an organization on ZDR can configure retention for a specific workspace.
- No Priority Tier. If you have a Priority Tier commitment, plan capacity separately.
- Fast mode on the Claude API, on Google Cloud (Anthropic managed and Google managed, with Google's pricing in the latter) and on Microsoft Foundry through the
claude-fable-5-2-fastdeployment, withoutspeed. Removespeed: "fast"in Managed Agents. - The Models API exposes the model's limits and capabilities, for example whether a given
thinkingvalue is accepted.
Features by platform
| Feature | Claude API | Platform on AWS | Google Cloud (Anthropic) | Google Cloud (Google) | Bedrock | Foundry |
|---|---|---|---|---|---|---|
| Fable 5.2 | yes | yes | yes | yes | yes | yes |
| Per-message effort beta | yes | yes | yes | yes | yes ¹ | — |
display: "updates" beta | yes | yes | yes | yes ² | yes ² | yes ² |
| Server-side fallback beta | yes | — | yes | — | — | — |
| SDK fallback middleware | yes | yes | yes | yes | yes | yes |
| Fast mode | yes | — | yes | yes ³ | — | yes ⁴ |
¹ With the InvokeModel API, the beta value goes in the body's anthropic_beta array. ² The beta header travels through the platform's own mechanism. ³ Pricing set by Google Cloud. ⁴ Through the claude-fable-5-2-fast deployment. "—": not listed in the pages consulted.
Estimate a workload's cost
Starting values: a made-up example of an agentic coding turn that rereads a lot of cached context. Replace them with your own numbers (the usage of your responses).
Claude API pricing. The saving compares cache reads with the same volume billed as input. In this estimate the Batch discount applies only to input and output; see the Pricing page for how it combines with caching.
Adaptive thinking
Fable 5.2 thinks before answering when the task calls for it. You cannot turn that thinking off: you set its depth with effort and its visibility with display.
What each thinking value does
| Value sent | Result on Fable 5.2 |
|---|---|
| Field absent | ok Adaptive thinking. |
{"type": "adaptive"} | ok Adaptive thinking (equivalent). |
{"type": "enabled", "budget_tokens": N} | 400 Manual extended thinking no longer exists on this model. |
{"type": "between_tools"} | 400 Claude Sonnet 5.5 only. |
{"type": "disabled"} | 400 At every effort level. |
What you see: display
display | Reasoning blocks | Progress updates | Typical use |
|---|---|---|---|
"omitted" (default) | Empty thinking field | Empty field | The UI does not show thinking. When streaming, the first text token arrives sooner. |
"summarized" | Readable summary | Summary, indistinguishable from reasoning | Inspecting the reasoning, tuning a prompt. |
"updates" beta | Empty field | Short summary | Agent UI that shows one status line per step. Header thinking-display-updates-2026-08-18. |
Things to remember
- Thinking is billed as output tokens, whatever
displaysays. Hiding it lowers latency, not cost. With"summarized", you pay for all the thinking, not just the summary. - It counts against
max_tokens, along with the answer text.max_tokensis the only hard limit; effort is a hint. - You never see the raw chain of thought. A block's text is a summary, written by a different model from the one you call.
- Each block carries a
signature, encrypted and opaque. Do not parse it. Send blocks back unchanged, including when thethinkingfield is empty: any text you put there is ignored. - At
highand above, the model thinks before almost every reply, even a greeting. For a simple request at lower effort it may produce no thinking block at all. - Interleaved thinking is automatic: the model thinks between tool calls with no beta header.
- Select content by
type, nevercontent[0].text: thinking blocks come first. - In Managed Agents, the platform sets the thinking configuration; agent definitions have no
thinkingfield.
response = client.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
output_config={"effort": "medium"},
messages=[{"role": "user", "content": "How many Friday the 13ths are there in 2027?"}],
)
for block in response.content:
if block.type == "thinking":
print("Reasoning summary:", block.thinking)
elif block.type == "text":
print(block.text)Progress updates between tool calls
Between two tool calls, Fable 5.2 can write a short note for the person following the agent: what it just found and what it will do next. Each note arrives in its own thinking block, right before the tool_use it introduces. There is at most one per tool call, and the model may skip any of them.
With the default display, these notes are empty. A client that only renders text blocks therefore looks silent during a long agentic turn. Switch to "updates" and render the non-empty thinking blocks.
with client.beta.messages.stream(
model="claude-fable-5-2",
max_tokens=64000,
thinking={"type": "adaptive", "display": "updates"},
output_config={"effort": "high"},
betas=["thinking-display-updates-2026-08-18"],
tools=tools,
messages=messages,
) as stream:
message = stream.get_final_message()
for block in message.content:
# With "updates", a non-empty thinking block is a progress update.
if block.type == "thinking" and block.thinking:
print("›", block.thinking)
elif block.type == "tool_use":
print("tool:", block.name)
# Send the turn back unchanged, empty thinking blocks included.
messages.append({"role": "assistant", "content": message.content})- For real-time display, handle the stream's
thinking_deltaevents. Expect a pause of a few seconds before a progress block opens. - The text you receive summarizes the note (a sentence or two), but
usage.output_tokenscounts the full note. - The model writes fewer notes at high effort and in long tool chains. To get more, see Keeping users informed.
- If a response stops on
max_tokens,model_context_window_exceededorstop_sequenceright after a tool, the last block can be a fixed note saying the response was interrupted. To resume, send the turn back unchanged and add ausermessage with atool_resultfor everytool_usein the turn.
max_tokenstoo low: the response stops withstop_reason: "max_tokens"after athinkingblock, before any text. Raise the value or lower the effort.- Streaming: the SDKs require it once
max_tokensexceeds 21,333 (a client-side check). Use.stream()thenget_final_message()in Python orfinalMessage()in TypeScript. - Very long thinking: above roughly 32k thinking tokens per request, batch processing avoids network timeouts.
- Reasoning inside the answer: asking the model to write its reasoning into the text can trigger a
reasoning_extractionrefusal. Read thethinkingblocks instead.
Effort
Effort sets how much work Fable 5.2 puts into a response: thinking, tool calls and text. Since thinking is always on, it is your main control over depth, latency and cost.
Quick exchanges, well-specified tasks, high volume, fast subagents. Anthropic measured scores close to Fable 5.1 at higher effort.
Interactive coding, chat, everyday knowledge work.
Hard coding, research, agentic work, long unattended runs. The recommended starting point. Turns take noticeably longer than at medium.
Your longest and hardest coding and agentic tasks, where a gain is measured. A slight gain for many more tokens.
Measuring the model's ceiling; open-ended problems (scientific discovery, mathematics). Slow, far more tokens than xhigh.
The bars only show the relative order of depth and spend, not measured values.
Choosing a level
- Most of the gain is already there at
high. Above it, gains are uneven and task-dependent. Drop tomediumwherever your evaluations show quality holds. - Re-run your sweep. Levels keep the same order from one model to the next, but not the same amount of thinking. A setting tuned for Fable 5.1 or Opus 5.5 does not carry over.
- An "answer without deliberating" instruction does not stop thinking from
mediumup. If simple requests cost too much, lower the effort for those turns. - Low levels cause more premature stops in agentic work. Add the "finish the job" instruction at
lowandmedium. - Effort barely changes answer length. Set length and tone through the prompt.
- Low effort means fewer, more consolidated tool calls, no preamble and short confirmations. High effort means more calls, an explained plan, detailed summaries and fuller code comments.
- Inside a tool loop, a request that only processes tool results may skip thinking at any level.
- Mix levels: plan and iterate at
medium, then raise the effort for the long unattended phase. - From
highup, plan for a highmax_tokens.
Changing effort mid-conversation
There are two ways. The first, per-message effort beta, keeps the prompt cache: append to messages a role: "system" message with empty content that carries the new level. The second, changing output_config.effort in the next request, works everywhere but restarts the cache.
first = client.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
output_config={"effort": "high"},
messages=[{"role": "user", "content": "Propose a plan to migrate from SQLite to PostgreSQL."}],
)
follow_up = client.beta.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
output_config={"effort": "high"}, # unchanged: the cache stays valid
betas=["mid-conversation-output-config-2026-07-01"],
messages=[
{"role": "user", "content": "Propose a plan to migrate from SQLite to PostgreSQL."},
{"role": "assistant", "content": first.content}, # sent back unchanged
{"role": "system", "content": [], "output_config": {"effort": "low"}},
{"role": "user", "content": "Summarize the plan in one sentence."},
],
)- Placement: right after a
userturn that brings new input, the level applies to the reply to that turn. Elsewhere (between anassistantturn and the nextuserturn, or after a turn holding onlytool_resultblocks), it takes effect at the nextuserturn that brings new input. A running tool loop therefore keeps its level. - Duration: the level stays in force until the next such message. Leave each message in place in later requests: it is now part of the history.
- Free placement: an effort-only message is exempt from the placement rules of system messages. It can even open
messages. - Without the beta header, the API returns a 400: the message's
output_configfield is rejected as unknown. - Platforms: Claude API, Claude Platform on AWS, Google Cloud (Anthropic managed and Google managed), Amazon Bedrock. With Bedrock's InvokeModel API, the beta value goes in the body's
anthropic_betaarray. Microsoft Foundry is not listed. - Changing effort between two requests does not invalidate preserved thinking: effort is not part of the checked prefix. Only the cache suffers.
- In Managed Agents, set
efforton the agent's model object or in a session's model override.
Preserved thinking
A thinking block you send back is only valid in the exact context that produced it. Fable 5.2 enforces this check on every account, whatever its age: an edited history returns a 400 by default.
Nothing changes for you if Claude Code, claude.ai, Managed Agents or the Claude Agent SDK manage the history. Read this section if your code builds the messages array itself.
Three checks on every block
The prefix
The system prompt, the tools and the messages before the block must be identical to what you sent when it was produced. Otherwise this block and every later thinking block fail.
The model
Each model reads its own blocks and those of a fixed list of other models. The API drops, without error and without charge, the blocks the current model cannot read.
The account
Fable 5.2 blocks only work in the account that produced them, or in a linked account. Sent from another account, they are dropped without error.
systemA single edit before a thinking block invalidates that block and every one after it. With "error", the request fails with a 400; with "drop_block", the blocks are dropped, the reasoning is lost and the cache restarts at the edit.
What the prefix covers
The checked prefix is the top-level system prompt, the full tools array and every message before the block. With server-side compaction, it starts at the latest compaction block. effort, max_tokens, output_config, tool_choice, metadata, thinking.display and cache_control markers are not part of it.
Earlier thinking blocks are not part of the prefix, but each one records the block that preceded it. You can drop the oldest ones, the newest ones, or all of them. A hole in the middle invalidates those that follow, and a dropped block must not come back: restoring it invalidates the blocks produced while it was gone.
Safe for thinking
- Appending messages at the end.
- Changing
effort,max_tokens,output_config,tool_choice,metadataorthinking.display. - Adding, moving or removing
cache_controlmarkers. - Adding a tool marked
defer_loading: truethat nothing references yet. - Dropping thinking blocks from the start, the end, or all of them (the reasoning is then lost).
- Switching models: unreadable blocks are ignored without error.
- Rotating a signed URL that returns the same bytes.
- Letting server-side compaction or context editing replace content.
- Keeping a cleared turn-scoped system message in place.
Invalidates the thinking that follows
- Editing, reordering or deleting an earlier
user,assistantorsystemmessage. - Editing the top-level
systemprompt. - Adding, removing, renaming or editing a tool in
tools. - Regenerating context placed in the first message (date, branch, memory, instructions).
- Shortening an old
tool_result, re-encoding an old image, editing an oldtool_useinput. - Adding text to an old
userturn, or removing the one added last time. - Dropping a
thinkingblock in the middle; restoring a dropped block. - An image or document URL whose content changes.
- An unpinned MCP tool list that changes (MCP connector).
- Deleting or rewording a turn-scoped message already sent.
Replacing each edit
| Instead of… | Do this | Beta header |
|---|---|---|
Rebuilding the system prompt (date, mode, re-read instructions, MCP server connecting later) | Append a role: "system" message right after the latest user message. It carries system-prompt authority. In a tool loop, place it after the tool_result, never between tool_use and tool_result. | none |
| Regenerating the first message's context | Generate it once and send it back unchanged. Report changes in the most recent turn. | none |
Shortening old tool_results, re-encoding old images | Shorten or downscale before the first send. Later, clear server-side with clear_tool_uses_20250919. | context-management-2025-06-27 |
| Injecting a reminder and removing it later | A turn-scoped system message with clear_at: "next_user_message", left in place afterwards. | mid-conversation-system-clear-at-2026-08-21 |
| Adding or removing tools | tool_addition and tool_removal blocks in a system message. Declare everything up front with defer_loading: true, or define a new tool inside the block. | inline-tools-2026-09-15, or mid-conversation-tool-changes-2026-07-01 for a plain reference; plus mcp-client-2026-09-15 for an MCP server |
| Changing top-level effort | Per-message output_config (see Effort). | mid-conversation-output-config-2026-07-01 |
| Summarizing or dropping old turns client-side | On-demand compaction, threshold compaction or server-side context editing. Client-side: one summary followed by the next turn, replaying no earlier turn. | compact-2026-09-04 (on-demand compaction) |
| An image URL whose content changes | A Files API file_id, or base64, from the very first request. | none |
Several betas in one request: separate them with commas in a single anthropic-beta header.
[
{ "role": "system", "content": "The workspace is now read-only. Do not write files until told otherwise." },
{ "role": "system", "clear_at": "next_user_message", "content": "Say in one line where things stand, then continue." },
{
"role": "system",
"content": [
{ "type": "tool_removal", "tool": { "type": "tool_reference", "name": "delete_branch" } },
{ "type": "text", "text": "Branch deletion is disabled for the rest of this session." }
]
}
]Sending turns back unchanged
Store each response's content array and send it back without changes: every block type, in the order received, including thinking blocks whose text is empty. On Fable 5.2 that text is empty by default and the signature carries the reasoning.
- A serializer that drops unknown types or reorders blocks changes the prefix of every later turn.
- A serializer that drops the empty
thinkingfield causes a 400. An emptysignaturefails too. - A serializer that skips empty blocks raises no error, but the model loses its reasoning on every turn.
- If you parse the stream yourself, keep the block even with no text: it opens, receives its signature through a
signature_delta, then closes. - To resume a saved session, replay exactly what you sent and received. Do not regenerate anything from inputs that may have changed (date, instruction file, tool version). JSON formatting and key order do not matter; values do.
Choosing what happens on failure
The thinking.block_binding.prefix_mismatch_behavior field decides the fate of a failing block. It requires the thinking-binding-controls-2026-08-01 header and thinking: {"type": "adaptive", ...}; without the header, the API returns a 400.
| Value | Effect | When to use it |
|---|---|---|
"error" (Fable 5.2 default) | 400 invalid_request_error naming the first failing block. Resending the same body fails the same way. | In production, when a mismatch can only mean a bug. |
"drop_block" | The failing block and every later thinking block are dropped and not billed. The request succeeds, the model answers without that reasoning, and the cache restarts at the edit. | As a stopgap while you fix the edit. The model rebuilds its reasoning: more output tokens, especially when blocks are dropped every turn. |
In your logs, the error starts with Invalid `signature` in `thinking` block and usually ends with a sentence saying what changed, for example the system prompt or the tools list. A tampered signature also returns a 400, with no mention of the conversation; prefix_mismatch_behavior does not apply to it.
With the header, every response contains an input_transformations array (in message_start when streaming). Each entry names a block by its path, for example messages.3.content.0, and gives a reason:
thinking_dropped+prefix_binding_mismatch: your code edited the history. Fix it.thinking_dropped+model_binding_mismatch: model switch. Expected, not a bug.thinking_dropped+organization_binding_mismatch: the block came from another account.thinking_mismatch_allowed: failing block let through. Only appears on models that still tolerate edits, never on Fable 5.2.
Ignore unknown types and reasons: new checks will add some. The token counting endpoint runs the same check. In the Message Batches API, an item without prefix_mismatch_behavior has its failing blocks dropped instead of a 400; with "error", it resolves as errored.
response = client.beta.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
thinking={
"type": "adaptive",
"block_binding": {"prefix_mismatch_behavior": "drop_block"},
},
betas=["thinking-binding-controls-2026-08-01"],
messages=messages,
)
for t in response.input_transformations or []:
# prefix_binding_mismatch: your code edited the history, fix it.
# model_binding_mismatch: model switch, expected.
print(t.type, t.path, t.reason)Reacting to a 400 in code
Do not resend the same body. Retry once with the header and "drop_block", then store that choice with the session so every later request sends it too, including after a restart. If you cannot send the header, remove the block named by the error plus every later thinking and redacted_thinking block, leave them out, and continue. Then fix the edit that caused the problem.
Testing your integration before switching
- Capture the request bodies of a few normal turns, including a compaction or a tool change.
- Diff each pair of consecutive requests:
system,toolsand the shared messages must be identical up to the appended turns. - Replay a multi-turn session on
claude-fable-5-2with thethinking-binding-controls-2026-08-01header and"drop_block". - Log
input_transformationsand fix everyprefix_binding_mismatchentry. Do it even if your account never triggered the check on another model. - Pick the production setting:
"error", or"drop_block"temporarily, with an alert on 400s and oninput_transformationsentries.
In Claude Code, /claude-api preserved-thinking-migration audits an existing integration and proposes fixes.
Switching models mid-conversation
Change model and keep sending the full history, thinking blocks included. The API drops, before the model sees them, the blocks it cannot read: no error, no charge, not counted in input_tokens. That drop does not count as an edit, and your messages array is never modified: if the conversation returns to a model that can read those blocks, it reads them again.
Fable 5.2 reads blocks from…
On the Claude API and Google Cloud (Google managed).
- Mythos 5.2, and its own blocks.
- Fable 5.1, Mythos 5.1, Fable 5, Mythos 5.
- Opus 5.5, Sonnet 5.5, Haiku 5.5.
- Opus 5, Opus 4.8, Sonnet 5 and earlier Opus, Sonnet and Haiku models.
Fable 5.2 blocks are read by…
Mythos 5.2 only.
- A switch to Fable 5.1, Opus 5.5, Opus 5 or Opus 4.8 (fallback targets included) continues without Fable 5.2's reasoning.
- The first turn after the switch costs more and takes longer.
- With the header, these drops show up as
model_binding_mismatch.
If you replay stored conversations from another account, go through the original account or a linked one: otherwise the API drops Fable 5.2's blocks.
Frequently asked questions
Does changing effort between requests invalidate thinking?
No. Effort, max_tokens and the thinking configuration are not part of the checked prefix. A top-level effort change does restart the prompt cache; per-message effort avoids that.
How do I handle a CLAUDE.md or AGENTS.md that changes mid-session?
Load it once at the start and keep system and tools frozen. When the file changes, append the new version in messages: in a system message if the instruction comes from you as operator, in the next user turn if you treat the text as untrusted.
A saved session fails on every request. What now?
The stored history contains an edit: it will always fail as is, even after the code is fixed. Send "drop_block" with the header on every later request, or remove once the block named by the error and every later thinking block. Thinking produced afterwards stays valid as long as nothing before it changes.
My harness routes some turns to a non-Claude model. Is that a problem?
No, if those turns are appended at the end and nothing earlier changes. Send the other model's output as text and tool_use blocks.
I compact by summarizing old turns and keeping recent ones verbatim. Does that work?
Yes if the API writes the summary (on-demand compaction, header compact-2026-09-04). If you write the summary yourself, the kept turns' thinking fails: remove their thinking and redacted_thinking blocks while keeping text and tool_use, or use simple compaction, a summary followed by the next turn. Never compact between a tool_use and its tool_result.
Can I carry the reasoning into a new conversation?
No. A block only works in the exact history that produced it; a branch that replays that history unchanged up to the fork keeps its thinking. Start a new conversation from a summary of the task state: goal, decisions, results so far, next step.
Prompting
Fable 5.2 follows instructions closely, including ones you wrote for other models. Start from the symptom you observe. The wordings below are examples to adapt, not Anthropic's official text.
| You observe | Go to |
|---|---|
| Simple requests too slow or too expensive; unsure which effort to use | Calibrating effort |
| A turn that ends before the work is done | Finishing the job |
| You approve steps as the agent works, or the system prompt has approval rules | Approvals |
| A coding agent that duplicates code instead of merging it, or reports nearby problems without fixing them | Saying who owns the code |
| Long, silent agentic turns | Keeping users informed |
| More subagents than the task needs | Framing subagents |
| Needless approvals, routine work held back | Keeping caution from piling up |
| A prompt, skills or a harness carried over from Fable 5.1 or Opus 5.5 | Reviewing legacy instructions |
| Hard-to-follow final reports | Making reports readable |
stop_reason: "refusal" | Refusals and fallback |
Finishing the job
On long tasks, Fable 5.2 sometimes ends a turn too early: it lists what is left, offers to continue, or stops at an ordinary obstacle such as a timeout. This happens mostly at low and medium. The instruction must tell two kinds of obstacles apart: ordinary ones, to diagnose and work through, and deliberate blockers, to respect and report.
# Seeing the work through
Keep going while there is requested work you can still do.
Errors, timeouts, empty results and failing tools are not blockers: find the cause,
then get past it with what you have (wait and retry, fix the request, use another
tool or source).
Deliberate blockers are different: a file marked as off-limits, access withheld on
purpose, a safety guardrail. Leave them alone, say clearly what you found, and look
for another safe way to finish.
Stop only when the next step truly depends on the user's answer.
Risky or irreversible actions still need confirmation.Anthropic's measurement, on coding sessions replayed at medium with an instruction of this kind: about half as many sessions ended with doable work left, for about 30% more output tokens. Endings that ask for permission nearly disappear; endings that list what is left and then stop do not. Since the model asks less often, keep your own confirmation for risky actions.
Approvals
- When you tell the model to continue, name what you approve. "Yes, apply the fix on the staging branch and rerun the tests" beats "go ahead" or a thumbs-up.
- In the system prompt, an approval rule must name the exact actions it covers: the model applies it to the letter. In an Anthropic test, a rule requiring approval for messages sent outside the conversation made the model hold back about half of its routine requests to colleagues.
Saying who owns the code
Fable 5.2 responds closely to what the prompt says about code ownership. If the prompt says nothing, or presents the code as someone else's, the model adds on top of the existing structure, even if that duplicates code, and reports nearby problems without fixing them. If you want it to improve the structure along the way, say the code is its own.
You own this codebase: its purpose and its design are your decisions, and you will
keep building on it.- Anthropic's measurement on small tasks: duplicated code merged in about half the trials with the sentence, versus fewer than one in ten without. The requested feature worked almost every time in both cases.
- The trade-off: about 1.5× more output tokens, unrequested changes (tests, documentation), and existing behavior changed in one trial out of six to ten, more often at high effort. The final summary often leaves out small changes: review the diff.
- Leave the sentence out when the code belongs to the user and they want as few changes as possible. A scope rule elsewhere in the prompt does not cancel it: with a ban on drive-by refactors, the model still merged code in a third of trials.
Keeping users informed
During long runs of tool calls, Fable 5.2 sometimes writes little user-facing text, and may start its first tool without announcing what it is doing. First check that your client renders the progress updates: with the default display, they are empty.
- Make the updates visible.
display: "updates"(beta) or"summarized", then render the non-emptythinkingblocks between tool calls. - Nudge from the harness. Count consecutive tool steps with nothing readable (no
textblock, no non-emptythinkingblock). After a few, append after the latest tool results a turn-scoped system message (clear_at: "next_user_message", headermid-conversation-system-clear-at-2026-08-21) asking for a short status. Leave every reminder in place inmessages. Anthropic's measurement: the longest silent stretch roughly halved, with no notable increase in tokens or time. - Ask for an opening line and a recap. Useful when a human follows along live; about 20% more output tokens, and the model spoke before its first tool every time.
Harness reminder (turn-scoped system message):
You have been quiet for a while. Tell the user in a few words what you are doing,
then carry on.
System prompt, opening line and recap:
Begin with one line saying what you are about to do, and post short updates as you
work. End with a recap that stands on its own: what you found, what you changed,
what comes next.
Without harness access:
Every few tool calls, post a one-line status update for the user.Even so, expect several tool calls between two updates. On asynchronous tasks, where the user comes back for the result, those gaps matter less.
Framing subagents
- Delegation depends on the harness: with a minimal subagent tool, Fable 5.2 rarely launches any; in a product whose prompts invite delegation, it delegates readily.
- First reread the lines asking for delegation in the system prompt, skills and agent files. Only rewrite the delegation tool's description if the model still launches too many subagents.
- A good description says, in this order: what a subagent adds to the session's cost, when delegating is worth it and when it is not, and how to brief the subagent. Anthropic's measurement: about a third fewer delegations, with the same success rate. Talk less about cost if the model delegates too little.
- At
xhighandmax, the model may launch subagents to review its own work. It makes a good planner and orchestrator of other models. Check which model your harness runs subagents on by default: they can weigh heavily on cost.
Keeping caution from piling up
Cautious instructions accumulate wherever context carries over: memory, notes, instruction files, messages between agents. Fable 5.2 follows them closely and may ask for approvals it does not need or hold back routine work, especially in multi-agent systems.
- Delete notes you no longer need. In one test, a single "never retry" note among a dozen cut retries after a busy tool to about four trials in ten, versus nearly all without it.
- Name the steps that need no approval. A line listing retries among them moved retries from almost none to about half of trials; a general instruction to act more freely changed nothing. Only name retries for calls that are safe to repeat.
- Check what reviewer agents add. A "stop at the first error" from a reviewer was enough to block retries in a third of trials.
- Build the exception into the rule itself. An approved step under a "never" rule ran only one time in ten with a separate exception line, and nine times in ten when the rule itself said to get a go-ahead first.
Reviewing legacy instructions
| Carried-over instruction | Effect on Fable 5.2 | What to do |
|---|---|---|
| Standing lines pushing delegation | More subagents than needed | Remove the ones you no longer need. |
| A token budget the harness writes into the prompt | Its size changes how much the model spends | Test without it. Removing a large budget lowered cost at equal results at high and xhigh. (Not about the API's task budgets.) |
| Harness code that edits earlier turns | 400 errors, or lost reasoning with drop_block | Append-only history (see Preserved thinking). |
| "Treat the previous answer as complete" lines | Less thinking on follow-ups, but the model flags its own past mistakes far less often | Remove them wherever you want it to re-examine its answers. |
| "Think less", "answer without deliberating" | No effect from medium up | Remove them and lower the effort. |
| Rigid style rules (one instruction per sentence, 20 words max…) | Choppy prose | Keep only the ones that matter. |
| Accumulated rules, notes and memories | Excess caution | Prune, and give absolute rules a scope and a reason. A stuck system can restart with pruned memory; keep a copy of the originals. |
Making reports readable
After long agentic work, the reader of the final report has seen neither the tool calls nor the files. Ask for text that stands on its own.
# Writing for the reader
Write for a capable reader who did not watch you work: they saw none of your tool
calls, reasoning or files, and may be coming back from something else.
Lead with the key points, then add detail in the order the reader needs it.
Do not use terms or abbreviations you coined during the work; describe things in
words any reader would understand.
Use short, complete sentences in the active voice, one idea per sentence, and the
same word for the same thing (in the spirit of ASD-STE100 Simplified Technical
English). Use prose where ideas connect and lists for separate items.
Be concise, but keep the context the reader needs.Anthropic's measurement with an instruction of this kind: less dense reports, fewer semicolons and, on workflow automation, shorter sentences. Remove old style rules first.
Where to start
- Set
effortexplicitly tohigh, then also run your evaluations atmediumandxhigh. - Reread the system prompts, skills, agent files, memories, notes and harness text you carry over. Remove or test the legacy instructions listed above.
- Run your longest agentic tasks. Note where the model stops too early, asks for needless approvals, goes quiet, delegates too much, or adds code where you wanted restructuring.
- Apply one recommendation at a time and measure its effect and token cost on your own tasks.
Migrating to Fable 5.2
Pick your starting model. Each tab lists what breaks, what changes, then a checklist you can tick; your ticks stay in this browser.
The /claude-api migrate command can carry out the migration, for example "/claude-api migrate this project to claude-fable-5-2". If your Managed Agents agent has an advisor, its model is a second name to update.
A mostly seamless migration: same API surface, same always-on thinking, same refusal handling, same stop_details categories, same data retention. Fable 5.2 is cheaper: $8 / $40 per MTok versus $10 / $50, and $0.20 versus $0.25 for cache reads.
What can break
- The prefix check applies to every account. Fable 5.1 only enforces it by default for accounts created on or after August 31, 2026: on an older account, requests that passed can fail with a 400.
- Fable 5.1 cannot read Fable 5.2 blocks (the reverse works). A router, retry or fallback that goes back to 5.1 continues without the reasoning.
computer_20251124returns a 400 outside Amazon Bedrock. Declarecomputer_toolset_20260801withoutnameor display dimensions, drop the beta header and update the agent loop.- Advisor tool: a Fable 5.2 executor only accepts Fable 5.2 or Mythos 5.2 as advisor. Changing the advisor changes
tools: do it in new conversations. A Fable 5.2 advisor returns encrypted advice.
What changes in behavior
- An "answer without deliberating" instruction no longer stops thinking from
mediumup: remove it and lower the effort. - At
xhighandmax, the model may launch subagents to review its work. - A low
max_tokensthat was enough on 5.1 can run out during thinking, before any text.
Checklist
0 / 10Same Messages API, same always-on thinking, same rejection of forced tool_choice: those parts of your requests stay valid. The differences are data retention, cost, default effort and fallback.
What changes
- 30-day retention required. Under ZDR, every request returns a 400 until retention is enabled for a workspace.
- Prefix check for every account (Opus 5.5 only enforces it for accounts created on or after August 31, 2026).
- Opus 5.5 cannot read Fable 5.2 blocks. Fable 5.2 reads those of Opus 5.5.
- Refusals: handle every
stop_detailscategory, not only the ones seen on Opus 5.5. Fallback:fallbacks: "default"(beta) or a list limited toclaude-opus-4-8andclaude-opus-5.reasoning_extractionrefusals are not retried. - Pricing: $8 / $40 versus $4 / $20, cache reads at $0.20 for both. Fast mode: $16 / $80 versus $8 / $40.
- CMEK: no structured outputs on Fable 5.2.
- Default effort
highversusmedium: a request without effort runs one level higher, costing more and running slower, with no error. - Advisor: Fable 5.2 or Mythos 5.2 only.
- Rate limits are separate, with lower token limits at every tier.
Checklist
0 / 11Same API surface, same context window, same tokenizer, same always-on thinking and same refusal handling as Fable 5.
What breaks
- Forced
tool_choice:anyandtoolreturn a 400, token counting included. Keepauto, name the tool in the instruction and addstrict: true, or use JSON output. If the call is mandatory this turn, append a mid-conversation system message after the lastuserturn.nonestill works. - Edited history: a 400 on every account; Fable 5 checked nothing.
- Fable 5 cannot read Fable 5.2 blocks (the reverse works).
- Computer use:
computer_toolset_20260801instead ofcomputer_20251124, outside Bedrock. - Advisor: Fable 5.2 or Mythos 5.2 only; Fable 5 and Opus 5.5 are no longer accepted as advisors.
Other changes
- Pricing: $8 / $40 versus $10 / $50; cache reads at $0.20 versus $1.
- No Priority Tier, unlike Fable 5.
- Per-message effort available (beta).
Checklist
0 / 10Same Messages API, same 1M context, same 128k output, same 512-token caching minimum, same restrictions on prefill and sampling. Much of the rest changes.
What changes
- Thinking can no longer be disabled. Remove
thinking: {"type": "disabled"}, control spend through effort, revisitmax_tokensand select blocks bytype. - Forced
tool_choice: 400. - Edited history: a 400 on every account; Opus 5 checked nothing.
- Opus 5 cannot read Fable 5.2 blocks (the reverse works).
- Narration between tool calls: it now arrives as progress-update
thinkingblocks, no longer astextblocks. To show it:display: "updates"or"summarized". - Computer use: the
computer_toolset_20260801toolset, outside Bedrock. - Broader classifiers (extra categories, such as
bio): handle them all; fallback available. - Pricing: $8 / $40 versus $5 / $25; cache reads at $0.20 versus $0.50. Fast mode without a header, $16 / $80 versus $10 / $50.
- 30-day retention: Opus 5 was available under ZDR; Fable 5.2 is not.
- CMEK: no structured outputs. Advisor: Fable 5.2 or Mythos 5.2. Rate limits: lower token limits.
Checklist
0 / 10Start with the Opus 5 tab, with claude-opus-4-8 as the ID to replace: Opus 4.8 also accepts disabled thinking, forced tool_choice, computer_20251124 and ZDR. Then add the following.
- Thinking runs even without a
thinkingfield. On Opus 4.8 it was off by default.thinkingblocks now precede the text, are billed as output and count againstmax_tokens. Fable 5.2 reads Opus 4.8 blocks if a conversation switches. - Caching from 512 tokens instead of 1,024: short prompts now create cache entries.
- No Priority Tier (Opus 4.8 accepted it).
- Encrypted advisor advice (
advisor_redacted_result): your code can no longer read its text. - Opus 4.7 or earlier: also apply the groups of the Opus 5.5 guide's checklist that cover your model (sampling parameters, old beta headers…). Under CMEK, remove
output_formatand validate the JSON in code.
Checklist
0 / 6Claude Mythos 5.2 is Fable 5.2 for verified organizations. Confirm your access before switching the ID (claude-mythos-5-2). Mythos 5.2 shares a combined rate limit with Mythos 5.1 and Mythos 5.
From Mythos 5.1
- Prefix check for every account. On Amazon Bedrock, Mythos 5.2 returns a 400 for an edited history where Mythos 5.1 accepted it.
- Mythos 5.2 reads Mythos 5.1 blocks; the reverse is not true.
- Advisor: Mythos 5.2 or Fable 5.2 only. Computer use:
computer_toolset_20260801outside Bedrock. - Pricing: $8 / $40 versus $10 / $50; cache reads at $0.20 versus $0.25.
From Mythos 5
- Forced
tool_choicerejected, edited history rejected, computer use toolset, advisor Fable 5.2 or Mythos 5.2. - Mythos 5.2 reads Mythos 5 blocks; the reverse is not true.
- Pricing: $8 / $40 versus $10 / $50; cache reads at $0.20 versus $1.
Checklist
0 / 6Refusals and fallback
Fable 5.2 runs safety classifiers. When one declines a request, you get a normal response, HTTP 200, with stop_reason: "refusal". The same request usually succeeds on another Claude model: that is what fallback is for.
What a refusal looks like
{
"model": "claude-fable-5-2",
"content": [],
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "…"
},
"usage": { "input_tokens": 412, "output_tokens": 0 }
}categorynames the policy area.explanationis readable but unstable: display it, do not parse it. Both can benull, which is normal and permanent.recommended_modelonly appears withfallbacks: it names a model to try directly when the API skipped the fallback attempt, for example because of rate limits. A hint, not a guarantee.stop_detailsisnullfor every other stop reason. Branch onstop_reasonorstop_details.type, never oncontent.- A refusal can also happen mid-stream, after partial output. Treat that output as incomplete and discard it.
Categories and billing
category | Meaning | Billed before any output |
|---|---|---|
cyber | Could enable cyber harm (malware, exploits). Legitimate security work can trigger it too. | No |
bio | Could enable biological harm (dangerous lab methods). Beneficial life-science work can trigger it too. | Yes |
frontier_llm | Could help build competing AI models, which Anthropic's commercial terms restrict. | Yes |
reasoning_extraction | Asks the model to reproduce its internal reasoning in the answer. | Yes |
general_harms | Another area of the usage policy. | No |
- Before any output: billed at normal rates for
bio,frontier_llmandreasoning_extraction, the categories where Anthropic measures few false positives (as of September 2026, subject to change). Free for the others and for anullcategory. In every casecontentis empty,usagegives the tokens and the request counts against your rate limits. - Mid-stream: input and the output already streamed are billed.
- With a fallback: the triggering refusal is billed if it happened mid-stream or belongs to a billed category, on top of the fallback request. Fallback credit keeps you from paying twice for caching the conversation.
Choosing a fallback approach
| Your situation | Approach | Why |
|---|---|---|
| Claude API or Google Cloud (Anthropic managed) | Server-side fallback beta | One request, one response: the API retries by itself. |
| Any platform, with an Anthropic SDK | SDK middleware | Configured once on the client; retries are automatic. |
| Raw HTTP or custom logic | Hand-written retry + fallback credit | Full control; the credit caps the cache cost. |
Server-side fallback
fallbacks: "default"with theserver-side-fallback-2026-07-01header: the API reruns the request on the model Anthropic recommends for the refusal category. Without a recommendation for the category, the refusal stands; that is the case forreasoning_extraction.- Or a list of at most three models, tried in order, distinct from each other and from the requested model. For Fable 5.2 the allowed targets are
claude-opus-4-8andclaude-opus-5; the Models API publishes them asallowed_fallback_models. Each entry may overridemax_tokens,thinking,output_configandspeedfor its attempt. The request must stay valid for every named model, or it is rejected up front. - Only a classifier refusal triggers fallback. A rate limit, overload or server error comes back as is. If the fallback model is saturated, the attempt is skipped and the refusal returns with
recommended_model: size its limits for the refusal volume you expect. - The fallback model does not receive Fable 5.2's thinking.
response = client.beta.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
output_config={"effort": "high"},
fallbacks="default", # or [{"model": "claude-opus-5"}, {"model": "claude-opus-4-8"}]
betas=["server-side-fallback-2026-07-01"],
messages=messages,
)
if response.stop_reason == "refusal":
details = response.stop_details # the whole chain refused
print("Refusal:", details.category if details else None)
else:
fallback_ran = any(
it.type == "fallback_message" for it in response.usage.iterations or []
)
if fallback_ran:
print("Response served by", response.model)What the response contains
modelnames the model that served the response.- A
fallbackcontent block marks each handoff, withfrom.model,to.modelandtrigger(typerefusaland its category). On a refusal before any output, it is the first block. usage.iterationsdetails every attempt: amessageentry per model that declined, afallback_messageentry for the one that served. It is the record of what you are billed, each attempt at its own model's rates. The top-levelusagecounts only describe the returned attempt.- Streaming: on a refusal before output,
message_startalready names the fallback model and the time to first byte includes the declined attempt. On a refusal mid-output, the open block closes, afallbackblock marks the boundary and the fallback continues from thetextblocks already produced; read the serving model into.modelor in the lastmessage_delta. - Without streaming, a mid-output refusal looks like a refusal before output: the partial output is omitted.
- Sticky routing: after a fallback, the API remembers for about an hour, per organization, which model served the conversation (a fingerprint of the prefix, not the content). Later requests with
fallbacksgo straight to the fallback model, without afallbackblock: spot them through thefallback_messageentry. Best effort only: your code must accept that the requested model may be tried again at any time.
Continuing the conversation after a fallback
| Block sent back next turn | What to do |
|---|---|
fallback | Keep it exactly where it was: the API uses it to validate the thinking blocks around it. |
text, and any block after the last fallback | Keep. |
thinking, redacted_thinking, connector_text before the last fallback | Drop. |
Client tool_use before the last fallback | Drop. |
server_tool_use before the last fallback | Keep if it has its result, drop otherwise. |
SDK middleware, on every platform
The middleware retries refused requests made through client.beta.messages, in the order of your list. If every model refuses, it returns the last refusal instead of raising an error. It sends the fallback-credit-2026-07-01 header itself, adds the fallback blocks and handles them on later turns. Share one BetaFallbackState across a conversation's requests: later turns stay pinned to the model that accepted.
from anthropic import Anthropic, BetaFallbackState, BetaRefusalFallbackMiddleware
client = Anthropic(
middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-5"}])],
)
state = BetaFallbackState() # one state per conversation
with state:
message = client.beta.messages.create(
model="claude-fable-5-2",
max_tokens=16000,
messages=messages,
)
print("Served by:", message.model)Hand-written retry
- Detect the refusal with
stop_reason == "refusal". - Resend the same request with
modelset to a fallback model, for exampleclaude-opus-5. Without credit, you can keep or remove the old thinking blocks: the fallback model does not read Fable 5.2's, and the API drops them without billing. With a fallback credit, send the body with no change at all: the credit requires an exact match. - Stay on the fallback model for the rest of the conversation instead of returning to the original model.
A hand-written retry writes the fallback model's whole cache; the fallback credit refunds that extra cost. In Message Batches, a refused item comes back as result.type: "succeeded" with stop_reason: "refusal", with no fallback credit, and fallbacks is not accepted there: collect the refused items and resubmit them on a fallback model.
The reasoning_extraction case
This refusal usually comes from a prompt that asks the model to put its reasoning in the output: a thinking or scratchpad section to fill before answering, a reasoning or trace field in JSON or tool input, private notes, reasoning "verbatim". Look in skills and tool descriptions too. Ask instead for a brief explanation, the evidence behind a result or a summary of the actions; to see the reasoning, read the thinking blocks with display: "summarized". No fallback is recommended for this category: change the prompt. If a reworded version is still refused, contact support with the request ID.
If the cyber or bio classifiers block legitimate work, see Anthropic's Cyber Verification Program and Life Sciences Verification Program. Mythos 5.2 offers Fable 5.2's capabilities to organizations verified that way.
- Retry on another model: the same model usually refuses again.
- Budget retries per request, not per turn or session: an agent and its subagents can refuse several times in a single turn.
- Configure fallback on every request path, including retry handlers, recovery branches and background workers.
- Give subagents their own fallback:
fallbacksis not passed on to model calls made during tool execution. - Make fallback a property of the request, not shared state that can drift.
- Instrument refusals: count refusals and fallback-served responses, and alert on the gap. 5xx monitoring will never see a refusal.
Workshop
Build a compliant Fable 5.2 request, or paste an existing request to spot what will be rejected.
Request builder
Required beta headers
Points to watch
Request checker
Paste the JSON body of a Messages request. The analysis runs in your browser; nothing is sent anywhere. The starting content is an example of a request written for an older model.
Result
Cheat sheet
Beta headers useful with Fable 5.2
| Value | Enables | See |
|---|---|---|
mid-conversation-output-config-2026-07-01 | Per-message effort, without losing the cache | Effort |
thinking-display-updates-2026-08-18 | display: "updates", readable progress updates | Thinking |
thinking-binding-controls-2026-08-01 | block_binding and input_transformations | Preserved thinking |
server-side-fallback-2026-07-01 | The fallbacks parameter ("default" or a list) | Refusals |
fallback-credit-2026-07-01 | Fallback credit (sent automatically by the middleware) | Refusals |
mid-conversation-system-clear-at-2026-08-21 | Turn-scoped system messages (clear_at) | Prompting |
inline-tools-2026-09-15 | Defining a tool inside tool_addition | Preserved thinking |
mid-conversation-tool-changes-2026-07-01 | tool_addition / tool_removal by reference | Preserved thinking |
mcp-client-2026-09-15 | MCP server tools added mid-session | Preserved thinking |
compact-2026-09-04 | On-demand compaction, compatible with kept thinking | Preserved thinking |
context-management-2025-06-27 | Context editing (clear_tool_uses_20250919, clear_thinking_20251015) | Preserved thinking |
Fable 5.2's fast mode does not need fast-mode-2026-02-01; on the Claude API, requests that send it still work.
Stop reasons
stop_reason | Meaning and reaction |
|---|---|
end_turn | The response finished normally. |
tool_use | Claude asks for a tool: run it and send back a tool_result, with the assistant turn intact. |
max_tokens | Limit reached, sometimes before any text. Raise max_tokens or lower the effort. |
refusal | Safety classifier. Read stop_details and retry on a fallback model. |
pause_turn | Turn paused in an agentic flow, to be resumed. |
stop_sequence | A custom stop sequence was hit. |
model_context_window_exceeded | Generation stopped at the context window limit, instead of a validation error. |
Sources
Anthropic documentation, read on November 10, 2026. Where this page and the official documentation differ, the documentation wins.