Fable 5.2 升级后报 400?会话历史、思考和工具调用排查
排查 Fable 5.2 升级失败,保留签名历史、移除不兼容参数,并区分 Claude API 规则、Bedrock 例外和 Ofox 实际测试结果。
升级 Fable 5.2 后出现 400,先读完整错误,再改提示词。会话绑定错误需要修复历史,强制工具错误需要调整请求,数据保留相关拒绝则需要处理账户政策。重复发送同一个请求无法修复这些问题。
本文依据 Fable 5.2 迁移文档,核查日期为 2026 年 11 月 10 日。标为“修改前”的示例说明与官方原生接口约定不兼容的写法。Ofox 测试中,关闭思考和强制工具的请求没有复现文档中的 400,而是返回了 200。如果网关接受请求却未落实其预期行为,下面的观察结果就很重要。
Ofox 实测究竟返回了什么
我们向 https://api.ofox.ai/anthropic/v1/messages 发送三个小请求,使用精确 ID anthropic/claude-fable-5.2、API 版本 2023-06-01、low effort 和 4,096 tokens 上限。三个请求都计算单价 12 美元的三件商品总额,仅使用合成数据。
| 测试 | 实际响应 | 能说明什么 |
|---|---|---|
| 最小请求 | 200、end_turn、36 美元 | 基础文本案例完成 |
加入 thinking: {"type":"disabled"} | 200,可见答案相同 | 路由接受了该字段,但不能证明思考被关闭 |
声明工具并强制 lookup_stock | 200,只有文本,没有工具调用 | 本次测试未执行所要求的强制工具调用 |
强制工具测试刻意保留原提示词的“Do not use tools”指令。仅收到看似合理的答案,无法验证强制选择约定;这次响应没有 tool_use 块。我们尚未确定是哪一层网关或上游处理了不兼容设置,因此不将其标为支持,也不声称已经定位原因。
这些只是单次请求观察,不是稳定的兼容性保证。需要可移植的代码时,应遵循文档约定、去掉不兼容控制项,并在精确路由上验证实际交付行为。下文说明官方 400 分支和应用修复方法。本批小测试没有复现签名前缀、数据保留、computer 工具或 advisor 故障。

