A refusal on Claude Fable 5 is a successful HTTP 200 with stop_reason: "refusal", not an exception. Code that treats every 200 as usable output is wrong on this tier. Anthropic shipped Fable 5 (claude-fable-5) on 2026-06-09 at $10/$50 per million tokens with a 1M context; the integration-breaking change is the classifier contract, not the price.
What to build
- Branch on
stop_reason === "refusal"on every call. - Retry on Opus 5 (or enable Anthropic’s beta automatic
fallbacks). - Account for billing: a request refused before any output is generated is not billed; fallback credit covers the prompt-cache cost of the retry model.
const msg = await client.messages.create({
model: "claude-fable-5",
max_tokens: 4096,
messages,
});
if (msg.stop_reason === "refusal") {
// HTTP 200, not an exception. Retry on another Claude model.
return retryOn("claude-opus-5", messages);
}
Fable 5 is an escalation tier - move up only when Opus 5 is not enough, because the price doubles and refusal handling adds integration cost lower tiers do not have. Mythos 5 is the same model without classifiers, limited to approved customers.
Full playbook: Claude Fable 5: refusals are an API contract, not an error.