400 invalid_request_error
Claude Fable 5 的 400 invalid_request_error
要么你的请求体里带了 Fable 5 已经移除的参数,要么你所在组织的数据留存设置直接把这个模型挡在门外。
30 秒版本
Fable 5 的 400 大多来自新版 Claude 模型不再接受的参数:非默认的 temperature、top_p、top_k,assistant 消息 prefill,thinking 传 disabled,以及带 budget_tokens 的手动扩展思考。另一类 400 是组织级的:Fable 5 要求 30 天数据留存,配置低于这个要求的组织,无论请求体写什么,每一个请求都返回 400。
什么会在 Fable 5 上触发 400
先读错误信息。它会指出出问题的字段,thinking block 类的错误还会给出 block 的位置。
预填了 assistant 消息
Claude 4.6 及之后的模型不支持预填 assistant 回合。messages 数组以 assistant 消息结尾会返回 400,错误信息会说明对话必须以 user 消息结尾。改用结构化输出、output_config.format,或者在系统提示里下指令。
组织数据留存低于 30 天
Fable 5 属于 Covered Model,要求 30 天数据留存,不提供零数据留存。在 Claude API 上,留存配置不满足这一要求的组织发出的请求返回 400 invalid_request_error。症状是每个请求都以完全相同的方式失败,连最小的 hello-world 请求体也不例外。
被改动或过滤过的 thinking block
如果最近一条 assistant 消息里的 thinking 或 redacted_thinking block 在回传前被重排、过滤掉或重新构造过,请求会返回 400。错误信息以出问题 block 的位置开头,例如 messages.1.content.0。
temperature、top_p 或 top_k 设成了非默认值
这三个参数中任何一个设成非默认值都会返回 400。这不是 Fable 5 独有的:从 Claude Opus 4.7 起就是如此,覆盖 Sonnet 5、Opus 5 和 Fable 5。SDK 的请求类型为了兼容旧模型仍然定义这些字段,所以代码能编译通过,请求在服务端被拒。
Fable 5 不接受的 thinking 配置
自适应思考始终开启。thinking 传 disabled、以及带 budget_tokens 值的手动扩展思考,都返回 400。disabled 那种情况的错误信息会建议用 thinking.type.enabled,但这种写法在 Fable 5 上同样被拒,所以正确做法是把 thinking 参数整个去掉。
按这个顺序修
先做一个判别动作:如果最小请求也失败,就别再调试请求体了,去查组织设置。
- 1
3. 在组织或工作区层面修正留存设置
如果你所在组织有零数据留存安排,仍然可以在 Console 工作区设置的 Privacy controls 里,单独为某一个工作区启用 30 天留存,其余工作区保持零留存。否则请联系你的 Anthropic 客户团队。
- 2
4. 一字不改地回传 thinking block
使用工具调用时,把 assistant 回合里的每一个 thinking 和 redacted_thinking block 原样返回,包括 thinking 字段为空的那些。如果你的代码在重发前按类型过滤内容块,把这两种类型都加进白名单。
- 3
1. 发一个最小请求,区分是请求体还是账号问题
只带 model 和 max_tokens,发一条单行 user 消息。如果成功,问题在你的请求体里。如果同样返回 400,问题就是组织的数据留存配置,改请求体没有任何用。
- 4
2. 删掉 Fable 5 拒收的参数
把 temperature、top_p、top_k 从请求里删掉,而不是设成默认值。把整个 thinking 对象删掉,而不是换一个 type 试试。把用于 prefill 的尾部 assistant 消息删掉。