前言¶
DeepSeek Harness(DSH)的技能系统允许你在对话中积累可复用的操作步骤,但上游原版更多提供浏览、编辑和手动提取能力。如果你希望把每次对话中值得保存的经验自动沉淀到技能库,需要持续的人工介入。DSH Skill Studio 是对上游的社区分叉,它为无人值守使用增加了四个关键能力:每轮对话的价值判断、自动接受候选、语义合并以及使用 DSH 原生模型。
这是什么¶
DSH Skill Studio 是一个 DeepSeek Harness 插件,用于构建自改进的技能流水线。它会在对话结束后自动判断当前轮次是否值得提取,将候选技能与已有技能进行语义对比,决定是合并到现有条目还是新建,最终将合格条目写入技能库。维护者为 samir2015dzh,采用 MIT 许可证。
核心功能¶
-
每轮价值判断:对话结束后约 3 秒,插件会向模型发送一个极简的 YES/NO 提示(从最近一轮会话抽取 10 个摘要),只有 YES 才会触发完整提取。判断被限制在 90 秒内,提取过程最多持续 5 分钟。
-
直接入库:被接受的候选会写入
~/.agents/skills,并在下一轮加载。只有写入失败时(如名称冲突)才会进入人工审核队列。 -
语义合并而非堆文件:每个候选都会与整个技能库比对,只有真正新的主题才会创建新技能。本地相似度仅作预筛选,最终决策由模型基于完整目录做出。
-
使用 DSH 原生模型:面板提供下拉选择,可从 DSH 中配置的提供商/模型列表中挑选。插件不存储 API 密钥,也不询问网关地址。
-
面板增强:技能库面板中会列出最近修改过的技能,包含名称、描述和时间戳。
-
写入清理:合并时会截断重复章节,剥离协议残留(如
MERGE:),并拒绝导致原文大幅丢失的合并结果。
合并流程¶
一个候选在写入前需通过四道关卡,任一关卡否决即转为新技能或丢弃。
new candidate
│
├─ ① Tombstone:检查该名称是否曾被合并移除(扫描 ~/.dsh/skill-archive/*)。
│ → 强制合并到同分类下体量最大的技能;若失败则丢弃,避免重复写入。
│
├─ ② Category tags:从目录读取 "- [decompile] name: description"。
│ → 模型在阅读正文前先看到分类标签。
│
├─ ③ Local re-check:再次验证 FOLD_INTO 判决。
│ → 同分类:接受;跨分类:要求相似度 ≥ 0.5,否则保存为独立技能。
│
└─ ④ 合并本身:模型将新经验折叠进现有章节。
→ 截断重复章节、剥离残留协议;结果若短于原内容 60% 则拒绝。
分类名称来源于技能名(如 gui-* → gui,decompiled-* / java-decompile-* → decompile,portable-* / offline-* → portable)。CATEGORY_ALIASES 位于 lib/extractor.js,可按需扩展。
安装与启用¶
插件通过 link: 依赖方式安装到 DSH 配置,代码修改无需重新发布。
- Clone 任意位置:
git clone <this-repo> D:/dsh-plugins/dsh-skill-studio
- 在配置文件
package.json中注册:
{
"dependencies": { "dsh-skill-studio": "link:D:/dsh-plugins/dsh-skill-studio" },
"dsh": { "profile": { "bundles": ["dsh-skill-studio"] } }
}
- 将其创建为 Junction 链接至
node_modules:
New-Item -ItemType Junction `
-Path "$env:DSH_PROFILE_DIR\node_modules\dsh-skill-studio" `
-Target "D:\dsh-plugins\dsh-skill-studio"
- 重启 DSH,打开 Settings → Skill Studio。
配置¶
配置文件为 ~/.dsh/dsh-skill-studio/extractor.json(权限 0600)。
{
"enabled": true,
"autoPerTurn": true,
"intervalMinutes": 60,
"windowDays": 7,
"maxCandidatesPerRun": 3,
"autoAccept": true,
"mergeThreshold": 0.2,
"skillLanguage": "auto",
"agentSkillDir": "C:\\Users\\<you>\\.agents\\skills",
"provider": "",
"model": ""
}
| 字段 | 用途 |
|---|---|
autoPerTurn |
在每轮对话结束时运行 YES/NO 判断 |
intervalMinutes |
降级轮扫间隔;设为 0 则仅依赖每轮触发 |
autoAccept |
直接写入技能库,而非放入审核队列 |
mergeThreshold |
本地相似度预筛选阈值(合并决策本身仍由模型做出) |
skillLanguage |
auto / zh / en;代码、命令与路径不翻译 |
provider / model |
留空则跟随触发会话;也可在面板中指定 |
遗留的 llmBaseUrl / llmApiKey / llmModel 字段仍可作为无 ctx.llm 环境的 HTTP 降级方案,正常使用时留空即可。
工具命令¶
| 工具 | 用途 |
|---|---|
skillmgr_list |
列出所有技能,包含来源、状态与分组 |
skillmgr_get |
读取单个技能全文 |
skillmgr_save |
将完整 SKILL.md 写回 |
skillmgr_policy |
切换模型/用户调用策略 |
skillmgr_extract_run |
手动触发一次提取 |
skillmgr_extract_status |
查看开关、间隔、队列深度与上次运行 |
skillmgr_extract_config |
修改配置 |
skillmgr_extract_list / _accept / _reject |
操作队列(autoAccept 开启时通常为空) |
HTTP 路由位于 /api/dsh-skill-studio/*,面板即通过这些接口与插件通信。
调试¶
每次模型响应会输出到:
~/.dsh/dsh-skill-studio/last-llm-raw.txt
解析失败时,优先读取该文件:截断的 JSON、markdown 装饰或答非所问的问题可据此区分。
两个回归脚本均不接触真实技能库:
node scripts/e2e-preview.mjs # extract → judge → merge → accept,6 个断言
node scripts/e2e-tombstone.mjs # tombstone 胜过模型判决(模型先说 SAVE,后说 KEEP)
与上游的差异¶
完整列表见 FORK-NOTES.md(15 条)。要点包括:
- 模型调用通过
ctx.llm.prepareCall(),不存储凭证 - 每轮 YES/NO 判断与自动接受入库
- 语义合并:分类标签 + 模型判决 + 本地复查 + Tombstone
- 合并清洗:去重、剥离残留、短体拒绝
- 面板:最近添加列表与模型下拉框
- 提取输出截断恢复,
maxTokens提升至 8000
适用场景与注意¶
适合希望将对话中持续产出的经验沉淀为可复用技能的开发者,尤其是需要长期运行无人值守的场景。插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证。
小结¶
DSH Skill Studio 把技能的自动蒸馏与语义合并变成了流水线:每轮对话的价值判断、候选自动接受、与已有技能的语义比对与合并,全部在后台完成。配合 DSH 原生模型调用与面板监控,可以在不改变工作流的前提下,让技能库自然生长。
- 插件主页:https://www.skillhub.cn/plugins/samir2015dzh/dsh-skill-studio-plus
- GitHub:https://github.com/samir2015dzh/dsh-skill-studio-plus