前言¶
用 DeepSeek Harness(DSH)搭智能体时,技能的加载时机通常交给模型自己判断:技能以目录(catalog)形式暴露给模型,模型每一步都能看到目录,每次都要重新决定要不要加载。结果是决策不稳定——可能加载晚了,可能加载错了,也可能根本没加载。
dsh-skill-router 把这件事改成规则驱动:在每个 step 开始前,用纯规则匹配最新的用户消息,命中就把对应技能内容注入当前 step,未命中就完全不干预。整个过程零 LLM 调用、零 token 成本。下面介绍它的用法。
这是什么¶
dsh-skill-router 是一个 DSH 插件,一句话定位:规则优先的 pre-step 技能路由——命中的技能会被注入(pour),不确定时保持沉默。按目录信息,维护者为 MJorgin,当前版本 0.1.3,许可证 MIT。仓库归属有一处待核实的矛盾,见下文安装一节。
它解决的问题很具体:让「某类消息 → 某个技能」的映射不依赖模型的临场判断。相比让模型每步重新决策,或引入 LLM judge、embeddings 做路由,纯规则匹配是确定性的,未命中时零开销。
工作原理¶
Pre-step 钩子¶
插件挂载在 agent/pre-step 钩子上,在每个 step 开始前读取最新一条用户消息,也就是说路由发生在模型开始处理之前。
规则匹配¶
规则来自 YAML 策略文件:用户可编辑的 ~/.dsh/skill-router.yaml,插件内置一份默认策略 default-policy.yaml。规则按顺序匹配,首条命中即生效。
命中时,插件以 skill-invocation 消息把匹配技能的内容注入当前 step,技能目录里「已加载、不要重复加载」的规则自动生效。未命中时零干预,模型照常走自己的 catalog 流程。
去重与回退¶
每个技能在每个 session 里最多注入一次,避免技能内容反复进入 context。
策略文件如果写坏(YAML 解析失败),插件回退到内置默认策略,不会中断会话。
whenToUse 次级触发¶
已安装技能的 whenToUse frontmatter 作为次级触发,采用字面短语匹配,附加在 YAML 规则之后。现有技能数据大多缺少这个字段;要用的话应写成短触发短语,长文匹配不上。skill-bartender 的 taste test 可以回填该字段。
与 skill-bartender 的分工¶
skill-bartender 负责策略判断,本插件负责执行,两者互补;不需要判断层时,本插件也可以独立使用。缺失技能的自动安装不归它管——那部分流程保留在 skill-bartender 的 quarantine → SkillSpector → 人工审批里。
安装与启用¶
安装命令(README 原文):
dsh plugin --profile web add github:akqwpeter-prog/dsh-skill-router
安装后先重启运行中的实例,再做验证——profile bundles 在启动时加载。插件的 peerDependencies 为 @deepseek-ai/cordis、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-skill 和 yaml。
一个需要留意的地方:这条命令指向 akqwpeter-prog/dsh-skill-router,而目录页与 GitHub 仓库地址给出的是 MJorgin/dsh-skill-router,两处不一致,实际仓库归属无法从现有资料确认。安装前建议核对你实际要添加的仓库地址。
验证方式:对实例说「生成一张海报」,media-tools 会自动注入;说「这个截图帮我检查一下」,vision-review 会注入;没有规则命中时,模型照常工作。
自定义规则¶
先复制内置默认策略,再编辑副本:
cp default-policy.yaml ~/.dsh/skill-router.yaml
这一步把插件自带的 default-policy.yaml 复制为用户策略文件 ~/.dsh/skill-router.yaml。规则按顺序匹配,首条命中即生效,pour 列出要加载的技能名。示例:
# ~/.dsh/skill-router.yaml
rules:
- match: "(生成|画).{0,12}(图|海报|banner)"
pour: [media-tools]
这条规则匹配「生成/画」之后 0 到 12 个字符内出现「图/海报/banner」的消息,命中时注入 media-tools。
经过上面的步骤,路由行为完全由这份 YAML 决定:改进匹配靠编辑规则,不需要改代码。
测试覆盖¶
插件带 10 个集成测试用例,覆盖 pour、dedupe、zero-touch、reject passthrough、URL 路由、邮件/IM 消歧、误报防护等场景。
适用场景与注意事项¶
适合谁:
- 希望技能加载可预期、可复现的人:哪些消息触发哪些技能,由自己在 YAML 里写清楚。
- 已经在用 skill-bartender 做策略判断、需要一个确定性执行环节的人。
注意事项:
- 没有 LLM judge,没有 embeddings,只做规则匹配。语义层面的模糊判断不在它的能力范围内。
- 不做缺失技能的自动安装,该流程保留在 skill-bartender 的 quarantine → SkillSpector → 人工审批。
whenToUse次级触发依赖技能数据里有这个字段,而目前大多缺失,实际触发主要还是靠 YAML 规则。- 插件以当前 dsh 进程的权限运行,安装前应检查源码与许可证;本项目许可证为 MIT。
小结¶
dsh-skill-router 做的事情很收敛:在 step 开始前用规则决定要不要注入技能,命中才动手,不命中零开销。策略是数据,改进匹配靠改 YAML;策略判断可以交给 skill-bartender,也可以由你自己写进规则,执行交给它。
- GitHub 仓库:https://github.com/MJorgin/dsh-skill-router
- 插件目录页:https://www.skillhub.cn/plugins/MJorgin/dsh-skill-router (社区站点,非官方应用商店)