前言¶
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