前言¶
DeepSeek Harness(DSH)的每個智能體預設都有一組固定的能力。這些能力通過 profile 的 bundles 掛載,會進入所有會話。當插件數量增加,每個會話都會帶着大量從未使用的工具定義,消耗 schema 預算。
DSH 內置了一些預設(Creative、Office、Media),但它們是手工維護的列表。一旦安裝了新的插件或 MCP 服務器,手工列表就會落後。
dsh-preset-categorizer 從機器上讀取已安裝的能力,按類型分組,自動註冊一組預設到 DSH 的預設選擇器。每個類別成爲一個一等公民,可以在 GUI 中直接選擇。
這是什麼¶
dsh-preset-categorizer 是一個 DSH 插件,用於把已安裝的插件、MCP 服務器和技能按類別註冊爲智能體預設。
維護者 anonamerjaxon-dev。插件版本 0.1.0,MIT 許可證,兼容 DSH 0.2.1-rc.2 及以上、Node.js >= 22。
它識別三種能力類型:
| 類型 | 識別方式 | 掛載方式 |
|---|---|---|
| plugin | loader 條目,基於包名(如 dsh-ffmpeg) | 插件行 |
| MCP | loader 條目,基於 @deepseek-ai/dsh-mcp-client | MCP 行,攜帶服務器配置 |
| skill | ~/.agents/skills* 下的技能目錄 | 技能提供者行,按根目錄掛載 |
核心功能¶
識別並分組能力¶
插件讀取 profile 的 package.json,列出所有已安裝的插件、MCP 服務器和技能目錄。根據能力類型,將它們歸類到預設中。
自動註冊預設¶
爲每個類別註冊一個預設到 DSH 的預設選擇器。預設的 id 以 cat- 開頭,例如 cat-media、cat-web。
安全規則¶
插件遵循三條規則:
- 只添加:如果 id 爲
cat-*的預設已存在,則跳過,不編輯、不替換、不刪除。不修改 profile 的package.json。 - 不移動:插件只報告能力歸屬,不從現有配置中卸載能力。移動能力涉及 UI 加載等成本,由用戶決策。
- 不添加工具:插件本身不提供工具,也不攜帶 schema。
處理缺失包¶
如果一個預設引用的包在 profile 中不存在,該預設會顯示爲 broken。插件在註冊前先讀取 package.json,跳過包含缺失包的行,避免顯示紅色 broken 行。
技能按根目錄掛載¶
技能提供者掛載的是目錄,而不是單個技能。機器上的技能通常位於共享根目錄。因此,一個預設只能掛載一個根目錄(如”genoffice 但不包含 mineru”無法表達)。如果兩個類別引用同一根目錄,第一個生效,第二個被報告。
生成報告¶
插件生成報告文件 ~/.dsh/preset-categorizer-report.json,包含註冊數量和能力統計:
{
"report": {
"registered": 5,
"capabilities": 209,
"plugins": 194,
"mcps": 5,
"skills": 15
},
"roster": [
{ "id": "cat-docs", "name": "Documents (office / pdf)" },
{ "id": "cat-web", "name": "Browser (playwright)" }
]
}
安裝與啓用¶
安裝¶
從 GitHub 倉庫安裝:
dsh plugin --profile web add dsh-preset-categorizer
或者從本地 checkout 安裝:
dsh plugin --profile web add "link:/path/to/dsh-preset-categorizer"
啓用¶
插件不應放在 profile 的 bundles 中,而應放在某個預設的配置裏。它在啓動時運行,向預設選擇器註冊類別,因此只需要在需要它的會話中存在。
在預設的 cordis patch 文件中添加:
# ~/.dsh/profiles/web/cordis.patch.yml,在 Creative 預設內部
- id: preset-categorizer
name: dsh-preset-categorizer
config: {}
inject:
- loader
- agentPresets
inject 字段告訴 loader 從這一行讀取注入的模塊,而不是從模塊導出中讀取。沒有它,ctx.agentPresets 會拋出 “cannot get property agentPresets without inject”。
典型用法¶
安裝後,DSH 會根據機器上已安裝的能力自動註冊預設。可以在智能體配置中選擇這些預設。
查看報告:
cat ~/.dsh/preset-categorizer-report.json
運行測試:
node test.mjs
配置與擴展¶
預設類別定義在 lib/categories.js 中,是純數據結構:
{
id: 'cat-web',
kind: 'mcp',
preset: {
id: 'cat-web',
name: 'Browser (playwright)',
order: 42,
mcpRows: [{ id: 'mcp-playwright', name: MCP_CLIENT, config: { /* ... */ } }],
skillRoot: null,
},
include: ['mcp-playwright'],
exclude: [],
}
字段說明:
id:預設唯一標識,以cat-開頭kind:能力類型,plugin、mcp或skillpreset:預設配置,包含 id、name、order、mcpRows 或 skillRootinclude/exclude:glob 模式,匹配能力的 id、name、package。exclude 優先級更高mcpRows:MCP 服務器的加載行,包含 serverName、transport、command/url 等配置skillRoot:技能根目錄的絕對路徑
類別匹配採用第一個匹配原則,因此列表順序有意義。
適用場景與注意¶
適合已經在使用 DSH,希望按能力類型組織智能體預設的開發者。當你安裝了多個插件或 MCP 服務器,手工維護預設列表變得困難時,這個插件可以從機器自動推導。
注意:插件以當前 DSH 進程的權限運行。安裝前應檢查源碼與許可證。
插件安全特性:
- 無網絡請求
- 無子進程調用(無 exec、spawn、eval)
- 只讀取技能目錄和 profile 的
package.json - 只寫入
~/.dsh/preset-categorizer-report.json,僅包含名稱和計數,無絕對路徑、無憑據 - 不修改任何配置文件或現有預設
小結¶
dsh-preset-categorizer 解決了 DSH 內置預設手工維護、無法隨已安裝能力自動更新的問題。它從機器讀取能力,按類型註冊預設,讓每個能力類別在 GUI 中成爲一等公民。
- 插件主頁:https://www.skillhub.cn/plugins/anonamerjaxon-dev/dsh-preset-categorizer
- GitHub 倉庫:https://github.com/anonamerjaxon-dev/dsh-preset-categorizer