历史里的网页搜索结果导致整段 400

Claude Code 2.1.282 修复一种 400:对话历史里存着 API 无法解密的网页搜索结果,例如某一轮是经第三方网关回答的。修复前是每一次请求都失败。说明没有写会自动删掉哪一段历史,旧会话升级后仍可能 400。

历史里的网页搜索结果导致整段 400

Claude Code 2.1.282 修了一种会让后续每一轮都失败的 400。条件写在发行说明里:对话历史中有 API 无法解密的网页搜索结果,例如某一轮是经第三方网关回答的。claude code 网页搜索 400 在这种会话里会让后面每一轮都失败:历史里留下了一段当前 API 读不了的网页搜索结果。

作者:CodePass 技术编辑

网关回合会留在同一条会话里

直连 Anthropic 和第三方网关对网页搜索结果的保存格式可以不一样。会话先在网关侧做过带网页搜索的一轮,再改回官方 API,或反过来,历史里的那段结果就可能无法解密。2.1.281 修过代理把流截断、以及「Content block not found」。2.1.282 这句专指网页搜索结果解密失败,并且是 every request failing。升级前,继续聊、压缩或换模型都可能还是 400,因为坏块还在历史里。

说明没有写修复是删掉那些结果、跳过它们,还是换一种编码重发。升级到 2.1.282 之后,同一条旧会话若仍然 400,再新开一轮,不要假定旧会话文件已经被改写干净。

和思考块错误分开看

2.1.282 另有一条:Invalid data in redacted_thinking block 时丢掉思考块并重试一次。网页搜索 400 的说明没有写同样的「丢掉并重试」。两条都表现为续聊失败,报错正文不同。看到解密或 web search,对 2.1.282 的网页搜索修复;看到 redacted_thinking,对思考块那条。都低于 2.1.282 时,先升级再判断会话还能不能续。

经网关使用网页搜索时,把网关会话和官方 API 会话分开,避免把一边的搜索结果块带进另一边的历史。这是根据说明里的 for example 做的隔离,不是发行说明里的配置项。

参考资料