修复绑定到其他对话的思考块
在出现提示思考块绑定到其他对话的 400 错误后让对话继续进行,找出您的代码更改了什么,并测试该更改已被消除。
再次发送相同的请求无法成功,因为您的历史记录中仍包含您的代码所做的更改。发送 "drop_block" 以立即停止错误。长期修复是让您的代码成为 “append-only”(仅追加)。
错误:The block is bound to a different conversation
该思考块未通过 “prefix check”(前缀检查):在 Claude 生成它之后,它之前的某些内容发生了更改(请参阅什么算作更改),或者位于其他思考块之间的某个思考块被省略或移动了位置。该错误如下所示,并且可能会进一步指出更改了什么:
messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block".“A different conversation” 指的是该块之前的内容不同:前缀检查不会比较会话或用户。错误消息说要移除该块,但只移除该块是不够的。其他错误可能看起来与此类似。
如果该应用不是您的,请开始一个新对话并告知其维护者。如果您移除了机密、个人数据或注入的文本,或者您的请求关闭了思考,请手动移除思考,而不是执行步骤 1。
立即停止错误
将
thinking.block_binding.prefix_mismatch_behavior设置为"drop_block",并发送 “beta header”(beta 标头)anthropic-beta: thinking-binding-controls-2026-08-01。请在该对话之后的每个请求中都这样做,因为 API 不会在请求之间存储该设置。即使您修复了代码,已保存的对话仍包含该更改,因此请将该设置与对话一起存储。将type设置为"adaptive",如下所示:{ "thinking": { "type": "adaptive", "block_binding": { "prefix_mismatch_behavior": "drop_block" } } }在 SDK 中,调用 beta Messages 方法并传入标头值,如测试程序中所示。如果错误仍要求提供标头,则说明标头没有送达。
这会通过丢弃无效的思考来停止错误,但它可能花费更多,并可能影响输出质量和 “latency”(延迟)。下一个请求会成功,其
input_transformations数组会列出 API 丢弃的每个块。如果您的请求没有设置
thinking参数,添加它不会改变其他任何内容,因为具有保留思考的模型默认进行自适应思考。
如果该更改是最近发生的,您也可以撤销它:恢复您的代码所更改的内容。更改之前的思考会再次有效。此后生成的思考会未通过前缀检查,因此请移除它,或继续发送 "drop_block"。
丢弃思考的代价
Claude 可能会花费更多输出令牌来重新推导它已无法读取的推理。丢弃这些块还会使 “prompt cache”(提示缓存)从第一个被丢弃的块起失效。
当某些内容在每一轮都发生更改时,每一轮都会失去之前各轮的思考,因此成本增加会反复出现。在依赖 "drop_block" 之前,请在您自己的工作负载上运行评估(evals)。
使用 "drop_block" 可以让现有对话在包含您正在修复的更改时继续进行,也可用于计划内的丢弃,例如在您自己的摘要之后。不要一直开启它来掩盖您的代码持续进行的更改。一旦无效块已不在历史记录中,您就可以停止发送它。
找出您的代码更改了什么
更改位于 API 指出的第一个块之前。400 错误可能会说明更改了什么,例如 system、tools、缺失的思考块,或第一条不同的消息。如果没有错误,或者错误没有说明,请从您已有的信息入手,例如 prefix_binding_mismatch 条目或增多的输出令牌。
测试您的代码是否存在未通过前缀检查的情况
看到测试失败过之后,您就可以信任它。首先,通过您自己的代码运行一个让 Claude 进行思考的会话,并有意更改某些内容。在此步骤中发送 "drop_block",这样响应会列出每个无效块,而不是在第一个处停止,如五个步骤和一个程序所示。
然后撤掉该更改,并运行您的真实会话。在每个请求中,发送 beta 标头 thinking-binding-controls-2026-08-01,并将 prefix_mismatch_behavior 设置为 "error",这样您的代码在这些会话中进行的更改会以 400 错误使构建失败。
请测试进行压缩、后期添加工具、更改指令、切换模型或恢复的会话:普通的轮次不会触及这些代码。
一次干净的运行没有 prefix_binding_mismatch 条目,也没有错误。它仅表明在您运行的会话中,它所检查的块是有效的。在以下情况下,它什么也证明不了:
- 会话中没有思考块
- 您的代码移除了所有思考,或者该模型不具有保留思考
- 您没有发送 beta 标头,而模型可能会放行未通过前缀检查的块且不报错
监控生产环境,并找出无错误丢失的推理
记录每个 400 错误,并在代码中处理它,让对话继续进行。如果您的请求改为不包含 prefix_mismatch_behavior,请监控生产流量,查找已送达 Claude 的未通过前缀检查的思考。
推理可能会在没有错误的情况下丢失,途径包括 "drop_block"、批处理项、模型切换、转移到另一个账户,或不回传任何思考的代码。使用 beta 标头时,除最后一种情况外,每种情况都会留下一个条目。对于最后一种情况,请检查您的请求是否包含 thinking 块。
技术细节
错误消息还可能说明什么
在 API 能够判断的情况下,错误消息会进一步指出更改了什么,例如 system、tools、第一条不同的消息或块、缺失或新增的内容,或者缺失或顺序错乱的较早思考块。该句子的措辞可能会变化,因此不要对其进行匹配。如果请求没有 beta 标头,错误消息会附加以下句子:
That setting requires the `thinking-binding-controls-2026-08-01` value in the `anthropic-beta` header.错误仍要求提供标头,或显示 Extra inputs are not permitted
如果错误仍要求提供标头,则说明标头没有到达 API:代理或库可能已将其移除。另一种以 block_binding: Extra inputs are not permitted 结尾的错误含义相同,或者表示思考已关闭。
手动移除无效的思考
在您无法发送该设置时,或在以下情况之一中使用此方法:
- 在您移除了机密、个人数据或注入的文本之后,因为
"drop_block"会将思考留在您存储的历史记录中。 - 当思考关闭时(
"disabled"或"between_tools"),因为"drop_block"需要"adaptive",而这会开启思考并增加输出令牌。
- 移除错误指出的块,以及其后的每个
thinking和redacted_thinking块,否则同样的错误接着会指出下一个无效块。但如果您的历史记录包含role: "system"消息,或连续两条相同角色的消息,请移除每个thinking和redacted_thinking块。错误会将此类消息计为其前一条消息的一部分,因此它指出的位置可能低于您数组中的索引。input_transformations条目的path则会单独计算每条消息。 - 保留其他所有块,然后再次发送请求。不要把移除的块放回去。
看起来与此类似的错误
这些错误不会说明该块绑定到了其他对话,设置 prefix_mismatch_behavior 可能无法消除它们:
- 在 “Invalid
signatureinthinkingblock” 之后就结束、说明 “cannot be modified”,或与budget_tokens有关的消息:思考功能故障排查 - 与
temperature或预填充回复有关的消息:限制与功能兼容性
何时可以停止发送 "drop_block"
要停止发送 "drop_block",请移除它所丢弃的块,并保留此后生成的思考。如果没有其他更改,对话随后在使用 "error" 时即可通过。
在代码中处理错误
要在代码中处理该错误,请在每个请求中发送 beta 标头和 "error",这样在每个模型上,未通过前缀检查都会表现为 400 错误。当错误出现时,仅将该对话切换为对之后的每个请求使用 "drop_block",将该选择与对话一起存储,再发送一次,并记录该错误。如果同样的错误再次出现,则说明该设置没有到达 API:请参阅错误仍要求提供标头,或显示 Extra inputs are not permitted。
您的代码必须通过其 message 字段识别此错误,这是"不要匹配错误文本"这一通用建议的例外情况。每个 400 错误的类型都是 invalid_request_error,而此错误没有 error.details.error_code。只匹配 “The block is bound to a different conversation”,因为消息的其余部分可能会变化。
您没有收到错误,或者错误没有说明更改了什么
-
收到 400 错误,但它没有指出任何更改:请自行比较请求。一个可能的原因是发送了压缩块,却没有移除它所总结的消息。
-
出现
prefix_binding_mismatch条目:将直到第一个条目的path为止的system、tools和messages,与生成该块时的对话进行比较。如果每个块都被列出,请从system和tools开始。如果没有任何不同,请查找内容已更改的图片或文档 URL、MCP 服务器已更改的工具列表(请参阅固定 MCP 服务器的工具列表),或者被省略、移动或放回的思考块。如果没有请求日志,请使用
"error"再次发送请求,并阅读说明差异的句子(如果有的话)。 -
中间有一个不属于您的代理或库:比较它发送的内容与您发送的内容,并向其维护者提供库、代理和网关。
-
只是怀疑,且没有 Claude Code:捕获一个对话的请求正文,其中要包含一次压缩或工具更改。将每个请求正文与前一个进行比较,不计其中新增的轮次。
可能失败的测试的五个步骤,以及运行它们的程序
- 在您自己的代码中,对一个会话的每个请求发送 beta 标头和
"drop_block",发往具有保留思考的模型。 - 使用让 Claude 进行思考的提示,并检查第一个响应是否包含
thinking块。使用自适应思考时,Claude 可能会对简单的提示跳过思考。 - 仅在出现 reason 为
prefix_binding_mismatch的input_transformations条目时判定失败。期望数组为空的测试在模型切换后也会失败,因为此时出现model_binding_mismatch或organization_binding_mismatch条目是预期行为。 - 有意更改某些内容,例如仅在第三个请求中添加
system提示。 - 检查
input_transformations是否列出了位于更改之后的思考块。如果它没有列出任何块,请检查历史记录是否包含思考块。
该程序执行步骤 1、2、4 和 5。它会打印每个响应包含多少个思考块和 input_transformations 条目,然后打印每个条目,这正是步骤 3 要检查的内容:
client = anthropic.Anthropic()
user_turns = [
"How many positive integers below 500 have exactly 6 positive divisors?",
"How many have exactly 8?",
"How many have exactly 10?",
]
messages = []
for turn, user_turn in enumerate(user_turns, start=1):
messages.append({"role": "user", "content": user_turn})
response = client.beta.messages.create(
model="claude-opus-5-5",
max_tokens=16000,
thinking={
"type": "adaptive",
"block_binding": {"prefix_mismatch_behavior": "drop_block"},
},
# 只有最后一个请求添加了系统提示,这是有意更改前缀
system="Answer briefly." if turn == len(user_turns) else anthropic.omit,
messages=messages,
betas=["thinking-binding-controls-2026-08-01"],
)
messages.append({"role": "assistant", "content": response.content})
thinking_blocks = sum(block.type == "thinking" for block in response.content)
entries = response.input_transformations or []
print(f"thinking blocks: {thinking_blocks}, entries: {len(entries)}")
for entry in entries:
if entry.type == "thinking_dropped":
print(entry.type, entry.path, entry.reason)thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 0
thinking blocks: 1, entries: 2
thinking_dropped messages.1.content.0 prefix_binding_mismatch
thinking_dropped messages.3.content.0 prefix_binding_mismatch将 "drop_block" 换成 "error" 后,第三个请求会收到 400 错误。
每个 input_transformations 条目的含义,以及哪些需要您修复
使用 beta 标头时,来自支持思考的模型的响应会在 usage 旁边包含 input_transformations 数组。当没有任何内容被丢弃、也没有无效内容被放行时,它为空。使用流式传输时,它位于 message_start 事件的 message 中;如果在流中途发生回退,则以最终 message_delta 事件携带的那个为准。与错误中的位置不同,path 始终是该块在您发送内容中的位置:
{
"input_transformations": [
{
"type": "thinking_dropped",
"path": "messages.1.content.0",
"reason": "prefix_binding_mismatch"
}
]
}每个条目的 type 和 reason 及其含义:
thinking_dropped、prefix_binding_mismatch:该块之前的内容与它所记录的不一致。需要您修复:找出您的代码更改了什么。thinking_mismatch_allowed、prefix_binding_mismatch:情况相同,但 Claude 原样读取了该块,并且会对其计费。此条目仅在请求不包含该设置时,才会在某些模型上出现。需要您修复。thinking_dropped、model_binding_mismatch:此模型无法读取由生成它的模型所产生的块。无需您修复:继续发送整个对话。thinking_dropped、organization_binding_mismatch:该块由另一个账户生成,因此 API 丢弃了它。无需您修复。
忽略 type 或 reason 是您无法识别的条目。
批处理和令牌计数
- 消息批处理:不包含
prefix_mismatch_behavior的批处理项永远不会收到 400 错误。API 会丢弃无效块,或者在某些模型上可能会放行它们。设置了"error"的批处理项在某个块未通过前缀检查时会以errored结束。block_binding放在该批处理项的params.thinking中。 - 令牌计数:在 Claude API 上,令牌计数可能会返回相同的 400 错误,并在使用相同标头时接受
prefix_mismatch_behavior。它不会将被丢弃的块计入计数,也不会返回input_transformations。
后续步骤
针对您的代码对对话所做的每种更改,改为发送什么内容。
什么是保留思考、思考块与什么绑定,以及切换模型或账户。
其他思考错误的修复方法,例如签名无法验证。
此页面对您有帮助吗?