You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Bug 报告:(1) spill 截断标记已写入但完整内容仍被持久化;(2) 超长工具结果未计入上下文计量,误导问题排查
概述
当工具结果超过 spill(溢出)阈值时,DSH 的 spill 机制会在末尾追加 "(Omitted NNNNN bytes. Full formatted result stored at: ...)" 标记——但完整的、未截断的内容仍然被持久化进会话历史(
session.jsonl.zstd)。截断标记只是"装饰",实际内容并未被截断。后果:任意大的工具结果(例如一个 49 KB 的
Select-String输出,其中含一条 13,170 字符的超长单行 minified JSON)会成为该会话此后所有 LLM 请求上下文的永久组成部分。在本案例中这直接"毒化"了一个会话(其触发的服务端崩溃详见配套的 vLLM 报告):该会话此后的每一次 LLM 调用都在精确的 ~19 秒后以TRANSPORT "Connection error."失败,inputTokens: 0。会话无法恢复,除非执行/compact;且故障表现伪装成网络问题。环境
@deepseek-ai/dsh@0.1.1-rc.2(npx,web profile)deepseek-v4-flashD:\Downloads\test_dsh复现步骤
dsh web会话,连接任意 OpenAI 兼容 provider。Select-String会原样打印匹配行。minified JSON 文件(如.pnpm-workspace-state-v1.json)会产生超过 13,000 字符的单行输出。本案例中的工具结果总计 49,614 字符 / 660 行 / 最长行 13,170 字符。session.jsonl.zstd):对应的tool/result事件包含的是完整的 49,614 字符内容,而不是截断版本。实际行为
session.jsonl.zstd中的tool/result事件持有完整输出(已验证:全文长度 49,614)。Connection error./ TRANSPORT 失败,inputTokens: 0,每次约 19 秒。/compact(将被遮蔽的历史区间替换为摘要)才能移除该内容。期望行为
tool/result应只包含截断后的头部 + spill 标记 + 文件路径;被省略的字节不应再持久化进消息体(它们已经存在于 spill 文件中)。来自受影响会话的证据
会话事件(已解包):
tool/result,seq 99865,turn 242 step 2,time= 2026-08-24 13:35:21(+08:00):~\profiles\web\node_modules\.pnpm-workspace-state-v1.json的匹配行)紧随其后的事件:下一个 LLM 步骤(seq 99868,13:35:40.955)以
{"kind":"error","failure":{"message":"Connection error.","code":"TRANSPORT"}}失败,inputTokens: 0;5 次重试全部以相同方式失败(每次约 19–21 秒);该会话再未恢复(turn 242–245 及以后,跨越了一次完整的 DSH 重启)。脱离 DSH、用原生 openai SDK 对同一 provider 以完全相同的内容做的最小复现:
结果:
APIConnectionError: Connection error.(cause 为TypeError: fetch failed),3/3 次复现,耗时 19,015–19,024 ms——与 会话内失败完全一致。将工具内容替换为同等总大小的良性文本则成功;失败是内容特异的(见 vLLM 报告),这也正是 DSH 侧截断之所以重要的原因:DSH 无法修复服务端,但目前它未能启用自己的防御。缺陷 2:超长工具结果内容未计入上下文计量,误导问题排查
概述
当完整的 49,614 字符工具结果被持久化并随此后每一次 LLM 请求发送时(provider 面板证实:每次请求约 73.78 K tokens),DSH 的上下文计量(由
dsh-context插件 v0.24.x 呈现)却报告该会话上下文非常小(至多几十 K;在"中毒"回合之后它显示接近 0%/对 200 K 窗口的极低占用)。上下文计量器没有把这类内容(超长工具结果 / 带 spill 标记的结果)计算在内,导致排障期间最重要的单一诊断信号——"实际发送的请求到底有多大?"——错了一个数量级。
影响
在对上述中毒会话长达数小时的诊断过程中,被低估的上下文读数主动把调查带偏了:它使得"请求中含有过大/病态内容"这一假设在早期就被排除,使排查转向网络、连接池、进程状态和 compact 等理论——全部是死胡同。直到提取 provider 侧的 token 计数(约 73.78 K/请求)并重放实际持久化的内容,才揭示真相。
一个排除了"实际仍会被发送的内容"的上下文计量器,会给用户虚假的信心,并恰好在最需要的时候拖延根因分析。
复现步骤
期望行为
session.jsonl.zstd即可被发现。修复建议(两个缺陷)
All reactions