用 dsh-explain 给 DeepSeek Harness 加上本地学习模式

前言

DeepSeek Harness(简称 dsh)是 DeepSeek 开源的 Agent 运行时,官方仓库的口号是 Everything is a Plugin(一切皆插件):模型、工具、会话、界面都可以在配置层替换,而不必改 Harness 核心源码。日常用它写代码、改配置、排查问题时,主模型往往直接给出可执行结果。结果能落地,但过程里用到的概念、取舍和常见误区,并不会自动留下来。过几天再开一个新会话,上一轮到底为什么那样改,通常已经散在各自的 transcript 里。

社区维护者 yuezengwu 做了一款工具与能力插件 dsh-explain,专门处理这件事。它不往主 Agent 里塞讲解,也不把学习记录绑死在某一个工作会话上,而是在本地维护一条跨会话的学习线程:工作还是原来的工作,值得学的内容另开一条私有通道。本文按社区目录页、GitHub 仓库 README / package.json,以及 DeepSeek Harness 官方仓库交叉核实后整理。

需要先说明两点背景。第一,DeepSeek Harness 目前仍是开发者预览版,插件明确适配 0.1.0-rc.6,更早的私有预览包版本线不在支持范围。第二,DeepSeek Harness 插件库 是独立的社区目录,用来检索和对照安装命令,与 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。

这是什么

dsh-explain 是一款面向 DSH 的学习模式插件,由 yuezengwu 维护,仓库为 yuezengwu/dsh-explain。社区目录把它归在「工具与能力」,许可证为 MIT,主要语言是 TypeScript。package.json 里的版本号是 0.1.0,并声明了 dsh.bundle 补丁;客户端注入目标是 Web 端的会话与设置界面。GitHub 仓库当前 11 星,目录页显示 10 星。

一句话定位来自仓库中文 README:把多个 DSH 工作会话中值得学习的内容,汇入用户唯一的全局学习线程;每个来源会话最多保留一个等待反馈的讲解;再用全局 ExplainContext 适配知识水平和讲解偏好。

它要解决的不是「让主模型讲得更啰嗦」,而是把讲解从主回合里拆出去:

  • 主模型继续干活,不知道 Explain 的存在。
  • 讲解由辅助模型完成,只进入学习线程。
  • 学习状态存在本机 $DSH_HOME 里,工作会话、恢复和 fork 都不会复制这份状态。

仓库 README 也写明:产品目标在社区里没有直接重复的插件。dsh-advisordsh-memory-evolve 等项目提供过局部实现参考,但那些方案会把内容注入主 Agent,或依赖外部 UI;Explain 明确不走那条路。

核心功能

下面这些能力来自仓库 README / README.zh-CN.md,以及目录页上的功能摘要,不是演示环境里的主观体验。

一条本地学习线程

一个 $DSH_HOME 只有一条学习线程。不同工作会话打开的「学习」Tab,读的是同一份全局数据。线程存在本地,不随某个 Session 复制。

每个顶层来源会话可以有一个等待反馈的讲解,也可以没有。同一来源还没反馈时,不会再生成第二条;其他来源不受影响,可以继续各自讲解。来源 Session 如果还在当前 inventory 里,可以从讲解直接打开;来源被删掉后,历史仍可读,但会标成不可用。

主动讲解和快捷入口

用户可以从工作会话的 composer 主动发起学习,不必先知道该问什么。仓库文档给出的命令如下:

  • /explain <学习请求>:在已建立或空白 Session 里,要求 explain agent 生成一条讲解。
  • /explain on/explain off/explain status:开关和学习状态查询。

另外两条入口不自动提交,只往 composer 写一份可编辑草稿:

  1. 选中可见文字后,使用 composer 工具行里的 Explain 快捷入口。
  2. 在任意已完成的 assistant 回答上,选择「学习这个回答」。

这两条入口由 Explain 自己注册在 DSH 第一方槽位上:选区动作在 conversation.input.left,精确回答动作在 conversation.chat.assistant-actions。README 写明它们不修改、不依赖 dsh-selection-chatdsh-suggested-repliesdsh-advisor

辅助模型调度和额度

主动讲解、自主讲解、重讲和压缩共用一个全局调度器,任意时刻最多一个辅助模型请求。主动请求优先于后台工作,但不会打断已经在途的主动请求或重讲。

自主判断默认最多发送 50 次 / 滚动 24 小时。占额跨进程重启保留;失败和重试会计数;用户触发的主动讲解、重讲与压缩不占这笔额度。

ExplainContext 与压缩

Explain 维护一份私有的全局 ExplainContext,汇总对话偏好、知识概况和学习进展。这份上下文只送给辅助模型,不注入主 Agent。主模型不知道插件存在:Explain 不写主 Session 日志、不改主模型上下文、不阻塞主 turn。

辅助历史会在两类条件下压缩:

  • 有新的结构化观察或已关闭讲解,且用户连续 30 分钟没有操作 Explain。
  • 预计下一次辅助请求会占所选模型上下文窗口的 50% 以上。

压缩只针对辅助模型历史。用户在学习视图里能看到的原始记录不会被删掉。首个讲解条目还会保存最多 2,000 字符的受限来源摘要,供后续重讲;来源 Session 删掉后重讲仍然可用,这份摘要不会通过学习视图 API 暴露。

界面:学习 Tab 和设置页

