Seedance 2.5 is live — 30-second cinematic video with native audio & real-person references
Claude Fable 5.1 迁移指南:修复工具选择 400 错误
2026/09/07

Claude Fable 5.1 迁移指南:修复工具选择 400 错误

从 Claude Fable 5 迁移到 Fable 5.1,避免工具调用中断、对话历史丢失、思考块绑定和回滚问题。

从 Claude Fable 5 迁移到 Claude Fable 5.1 并非一行代码改名那样简单。新模型拒绝强制工具选择,将保留的思考块绑定到产生它们的对话前缀,也无法将思考块回传到更早的 Claude 版本。因此一个集成可能通过单轮烟雾测试,在第一个结构化输出请求、压缩对话或回滚时仍然失败。

安全迁移有三个部分:用自动选择加模式强制替换强制工具调用,保持多轮历史仅追加,测试每条可能将对话切换回更早版本的路由。如果使用 OpenAI 兼容路由,先读 Claude Fable 5.1 请求指南;下面的原生例子使用 Anthropic Messages API,这样每个破坏性变更都清晰可见。

快速答案

  • 改原生模型 ID 为 claude-fable-5-1,然后删除强制 tool_choice 模式;any 和指定工具会返回 HTTP 400。[1]
  • Fable 5.1 thinking 块之后保持系统提示、工具和早期消息前缀不变。用追加新指令替代改写历史。[1]
  • 测试每条回滚路由:更早的 Claude 模型无法读 Fable 5.1 思考块,所以 API 会在继续前删除它们。[1]
  • 自适应思考保持开启。用 effort 替换手动 token 预算,在发布前在 CI 中测试前缀不匹配。[1]

首先,清点你正在迁移的代码路径

搜索范围比字面上的模型 ID 要宽。一个封装器可能会把通用的"必需工具"设置翻译为 Anthropic 的 tool_choice: {"type":"any"},在对话存储中保留思考块,或在每个请求中改变系统提示。发布后不久出现的 OpenCode 问题是一个有用的例子:它的结构化输出适配器选择了必需工具使用,变成了 Anthropic 不支持的 any 模式并产生了 400。[6]这个问题展示了真实的集成模式;Anthropic 的迁移指南是 API 行为的权威。

审计这些组件后再编辑:

组件搜索什么预期失败
模型选择claude-fable-5、别名、回滚列表旧模型仍然接收一些流量
工具适配器tool_choicerequiredany、指定工具400 invalid_request_error
结构化输出合成工具、schema 包装器包装器静默强制一个工具
对话存储thinkingredacted_thinking、签名编辑后思考块签名无效
压缩摘要注入、尾部保留、消息删除后面的块绑定到旧前缀
动态提示当前日期、权限、启用的工具系统或工具前缀每轮变化
重试和回滚更早的 Claude 模型 IDFable 5.1 思考块在切换时被删除
保留策略ZDR 工作区或组织请求在生成前被拒绝

如果可能,在序列化请求边界处做清单。应用对象即使 SDK 或提供商适配器改写它们也可能看起来不变。

第 1 步:更新模型 ID,但保持其他部分可观测

原生 ID 是 claude-fable-5-1。Fable 5.1 保留 100 万 token 上下文窗口,支持最多 128,000 输出 token,使用始终开启的自适应思考。[2]用相同的生产流量形状开始,记录请求 ID、状态码、停止原因、token 使用、工具调用和回滚。

不要用这次迁移来同时改变 effort、压缩、提示措辞和工具框架。一个狭隘的首次部署使 400 或行为变化可以追溯。建立兼容性后,在工作负载上扫描 lowmediumhighxhighmax,而非假设旧设置是最优的。Anthropic 文档说 high 是默认值。[1]

如果前任集成提供了这两个配置,也要删除:

# 两个对 Claude Fable 5.1 都无效。
thinking={"type": "disabled"}

thinking={"type": "enabled", "budget_tokens": 12000}

Fable 5.1 决定何时何时思考多少。用作前缀的尾随助手消息也会返回 400,所以在系统或用户内容中表达输出指令。[1]

第 2 步:替换强制工具选择

兼容性边界是精确的:

tool_choiceFable 5Fable 5.1
{"type":"auto"}支持支持
{"type":"none"}支持支持
{"type":"any"}支持HTTP 400
{"type":"tool","name":"record_summary"}支持HTTP 400

检查适用于 Messages、Message Batches 和 token 计数。报告的错误说工具选择类型 toolany 对该模型不支持。[1]重试相同的请求体无法帮助。

