前言¶
用 DeepSeek Harness(dsh)写代码、改仓库、走评审,同一个团队习惯经常要反复讲:提交信息怎么写、测试怎么跑、哪些文件不能动。会话一换,智能体又回到「请再说明一下你们的规范」。记忆插件可以存事实,但不一定把「怎么做这类事」沉淀成后续会话能直接调用的技能。
社区插件 distill 走另一条路:主对话不额外注册工具,只在回合结束时于后台派发反省子代理,把值得复用的流程写成 SKILL.md。它不替代图谱记忆或长期记忆,而是把「做过什么」收成「以后怎么做」。
本文按社区目录页、GitHub 仓库 README、package.json 与 src/index.ts 交叉核对后整理。社区目录站点 https://deepseek-harness-plugin.com/zh-CN/plugins/ 是独立收录页,与 DeepSeek / 幻方没有官方从属关系;官方运行时仍以 https://github.com/deepseek-ai/deepseek-harness 为准,其核心理念是「一切皆插件」。
这是什么¶
distill 是一款 DeepSeek Harness 的「记忆」类插件,由 GitHub 用户 LoserFox 维护,仓库为 LoserFox/distill。npm 包名是 @loserfox/distill,当前版本 0.1.0,主要语言 TypeScript。目录页收录于 2026-08-03;GitHub 仓库在 2026-08-17 显示 19 星(目录页当时显示 16,星标以 GitHub 为准)。
目录页的定位可以概括成一句话:每个回合结束后,后台 subagent 对对话做反省,把经验沉淀为技能的创建或更新;只挂接 agent/turn-stopping,不注册任何面向模型的工具或技能。
package.json 把许可证写成 BSD-3-Clause,但仓库根目录没有 LICENSE 文件,GitHub 也未识别出 SPDX 许可证。安装前应自己打开源码核对许可声明。
核心功能¶
主对话保持原样¶
插件插入行 id 是 distill(见仓库 cordis.patch.yml)。它不往主 agent 的工具表或技能表里加任何东西,因此对话表面不会多出「蒸馏」按钮或新工具名。README 写明:唯一对模型可见的间接效果,是后台反省子代理带有 skill 查看器,写进去的技能会在后续轮次出现在 dsh-tool-skill 目录里。
反省派发本身记在日志里,对话循环不可见,也不会和用户当前任务抢工具调用。
回合结束后再蒸馏¶
触发点是 agent/turn-stopping。一次反省的大致流程如下:
- 收集自上次蒸馏检查点以来新增的人类
user/message。 - 数量达到
minUserMessages(默认 3)后,派发后台反省子代理。 - 子代理工具白名单只保留
skill查看器;结果走结构化输出契约,而不是自由文本。 - 无论 skip / create / update,检查点都会推进到最后一条已反思消息,下一轮只覆盖新消息。
每个会话同时只允许一次进行中的反省;反省尚未结束时到达的已结束回合会被跳过,下次结算再评估。
反省子代理的目标路由优先使用配置里成对出现的 provider / model;都没配则沿用刚结束的 agent 自己的 agent.options。两者都不存在时本轮跳过并打警告。子代理提供方默认名是 spawn(providerName)。提供方缺失、运行失败、被取消或没有捕获结果时只记警告,不会把主循环打崩。
三种提议,写入本地技能包¶
子代理只能给出下面三种结构化结果之一:
{"action": "skip"}:没有值得保存的内容。{"action": "create", "skill": {"name", "description", "whenToUse?", "content"}}:新建技能,写成带 frontmatter 的SKILL.md包,由本地技能提供方像发现手写技能一样发现它。源码注释里对应的发现插件是dsh-skill-filesystem。{"action": "update", "skill": {...}}:对某个先前蒸馏出的技能做整文件替换。
落地前会做校验:技能名必须通过 isSkillName(kebab-case),描述和内容不能为空。create 时若目标文件已存在则跳过。update 只作用于已经带有插件所有权标记的文件:
distilled-by: dsh-distill
缺少该标记、或不是本插件蒸馏出来的技能,update 会被跳过并记警告。因此手写技能、内置技能和运行时注册的技能不会被重写。只有带该标记的技能会出现在子代理的可更新列表里。
默认写入位置由 targetRoot 决定:
project(默认):仓库 git 根下的.agents/skills;找不到.git祖先时回退到会话 cwd。user:~/.agents/skills。源码里可用agentsHome或环境变量DSH_AGENTS_HOME覆盖用户根目录。
提示词来源¶
反省提示词改编自 Nous Research hermes-agent 的 _SKILL_REVIEW_PROMPT(MIT,Copyright (c) 2025 Nous Research),针对 DSH 界面改了工具引用和输出契约。完整署名写在 src/index.ts 文件头。提示词要求产出的是「类级别」技能(一类任务怎么做),而不是一次会话一条的碎片条目。
安装与启用¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:
dsh plugin add github:LoserFox/distill
需要装到指定 profile(例如 web)时,以仓库 README 为准:
dsh plugin --profile web add github:LoserFox/distill
dsh --profile web --dump-config | grep distill
如需可复现安装,目录页建议固定 commit 哈希。当前 main 最新提交是 2026-08-13 的 d2aaa395adeffe88e429be796c12d829752cbad1(提交说明为迁移到官方 0.1.0-rc.5,并以 @loserfox/distill 发布):
dsh plugin add github:LoserFox/distill#d2aaa395adeffe88e429be796c12d829752cbad1
卸载:
dsh plugin --profile web remove distill
安装后必须重启目标 profile 的 DSH 进程。README 写明组合层变更不参与 HMR 热更新。
宿主前提(base bundle 里默认存在):
subagent-spawn-in-process:注册反省子代理使用的spawn提供方tool-skill:子代理可调用的skill查看器
插件还要求 ctx.subagents(inject: ['subagents'])。没有 tool-skill 的部署仍会跑反省,但子代理在提议前无法查看已有技能。package.json 的 peerDependencies 把 @deepseek-ai/dsh-agent 标到 ^0.1.0-rc.6。
配置项¶
配置字段以仓库 README 为准,并与 src/index.ts 中的 Config 对照过:
| 字段 | 默认值 | 含义 |
|---|---|---|
enabled |
true |
总开关 |
minUserMessages |
3 |
触发一次反省所需的新增人类用户消息数 |
provider / model |
未设置 | 显式辅助路由,必须同时提供;默认用 agent 自身路由 |
maxTokens |
2048 |
反省子代理输出 token 上限 |
timeoutMs |
30000 |
反省的端到端截止时间(毫秒) |
targetRoot |
project |
project 写入项目 .agents/skills;user 写入用户级技能目录 |
providerName |
spawn |
反省子代理使用的子代理提供方注册名 |
allowUpdate |
true |
是否允许更新先前蒸馏出的技能;false 时只提供 create |
provider 和 model 必须成对出现,只配其中一个会在校验阶段报错。源码里还有可选字段 agentsHome,用于覆盖 user 目标的根目录。
适用场景与注意事项¶
目录页给出的使用方向包括:从真实会话里抽出工作方式(提交约定、评审偏好、项目习惯),让新会话或新人的智能体从已有规范起步;把反复口头解释的流程收成技能。目录页也提醒:偶尔审查蒸馏结果,删掉过时条目、合并重叠技能、改措辞让它们读起来像团队标准。蒸馏质量取决于会话质量,不是装上就会自动变「更懂你」。
使用前需要知道当前实现的边界:
- 只做整文件更新。update 会重写整个
SKILL.md,不支持局部补丁,也不能写入references/、templates/、scripts/这类支持文件。 - 所有权标记按来源选择。加标记之前蒸馏出的技能没有
distilled-by: dsh-distill,会被当作用户所有,永远不会被自动更新,除非重新创建或手动补上标记。 - 检查点从日志推导。README 写的是:检查点来自最近一条已记录的
session/distill-review-request;从未反省过的会话从第一条用户消息开始。 - 项目目标依赖 git 根。没有
.git祖先时回退到会话 cwd。
更需要单独说明的是会话事件兼容性。当前 main(0.1.0,commit d2aaa395)会把仅用于诊断的 session/distill-review-request 写进会话日志。GitHub Issue #6、#9 以及官方仓库讨论 #1584 都报告:在 dsh 0.1.0-rc.6 上,该自定义事件类型不在 harness 的已知会话事件列表里,也无法通过现有 session.append API 标成可忽略,导致触发过蒸馏的会话在重启或恢复时出现 SessionFormatUnsupportedError,整段历史无法加载。截至 2026-08-17,仓库里已有未合入的修复 PR(#8、#10)。在修复进入你实际安装的 commit 之前,不建议把它接到还需要保留历史的生产会话上;安装前请先核对 Issue 与当前提交。
插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证;需要可复现安装时请固定 commit 哈希。
小结¶
distill 把「回合结束」变成一次后台技能策展:不改主对话表面,只在积累了足够的新用户消息后,用受限工具集的子代理决定 skip、create 或 update,并把结果写成带所有权标记的本地 SKILL.md。它适合想把团队习惯从口头说明变成可发现技能的人,但当前 0.1.0 与 dsh 0.1.0-rc.6 的会话事件兼容性仍是硬限制,装之前要先看仓库状态。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/distill/
GitHub:https://github.com/LoserFox/distill