前言¶
DeepSeek Harness(DSH)默认每次会话从零开始:昨天一起摸清的构建命令、部署细节、被你纠正过的偏好,新开会话里都不会自动带上。社区里 Hermes Agent 用有界记忆文件和回合结束后的自动回顾解决类似问题;DSH 具备 ctx.tools 与 ctx.systemPrompt 等原语,但开箱并没有同等实现。
下面介绍维护者 Tommy00748 在 SkillHub 目录 与 GitHub 仓库 发布的 dsh-self-evolution(当前 package 版本 0.9.0,MIT 许可证)。它把 Hermes 的自改进循环移植到 DSH 插件形态,不修改 DSH 核心;记忆文件格式与 Hermes 字节级兼容,可互换。分类上属于「记忆」类插件。
这是什么¶
一句话:DSH 上的自进化层——有界长期记忆、每回合自动回顾、程序化技能写入与合并、技能健康检查、跨会话检索,以及「有内容才出现」的学习提示(对话内持久行 + 输入框上方卡片)。
设计目标之一是:自动学习可以长期开着,而不必担心写坏文件、悄悄删改记忆,或通知被当成一闪而过的 toast 而错过。
核心功能¶
1. 有界、自管记忆¶
记忆落在 <dshHome>/self-evolution/ 下:
MEMORY.md:智能体笔记USER.md:关于你的信息
条目以 § 分隔,格式与 Hermes 相同。工具支持 add / replace / remove / list;replace 与 remove 用唯一子串定位条目,歧义时拒绝操作。
默认容量与 Hermes 一致:MEMORY 2200 字符、USER 1375 字符;不会自动压缩。写满时工具返回 ok:false 并带上当前全部条目,便于同回合内合并后重试。完全重复条目会被拒绝。
写入前默认做安全扫描(可用 scanOnWrite: false 关闭):不可见 Unicode、指令注入、私钥与云凭证、authorized_keys、curl … | sh 等。命中则拒绝写入。
记忆通过系统提示词段落 self-evolution:memory(order 100,interpolate: false,记忆正文不会被当作 {{template}} 解析)注入,标题行会显示占用比例,例如 [67% — 1474/2200 chars]。
2. skill_learn:把流程写成可加载的技能¶
将刚跑通的流程写成 DSH 实际扫描目录下的 SKILL.md,默认根目录为 <projectRoot>/.dsh/skills(在工作区内,无需额外审批或重启)。
写入后会立即重读并 lint;若加载器会丢弃该文件则回滚,不会报告「已保存」却实际不可用。frontmatter 标量以 JSON 双引号形式输出,减少 YAML 解析失败导致技能被静默丢弃的情况;description 超过 500 字符会直接拒绝(目录会静默截断更长描述)。
3. skill_doctor:发现会被静默丢弃的技能¶
DSH 对 frontmatter 解析失败的技能静默丢弃且无警告。skill_doctor 扫描 DSH 读取的所有技能根,区分:
- 加载错误:无 frontmatter、缺
name/description、非 kebab-case 名称、未加引号且含": "、未闭合引号等; - 质量警告:如
description过长。
fix: true 时仅 surgical 修复 offending 行,其余字节不动,并备份为 <file>.bak-<timestamp>,修复后再次校验,无法验证则放弃。
4. 回合结束自动回顾¶
监听 turn/end,用辅助模型(无工具、JSON 输出)判断本回合是否值得保留。中断或错误结束的回合不会学习;工具步数少于 reviewMinSteps(默认 2)视为琐碎;同一时刻只跑一条回顾。
输入为回合末尾最多 reviewMaxEvents(40)条事件的紧凑文本,字符上限 reviewMaxChars(6000)。输出契约为严格 JSON,包含 memory、skill 与 reason;提示词要求克制,0–2 条记忆、空结果也合法。
落地路径与手动工具相同(扫描、限额、去重、读回校验)。失败(模型不可用、超时、非法 JSON、写入被拒)全部吞掉,不影响当前会话。技能侧支持 create 与 improve:后者会二次调用模型把新知识合并进已有技能并压缩,避免近重复技能堆积;合并体超过 skillMaxChars(12000)则拒绝并保持旧版。reviewSkillUpdates: false 可关闭改写,仅保留新建。
自动回顾只能追加记忆;删除或改写需排队等你批准(见下文「信任与审批」)。
5. session_search:跨会话召回¶
搜索历史会话中的真实消息(与智能体主动写入的 MEMORY 互补)。模式包括 search(全文,可限定 session_id)、list(最近会话)、read(按 seq 读窗口上下文)。
README 建议:一次搜一个 distinctive 词;多词按精确短语匹配。中文按词切分,无 Hermes 式 CJK 分词器时,子串级检索可用 grep 扫文件。
该工具可选注册:无搜索后端时插件其余部分仍可用。启用需在 profile patch 中覆盖 DSH 的 session 查询插件,例如:
- id: session-query-sqlite
name: '@deepseek-ai/dsh-session-query-sqlite'
config:
path: '/Users/<you>/.dsh/storages/session-search.db'
openAt: first-search # startup | first-search | never
索引为独立派生库,可安全删除重建;勿指向会话持久化库本身(单进程索引)。
6. 对话内的学习记录与输入框卡片¶
有学习发生时,会在对应回答之后写入一条持久 context 行(可 transcriptRow: false 关闭),摘要类似「记住了一条经验:…」;展开可见回顾理由、记忆占用与当前条目。正文以 [self-evolution record · not a message from the user] 开头,避免被误读为用户消息;每回合最多一行,且在回合已 idle 后写入,不会触发额外一步。
输入框上方:无新闻时仅占 stats 行里一个 faint ◈;有学习或待审批变更时出现一行可点击摘要,点击展开面板(待审批、MEMORY/USER 用量、近期学习时间线、当前条目)。待审批项或面板打开时卡片保持可见;已读状态存于浏览器 localStorage(dsh:self-evolution:seen)。
系统提示里还可注入一段稳定的 guidance(默认 guidance: true),说明何时写记忆、何时提炼技能、写前查容量、用户纠正优先等。
安装与启用¶
安装命令来自仓库 README(非 npm 发布包):
dsh plugin --profile <your-profile> add github:Tommy00748/dsh-self-evolution
然后在 profile 的 cordis.patch.yml(路径形如 ~/.dsh/profiles/<profile>/cordis.patch.yml)加入 bundle:
- id: self-evolution
name: 'dsh-self-evolution'
config:
memoryCharLimit: 2200
userCharLimit: 1375
主机侧(工具、提示词段、HTTP 路由)在下次启动 DSH 后加载;客户端 client.js 可被 DSH 轮询热更新,index.js 变更需重启。
运行环境:package.json 要求 Node >= 22,并依赖 @deepseek-ai/dsh-tools、@deepseek-ai/dsh-llm、@deepseek-ai/schemastery 等 peer 依赖(随已安装的 DSH 提供)。
卸载时从 profile 的 dsh.profile.bundles 移除 bundle 并删除包;不会自动删除 <dshHome>/self-evolution/ 下的记忆与技能文件,需自行清理。
配置要点¶
在 profile 的 cordis.patch.yml 里用 id self-evolution 覆盖配置。Patch 会整体替换 config 对象,不会字段级合并,因此要列出你想保留的全部键。
常用项包括:storeDir、skillsDir、extraSkillDirs、enableMemoryTool、enableSkillTools、autoReview、reviewProvider / reviewModel、approveReviewEdits(默认 true:删改需批准;false 则自动合并)、uiMode、notify、scanOnWrite 等。完整列表见仓库 README 的 Configuration 一节。
典型用法¶
- 安装并写入 profile patch 后重启 DSH,正常对话;复杂任务结束后,自动回顾可能写入 MEMORY 或改进/新建
.dsh/skills下的技能。 - 需要主动固化流程时,让模型调用
skill_learn;怀疑技能「写了却从不生效」时,调用skill_doctor(必要时fix: true)。 - 记忆写满时,根据工具返回的现有条目在同回合合并后再
add。 - 若要跨会话搜聊天记录,按 README 配置
session-query-sqlite后使用session_search;查询宜单词、 distinctive。 - 自动回顾提议删除或改写记忆时,在卡片里查看将被替换的全文后再批准;批准接口仅接受本机 loopback 且声明 JSON 的请求。
适用场景与注意¶
适合谁:长期在同一 DSH 环境做项目开发、希望构建/部署/偏好能跨会话保留,又希望技能文件不被 YAML 小错误静默吃掉的用户;也可与 Hermes 记忆文件迁移互换。
信任边界(务必阅读):插件通过主机进程的 node:fs 写入,不受会话文件沙箱约束。默认写入 <dshHome>/self-evolution/ 与 <projectRoot>/.dsh/skills/(均可配置)。记忆会持续注入系统提示词,故默认开启 scanOnWrite。安装前请自行审阅源码与 MIT 许可证;插件以当前 dsh 进程权限运行。
其他限制(摘自 README Known limits):对话行是 user-role 的 context 注入而非 system 行;卡片时间线只读、最多展示部分记录;session_search 为 SQLite unicode61 分词,非任意子串;记忆默认全局共享,可按项目将 storeDir 指到工作区内以隔离。
结尾¶
dsh-self-evolution 在 DSH「一切皆插件」的生态里,把有界记忆、回合回顾、技能精炼与可见的学习反馈接到一起,并围绕 unattended 写入做了 provenance、仅追加与审批队列等约束。若要进一步了解分类与简介,可看 SkillHub 目录页;安装、配置与测试说明以 GitHub 仓库 README 为准。