这是常见的迁移前模式:

response = client.messages.create(
    model="claude-fable-5",
    max_tokens=4096,
    tools=[record_summary_tool],
    tool_choice={"type": "tool", "name": "record_summary"},
    messages=[
        {"role": "user", "content": "Summarize the meeting notes."}
    ],
)

对于 Fable 5.1,使用自动选择,把要求放在当前指令中,让工具严格:

record_summary_tool = {
    "name": "record_summary",
    "description": "Record the structured meeting summary.",
    "strict": True,
    "input_schema": {
        "type": "object",
        "properties": {
            "summary": {"type": "string"},
            "action_items": {
                "type": "array",
                "items": {"type": "string"},
            },
        },
        "required": ["summary", "action_items"],
        "additionalProperties": False,
    },
}

response = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=4096,
    tools=[record_summary_tool],
    tool_choice={"type": "auto"},
    messages=[{
        "role": "user",
        "content": (
            "Summarize the meeting notes, then call record_summary "
            "with the summary and action items."
        ),
    }],
)

strict: true 在模型调用工具时约束参数;它不重建运输层保证工具必须被调用。你的应用必须验证响应包含所需的工具使用块。Anthropic 也建议当强制工具仅为获得符合 schema 的 JSON 时通过 output_config.format 用 JSON 输出。[1]

如果应用必须在对话中途要求一个指定工具,在最新用户消息后追加一个 role: "system" 消息。命名工具,陈述这一轮它是必需的,告诉模型以这个调用开始。在后来的历史中保持那个系统消息。这保留了早期前缀;改写顶层系统提示不会。[1]

把"模型忽略了指令"视为已处理的结果。拒绝轮次,在有限策略下重试,或安全地失败。不要把提示描述为绝对强制机制。

第 3 步:保留思考,只在 API 支持的方向

每个 Fable 5.1 思考块携带模型和对话绑定信息。兼容性是单向的:

Fable 5 思考  ───────► Fable 5.1 可以读它
Opus 5 思考   ───────► Fable 5.1 可以读它

Fable 5.1 思考 ──X──► Fable 5 无法读它
Fable 5.1 思考 ──X──► Opus 5 无法读它

Claude Mythos 5.1 是文档记录的例外,可以读 Fable 5.1 块。当路由器、拒绝回滚或客户端重试把对话发送到更早的模型时,API 删除目标无法读的块。请求仍然可能成功,删除的输入 token 不计费,但目标必须在没有那个推理的情况下重新规划。[1]

这对回滚评估很重要。Fable 5 的首次请求和 Fable 5.1 的首次请求不等于从 5.1 中途切换到 5。测量两者。启用思考绑定 beta 记录 input_transformationsmodel_binding_mismatch 指出因模型变化删除的块。

第 4 步:让对话前缀仅追加

Fable 5.1 思考块对于精确的系统提示、工具集和前面的消息历史有效。在重放块前改变任何这些可能对无效思考签名产生 400。[1]

常见的意外编辑包括:

  • 用新时间戳重建系统提示;
  • 从顶层 tools 数组添加或删除工具;
  • 删除旧工具结果以节省 token;
  • 在保留最近轮思考块的同时插入摘要;
  • 删除下一请求的每轮提醒;
  • 从同一个 URL 获取不同的图像或文档字节。

最后一个情况很容易遗漏:绑定涉及文件字节而不仅是 URL 字符串。对于跨轮重用的文件,Anthropic 建议一个稳定的 Files API file_id 或 base64 内容。[1]

首选这些模式:

  • 追加新轮不改早期字节;
  • 追加对话中系统消息以改变指令;
  • 对工具改变使用支持的工具添加和工具删除块;
  • 使用服务端压缩或上下文编辑;
  • 如果在客户端压缩,用一个摘要和新用户轮替换整个历史,不携带旧思考块。

那最后一个客户端形状故意简单。保持最近轮在新摘要后只有在删除他们的 thinkingredacted_thinking 块时才安全,因为那些块是针对摘要前的历史创建的。[1]

在用户之前诊断前缀不匹配

Anthropic 对 2026 年 8 月 31 日或之后创建的账户默认强制对话前缀检查。较早的账户可能不会失败,除非他们选择进入控制,这为库用于客户密钥创建危险的"对我们密钥有效"测试间隙。[1]

在分段会话中使用 beta 控制:

response = client.beta.messages.create(
    model="claude-fable-5-1",
    max_tokens=4096,
    thinking={
        "type": "adaptive",
        "block_binding": {
            "prefix_mismatch_behavior": "drop_block"
        },
    },
    messages=conversation,
    betas=["thinking-binding-controls-2026-08-01"],
)

