dsh-agent-router:Deterministically select the model by keywords when delegating subagents

前言

在 DeepSeek Harness(DSH)里,主智能体通过委派(delegation)拉起子智能体时,往往需要在不同任务上选用不同的 provider 与 model:调研类任务希望用推理能力更强的模型,改 typo、重命名、格式化则用更轻量的模型。若每次都在调用侧手写 provider / model,规则分散、难以审计;若再叠一层「打分分类器」,行为又不透明、也不好在 CI 里做 dry-run。

下面介绍的 dsh-agent-router(维护者 gengwg,GitHub 仓库 gengwg/dsh-agent-router,社区目录分类为「模型推理」)做的是另一件事:在委派发生的瞬间,用你写的一小段关键词规则决定子智能体的路由;没有分类器、没有打分,第一条命中的规则生效;没有任何规则命中时,行为与未装插件时一致。

这是什么

一句话:DSH 插件,在子智能体创建时根据 label 与 prompt 文本中的关键词,从配置里选出 provider、model(以及可选的 reasoningEffort),且决策过程可导出、可单测。

它包装官方 subagents.startActivation 服务,子智能体仍走 DSH 自身的容量、取消、结果回传、持久化与清理;不向根智能体注册工具,也不改变根智能体的行为。包声明了 dsh.bundle,通过 dsh plugin add 加入 profile 的 bundle 栈。当前 package 版本为 0.1.0,许可证 MIT;引擎要求 Node >=22.18,DSH >=0.2.1-rc.5 <0.3.0(README 开发说明中测试针对 DSH 0.2.1-rc.5)。

核心功能

规则匹配

  1. 规则按配置顺序排列,先匹配先生效。
  2. 匹配方式:对 label + "\n" + prompt text 做不区分大小写的子串检测;keywords 不能为空列表,空字符串 keyword 永不匹配。
  3. 显式路由保留:若委派方已在 agentOptions 里指定 provider、model 或 reasoningEffort,默认情况下规则不会覆盖;某条规则设置 overrideExplicit: true 时,该规则仍可胜出。
  4. 无兜底路由:没有规则命中则原样透传,由 DSH 自身的继承逻辑处理。
  5. 非路由选项保留:cwd、token 上限等 agentOptions 不动,只改写 provider、model、reasoningEffort;若省略 route.reasoningEffort,调用方传入的 effort 会被丢弃,避免带到另一模型上。
  6. 对声明 capabilities.agentOptions: false 的 out-of-process 后端(例如 ACP),插件不尝试改路由,避免委派失败。

可检查的决策

插件导出 decide(rules, { label, promptText, requested }),返回 { action, reason, rule, matchedKeyword, agentOptions? },可在脚本里对规则集做 dry-run。使用前应对配置走 validateConfig(config).rules;decide 假定已是校验后的结构。畸形规则在加载时失败并给出路径(例如 rules.0.match: unknown rule key),避免 typo 静默错路由或静默全放行。

安装与启用

安装依赖 pnpm(dsh plugin 会通过 shell 调用它)。README 给出的从源码安装步骤如下:

git clone https://github.com/gengwg/dsh-agent-router
cd dsh-agent-router
dsh plugin --profile web add "$PWD"

将插件加入 profile 的 bundle 栈后,重启 dsh 以加载。初次启用时规则列表为空,不会改写任何路由。

配置方式

规则写在 profile 的 ~/.dsh/profiles/<profile>/cordis.patch.yml 中,条目 id 为 agent-router。示例(字段含义以 README 表格为准):

- id: agent-router
  name: dsh-agent-router
  config:
    rules:
      - name: research
        keywords: [investigate, research, compare]
        route:
          provider: openrouter
          model: deepseek/deepseek-v4-pro
          reasoningEffort: high
      - name: routine
        keywords: [typo, rename, format]
        route:
          provider: openrouter
          model: deepseek/deepseek-v4-flash
字段 必填 含义
keywords 是 非空列表;子串匹配 label 与 prompt,不区分大小写
route.provider、route.model 是 子智能体 provider 与 model;须已是你在 DSH 中允许的路由,插件不能代为开通
route.reasoningEffort 否 写入子智能体;省略时丢弃调用方 effort
name 否 决策记录中的标签
overrideExplicit 否 默认 false;为 true 时可覆盖调用方显式指定的路由

典型用法思路

  1. 在 cordis.patch.yml 中为常见任务类型写少量规则(如 README 中的 research / routine)。
  2. 委派子智能体时在 label 或 prompt 里带上能命中关键词的用语(例如 prompt 含 research 则走 research 规则)。
  3. 上线前用导出的 decide 对样例 label/prompt 跑一遍,确认顺序与 overrideExplicit 符合预期。

注意:路由在子智能体工具自身的 preflight 之后应用,插件不会再次校验路由是否在 DSH 模型选择 allowlist 内;只配置 profile 已允许的路由。路由仅在创建子智能体时生效,运行中的子智能体不会换模型;配额、鉴权、限流失败也不会自动改路由——若需要失败回退,需另配 fallback 类插件。关键词匹配刻意保持简单;若要分类,应自行实现分类器并把结果放进 label。

适用场景与注意

适合:希望在 DSH 子智能体委派链路上用可版本化、可审查的 YAML 规则做模型分流,且接受「第一条关键词命中」语义、不需要 ML 分类器的团队或个人。

使用前请知悉:

  • 插件与 DSH 进程同权限运行;安装前请阅读仓库源码与 MIT 许可证,确认符合你的安全与合规要求。
  • 社区目录 skillhub.cn 上的条目 与 GitHub 源码是了解插件的入口;目录站点为社区生态索引,与 DeepSeek / 幻方无官方从属关系。
  • README 列出的限制(allowlist、运行期不换模、简单关键词)应在设计规则时一并考虑。

结尾

dsh-agent-router 把「子智能体用哪个模型」收束到委派时刻、可配置的 keyword 规则上:行为确定、可 dry-run,又不打断 DSH 原生子智能体生命周期。需要细节与更新时,可看目录页 https://www.skillhub.cn/plugins/gengwg/dsh-agent-router 与仓库 https://github.com/gengwg/dsh-agent-router。

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

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

Xiaoye