Table of Contents
In my Opus 4.8 article I said 80% of what I ship runs on Sonnet and the rest goes to Opus. Then Anthropic released the Claude 5 family, and the top of that ladder moved. Claude Fable 5 is now their most capable generally available model — a new tier that sits above Opus. I've spent the past month integrating it into two client projects, and this is the honest breakdown: what changed in the API, what it does to your frontend, and whether the price is justified.
What Fable 5 is, and where it sits
The model ID is claude-fable-5. It ships with a 1M-token context window (that's the default, not an opt-in) and up to 128K output tokens per request. There's a sibling model, Claude Mythos 5, which is the same underlying model without some of the dual-use safety measures — but it's only available to approved organizations, so for practical purposes Fable 5 is what you and I get.
The mental model I use for the current lineup:
- Haiku 4.5 — classification, autocomplete, anything where speed beats depth
- Sonnet 5 — the production workhorse; near-Opus quality at a third of the price
- Opus 4.8 — hard reasoning, agentic loops, tasks where quality is load-bearing
- Fable 5 — the ceiling: long-horizon autonomous work, tasks Opus fails at, problems where a single correct answer is worth minutes of compute
The key insight after a month: Fable 5 is not "Opus but better at everything you already do." It's a model for work above what Opus could handle — overnight refactors that finish without correction, analysis across hundreds of documents, agentic runs with dozens of tool calls that stay coherent. If your current Opus integration works fine, you probably don't need it. If you've hit Opus's ceiling, that's the signal.
The API differences that will break your Opus code
You can't just swap the model string. Fable 5 has a stricter request surface, and several things that work on Opus return a 400 here.
Thinking is always on. Don't pass a thinking parameter at all — the model decides when and how deeply to reason. An explicit { type: "disabled" } is rejected, and the old budget_tokens is long gone. The raw chain of thought is never returned; if you want a readable summary of the reasoning, opt in with display: "summarized".
No sampling parameters. temperature, top_p, top_k — all rejected. If you were using temperature for variety, that steering now belongs in the prompt.
No assistant prefill. If you were forcing JSON output by prefilling {"name": ", switch to structured outputs via output_config.format — which is more reliable anyway.
A minimal call looks like this:
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const response = await client.messages.create({
model: 'claude-fable-5',
max_tokens: 16000,
output_config: { effort: 'high' },
messages: [
{ role: 'user', content: 'Analyse these 40 support tickets and identify systemic product issues.' },
],
});
// Check stop_reason BEFORE reading content — more on this below
if (response.stop_reason !== 'refusal') {
const text = response.content.find(b => b.type === 'text');
console.log(text?.text);
}
One operational note that cost me an afternoon: Fable 5 requires 30-day data retention. If your organization is configured for zero data retention, every request returns a 400 with a perfectly valid payload. Check the org settings before you debug the request body.
Effort instead of thinking budgets
Since you can't configure thinking directly, the depth control is output_config.effort with five levels: low, medium, high, xhigh, and max. The default is high.
What I've settled on after testing:
low/medium— routine work. Here's the surprise: Fable 5 atlowoften beats previous models at their maximum settings. If you're paying Fable prices anyway, low-effort routine calls are not a waste.high— the sensible default for anything intelligence-sensitivexhigh— coding and agentic workloads; this is what Claude Code defaults tomax— when correctness matters more than cost or time, and you've verified it actually helps (it can overthink)
Effort interacts with max_tokens in a way that bites: it's a hard cap on thinking plus response. At xhigh or max, a tight budget produces a response that's almost entirely internal reasoning followed by a truncated answer. Give it room — 64K and up for the high settings — and stream.
Refusals and fallbacks — handle them from day one
This is the part most integration guides bury, and it's the most important operational difference. Fable 5 runs safety classifiers on requests, aimed at research biology and most cybersecurity content. Benign adjacent work can occasionally trip them — one of my clients does security-adjacent dev tooling, and we saw false positives in testing. A declined request comes back as HTTP 200 with stop_reason: "refusal", which means code that blindly reads content[0].text will break in production, not in your happy-path tests.
The clean solution is the server-side fallback parameter: name a substitute model, and on a policy decline the API re-runs the same request on it inside the same call. One round trip, no retry logic on your side:
const response = await client.beta.messages.create({
model: 'claude-fable-5',
max_tokens: 16000,
betas: ['server-side-fallback-2026-06-01'],
fallbacks: [{ model: 'claude-opus-4-8' }],
messages: [{ role: 'user', content: userMessage }],
});
// Did a fallback model serve this response?
const fallbackRan = (response.usage.iterations ?? []).some(
(entry) => entry.type === 'fallback_message',
);
if (fallbackRan && response.stop_reason !== 'refusal') {
console.log(`Served by ${response.model}`); // claude-opus-4-8
}
Billing works in your favor: a decline before any output isn't billed at all, and the fallback run bills at the fallback model's (cheaper) rates. A refusal on the final response means the whole chain declined — that's the case your UI still needs to handle gracefully, with an honest "I can't help with this request" state instead of a spinner that never resolves.
Frontend UX for minutes-long responses
Here's where this becomes a frontend article. On hard tasks at high effort, a single Fable 5 request can run for many minutes. A 10–15 minute request is normal behavior, not a hang. That breaks every assumption baked into a typical chat UI.
What I changed in the client project that uses it interactively:
- Always stream. Non-negotiable at this latency. Use
client.messages.stream()and give the SDK generous timeouts. - Show thinking activity. By default, thinking blocks stream with empty text — the user sees a dead pause that can last minutes. Set
display: "summarized"and render the reasoning summary as a collapsible "working…" panel. The perceived-latency difference is enormous. - Design for async. For the heaviest tasks we moved off request/response entirely: the job is queued server-side, the UI shows a progress card, and the result arrives via WebSocket. Nobody watches a spinner for twelve minutes.
// api/analyze/route.ts (Next.js App Router)
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
export async function POST(req: Request) {
const { task } = await req.json();
const stream = client.messages.stream({
model: 'claude-fable-5',
max_tokens: 64000,
thinking: { type: 'adaptive', display: 'summarized' },
output_config: { effort: 'xhigh' },
messages: [{ role: 'user', content: task }],
});
return new Response(stream.toReadableStream());
}
On the React side, handle thinking_delta events separately from text_delta — thinking goes into the status panel, text into the answer. Users who can see the model is working wait patiently; users staring at nothing assume it crashed.
Cost: $10/$50 and when it pays off
Fable 5 costs $10 per million input tokens and $50 per million output — double Opus 4.8's $5/$25, and output tokens include all that thinking. This is the model where cost discipline stops being optional.
What keeps our bill sane:
- Route by task, not by default. Sonnet 5 first, Opus for hard reasoning, Fable only for the workloads that earned it. In our stack that's roughly 3% of requests.
- Prompt caching matters twice as much. Cache reads at ~10% of input price, on a $10 input rate, on repeated 1M-token contexts — the arithmetic writes itself. Cache your system prompt and any repeated documents.
- Batch what isn't interactive. The Batches API is 50% off, and Fable's minutes-long turns fit background processing naturally.
- Log
usageper request. Same advice as always, but the stakes doubled. We track cost per business outcome, not per token — that's the number the client actually cares about.
Concrete example: the document-analysis pipeline I moved from Opus to Fable costs about 1.9× more per run — but the output went from "draft an analyst reviews for an hour" to "final version with occasional spot-checks." The analyst hour was worth far more than the token delta. That's the shape of task where Fable 5 pays for itself; a chatbot answering FAQ questions is not.
My verdict after a month
Fable 5 is the first model where I'd describe the difference as delegation rather than assistance. Give it a well-specified task up front — full context, clear definition of done — and it works the way a strong senior colleague does: quietly, for a long time, arriving with something finished. It rewards a different prompting style too: state the goal and constraints, skip the step-by-step scaffolding you wrote for older models. My over-prescriptive Opus prompts actually performed worse until I trimmed them.
Where I'd reach for it:
- Agentic pipelines that were failing on Opus — long tool-use chains, multi-step autonomous work
- Analysis where a wrong answer is expensive and a human review cycle is more expensive still
- Huge-context work that actually uses the 1M window instead of just admiring it
Where I wouldn't: anything interactive and latency-sensitive, anything Sonnet 5 already does well, and anything where you can't articulate why the extra intelligence is worth 2× Opus pricing. The best Fable 5 integration decision is often deciding which 97% of your traffic doesn't need it.
Integrating AI into your product or workflow?
Let's talk