前言¶
智能體幹活時,最常重複的不是推理,而是那一串固定的動作:讀文件、按某個字段分組、彙總、寫到另一個位置。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 。