Repository navigation
[Bug] 尾部为 pending 工具调用的会话被 crash-recovery 合成坏 tool/result ⇒ 会话永久不可读 / 不可 resume #12179
zhaocjiang
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
现象
某会话日志(
session.v4.jsonl.zstd)的尾部是一个未完成的工具调用:assistant/message(seq 21293)含 tool-call 块{ id: "", name: "", arguments: "{\"bash\":\"\",\"command\":\"…\",…}" }tool/call事件(seq 21294)为{ callId: "", name: "", turn: 64, step: 32 },且悬空(会话在此处被掐断)之后该会话的任何读取路径都失败:
failed to read referenced session: session event at seq 21295 message must have tool source本轮运行失败 format v4 tool/result at seq 21295 requires toolCallId matching its tool source即:尾部是 pending 工具调用的会话,永久不可读、不可恢复、不可被 @ 引用。
环境
agnes-3.0-flash,APIopenai-completions(流式)tool-call-delta块id从头就是""(provider 未提供工具调用 id)根因(两层)
1. 写侧:空 tool-call id 被原样持久化
provider 流未携带 tool-call id 时,持久化没有「合成确定性非空 id」的兜底:tool-call 块
id、tool/call事件callId/name全空入库。2. 读侧:crash-recovery 合成出违反自身不变量的 tool/result
@deepseek-ai/dsh-session的ToolCallRecovery.results()(lib/index.js约 L857)对pendingCalls里每个键无条件合成:pending 键来自 assistant 消息的
block.id(本例为空)⇒ 合成事件过不了assertMessageEventShape⇒ 报错 ①。把日志里块 id 手工补成非空后,又撞上 resume 活体路径的第二道校验:其合成的
tool/result的message.toolCallId与message.source.callId取自不同来源、彼此不一致 ⇒ format-v4 校验器拒收(报错 ②)。影响
任何在「空 id 工具调用」处被中断的会话都永久卡死;当前唯一绕行 = 手工把日志截到最后一条干净
step/end边界(本会话即如此处理),代价是丢掉进行中的 step 内容。建议修复
tool/call事件带同一值;name不允许空)。results():跳过空键 pending,或合成自洽的非空 id —— 在所有合成 tool/result 的位置(含 live resume 合成器)保证message.toolCallId === message.source.callId。证据
adoptSessionEvent+interruptedTurnClosers跑真实日志):逐字复现报错 ①;step/end后:recovery 仅合成turn/end,全链校验通过(退出码 0),会话可读。补充复现(第二个宿主构建:0.2.1-rc.5)
在第二台实例(宿主
0.2.1-rc.5)上复现了完全相同的报错:盘上取证(
session.v4.jsonl.zstd)maxSeqtool/call,callId=""、name=""(arguments有实际内容)tool/call(带正常非空 callId)tool/result@5312因果链与主诉逐字吻合:写侧记了空 id 的
tool/call(5311)→ 会话停在此处未收尾 → 读侧 crash-recovery 合成一条tool/result(5312)收尾,id 对不上 ⇒requires toolCallId matching its tool source。汇总(跨宿主构建)
tool/call两份不同宿主构建(rc.2 / rc.5)都复现,缺陷位于宿主核心(写侧空 id + 读侧合成器不匹配)。
All reactions