TL;DR
Fable 5 ships with safety classifiers that route flagged requests away from the model. In production you need to handle this, and Anthropic shipped three ways to do it. Here's how each one works, with code, plus the billing rules nobody has written up.
Read next
Fable 5 is mostly a drop-in replacement for Opus 4.8, but 'mostly' is doing real work in that sentence. Here's every breaking change, what to delete from your code, and the prompt audit you should run before flipping the model ID.
9 min readAnthropic gave subscribers two weeks of free Fable 5 access, then it moves to usage credits. Here's what's actually changing, what the real-world burn rates look like, and what to do depending on how you use Claude.
6 min readAnthropic added three new primitives to Claude Managed Agents in spring 2026 - dreaming, outcomes, and multi-agent orchestration. Here is how each one works and when to use them together.
8 min readClaude Fable 5 is the same model as the restricted-access Mythos 5, wrapped in safety classifiers. When a classifier fires, Fable 5 doesn't answer. In the Claude apps, the request silently falls back to Opus 4.8. On the API, handling that is your job.
This matters even if your product has nothing to do with security or biology. The classifiers are tuned conservative and they catch normal work: developers reported a base64 implementation flagged as cyber, genome-alignment pipelines rerouted, and prompts asking the model to "explain its reasoning" tripping the extraction filter. Anthropic's own number is that under 5% of sessions hit a fallback. Across production traffic, that's not an edge case. That's Tuesday.
Here's how refusals work on the wire, and the three ways to handle them.
A refusal is not an error. You get HTTP 200 with a new stop reason:
{
"id": "msg_...",
"model": "claude-fable-5",
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "This request was flagged by safety classifiers..."
},
"content": [...],
"usage": {...}
}
Three things to know:
stop_details.category is "cyber", "bio", "reasoning_extraction", or null.stop_reason on every call.The simplest approach. Catch the refusal, replay the conversation on claude-opus-4-8:
def create_with_fallback(client, **kwargs):
response = client.messages.create(model="claude-fable-5", **kwargs)
if response.stop_reason == "refusal":
# Strip thinking blocks before cross-model replay
clean_messages = strip_thinking_blocks(kwargs["messages"])
response = client.messages.create(
model="claude-opus-4-8",
**{**kwargs, "messages": clean_messages},
)
return response
The gotcha is in that strip_thinking_blocks call. Thinking blocks are model-specific: you pass them back unchanged on same-model multi-turn conversations, but you must strip thinking and redacted_thinking blocks when replaying history on a different model.
The bigger problem with manual retry is cost. Prompt caches are per-model. If you've built up a large cached prefix on Fable 5 and a refusal forces you to Opus 4.8, you pay full cache-write costs all over again on the new model. On a long agentic session with hundreds of thousands of cached tokens, that's real money. Anthropic shipped a fix for this, covered below.
Get the weekly deep dive
Tutorials on Claude Code, AI agents, and dev tools - delivered free every week.
From the archive
Jun 10, 2026 • 8 min read
Jun 10, 2026 • 9 min read
Jun 10, 2026 • 7 min read
Jun 10, 2026 • 7 min read
New with Fable 5, in beta. You declare fallback models in the request and Anthropic handles the reroute server-side:
response = client.messages.create(
model="claude-fable-5",
max_tokens=32000,
messages=messages,
fallbacks=[{"model": "claude-opus-4-8"}],
extra_headers={"anthropic-beta": "server-side-fallback-2026-06-01"},
)
Details that matter:
server-side-fallback-2026-06-01. Other date values return a 400.max_tokens and thinking for that attempt only, which you'll want, because Opus 4.8 has different thinking semantics than Fable 5.allowed_fallback_models on the Models API when you set the beta header.The response tells you exactly what happened. The top-level model field reports whichever model actually answered, a new fallback content block marks the handoff:
{"type": "fallback", "from": {"model": "claude-fable-5"}, "to": {"model": "claude-opus-4-8"}}
and usage.iterations[] breaks out token usage per attempted model, which is what you want for cost attribution.
Availability caveat: server-side fallback works on the Claude API and Claude Platform on AWS only. It's rejected on the Batches API, and it doesn't exist on Bedrock, Vertex, or Microsoft Foundry. On those platforms you need option 3.
Anthropic shipped refusal-fallback middleware for the TypeScript, Python, Go, Java, and C# SDKs alongside the launch. It implements the catch-refusal-retry-and-bill-correctly loop client-side:
import Anthropic from "@anthropic-ai/sdk";
import { refusalFallback } from "@anthropic-ai/sdk/middleware";
const client = new Anthropic({
middleware: [refusalFallback({ fallbackModel: "claude-opus-4-8" })],
});
This is the right answer on Bedrock and Vertex where server-side fallback isn't available, and for teams who want the behavior without taking a beta header into production. It also applies the fallback credit automatically, which brings us to billing.
Scattered across three docs pages, collected here:
That last one deserves explanation. When a refusal forces you onto a new model, the refusal response carries a one-time token in stop_details:
"stop_details": {
"type": "refusal",
"fallback_credit_token": "fct_...",
"fallback_has_prefill_claim": true
}
Echo it as a top-level fallback_credit_token on your retry (with the fallback-credit-2026-06-01 beta header, which the server-side-fallback header also grants), and the retry is billed as if the conversation had always been on the new model. No double-paying for cache writes.
You only need to touch this if you're hand-rolling retries in Ruby, PHP, or raw HTTP. Server-side fallback and the SDK middleware both apply it for you.
fallbacks parameter, so split refused items into a retry batch against Opus 4.8.The cheapest refusal is the one that never fires. Two prompt-level fixes with outsized impact:
First, remove any instruction asking the model to reproduce its reasoning in responses. "Show your thought process" style prompts trigger the reasoning_extraction classifier. If you need process visibility, set thinking: {"display": "summarized"} and read the thinking blocks.
Second, if you work in security or life sciences legitimately, expect false positives and design for them rather than fighting them. The fallback path to Opus 4.8 is the supported answer. Opus 4.8 has no blocking cyber safeguards and remains a very capable model; for flagged requests, a clean fallback is a better experience than an argument with a classifier.
Log every refusal with its category. A week of data will tell you whether your workload has a 0.1% fallback rate or a 15% one, and that number should drive how much engineering you invest here.
Sources: Anthropic's refusals and fallback, fallback credit, SDK middleware docs, and the fallback billing cookbook.
Technical content at the intersection of AI and development. Building with AI agents, Claude Code, and modern dev tools - then showing you exactly how it works.
Anthropic's agentic coding CLI. Runs in your terminal, edits files autonomously, spawns sub-agents, and maintains memory...
View ToolThe TypeScript toolkit for building AI apps. Unified API across OpenAI, Anthropic, Google. Streaming, tool calling, stru...
View ToolAnthropic's Python SDK for building production agent systems. Tool use, guardrails, agent handoffs, and orchestration. R...
View ToolUnified API for 200+ models. One API key, one billing dashboard. OpenAI, Anthropic, Google, Meta, Mistral, and more. Aut...
View ToolConfigure Claude Code for maximum productivity -- CLAUDE.md, sub-agents, MCP servers, and autonomous workflows.
AI AgentsStep-by-step guide to building an MCP server in TypeScript - from project setup to tool definitions, resource handling, testing, and deployment.
AI AgentsManaged scheduling on Anthropic infrastructure with API and GitHub triggers.
Claude CodeFable 5 is mostly a drop-in replacement for Opus 4.8, but 'mostly' is doing real work in that sentence. Here's every bre...
Anthropic gave subscribers two weeks of free Fable 5 access, then it moves to usage credits. Here's what's actually chan...
Fable 5 lists at $10/$50 per million tokens - twice Opus 4.8. But list price is the wrong number. Here is the cost-per-o...
Anthropic added three new primitives to Claude Managed Agents in spring 2026 - dreaming, outcomes, and multi-agent orche...
Anthropic shipped two names for one architecture on June 9, 2026. Here is what separates Fable 5 from Mythos 5, who can...

Claude Opus 4.8 looks like a benchmark bump, but the developer story is better honesty, dynamic workflows, and effort co...

New tutorials, open-source projects, and deep dives on coding agents - delivered weekly.