工具调用导致的会话污染问题 #3708
lcxie9710-lang
started this conversation in
General
工具调用导致的会话污染问题
#3708
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.
一、我们遇到的问题
现象
tool/call已写、tool/result未写回);我们已核验的归因
adding-a-package.md约定——核心运行时包必须走 peerDependenciesnodeLinker: hoisted导致 profile 里出现第二份 dsh-tools;TOOL_RUNTIME_SCHEDULER(Symbol()单例)不相等 → agent-loop 跨副本取调度器得undefined→.prepare()崩溃;tool/call落盘之后、tool/result写回之前 → 孤儿调用 → 会话污染。二、官方 Discussions 区的相关讨论
#1697 :
dsh plugin add任何依赖@deepseek-ai/dsh-tools的第三方插件(如@anweat/dsh-browser、@linxin666/dsh-ssh),就破坏所有工具调用;Cannot read properties of undefined (reading 'prepare'),回合在第一个tool/call后立即结束(turn/end reason: error);#3234 — 流式 tool-call 参数被截断 JSON 持久化,导致后续 turn 全失败
turn 标记失败;因为日志 append-only 且坏记录从不修复,同一会话每个后续 turn 都失败,无限期;只有开新会话(新日志、
都是"一条坏日志记录 → 会话后续全挂"。这里不是 Symbol 崩溃,而是流式参数截断 + 原样持久化;但同样卡在"append-only 日志从不修复坏记录"这个点。
三、工具调用全挂 → 会话彻底污染,是多种机制下的常见问题
可以看到一个清晰的模式:
仍不确定的地方 :
四、修复思路:污染会话的自愈
针对"会话已被污染"的现状,我自己制作了简单的本地工具,其思路如下,我相信任何AI都可以很容易的复刻类似的脚本:
tool/call↔tool/result→ 分类CLEAN/POLLUTED-FIXABLE(含精确截断行)/POLLUTED-UNCLEAN/OPEN/CORRUPT;POLLUTED-FIXABLE截断到最后一个干净 turn(丢弃污染 turn 及其后全部内容);对POLLUTED-UNCLEAN整会话删除;不管污染来自 Symbol 崩溃(我们/Bug: installing any plugin that depends on @deepseek-ai/dsh-tools breaks every tool call (Cannot read properties of undefined (reading 'prepare')) #1697)还是参数截断([Bug Report] Streamed tool-call arguments with truncated JSON are persisted, then every subsequent turn fails with `400 INVALID_REQUEST: Unterminated string ...` in the same session forever #3234),只要日志里出现"turn 内 call 无 result"或"结构异常",
repair_sessions_apply都能截断到最后一个干净 turn 恢复会话。修复的是后果,不依赖具体触发机制。五、对官方的建议
1. 坏记录持久化问题(对应 #3234)
serializeAssistant重发前应检测并降级(而不是原样重发导致 400)。3. 会话污染的自愈能力
deriveMessages()容错:日志中无配对 result 的调用、或参数非法的调用,重建历史时合成占位 result / 跳过,让单个坏 turn 降级而非让整个会话永久不可用;dsh session repair,或SessionPersistence语义级截断 API(带备份/验证/拒绝活动会话护栏)All reactions