dsh-llm-call-inspector
English | 中文
 
一个面向 DeepSeek Harness Web 的本地、会话级 LLM 请求/响应检查器。它在聊天和“轨迹”旁新增独立的 LLM 调用 页面,让开发者查看每个带会话标识的标准化 llm/stream 调用,同时不改变模型收到的内容,也不改变调用方收到的结果。
这是社区插件,并非 DeepSeek Harness 官方发布。0.1.2 版本已按 0.1.0-rc.8 与 0.1.1-rc.1 两个 API 边界验证。

> [!WARNING] > 请求与响应正文可能包含提示词、源码、工具参数、工具结果、个人数据,或嵌入内容中的秘密。安装本插件后,Host 默认开始采集正文。请先阅读[隐私与数据处理](docs/privacy.md),再用于敏感会话。
能看到什么
- 当前 DSH 会话的调用列表,最新调用在前。
- Provider、模型、用途、状态、开始时间、耗时、chunk 数量与正文采集状态。
- 搜索,以及按状态、用途筛选。
- 主从详情布局;请求/响应独立页签;可展开 JSON 与复制操作。
- 实时轮询、手动刷新、仅清空当前会话、错误/空状态、键盘焦点、响应式布局和中英文界面。
- 只要调用带有
sessionId,就能覆盖 Assistant、压缩、会话标题和其他标准化用途。
标准化请求只允许采集以下字段:
provider、model、reasoningEffort、messages、system、tools、temperature、maxTokens、stop、sessionId 和 purpose。
响应正文是 llm/stream 边界观察到的有序 DSH StreamChunk 数组。观察器只向下游委托一次,按原顺序交还原始 chunk 对象,并原样保留下游抛错。完整 chunk 采集也会保留 JSON 兼容的适配器回放元数据,包括适配器产生的 finish.replayState。
当前 DSH 内置图片块包含附件引用元数据,包括不透明附件 id、媒体类型、字节数、尺寸和可选显示名;插件会把这份引用作为 messages 的一部分采集。插件不会主动加载附件字节,也观察不到供应商侧的 base64 网络请求体。但标准化 messages 是整体复制的:如果某个扩展在自定义消息块里嵌入字节、base64、凭证或其他私有字段,这些内容也会进入采集边界。
能力边界
本插件检查的是 DSH 标准化 LLM 边界,不是供应商网络代理。
它不会采集:
- 供应商原生 HTTP 请求体或响应体;
- HTTP headers、顶层 API key、终止信号或请求对象上未声明的适配器私有字段;
- 原始 SSE 帧、适配器内部隐藏的网络重试或供应商侧处理;
- 没有
sessionId的llm/stream调用; - 供应商没有作为标准化 chunk 返回的隐藏推理。
排除顶层字段不等于内容脱敏。粘贴到提示词里的密钥、工具结果里返回的密钥,或插件自定义消息块内嵌的字段,仍可能被采集。 响应 chunks 会被完整保留,因此 finish.replayState 内的适配器私有 JSON 也可能被采集,必须按敏感内容处理。
为什么做独立页面,而不直接融合“轨迹”
DeepSeek Harness 0.1.0-rc.8 与 0.1.1-rc.1 对外提供的增量 UI 扩展点都是 conversation.view。内置“轨迹”使用了这个扩展点,但没有公开稳定的内部行或面板扩展接口。
两者回答的问题也不同:
- 轨迹解释持久化的会话故事:用户、Assistant、工具事件,步骤、时序、用量与结局。
- LLM 调用展示每个标准化调用实例:该次调用中被采集的完整请求快照与有序响应 chunks。
因此,本插件在 order 20 注册相邻页面,不复制、不修改,也不依赖“轨迹”内部实现。将来如果“轨迹”提供稳定的跳转或内部扩展接口,可以在不改变采集所有权的前提下把两个页面连接起来。
架构
带 sessionId 的 GenerateOptions
|
v
llm/stream 透明观察器
|
v
有界、按会话隔离的内存
|
v
Connection RPC /dsh-llm-call-inspector(仅 loopback)
|
v
conversation.view / LLM 调用一个包同时包含两个运行面:
- Host 注入
llm和connection,在llm/stream前置透明观察器,持有有界内存,并注册一个仅 loopback 可用的 Connection RPC channel。 - Client 注入
connection、slots和locale,注册一个conversation.view。它轮询不含正文的摘要,只为当前选中的调用读取完整正文。 - Bundle 声明
dsh.bundle.patch和 Web client 导出,因此dsh plugin能通过官方 profile 机制加载两个运行面。
存储不会把采集正文写入磁盘。在 UI 中清空当前会话、达到单会话/会话总数/全局正文预算被淘汰、插件重载或 DSH 重启,都会让相关记录消失。
安装
前置条件:
- DeepSeek Harness
0.1.0-rc.8或0.1.1-rc.1; - Node.js
22.19或 package engine 支持的更新版本; PATH中有 pnpm,这是dsh plugin的官方要求。
把 GitHub 仓库安装进 Web profile:
dsh plugin --profile web add github:striveh/dsh-llm-call-inspector
dsh --profile web --dump-config
dsh web新增、更新或移除 bundle 后,需要重启正在运行的 Web profile。配置展开结果中应出现 # == dsh-llm-call-inspector 层。
正式使用建议锁定已经审阅的 commit:
dsh plugin --profile web add github:striveh/dsh-llm-call-inspector#<commit-sha>仓库提交了构建好的 lib/,并且有意不提供 prepare 或安装期生命周期脚本;从 GitHub 安装不需要授予 pnpm allowBuilds 权限。
配置
Bundle 默认值如下:
| 字段 | 默认值 | 含义 |
|---|---|---|
captureBodies | true | 采集白名单请求字段与有序响应 chunks。设为 false 时仍保留调用元数据,但两个正文都会标记为 omitted。 |
maxCallsPerSession | 100 | 单个会话最多保留的调用数;先淘汰最旧调用。 |
maxSessions | 32 | 最多保留的会话桶数量;按 LRU 淘汰。 |
maxRequestBytes | 524288 | 单个请求快照序列化为 JSON 后的 UTF-8 字节上限。 |
maxResponseBytes | 1048576 | 单个响应 chunk 数组序列化为 JSON 后的 UTF-8 字节上限。 |
maxTotalBodyBytes | 67108864 | 跨全部会话保留的 captured JSON 全局预算;先淘汰已结束调用,再淘汰运行中调用,同类按创建时间从旧到新。 |
pollIntervalMs | 750 | Host 告知当前浏览器页面的轮询间隔。 |
如需覆盖,在 $DSH_HOME/profiles/web/cordis.patch.yml 中添加一个更晚生效的配置行。DSH patch 会替换目标行的完整 config,所以下例重述全部字段:
- id: dsh-llm-call-inspector
config:
captureBodies: true
maxCallsPerSession: 50
maxSessions: 16
maxRequestBytes: 262144
maxResponseBytes: 524288
maxTotalBodyBytes: 33554432
pollIntervalMs: 1000正文超过上限时,插件会丢弃整个正文,并以 size-limit 明确标识实测字节数。正文包含不可 JSON 化的值,或关闭正文采集时,也会得到明确的 omission 状态;元数据和 chunk 数量仍然可见。
仅元数据模式
如果只需要 Provider/模型、状态、耗时与 chunk 数量,可以设置 captureBodies: false:
- id: dsh-llm-call-inspector
config:
captureBodies: false
maxCallsPerSession: 100
maxSessions: 32
maxRequestBytes: 524288
maxResponseBytes: 1048576
maxTotalBodyBytes: 67108864
pollIntervalMs: 750修改配置会重载插件,并丢弃当时的内存记录。
禁用或卸载
如果想保留依赖但禁用插件,请在 profile 的后续 patch 中添加以下内容并重启 Web:
- id: dsh-llm-call-inspector
disabled: true如果要移除依赖及其 bundle 层:
dsh plugin --profile web remove dsh-llm-call-inspector移除后重启 profile。禁用或卸载不会产生可恢复文件:本插件从未持久化这些内存记录。
现有方案怎么选
这个生态变化很快;选择前请重新核对每个链接项目的最新文档。
| 方案 | 主要数据与界面 | 更适合的场景 |
|---|---|---|
| 内置轨迹 | 原生 UI 中的持久化会话事件 | 需要理解 Agent/会话叙事、工具流、用量与结局,而不是调用正文。 |
| dsh-devtools | 原生 Web 页签中的 metadata-first 运行剖析;有意不采集提示词与工具正文 | 需要性能和运行诊断,同时希望内容隐私面更小。 |
| dsh-llm-inspector | 推理控制、流量统计、think 工作流与可选审计文件;项目文档未描述原生请求详情 UI | 明确需要行为改写或文件审计能力。 |
| dsh-plugin-langfuse | 把会话事件作为 OpenTelemetry traces 导出到 Langfuse | 需要集中式、跨会话可观测性,并愿意配置外部上传。 |
| dsh-llm-call-inspector | 本地原生主从界面,查看标准化调用正文;仅保留在有界进程内存 | 需要本地 trace、debug、教学或研究检查。 |
GitHub topic 只是发现元数据,不是安全审核,也不代表官方背书。
开发
pnpm install --frozen-lockfile
pnpm verify
pnpm pack --dry-runpnpm verify 会执行 Host/Client 类型检查、自动测试、干净构建和只读 package 校验。package 校验覆盖公开 exports、已提交构建产物、Web loader 标识、bundle patch、DSH client 声明、文档安装命令,以及安装期生命周期脚本必须缺失。
构建后测试本地 checkout:
dsh plugin --profile web add .
dsh --profile web --dump-config
dsh web改动约束见 [CONTRIBUTING.md](CONTRIBUTING.md),私下报告漏洞的方式见 [SECURITY.md](SECURITY.md)。
兼容性
DeepSeek Harness 仍是 developer preview,不承诺预发布版本之间的插件兼容性。本版本在独立 CI lane 中分别验证 @deepseek-ai/dsh-* 0.1.0-rc.8 与 0.1.1-rc.1。rc.1 源码审计确认插件依赖的 llm/stream、Connection RPC、conversation.view、client loader 与 bundle/profile 接缝保持兼容;正式发布前还必须通过全新 rc.1 profile 的固定提交安装与浏览器交互验收。其他 DSH 版本只有通过同样的 gates 后,才会声明为已验证。
许可证
[MIT](LICENSE)