前言¶
智能体干活时,最常重复的不是推理,而是那一串固定的动作:读文件、按某个字段分组、汇总、写到另一个位置。Skill(SKILL.md)就是为了把这些步骤存下来复用。于是有了一类做法是「自动保存技能」,像 Hermes 那样,模型觉得自己学到了什么就直接落成技能,下次遇到类似任务直接加载。
这条路的问题不在保存,而在时机:你不知道它什么时候存的,也不知道它会在什么时候被加载。一个为「汇总某类 CSV」写的技能,完全可能在一次完全无关的对话里被匹配上,然后以你没预期的方式介入。等到事后才发现,已经改了不少东西。写 dsh-skill-scribe 的思路因此少迈了半步:保存照旧自动,启用与否交给人。候选照常生成,但只有你 accept 之后,它才是技能。
这是什么¶
dsh-skill-scribe 是 DeepSeek Harness(dsh)的一个插件,属于「工作流」这一类。它定位成一个编辑器:每次对话轮次(turn)结束时,插件审视这一轮做了什么,如果步骤看起来可复用,就让模型起草一份 SKILL.md 放到待审目录里。起草结果在确认前不会被加载。
插件由 MaresaN41 维护(包内 author 字段写的是 MaresaN)。仓库自述是作者自己用的,README 也用 AI 写成,所以边缘情况不少,这点后面会说到。
许可证 MIT,需要 Node.js 20.3 以上,dsh 版本要求 >=0.2.0-rc.2 <0.3(作者在 0.2.0-rc.2 与 0.2.1-rc.5 上验证过)。
它做什么¶
往下看的前提是:插件自身不执行命令,它只起草文本,执行与否永远由 caller 决定。
- 一轮对话正常结束后,如果这一轮调用工具的次数达到阈值(默认 3 次,可配),插件把这一轮的工作交给模型判断能不能复用,能就起草
SKILL.md。 - 如果这一轮用的是已有技能,插件不会新建技能,而是生成一份「更新案」,用
diff可以对着看改了什么。 - 文本送模型、写入文件之前,形如 API key 这类可识别的秘密会被遮住。
- 起草用当前会话的模型,包括 OpenAI 兼容的本地模型;也可以另配一个备用 endpoint。
技能草稿的形态是 SKILL.md 的 front matter 加步骤说明:
---
name: csv-aggregate-by-date
description: "Aggregates numeric columns in a CSV file by grouping on a date column"
whenToUse: "When summarizing transactional or time-series data by calendar date"
---
# CSV Aggregate by Date
## Steps
1. Read the input CSV file to extract date and amount columns
2. Group rows by the date column
3. Sum the amount values for each unique date
4. Write the aggregated data to a new CSV file
## Notes
- Works with any CSV where one column is a date and another is numeric
安装与启用¶
README 给了两种方式。第一种是 clone 下来再用绝对路径安装:
git clone https://github.com/MaresaN41/dsh-skill-scribe.git
dsh plugin --profile <profile> add /absolute/path/to/dsh-skill-scribe
其中 <profile> 换成你的 dsh profile 名,路径换成 clone 下来的绝对路径。插件通过包里的 dsh.bundle.patch 自动注册,不需要额外加 --patch。
第二种是不 clone,直接从 GitHub 装:
dsh plugin --profile <profile> add github:MaresaN41/dsh-skill-scribe
跑测试需要 dsh 的 peer 包:
npm test
npm pack --dry-run
典型用法¶
在 dsh 会话里跑一个会用到几次工具的任务。轮次结束时,插件在后台起草候选。之后:
cd dsh-skill-scribe
node bin/scribe.js list
输出形如:
id kind created drafter task
csv-aggregate-by-date new 2026-11-04T22:44:10.340Z llm Sum amount by date ...
看一下内容,然后决定接受还是拒绝:
node bin/scribe.js show csv-aggregate-by-date
node bin/scribe.js accept csv-aggregate-by-date
accept 之后,这个技能从下一个会话开始可用。拒绝用 reject,会被移到 rejected/ 而不是删掉,留作记录。
命令入口有三处:仓库里是 node bin/scribe.js <cmd>,profile 的 node_modules/.bin 下是 scribe <cmd>,在 dsh 里面可以直接打 /scribe <cmd>。
| 命令 | 说明 |
|---|---|
list |
列出待审批的候选 |
show <id> |
显示候选与元数据 |
diff <id> [--project <dir>] [--dest <dir>] |
候选与现有技能对比 |
accept <id> [--project <dir>] [--dest <dir>] |
落成技能 |
reject <id> |
移入 rejected/ |
accept 的写入位置默认是 $DSH_HOME/skills;加了 --project <dir> 就写 <dir>/.dsh/skills;--dest <dir> 则写你指定的地方。同名技能已存在时,先备份再覆盖。更新案的落点规则同样,原技能在其他位置时原文件不动,accept 会提示出来。
候选什么时候不会生成¶
全部满足才生成:
- 轮次没有报错地完成;
- 工具调用达到
minToolCalls(读取技能不计入次数); - 模型判断这是可复用的步骤;
- 草稿通过格式检查(重试只有一次);
- 没触到当日上限;
- 同一会话里前一份草稿不在进行中(进行中这期间结束的轮次会被跳过);
- 进程结束前草稿已完成。
配置¶
配置全部可省略,写在 profile 的 cordis.patch.yml 中:
- id: skill-scribe
config:
minToolCalls: 5
language: ja
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
插件开关 |
minToolCalls |
3 |
一轮里最少的工具调用次数 |
model |
跟随会话 | 起草用的 { provider, model } |
endpoint |
无 | 备用 OpenAI 兼容地址 { baseURL, model, apiKeyEnv } |
language |
"auto" |
草稿语言,auto 跟请求文本走 |
maxProposalsPerDay |
10 |
每日候选上限 |
timeoutMs |
180000 |
模型调用超时 |
maxOutputTokens |
4096 |
草稿输出上限 |
shutdownGraceMs |
3000 |
退出时等待进行中草稿的时间 |
home |
$DSH_HOME |
覆写 dsh home,主要给测试用 |
会送出去什么¶
起草需要把请求文本、工具的参数与结果、最终回答交给模型;如果做的是更新案,还要带上现有技能的正文。默认走 dsh 自己的模型通路。设了 endpoint 的话,主通路失败时会把同样的内容发到那个备用地址。所以本地模型跑着、endpoint 却指向外部,内容就会出域——只配你信任的地址。
拼命令能遮住形如 key 的秘密,但并不能保证密钥和个人信息一定消失;已经写在草稿里的内容,accept 之后会变成给后续 agent 的指令。生成的步骤也可能本来就是错的,所以 accept 之前把全文读完是真正要做的一步。
插件只写 $DSH_HOME/skill-scribe/ 和 accept 时选中的位置。设了环境变量 SKILL_SCRIBE_DEBUG 时,会往指定的文件追加日志。
安装前该看的¶
插件以当前 dsh 进程的权限运行,所以安装前先读源码再决定。特别留意两点:一是它会读取整轮的工具参数与结果,二是草稿的措辞直接进入后续会话。仓库 MIT、依赖简单,但 README 自述是个人使用品,endpoint 备用地址这类外部通路更是要自己确认。
已知限制也写在 README 里:
- dsh 单次运行的用法下,较慢的起草可能在进程退出前没写完,候选就没了;插件会等
shutdownGraceMs,但 dsh 退出的整体窗口约 5 秒。长会话,或者用examples/draft-from-session.mjs从已记录的会话里重做会稳一些。 - dsh 本身是预览版,有破坏兼容性的变更时插件需要跟进。
- 日上限额度被占用后进程挂掉,这个额度当天就扣掉了,不会退还。
小结¶
这套机制省掉的其实是那个「事后才发现」的成本:自动保存不阻止,自动加载才拦住。对日常用 dsh 跑数据整理、批处理类任务的人来说,一次 list + show + accept 的成本,比下一次才发现某个技能悄悄介入要低。目录页在 https://www.skillhub.cn/plugins/MaresaN41/dsh-skill-scribe ,源码在 https://github.com/MaresaN41/dsh-skill-scribe 。