学习线程注册在 DSH 第一方 conversation.view 槽位,界面上是一个「学习」Tab。配置和诊断走第一方 settings.section,不引入外部 UI 宿主,也不要求安装 better-sidebar

「学习」入口是 Session 范围的,但业务数据来自同一个全局 client store。空白 Session 的 Hero 阶段不显示视图 Tab;进入学习视图后,当前工作 Session 的 composer 仍然保留。插件也不会自动把你切到学习视图。

设置页可以选择辅助模型、启用学习模式、调整滚动 24 小时自主额度,并查看路由、额度恢复、上下文压力和最近一次压缩。普通配置不必手改 YAML。

本地持久化

学习历史、来源活跃状态、压缩检查点和 ExplainContext 写在:

$DSH_HOME/dsh-explain/v1/thread.sqlite

开关与模型设置走 $DSH_HOME/settings.yaml。数据留在本机,这就是目录页所说的「本地优先」。

安装与启用

社区目录页给出的安装命令原文是:

dsh plugin add github:yuezengwu/dsh-explain

如需可复现安装,目录页建议固定 commit 哈希:

dsh plugin add github:yuezengwu/dsh-explain#commit

#commit 换成实际提交哈希即可。插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证。

仓库 README 写得更具体:当前适配 DSH 0.1.0-rc.6,并推荐装进 web profile。package.jsondsh.client.platform 也是 web,peerDependencies 对齐 0.1.0-rc.6 这一组公开 API 包。README 中的安装命令如下:

npx @deepseek-ai/dsh@0.1.0-rc.6 plugin --profile web add github:yuezengwu/dsh-explain
npx @deepseek-ai/dsh@0.1.0-rc.6 web

Git 仓库插件会在安装时构建。如果 pnpm 要求批准构建脚本,按报错信息把 dsh-explain 加入该 profile 的 pnpm-workspace.yaml,再重新跑安装命令。装完后需要重新启动 profile,新的 bundle 层才会组合进当前插件栈。

package.json 还声明了 Node 引擎为 ^22.19 || >=24,包管理器为 pnpm@11.7.0。本机 Node 版本过旧时,构建步骤可能直接失败。

典型用法

下面这些步骤都来自仓库文档,不是虚构的操作演示。

  1. 按上一节把插件装进 0.1.0-rc.6 的 web profile,并启动 Web 界面。
  2. 打开设置中的 Explain 分区,选择辅助模型,打开学习模式。需要的话再改滚动 24 小时自主额度。
  3. 回到工作会话继续干活。Explain 不会改主模型上下文,主回合仍按原来的方式进行。
  4. 想主动学某件事时,在 composer 输入:
/explain 解释刚才这次重构为什么把状态机拆成两层
  1. 也可以选中对话里的一段文字,点 Explain 快捷入口;或在一条已完成的 assistant 回答上点「学习这个回答」。这两步只会生成可编辑草稿,确认内容后再提交。
  2. 切到会话头部的「学习」Tab 查看全局学习线程。不同工作会话看到的是同一条线程。
  3. 需要确认插件是否在跑时,使用 /explain status;临时关掉用 /explain off,再打开用 /explain on
  4. 设置页可以查看路由、额度恢复、上下文压力和最近压缩。出现异常时先看这里,不必先去翻 SQLite。

本地开发或验收时,仓库还提供直接安装 checkout 的写法,不经过 npm:

dsh plugin --profile web add /absolute/path/to/dsh-explain
dsh --profile web --dump-config
dsh --profile web

日常使用不必走这条路径。assembled Web 验收需要一份已构建的 DSH 源码 checkout,那是给插件开发者准备的。

适用场景与注意事项

适合谁:已经在用 DSH Web 界面做开发或排查,希望把「做完」和「学会」分开的人。尤其是同一 $DSH_HOME 下会开很多工作会话,又不想让讲解污染主 Agent 上下文的情况。

不适合什么:它不是课程、测验、卡片或间隔复习系统。仓库在查重结论里写明,P0 不做这些;那是 dsh-edu 一类方向,Explain 目前只提供讲解闭环。它也不是通用记忆插件,不会把学习摘要写回主模型。

使用时需要注意:

  • 当前只声明了 Web 客户端注入,不要默认它能在非 Web 界面里出现同样的「学习」Tab。
  • 明确适配 DSH 0.1.0-rc.6。开发者预览期 API 仍会变,升到其他 rc 之前应先看仓库是否跟进。
  • 自主讲解会消耗辅助模型额度,默认 50 次 / 24 小时。失败和重试也计数。
  • 学习数据在 $DSH_HOME/dsh-explain/v1/thread.sqlite。备份或迁移 home 目录时,要把这份文件一起带走,否则学习线程不会跟着走。
  • 快捷入口只写草稿、不自动提交,是有意设计,避免误把选区送进学习闭环。
  • 插件以当前 dsh 进程权限运行。社区目录和官方文档都提醒:安装前检查源码与许可证;需要可复现环境时固定 commit。

小结

dsh-explain 把 DSH 的工作会话变成学习素材来源,但不改主 Agent 的行为。一条本地全局线程、按来源最多一条活跃讲解、只送给辅助模型的 ExplainContext,再加上第一方「学习」Tab 和可诊断设置页,构成它目前已经落地的 P0。仓库 README 记录到 M6:选区与精确回答入口都由 Explain 自己实现,并且通过了 DSH 0.1.0-rc.6 的验收门禁。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-explain/

GitHub:https://github.com/yuezengwu/dsh-explain

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

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

小夜