英文截图来自本地渲染的测试记录,数据取自真实 API 响应;不是 Ofox 产品界面截图。
先确定在哪一步开始失败
记录精确模型、端点、API 版本、SDK 版本、状态码、错误体和请求 ID,再找到第一个失败请求。公开提交问题时,去掉密钥和私人会话内容。
| 失败位置或错误 | 优先检查 | 下一步处理 |
|---|---|---|
| 首个请求提到 thinking 或采样 | SDK 封装注入的默认参数 | 移除不兼容字段 |
| 续接提示块属于另一会话 | system、工具定义和早期消息 | 恢复原始前缀 |
错误提到 tool_choice | 框架添加的强制选择 | 改用 auto,在应用中检查完成条件 |
| 错误提到无法匹配的工具 ID | assistant 工具调用及下一条结果消息 | 补齐每个匹配的真实结果 |
| 错误提到 computer 或 advisor 工具 | 模型与平台兼容性 | 按对应平台迁移 |
| Claude API 首次请求提到保留期或 ZDR | 工作区的数据保留资格 | 发数据前由账户负责人处理 |
| HTTP 成功却没有答案文本 | 停止原因与输出额度 | 排查输出耗尽,不按 400 处理 |
保留一个使用合成输入、已知可用的请求。复制后先去掉可选字段,再逐个加回,借此区分模型限制与封装层悄悄注入的默认值。原始抓取请求保持不变,用于对照。
修复会话绑定失败
Fable 5.2 对所有账户执行前缀检查。如果客户端修改早期历史,某个旧账户上原本可在 Fable 5.1 执行的请求,升级后也可能失败。文档中的错误包含 The block is bound to a different conversation。
常见原因包括:重新生成带新时间戳的 system prompt、在轮次之间改变工具 schema、重排消息,或用本地摘要替换早期内容。仅保留原签名并不能使修改后的前缀有效。
应用代码层面的区别如下:
# Before: rewriting history after the model has produced signed content.
system = base_system + " Current time: " + current_timestamp
messages[0] = {"role": "user", "content": shortened_original_request}
# After: freeze the original request prefix; add genuinely new instructions.
system = original_system
messages.append({"role": "user", "content": new_instruction})
“修改后”模式用于追加新信息,不是压缩已满上下文的通用方法。如果必须改变任务、工具或摘要,应依据已验证的应用检查点开启新会话,或使用所选路由支持的文档化上下文管理机制。不要保留旧签名块,却寄希望于修改后的历史“意思差不多”。
在发送前的边界比较序列化值:原始 system prompt、工具定义、消息顺序和完整 assistant 块。便于阅读的聊天记录可能遗漏关键字段。对于 MCP 接入,还应检查服务端工具列表的变化是否改变前缀;只固定本地工具字典未必覆盖这一变化来源。
保留思考文档说明了一个恢复 beta:thinking.block_binding.prefix_mismatch_behavior: "drop_block",配合 thinking-binding-controls-2026-08-01 请求头。它会丢弃受影响的推理,而不是修复推理。用 input_transformations 报告查找修改位置,并考虑重新生成可能增加的成本。依赖该功能前,要验证所选路由是否支持 beta;本文没有声称 Ofox 的 Bedrock 路径会透传此控制项。
保存完整 assistant 消息,包括不透明块
不要仅用界面显示的文本重建下一次请求。原生 thinking 块包含不透明签名,redacted 块包含不透明数据。续接同一会话时,要保存完整响应块和原顺序。
# response is a completed native SDK Message.
messages.append({
"role": "assistant",
"content": [block.model_dump(exclude_none=True)
for block in response.content],
})
流式输出时,等待完成后取得组装好的最终消息。只记录 text delta 的采集器可能展示了有用答案,却保存了无法续接的历史。不要自行生成替代签名。状态丢失后,应找回原始消息,或从已验证事实开启新的任务会话。
“invalid signature”和“different conversation”是有关联但原因不同的诊断。已有 Claude thinking 签名文章覆盖序列化与流式采集错误。本文补充 5.2 更严格的升级边界,不表示所有历史模型采用相同检查规则。
移除继承而来的 thinking 和采样设置
Fable 5.2 的自适应思考不能关闭。从手动思考模型继承的封装可能发送固定 budget_tokens 或 thinking: {"type":"disabled"}。移除这些设置,改用支持的 effort 控制。
{
"model": "claude-fable-5-2",
"max_tokens": 4096,
"output_config": {"effort": "low"},
"messages": [{"role": "user", "content": "Calculate 3 times 12."}]
}
这是 Claude API 请求体模板。在 Ofox 上应使用 API 指南中的 ID 与端点。模板省略 thinking,因为自适应思考已是模型默认行为。
移除 temperature、top_p 和 top_k,不要随机换数值尝试。思考兼容性参考区分了 API 版本:对这些较新模型,旧 API 版本拒绝非默认采样值;从 2026-10-21 版本起,只要携带这些字段,无论值是什么都会被拒绝。还要检查是否预填了最后一条 assistant 消息,这里不能将其作为控制输出格式的变通办法。
始终启用思考和强制工具限制也适用于 Fable 5.1。这些是已有约束,升级后可能因代码路径变化而暴露,不能全部当作 5.2 新增规则。
替换强制工具选择,同时验证实际执行
按原生 Claude 官方约定,以下写法与 Fable 5.2 不兼容。但正如上面的 Ofox 测试所示,不要假设每个网关都会返回同样的错误:
{"tool_choice": {"type": "any"}}
{"tool_choice": {"type": "tool", "name": "lookup_stock"}}
改用 {"tool_choice":{"type":"auto"}},并说明何时必须查询,然后验证实际响应。如果任务需要权威库存数据,而模型未调用工具就回答,不应将其视为已完成库存工作。
对于需要 schema 格式的输出,受支持的严格工具 schema 或结构化输出可以处理格式要求。但这不意味着某个指定工具一定运行,模型和账户限制仍然适用。尤其是官方迁移指南指出,使用客户管理加密密钥的组织需要额外检查结构化输出兼容性。
可靠的应用循环要分开判断三件事:模型是否请求工具调用、参数是否有效且已授权、结果是否满足任务。还要设置最大轮数和明确的失败/未完成状态。否则,从强制选择改成 auto 可能只是把可见的 400 变成不易察觉的漏执行。
在协议层修复缺失的工具结果
若错误提到 tool_use_id,列出上一轮 assistant 的所有工具调用,为每个调用配上真实结果。Anthropic Messages 使用原生 user 消息中的 tool_result;Chat Completions 使用 tool 消息格式。二者是不同协议。
查询失败就如实返回错误结果。若查询在进程崩溃前已成功,应取回持久化记录的结果。不要仅为得到新的工具结果块而重复支付、发邮件或执行写入。工具结果 400 排查解释消息位置;检查点教程说明跨重启需要的持久化记录。
检查 Bedrock 和 advisor 例外
旧版 computer_20251124 工具在文档所述平台上配合 Fable 5.2 会报错,Amazon Bedrock 除外。其他平台需要迁移到 computer_toolset_20260801 声明,并相应修改 Agent 循环,不能只换 type 字符串而继续使用旧参数。
这一例外对 Ofox 很重要:11 月 10 日目录将 Fable 5.2 的供应商类型列为 aws_bedrock。不能仅凭 Claude API 示例就把旧 computer 工具写成 Ofox 已观察到的故障。先确认实际路由、支持的工具能力和完整请求。
使用 Anthropic advisor 工具时,5.2 执行模型需要受支持的 5.2 advisor。改变 advisor 声明会改变工具前缀,因此要在新会话中迁移,不要修改已有签名会话。advisor beta 的可用性也需单独核查,不能从普通文本和函数调用支持推导。
区分政策、容量与请求格式错误
Anthropic 文档规定 Fable 5.2 的数据保留期为 30 天,例外需要明确授权。Claude API 工作区若使用不兼容的 ZDR 设置,可能收到 400。不要为使请求成功而自动放宽客户的数据保留政策。应交由账户负责人决定,并查阅实际平台条款;这条规则不代表已经知道 Ofox 的账户配置。
遇到 429 或 529 时,改查容量与重试指引。短暂过载可以采用次数受限的退避重试,但格式错误的 400 不应原样重试。参考 529 过载指南(英文)及当前 Ofox 限流文档。
用同一个失败工作流验证修复
分别运行全新请求、续接、只读工具往返和已保存会话恢复。新请求成功不能证明历史保存问题已解决。还可以在独立的合成测试中刻意修改前缀,确认诊断能够识别变换,而不是掩盖它。
保留修改前后请求格式、错误、精确路由与完成结果。若开启了丢块恢复,应记录丢失状态,并检查交付答案。只有实际工作流通过独立验收,且未重复执行有副作用的操作,才算排查结束。
相关文档:Ofox 原生 Messages、鉴权、官方迁移指南。


