前言¶
在 DeepSeek Harness(DSH)里排查一次对话为何发给模型的内容与会话里看到的不一致,常见做法是截断日志、抓网络包或在调用链里打补丁。这些方式要么看不到组装后的 messages 与 tools,要么改动了请求路径本身。dsh-llm-dump 挂在 Host 侧的 llm/stream 瀑布流上:监听 GenerateOptions,不修改其内容,把每次完整的模型侧请求(消息、工具定义、采样与其它顶层字段)以及流式回复落盘为可复现的折叠 JSONL。下面介绍它是什么、怎么装、数据长什么样、以及如何回放校验。
这是什么¶
dsh-llm-dump(npm 包名 dsh-llm-dump,GitHub:wannaknowhys/dsh-llm-dump)由 wannaknowhys 维护,分类上属于模型推理相关插件。它是纯 Host 端 bundle,没有浏览器半部;需要 DSH 构建提供 llm 服务。插件不拦截 fetch,在 provider 边界能拿到完整请求对象,前缀复用与哈希去重在本地对已捕获载荷计算完成。
监听点与捕获范围¶
挂钩位置是 llm/stream 瀑布流。监听器观察 GenerateOptions 且永不改写,因此捕获不会改变模型实际收到的内容。
在 provider 边界记录的 GenerateOptions 包括:
messages:模型可见的完整会话,含组装后的 system prompttools:当前生效的工具定义model、provider、sessionId、采样相关字段toolHistory及其它较大的顶层字段(大字段折叠存储,见下文)
适配器仍可能在之后做图像投影、工具更新、延迟加载等变换;本插件记录的是这些步骤之前、对外的最后一份状态。
存储布局与折叠策略¶
默认或配置的输出目录下,按 sessionId 分子目录,主要文件如下:
<outputDir>/<sessionId>/
objects.jsonl {"h": sha1, "v": <content>} unique content, written once
requests.jsonl {"prefixLen": n, "suffix": [hash...], ...}
responses.jsonl {"seq": n, "blocks": [...], ...} the answer to request n
同一会话内,若新请求复用上一轮的前 prefixLen 条消息,则 requests.jsonl 只追加后缀哈希列表;完全相同的重试会表现为 prefixLen == messageCount 且 suffix 为空;压缩或改写对话会体现为更短的 prefixLen 与更长的 suffix,数据不丢。每条请求记录还带整份请求规范 JSON 的 sha1,便于回放时证明重建内容与当时一致。
数据格式为 version 1(包内 package.json 的 dsh.formatVersion 现为 1,与 npm semver 独立),与 dsh-dump-manager 共享 append-only 约定;读者应忽略未知字段。大于 1 KB 的 top 或 tools 等字段会通过 {"$dshRef": "<hash>"} 指向 objects.jsonl 中的唯一条目;messages 仅通过 suffix 与 prefixLen 表达相对上一条请求的增量。
回复流捕获¶
仅保存请求无法看到「最新一轮」的 assistant 答案——该内容往往要到下一次请求把它作为消息发回时才会出现在 messages 里。因此监听器在转发流的同时读取 chunk,流结束时向 responses.jsonl 追加一行,例如包含 seq、request(对应请求的 sha1)、blocks、usage、reason、interrupted 等。块组装遵循 Harness 侧规则(文本增量、block-end、max-tokens 丢弃 tool call、中断时只保留已闭合的 text/reasoning 等);捕获是纯观察,chunk 原样转发,提前取消消费时上游迭代器会关闭,错误不会泄入响应路径。除最新一条外,多数历史回复会重复出现在后续请求的 messages 中;dsh-dump-manager 侧重展示最新回复。
安装与移除¶
插件以当前 DSH 进程权限运行,安装前建议在 GitHub 阅读源码与 MIT 许可证。Host 模块不支持热重载,改本地 checkout 后需切换 bundle 让 Host 重新导入。
从 npm 安装到 desktop profile:
dsh plugin --profile desktop add dsh-llm-dump
从 GitHub checkout 安装:
dsh plugin --profile desktop add github:wannaknowhys/dsh-llm-dump
移除:
dsh plugin --profile desktop remove dsh-llm-dump
插件管理器亦接受 install_bundle target = dsh-llm-dump 或 checkout 目录等价规格。运行环境需 Node.js >=20(见 package.json 的 engines)。
配置¶
配置文件默认位于 %DSH_HOME%\llm-dumps\config.json,修改后按 mtime 重新读取。可用环境变量 DSH_LLM_DUMP_CONFIG 覆盖配置路径。
{
"outputDir": "D:/llm-dumps"
}
| 字段 | 默认 | 含义 |
|---|---|---|
outputDir |
%DSH_HOME%\llm-dumps |
会话子目录的写入根路径 |
dsh-dump-manager 可在设置页编辑该文件;未知键会保留,写入为原子操作。
回放与校验¶
仓库内 tools/unfold-dump.mjs 读取与插件相同的 outputDir 配置,对指定 sessionId 展开折叠数据:
node tools/unfold-dump.mjs <sessionId> --summary
node tools/unfold-dump.mjs <sessionId> --verify
node tools/unfold-dump.mjs <sessionId> --seq 3 --out req.json
--verify 会重算每条回放请求的规范 JSON 哈希,与记录中的 sha1 不一致则失败。哈希算法与存储一致:规范 JSON(键排序、无空白)的 SHA-1。
开发者在仓库根目录可运行:
npm test
测试在系统临时目录下的临时 DSH_HOME 中执行,不触碰真实 profile,覆盖折叠复用、对象去重、响应转发与中断流等 smoke 用例。
适用场景与注意¶
适合需要审计「模型实际输入」、对比多轮请求增量、或与 dsh-dump-manager 联调查看的 DSH 开发者。dump 包含完整模型可见对话(含文件内容、工具输出、system prompt),不宜提交到版本库,调查结束后应删除。DSH 社区插件目录是独立站点,与 DeepSeek、幻方无官方从属关系;本插件当前 GitHub 星标为 0,功能以 README 与仓库代码为准。
结尾¶
dsh-llm-dump 在不影响推理路径的前提下,把完整 LLM 请求与流式回复落成可校验的折叠 JSONL,便于本地复现与 diff。目录页:https://www.skillhub.cn/plugins/wannaknowhys/dsh-llm-dump;源码与文档:https://github.com/wannaknowhys/dsh-llm-dump。