Claude Code 升到 2.1.304 以后,公司自建网关每个请求都回 400,是 tool search 的锅吗

报错大概长这样(示意,外层格式各家网关不一样):

API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"context_management: Extra inputs are not permitted"}}

常见的情况是组里的 Claude Code 一直走公司自己搭的网关,ANTHROPIC_BASE_URL 指过去,用了几个月都没事。某天自动更新了一下,再开会话,随便问一句就是上面这种 400,或者网关日志里一排 422,报的字段名有时是 context_management,有时是 defer_loading、tool_reference,有时干脆是 anthropic-beta 里的某个值不认。配置一个字没动的话,就该查客户端版本了。

官方 changelog 里 10 月这几版跟网关有关的条目是下面几条(我看的时候 changelog 最新已经到 2.1.311):

2.1.304(10 月 19 日):自定义 ANTHROPIC_BASE_URL 时 tool search 改成默认开启,changelog 上写的是网关回 400 或 422 时会去掉 tool search 再重试。同一版还修了网关后面报 context_management: Extra inputs are not permitted 的问题,现在会去掉这个字段重发。官方的网关兼容文档也写了,2.1.304 之前遇到这个报错是不会自动重试的,所以更老的版本碰上这个错只能自己改配置。

2.1.305(10 月 20 日):修了一个 2.1.304 带进来的回归:端点或网关拒绝 tool search 时每个请求都失败,网关里禁用了 ToolSearch、或者 --tools 没带它的情况也算。修好以后会不带 tool search 重试。如果恰好停在 2.1.304 上,请求全挂大概率就是这一条。

2.1.310(10 月 23 日):修了部分网关和兼容服务拒绝 effort-2025-11-24 这个 beta 值,或者拒绝对话中途的 system 消息导致请求失败的问题,现在会去掉它们重试。

动手之前可以先去网关日志里看一眼被拒的那条请求,上游报错里点名的是哪个字段、哪个 beta 值,基本就能对上上面哪一条。defer_loading、tool_reference 对应 tool search,context_management 对应上下文管理,effort-2025-11-24 或者 Unexpected role "system" 一类对应 2.1.310 那条。

先在终端跑 claude --version 看自己停在哪一版,落在 2.1.304 的话直接 claude update 升上去就行。升级后还不对,跑 claude doctor,它是在 shell 里直接执行的只读诊断,不用起会话,安装状态、settings 文件校验错误、上次自动更新成没成功都会列出来。会话内的 /doctor 是个需要调模型的 skill,请求全 400 的时候它多半也跑不起来,所以这时候用命令行那个更靠谱。

如果升到新版还是报错,或者你们因为内部规定暂时不能升,文档里有两个开关可以用:

  • ENABLE_TOOL_SEARCH=false:新版遇到原因不明的 400/422 会自动去掉 defer_loading 和 tool_reference 重试,但过一阵还会再试 tool search,网关日志里就会周期性地出现一次被拒、一次重试。设了这个变量就每个请求都不带这些字段,代价是 MCP 工具全部一开始就加载进上下文。
  • CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1:范围更大,context_management、strict/defer_loading 这类 beta 工具字段、MCP tool search 都会停掉。它不管 effort 相关的 beta 值和对话中途的 system 消息,这两样要靠 2.1.310 的自动重试,或者网关这边放行。

还有个容易漏的地方:有人在 ANTHROPIC_BETAS 里手动写过 effort-2025-11-24,文档说这种情况下 Claude Code 会继续发它,照样 400,得自己把这一项删掉。

网关那边能配合的话,官方的意思是 anthropic-beta 头和对应的 body 字段要成对转发,上游的错误响应体原样透传,别包一层自己的格式。客户端的自动重试大多是按上游报错原文匹配的,网关把报错改写了,状态码没变也认不出来,就不会重试。

官方链接:

有没有人是升到 2.1.310 以后还在 400 的?想知道报错里具体是哪个字段,是不是还有文档没覆盖到的情况。