Repository navigation
[Bug] 工具执行中途崩溃的轮会留下悬空 tool_calls:切到 deepseek-official 重放历史必 400(repair 只补尾部 turn,deepseek 适配器无 sanitizer) #6127
DDDFXYqiming
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.
症状
会话中途从其他 provider(cerebras/qwen 等)切换到
deepseek-official,该会话的第一个请求即 400:切回原模型立即恢复正常;不带伤的会话切换 DeepSeek 也正常。触发条件是该会话历史里曾有某一轮在工具执行中途崩溃(见根因),伤会永久留在 transcript 里,只有严格校验的 provider 会引爆。
环境
dsh web)serialize.ts无 sanitizer、repair.ts逻辑一致,均未修复;GitHub 上无同类报告根因链
Cannot read properties of undefined (reading 'prepare'))。session log 落了assistant/message(含 tool-call 块)和tool/call,但tool/result永远没落,turn 以step/end+turn/end(reason=error)收尾 → 历史里留下悬空 tool_call。packages/core/session/src/repair.ts::interruptedTurnClosers只补"尾部未闭合 turn";本例 turn/end 已写、日志"平衡",repair 返回空 closers(step/end分支的pendingCalls.clear()把悬空记录直接清掉了)。packages/llm/llm-deepseek/src/serialize.ts::serializeMessages对历史做无损直转,无任何补齐。证据(session.jsonl 事件节选)
建议修复(二选一或都做)
tool/result(复用 repair.ts 已有的TOOL_NOT_STARTED/TOOL_OUTCOME_UNKNOWN语义);或让 repair 扫描全史补齐悬空调用,而不仅是尾部 turn。requestWithMessages收口处(text 与 image 两条序列化路径共用)为未应答的 tool_call_id 插合成 tool 消息,约 15 行。此法同时救活所有已带伤的存量会话。现状 workaround
只能新开会话,或手改 session 日志补
tool/result。存量长会话一旦留伤就永远切不了 DeepSeek,故提此报告。All reactions