疑似:prepare 抛错后不写 tool/result,会话历史残留未配对的 tool_calls,之后每轮都被上游 400 拒绝 #3524
Replies: 2 comments
|
你的判断两层都成立,而且两层我们都有已核验的分析:
建议落地顺序与你的三点一致:
已并入 bug 家族图谱"工具结果可信度/截断调用"族,方便以后直接引用。 |
|
我在当前干净的
我准备的防止新污染会话的补丁在这里: https://github.com/DON738110198/deepseek-harness/tree/fix/scheduler-failure-tool-results 补丁没有把所有情况都伪装成普通“工具执行失败”,而是保留了副作用边界:
验证结果:
另外,为了在 core 修复合入前发现已污染/潜在污染会话,我发布了诊断与非破坏性恢复插件
插件 v0.2.1 已用官方 rc.8 CLI 从打包产物安装到隔离 Web profile:Host 插件处于 active,boot manifest 能发现浏览器 bundle,服务端能返回注册 recovery action 的 client.js。它新增离线安全边界规划,以及历史 assistant 消息上的“从这里继续”:调用官方 Session fork、打开子会话、保留原会话不变,并在当前轮仍运行时拒绝操作。它仍不做原地回滚、硬删除、自动归档或工具盲重试。23 个测试、语法检查与 packed-tarball 安装检查均通过。 |
Uh oh!
There was an error while loading. Please reload this page.
现象:某个会话在某一轮工具调用时报错,之后每次发消息都失败。底层错误是 DeepSeek API 返回的 400:
环境:Windows 10,dsh 0.1.0-rc.7,deepseek-official / deepseek-v4-flash。
出问题的那一轮事件序列:
tool/call写了,没有tool/result。全会话这是唯一一次缺配对的(session.history 拉全量统计)。这轮之后每次发消息都 400。怀疑在
dsh-agent-loop/lib/index.js的 startCall:TOOL_RUNTIME_SCHEDULER是 Symbol。ctx.tools[Symbol]为 undefined 时.prepare抛的 TypeError,和 turn/end 的错误逐字一致。appendToolResult是唯一写tool/result的地方,抛错路径没有兜底,残缺序列留在历史里,之后每轮都原样发给上游被 400。我环境里触发原因是 dsh-tools 双副本(Symbol 不匹配,推断)。profile 里 dsh-tools 的 junction 建于 8/19 22:49,出事在 22:46,junction 建好后新会话正常。这条是环境问题,干净环境不一定会出现;但不管触发原因是什么,prepare 抛错不写 result 都会把会话弄坏,这个跟环境无关。
复现:curl 构造同样残缺的序列打 DeepSeek API 返回逐字相同的 400,佐证 400 是上游校验。dsh 侧未稳定复现,也没抓实际请求体。
建议:
tool_call_id对应、content 为错误描述的tool/result;若回滚 tool/call,必须连带去掉 assistant 消息里的 tool_calls 声明。如需更多信息(完整事件流、会话文件):2632530353@qq.com
All reactions