dsh-capability-router:用自然语言在已装技能、插件与 MCP 里做能力检索

前言

在 DeepSeek Harness(DSH)里,模型能调用什么,取决于会话启动时上下文里挂载了哪些技能、插件和 MCP。目录外的能力对模型等于不存在,用户往往得先记住包名再操作。另一方面,插件描述多为英文,用中文说「自动审批」「免确认」时,仅靠包名很难召回。技能在文件系统、插件在 profile、MCP 在另一份配置,也没有统一检索入口。

dsh-capability-router(维护者 difaandailisi,GitHub 仓库 difaandailisi/dsh-capability-router)把三类能力收成一张本机目录,提供一个只读工具,按自然语言意图匹配并返回带命中理由的候选。纯本地、零依赖,不联网、不调 LLM、不自动安装第三方包。当前版本 0.1.2,许可证 MIT;分类上属于 DSH 社区目录中的工作流类插件,与 DeepSeek / 幻方无官方从属关系。

它解决什么问题

README 归纳了三类具体痛点:

  1. 看不见就想不到:未进入上下文的能力无法被模型想到,用户要先记住名字。
  2. 中文查询零召回:只记包名时,中文意图与英文描述对不上。
  3. 三类割裂:技能、插件、MCP 分散在不同配置与路径,缺少统一按意图查询的入口。

本插件用「需求 → 词元扩展 → 三类目录打分 → 候选 + 理由」的流程应对上述问题;打分规则对名称、标签、分类、描述分别加权,且同字段最多计两次,避免长描述靠词多取胜。

核心功能

目录采集来源

  • 技能:读取 SKILL.md frontmatter。
  • 插件:读取 profile 中的 package.json 及包内 description、keywords。
  • MCP:读取 mcp.json 与 mcp-known-tools.json。

模型侧工具

暴露工具 capability_route,参数包括自然语言需求 need,可选 limit(默认条数)与 kind(例如只筛 plugin)。返回结果包含候选条目、分数,以及可转述的命中理由(名称、标签等字段为何加分),并注明条目所在位置(例如 desktop profile)。

引导注入

除工具外,插件可向系统提示词注入一段引导,说明当用户说的是需求而不是工具名时,应先调用本工具——这是让检索被主动用到的设计之一。

与 WorkBuddy 共用引擎

lib/catalog.js 为纯函数、零依赖,可被其他宿主(如 WorkBuddy 技能目录下的软链与薄 CLI)复用同一套采集与打分逻辑,避免多份实现漂移。

安装与启用

DSH 引擎要求见 package.json:dsh 为 >=0.2.1-0 <0.3.0,Node >=20。

方式一:bundle(进 dsh.profile.bundles,启动时装配)

dsh plugin --profile web add dsh-capability-router

bundle 层变更后需要重启 DSH 进程。

方式二:本地开发

软链进 profile 后,在本地路径安装并手工加热挂载行:

npm install /path/to/dsh-capability-router --legacy-peer-deps

在 profile 的 cordis.patch.yml 末尾追加:

- insert:
    - id: capability-router
      name: dsh-capability-router

patch 层由 HMR 监视,改完即生效,无需重启。

典型用法

模型调用示例(参数与返回格式来自 README):

capability_route(need: "任务完成时通知我", limit?: 5, kind?: "plugin")

返回示例形态如下(分数与理由由引擎计算,模型可直接转述 reasons):

检索「自动审批 不用我每次点同意」→ 1 条(catalog 181 条,更新时间 ...)
1. [plugin] dsh-auto-review — 12 分
   名称命中「review、auto」+6;标签命中「approval、review、auto」+4
   位置:desktop profile

配置

在 patch 条目中通过 config 覆盖;注意 patch 会整体替换 config,需把要保留的键全部重述:

- id: capability-router
  name: dsh-capability-router
  config:
    ttlMs: 300000        # 目录缓存时长,默认 5 分钟
    limit: 5             # 默认返回条数
    injectPrompt: true   # 是否注入引导段落
    extraSkillRoots:     # 额外技能根目录,支持 ~;会递归找其中的 skills/ 子目录
      - ~/.workbuddy/skills
    sources:
      skills: true
      plugins: true
      mcp: true

extraSkillRoots 用于本机 DSH 未放技能、而技能在其它工具目录的场景,挂入后可在同一目录里统一检索。

设计取舍与局限

README 说明:目录规模为几十到几百条时,中文 2-gram 加意图词典的召回已够用,且每条命中可解释、无额外模型调用;未采用向量检索作为主路径。召回质量依赖技能/插件描述是否写好触发语义;只覆盖本机已装能力,不含远端市场索引;中文长句可能有噪音,短需求效果更好。工具只给出安装相关命令,不自动执行安装——装插件等于运行第三方代码,安装前应自行审阅源码与许可证;插件在 DSH 进程权限下运行,与 DSH 其它插件相同。

与同生态项目的差异(摘自 README 对比表):dsh-need-finder 面向精选插件列表;dsh-skills-anywhere 侧重技能;dsh-cap-manager 做管理面板;dsh-vet 做安装前安全审计——本仓库只做检索,与 vet 等互补。

结尾

若你经常在本机已装的技能、DSH 插件和 MCP 之间用中文描述需求、又不愿死记包名,dsh-capability-router 提供统一的只读意图检索与可解释命中理由。社区目录页:skillhub.cn/plugins/difaandailisi/dsh-capability-router;源码与完整说明:github.com/difaandailisi/dsh-capability-router。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