for change in response.input_transformations or []:
    print(change.path, change.reason)

drop_block,API 删除第一个不匹配的思考块和后面的每个思考块,然后报告 prefix_binding_mismatch。用默认 error,它拒绝请求。当降级继续比失败更好时用 drop_block;在 CI 中用 error 立即暴露历史突变。[1]

相同无效请求体的自动重试无法修复不匹配。要么恢复原始前缀,删除受影响的思考块,要么显式请求一次删除行为。

重新检查不产生 400 的行为

兼容性测试也应覆盖安静的改变。Anthropic 说 Fable 5.1 可能在长代理循环中发出更少的平行工具调用,产生更少的进度消息,在 low effort 时调用搜索或检索更少。[3]这些都不一定表示缺陷,但每一个都可以改变延迟或产品行为。

围绕应用需要的东西建立断言:

  • 对于可并行化的读,记录每轮调用和总往返次数。
  • 对于进度 UI,要求用户面更新在定义的间隔而不是假设它们出现。
  • 对于检索基础的答案,明确检索条件并拒绝缺少必需证据的答案。
  • 对于编辑代理,验证改变文件列表并在需要小补丁时阻止整文件改写。[4]

也保持拒绝处理。Fable 5.1 可以返回 stop_reason: "refusal"stop_details.category;不要把空答案文本视为运输失败。任何回滚必须考虑单向思考兼容性。[2]

FAQ

为什么 Fable 5.1 对我的结构化输出请求返回 400?

审查序列化 Anthropic 请求。一个框架可能通过用 tool_choice: any 强制一个合成工具来实现结构化输出。Fable 5.1 拒绝 any 和指定 tool 选择。切换到自动工具选择加严格 schema 和明确指令,或使用 Anthropic 的 JSON 输出机制。

strict: true 保证 Claude 调用工具吗?

否。它保证调用工具时参数符合 schema。指令可以要求调用,但你的应用仍需确认预期的工具使用块存在并处理其缺失。

Fable 5.1 能继续 Fable 5 对话吗?

是的。Fable 5.1 可以读来自 Fable 5 和其他文档记录的早期 Claude 模型的保留思考。反向不兼容:更早的目标在 Fable 5.1 思考块被删除后接收对话。

我能改变轮之间的系统提示吗?

不能通过在重放后面 Fable 5.1 思考块时改写前缀。追加对话中系统消息并保留在历史中。如果应用故意启动新对话,它可以使用新系统提示,因为没有旧思考块要保留。

最安全的客户端压缩策略是什么?

用一个摘要消息加新用户轮替换所有早期历史,不重放旧思考块。如果保留最近尾部,从尾部删除思考和清空思考块或使用文档删除行为。

迁移降低每个 API 账单吗?

否。输入和输出列表价格保持 $10 和 $50 per 百万 token。缓存读更便宜,但任务成本也依赖输出、轮数、effort、重试和缓存是否保持有效。[5]Fable 5.1 成本分解单独处理该计算。

发布门:所有行通过前不要部署

通过条件
模型路由每个生产别名在预期的地方解析到 claude-fable-5-1
强制工具没有序列化请求包含 tool_choice: any 或指定强制工具
必需输出丢失工具调用和无效数据在应用代码中安全地失败
思考历史多轮、工具改变和压缩测试显示无意外前缀不匹配
回滚降级测试容忍删除的 5.1 思考并不双执行副作用
保留目标工作区允许模型必需的保留策略
行为检查检索、进度、工具批处理、拒绝和文件编辑范围满足产品标准

绿色单轮响应只证明模型 ID 和凭证工作。绿色迁移在工具调用后、历史改变后和通常只在生产已经压力下运行的回滚后锻炼对话。

References

  1. Anthropic, 迁移到 Claude Fable 5.1 和 Claude Mythos 5.1, accessed September 7, 2026.
  2. Anthropic, Claude Fable 5.1 概述, accessed September 7, 2026.
  3. Anthropic, Claude Fable 5.1 的新增功能, accessed September 7, 2026.
  4. Anthropic, 提示 Claude Fable 5.1, accessed September 7, 2026.
  5. Anthropic, API 价格, accessed September 7, 2026.
  6. OpenCode, Issue #46735: Claude Fable 5.1 结构化输出工具选择错误, accessed September 7, 2026. The issue is cited as an integration example; API behavior is sourced from Anthropic.