dsh-error-digest: Collect DSH conversation errors into a sortable table

前言

用 DeepSeek Harness(DSH)做多轮对话和工具调用时,失败往往散落在各会话的 tool/result、turn/end 或模型重试事件里。要复盘「哪类错误最烦、最近是否在恶化」,通常只能翻日志或凭印象。dsh-error-digest 在宿主侧折叠会话投影、在侧栏汇总错误事实,跨会话按频次排序,并为每条错误提供「分析」「防范」「忽略」三种后续动作。

这是什么

dsh-error-digest 是维护者 railgun20001 发布的 DSH 插件,npm 包名与仓库名一致,当前版本 0.2.1,许可证 MIT。它在社区目录 SkillHub 中归类为 admin-security。

插件分两半:bundle.patch 向宿主写入错误账本投影;client 提供左侧栏底部的「错误汇总」面板。面板只合并、排序和渲染,不 retain 历史会话,避免误激活他人会话。

收集哪些错误

宿主半监听会话事件,将下列情况记入账本:

会话事件 含义 界面归类
tool/result 且 data.error 或 message.isError 工具执行失败(非零退出、编辑无唯一匹配、参数校验拒绝等) 工具失败
turn/end 且 reason.kind === 'error' 整轮失败(重试耗尽后模型请求仍失败) 回合失败
llm/retry 模型请求失败并触发重试(限流、5xx、超时等) 模型重试

写入时用签名合并同类项:类别、工具名或提供方、错误码、归一化后的首段摘要。归一化会去掉 UUID、长十六进制、绝对路径、行列号、耗时与字节数,但保留 HTTP 状态码、退出码等区分信息。界面再跨会话合并同签名,并按出现次数排序,便于一眼看到高频问题。

面板上的三个动作

每条错误后有三个按钮,均通过宿主 uiWorkspace.startSession 打开新对话,提示词落在草稿输入框,发送仍由用户确认:

按钮 作用
分析 新对话任务为查根因、影响范围、修复或规避步骤;输入框预填类别、来源、错误码、次数、最近时间与摘要
防范 新对话任务为判断在哪一层拦截(规则、skill、工具校验、插件代码、文档),并给出最小改动与自查清单
忽略 仅在本机面板隐藏该条;不删日志,不影响投影统计口径

「忽略」存在浏览器 localStorage 键 dsh-error-digest/ignored-v1,按签名记账并保留摘要,上限 200 条。面板顶部可查看「已忽略 N 条」并逐条或全部恢复。

安装与启用

在 DSH 插件环境中按 npm 安装(与 README 一致,勿自行拼接 dsh plugin add github:...):

npm install dsh-error-digest

包内 dsh 字段声明 bundle.patch(cordis.patch.yml)与 web 客户端;exports 暴露 ./client(lib/client.js)、./locale/*.json、./icon 与 ./package.json,无需二次构建。运行环境要求 Node >= 20。

客户端硬依赖注入:@deepseek-ai/dsh-api-session-controller、@deepseek-ai/dsh-client-locale、@deepseek-ai/dsh-client-ui-layout、@deepseek-ai/dsh-client-ui-sidebar、@deepseek-ai/dsh-client-ui-workspace。若 uiWorkspace / layout 未正确注入,「分析 / 防范」可能出现点了无反应。

典型用法

  1. 安装并启用插件后,在左侧栏底部打开「错误汇总」面板。
  2. 按频次查看工具失败、回合失败、模型重试;前三名序号会加深,便于关注高频项。
  3. 对需要深挖的项点「分析」,在草稿中核对预填信息后再发送;对需要制度性拦截的项点「防范」。
  4. 对已知噪声或已接受的失败点「忽略」;误操作时在「已忽略」列表中恢复。

排障时可在浏览器控制台使用全局对象(与面板同一份合并逻辑):

__DSH_ERROR_DIGEST__.snapshot()
__DSH_ERROR_DIGEST__.lastAction()
__DSH_ERROR_DIGEST__.canOpenConversation()

若面板一直为空,可用宿主只读诊断区分「确实没错误」与「投影未工作」:

# POST /dsh-error-digest/debug,body 可为 ping 或 debug

该路由回答投影键是否注册、各在挂会话折叠出了什么。

实现要点(便于排障)

  • 宿主注册 dialogErrors 会话投影,由框架折叠所有会话(含未打开的冷会话),并随会话列表 RPC 到达客户端。
  • 每个会话账本最多 60 条不同签名(超出时先删次数最少的);在途工具调用表最多 128 项;摘要最长 240 字符。
  • 「分析 / 防范」先 layout.selectPanel(null) 回到对话主面板,再 uiWorkspace.startSession,避免 composer 未挂载时静默失败;失败时会重试并将提示词复制到剪贴板。

适用场景与注意

适合谁:长期用 DSH 跑 Agent、频繁遇到工具或模型错误的开发者,需要跨会话看频次、并想把复盘接到「新建对话」工作流里的人。

权限与信任:插件以当前 DSH 进程权限运行,会读取本机可见会话的投影数据。安装前建议查看 GitHub 仓库 源码与 MIT 许可证。

已知边界(README 明确写出):

  • 只统计本机可见会话;很久未物化的历史会话,需被打开或产生新事件后才会进入统计。
  • 分叉会话会继承前缀里的错误再记一次,符合「复制历史」语义。
  • 「忽略」仅本机浏览器存储;换机器、换 profile 或清站点数据会丢失忽略列表,恢复后面板频次仍完整。
  • 按钮不自动发送消息,避免在用户未选好目录或模型时消耗请求。

结尾

dsh-error-digest 把分散在对话日志里的失败收成一张按频次排序的表,并用与官方一致的 startSession 通路把「分析」和「防范」落到新对话草稿里。目录页:SkillHub · dsh-error-digest;源码与说明:github.com/railgun20001/dsh-error-digest。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye