## Migrating to Claude Fable 5.1 from Claude Fable 5 ### Update your model name ### Breaking changes ### Behavior changes ### Recommended changes ### Migration checklist ## Migrating to Claude Fable 5.1 from Claude Opus 5 ### Update your model name ### What changed ### Migration checklist ## Migrating to Claude Fable 5.1 from Claude Opus 4.8 or earlier ### Update your model name ### Migration checklist ## Migrating to Claude Mythos 5.1 from Claude Mythos 5 ### Update your model name ### Migration checklist
The whole hunk
1653 lines, new pageA whole new page. There's nothing to diff it against, so here is what it says.
---
title: Migrating to Claude Fable 5.1 and Claude Mythos 5.1
url: https://platform.claude.com/docs/en/models/fable-5-1/migration-guide
description: "Migrate to Claude Fable 5.1 and Claude Mythos 5.1 from Claude Fable 5, Claude Mythos 5, Claude Opus 5, or Claude Opus 4.8: model IDs, breaking changes, and migration checklists."
---
<Note>
This guide covers migrating [Messages API](https://platform.claude.com/docs/en/build-with-claude/working-with-messages) code. If you use [Claude Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview), no changes beyond updating the model name are required.
</Note>
<Tip>
**Automate your migration with the Claude API skill.** In Claude Code, run `/claude-api migrate` to invoke the bundled [Claude API skill](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/claude-api-skill#migrating-to-a-newer-claude-model). It works for any current Claude model as the target:
```text wrap
/claude-api migrate this project to claude-fable-5-1
```
The skill applies the model ID swap and, as needed, breaking parameter changes, prefill replacement, and effort calibration for your target model across your code base, then produces a checklist of items to verify manually. It asks you to confirm the migration scope (entire working directory, a subdirectory, or a specific file list) before editing any files. The skill also detects Amazon Bedrock and Claude Platform on AWS clients and adjusts model ID formats and feature changes for those platforms.
</Tip>
[Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1) succeeds Claude Fable 5 at the same input and output prices, with cache reads at a quarter of the cost. It's available on the Claude API, [Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), [Google Cloud](https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai), and [Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry). [Claude Mythos 5.1](https://anthropic.com/glasswing) shares the same capabilities and is offered only to approved customers in Project Glasswing. For behavioral differences and prompting patterns, see [Prompting Claude Fable 5.1](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5-1).
The baseline settings shared by `claude-fable-5-1` and `claude-mythos-5-1`:
* **Thinking:** [Adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/thinking) is always on, unchanged from Claude Fable 5. The model decides when and how much to think. No `thinking` configuration is required. Both `thinking: {type: "disabled"}` and manual extended thinking (`thinking: {type: "enabled", budget_tokens: N}`) return a 400 error.
* **Prefill:** Prefilling the assistant message returns a 400 error, unchanged from Claude Fable 5. Use system prompt instructions instead.
* **Tool choice:** `{type: "auto"}` (the default) and `{type: "none"}` are supported. Forcing a tool call with `{type: "any"}` or `{type: "tool", name: "..."}` returns a 400 error. See [Breaking changes](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-breaking-changes).
* **Preserved thinking across models:** Claude Fable 5.1 reads thinking blocks from Claude Opus 5, Claude Fable 5, Claude Mythos 5, and earlier Claude models. None of those models can read Claude Fable 5.1's blocks. See [Breaking changes](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#fable-5-1-breaking-changes).
* **Context window and output:** A [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows) by default, and up to 128k output tokens per request.
* **Pricing:** $10 USD per million input tokens and $50 USD per million output tokens, the same as Claude Fable 5. Prompt cache reads are $0.25 USD per million tokens, a quarter of the Claude Fable 5 rate. See [Claude pricing](https://platform.claude.com/docs/en/about-claude/pricing).
* **Data retention:** Both models require 30-day data retention, aren't available under zero data retention (ZDR) arrangements unless expressly authorized by Anthropic, and are designated Covered Models, the same as Claude Fable 5 and Claude Mythos 5. On the Claude API, a request from an organization or workspace without 30-day retention returns a 400 `invalid_request_error`. Organizations with a ZDR arrangement should contact their Anthropic account team, or configure retention per workspace. See [Model-specific data retention requirements](https://platform.claude.com/docs/en/manage-claude/api-and-data-retention#model-specific-data-retention-requirements) for per-platform details.
Where the two models diverge:
* **Availability:** Claude Fable 5.1 doesn't require access approval. Claude Mythos 5.1 is available only to approved customers in [Project Glasswing](https://anthropic.com/glasswing). Contact your Anthropic account team for access.
* **Safety classifiers:** Claude Fable 5.1 runs safety classifiers covering the same `stop_details` categories as Claude Fable 5. A declined request returns `stop_reason: "refusal"` with a `stop_details.category`, and can fall back to another model with the `fallbacks` parameter or a client-side retry. See [Refusals and fallback](https://platform.claude.com/docs/en/build-with-claude/refusals-and-fallback).
* **Priority Tier:** Neither model is supported on [Priority Tier](https://platform.claude.com/docs/en/api/service-tiers#supported-models). Claude Fable 5 is.
## Migrating to Claude Fable 5.1 from Claude Fable 5
Migration is mostly drop-in. The API surface, limits, per-token pricing, tokenizer, always-on adaptive thinking, refusal handling, and `stop_details` categories all match Claude Fable 5. What changes: forced tool choice returns a 400 error, thinking blocks are preserved only for the model that produced them or a newer one and only in the conversation that produced them, cache reads cost less, and agent-loop behavior differs in three ways. The same changes apply to [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/fable-5-1/migration-guide#migrating-from-claude-mythos-5-to-claude-mythos-5-1), except the conversation check on thinking blocks, which Claude Mythos 5.1 doesn't run.
### Update your model name
```python
model = "claude-fable-5" # Before
model = "claude-fable-5-1" # After
# Or, for the Project Glasswing model with the same capabilities:
model = "claude-mythos-5-1" # After
```
### Breaking changes
1. **Forced tool choice is not supported:** Claude Fable 5 accepts `tool_choice` `auto`, `none`, `any`, and `tool`. On `claude-fable-5-1`, `{type: "any"}` and `{type: "tool", name: "..."}` return a 400 `invalid_request_error`:
```text wrap
tool_choice: type "tool" and "any" are not supported for this model.
```
The check applies on the Messages API, the Message Batches API, and the [token counting](https://platform.claude.com/docs/en/build-with-claude/token-counting) endpoint.
Before (Claude Fable 5):
<CodeGroup>
```bash cURL
curl -sS https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d @- <<'EOF'
{
"model": "claude-fable-5",
"max_tokens": 16000,
"tools": [
{
"name": "record_summary",
"description": "Record the structured summary of the document.",
"input_schema": {
"type": "object",
"properties": {"summary": {"type": "string"}},
"required": ["summary"]
}
}
],
"tool_choice": {"type": "tool", "name": "record_summary"},
"messages": [
{"role": "user", "content": "Summarize: The meeting moved to Thursday."}
]
}
EOF
```
<MultiFileExample language="cli" label="CLI">
```bash CLI
ant messages create < request.yaml
```
<File filename="request.yaml">
```yaml
model: claude-fable-5
max_tokens: 16000
tools:
- name: record_summary
description: Record the structured summary of the document.
input_schema:
type: object
properties:
summary:
type: string
required: [summary]
tool_choice:
type: tool
name: record_summary
messages:
- role: user
content: "Summarize: The meeting moved to Thursday."
```
</File>
</MultiFileExample>
```python Python
client = anthropic.Anthropic()
record_summary_tool = {
"name": "record_summary",
"description": "Record the structured summary of the document.",
"input_schema": {
"type": "object",
"properties": {"summary": {"type": "string"}},
"required": ["summary"],
},
}
response = client.messages.create(
model="claude-fable-5",
max_tokens=16000,
tools=[record_summary_tool],
tool_choice={"type": "tool", "name": "record_summary"},
messages=[{"role": "user", "content": "Summarize: The meeting moved to Thursday."}],
)
print(response.content)
```
```typescript TypeScript
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-fable-5",
max_tokens: 16000,
tools: [
{
name: "record_summary",
description: "Record the structured summary of the document.",
input_schema: {
type: "object",
properties: { summary: { type: "string" } },
required: ["summary"]
}
}
],
tool_choice: { type: "tool", name: "record_summary" },
messages: [{ role: "user", content: "Summarize: The meeting moved to Thursday." }]
});
console.log(response.content);
```
```csharp C#
AnthropicClient client = new();
var parameters = new MessageCreateParams
{
Model = Model.ClaudeFable5,
MaxTokens = 16000,
Tools = [
new ToolUnion(new Tool()
{
Name = "record_summary",
Description = "Record the structured summary of the document.",
InputSchema = new InputSchema()
{
Properties = new Dictionary<string, JsonElement>
{
["summary"] = JsonSerializer.SerializeToElement(new { type = "string" }),
},
Required = ["summary"],
},
}),
],
ToolChoice = new ToolChoiceTool { Name = "record_summary" },
Messages = [
new() { Role = Role.User, Content = "Summarize: The meeting moved to Thursday." }
]
};
var message = await client.Messages.Create(parameters);
Console.WriteLine(message);
```
```go Go
client := anthropic.NewClient()
response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: anthropic.ModelClaudeFable5,
MaxTokens: 16000,
Tools: []anthropic.ToolUnionParam{
{OfTool: &anthropic.ToolParam{
Name: "record_summary",
Description: anthropic.String("Record the structured summary of the document."),
InputSchema: anthropic.ToolInputSchemaParam{
Properties: map[string]any{
"summary": map[string]any{"type": "string"},
},
Required: []string{"summary"},
},
}},
},
ToolChoice: anthropic.ToolChoiceUnionParam{OfTool: &anthropic.ToolChoiceToolParam{Name: "record_summary"}},
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("Summarize: The meeting moved to Thursday.")),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.RawJSON())
```
```java Java
void main() {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model(Model.CLAUDE_FABLE_5)
.maxTokens(16000L)
.addTool(Tool.builder()
.name("record_summary")
.description("Record the structured summary of the document.")
.inputSchema(InputSchema.builder()
.properties(JsonValue.from(Map.of("summary", Map.of("type", "string"))))
.required(List.of("summary"))
.build())
.build())
.toolChoice(ToolChoice.ofTool(ToolChoiceTool.builder()
.name("record_summary")
.build()))
.addUserMessage("Summarize: The meeting moved to Thursday.")
.build();
Message response = client.messages().create(params);
IO.println(response);
}
```
```php PHP
$client = new Client();
$message = $client->messages->create(
maxTokens: 16000,
messages: [
['role' => 'user', 'content' => 'Summarize: The meeting moved to Thursday.']
],
model: 'claude-fable-5',
toolChoice: ['type' => 'tool', 'name' => 'record_summary'],
tools: [
[
'name' => 'record_summary',
'description' => 'Record the structured summary of the document.',
'input_schema' => [
'type' => 'object',
'properties' => [
'summary' => ['type' => 'string']
],
'required' => ['summary']
]
]
],
);
echo $message;
```
```ruby Ruby
client = Anthropic::Client.new
message = client.messages.create(
model: Anthropic::Model::CLAUDE_FABLE_5,
max_tokens: 16000,
tools: [
{
name: "record_summary",
description: "Record the structured summary of the document.",
input_schema: {
type: "object",
properties: { summary: { type: "string" } },
required: ["summary"]
}
}
Cut at 300 lines. The page has the rest.