dsh-subagent-switch:为 DSH 子代理按任务自动选本地模型

前言

在 DeepSeek Harness(DSH)里,子代理默认沿用父会话的模型。本机若通过多个 provider 接入了几十甚至上百个模型,就会出现两类浪费:调研类子代理用高价倍率模型回答一句话,编码类子代理却落在明确标了「不擅长编码」的免费档上。手工为每次 spawn 点选模型,规模一大就不可行。

dsh-subagent-switch(维护者 AshenSeeker)在子代理启动时拦截配置,按任务类型从本机候选池里挑模型,并把选择理由写进路由结果。社区目录将其归类为「模型推理」;GitHub 仓库当前约 2 stars。下文功能与安装步骤均来自仓库 README 与 package.json(版本 0.1.1,许可证 MIT,运行环境 Node >= 20)。

这是什么

一句话:dsh-subagent-switch 是 DSH 桌面 profile 插件(包名 @local/subagent-switch),在 spawn 子代理时为每次任务选择「便宜优先、额度可查、能力匹配」的本地模型,并提供独立控制面板。默认尽量只花订阅里已付过的钱;便宜档里没有任何模型真正擅长该任务域时,才在配置允许下升到付费档。

它不改动原有会话模型选择栏,而是在左侧栏增加「子代理模型切换」入口。实现上声明为纯 Node 内置模块、无额外 npm 依赖;除读取本机 provider 额度 HTTP 端点外,不发外部网络请求。

核心功能

任务域与能力打分

任务归到 coding、research、writing、summarize、analysis 等域(面板预览里还包含通用类)。每个模型可带 goodAt / badAt;路由时对 required 域 +10、optional +2,不擅长 −10/−2。中英文标签等价(如「编码」与 coding),内部统一为英文 canonical id。

能力标签来源分三层:手写 config 优先于内置系列预设,无标签模型可信度最低;面板上区分「手写 / 推测 / 无标签」,便于审计而非黑箱。

档位、额度与升级策略

free 与 free_quota 可合成一个「便宜档带」,在档内按「手动优先级 → 能力分」排序,而不是「见到免费就先选」。只有便宜档里没有任何模型真正声明擅长该域,且 escalateOnMiss 开启时,才向付费档查找满足 escalateMinScore 的匹配模型;面板与日志会标「升级付费」并写明跳过候选与分数。

路由门禁默认 requireQuotaAware: true:仅账号接入、有可能读余额的模型参与自动路由;our-free-model 等无稳定额度的模型可列出但不自动选用,可在面板「放行」。内置默认整段排除 cline provider(excludedProviders)。

拦截 spawn 与可解释输出

autoRouteSubagents 默认为 true,在 startActivation 阶段把选定模型写入子代理会话配置。select() 返回体包含 reason、tier、score、matched、escalated、model 等字段,便于对照面板「本次路由预览」。

手动优先级(面板 ↑/↓ 或 ~/.dsh/subagent-switch-overrides.json 中 priority > 0)压过能力分与档带顺序,且不再触发付费升级。routingTable 可为某类任务钉死模型。

控制面板

面板自上而下:当前档带顺序、忽略的 provider、参与路由的 provider、升级开关、手动 pin 数量;六类任务的路由预览(含匹配、兜底、升级依据);完整本地模型目录(档位、状态、擅长域、优先级、放行/收回)。README 附带真实环境截图说明(百余模型接入时的预览示例)。

仓库 README 称具备 143 个 node:test 单测。

安装与启用

DSH 通过 profile 机制加载插件;官方 desktop profile 一般在 ~/.dsh/profiles/desktop。

从 GitHub 安装(README 推荐)

cd <你的 profile 目录>          # 官方 profile 一般在 ~/.dsh/profiles/desktop
pnpm add "git+https://github.com/AshenSeeker/dsh-subagent-switch#v0.1.1"

在 <profile>/cordis.patch.yml 中插入:

- insert:
    - id: '@local/subagent-switch'
      name: '@local/subagent-switch'

重启 DSH 后,左侧栏出现「子代理模型切换」。README 建议用 tag v0.1.1 固定版本;若要跟仓库最新提交,可将 URL 末尾改为 #main。

插件市场发现

仓库提供 market-index.json。可在 DSH「发现」页的索引源填入:

https://raw.githubusercontent.com/AshenSeeker/dsh-subagent-switch/main/market-index.json

或在 cordis.patch.yml 中为 plugin-market 配置 config.indexes 加入同一 URL。DSH 插件市场无中央注册表,索引不会自动扫描,需用户自行添加索引地址。目录页:skillhub.cn 插件页。

README 另述通过 package.json 的 link:<插件目录>、bundles 与 node_modules 软链接装载,改插件宿主代码后需重启 DSH(bundle 启动时加载)。

典型用法

装上后默认即:免费优先 + 能力匹配 + 路由门禁,无需先改配置。

  1. 打开左侧「子代理模型切换」,先看顶部说明区(档带、provider 过滤、升级与 overrides 路径)。
  2. 查看「本次路由预览」,确认六类任务当前会选中的模型与 matched / 兜底说明。
  3. 在模型表中调整优先级,或对被门禁挡住的模型点「放行」。
  4. 需为某任务类固定模型时,在配置中使用 routingTable(详见 README「配置」一节)。

路由决策顺序(概要):routingTable 指定 → 全局 pin → 便宜档带内按优先级与能力分 → 条件升级付费 → defaultModel 或任意可用模型兜底。

配置可写在 <profile>/cordis.patch.yml 对本插件的扁平 config:,或插件 config.example.json 下嵌套的 "subagent-switch" 对象;合并后为扁平键。常用项包括 enabled、modelTiers、cheapBand、escalateOnMiss、escalateMinScore、tags、blacklist、excludedProviders、forceOverride、overridesPath 等;数组字段为替换而非追加。

手动优先级表示例(README):

{
  "priority": { "workbuddy/glm-5.3": 2 },
  "routable": { "our-free-model/big-pickle": true }
}

适用场景与注意

适合谁: 在同一台 DSH 机器上挂了多个 provider、模型数量多,且频繁 spawn 编码/调研/写作等不同子代理的开发者;希望默认省订阅额度、又能在便宜档无匹配时才付费升级的场景。

权限与安全: 插件随当前 DSH 进程与 profile 权限运行,会调用本机 provider 插件的额度接口并改写子代理会话模型。安装前宜阅读仓库源码与 MIT 许可证,确认 cordis.patch.yml 与 overrides 路径符合你的环境。

生态说明: DSH 主张「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件分发依赖 Git tag、market 索引或本地 link,并非中央应用商店一键上架。


若你需要在多模型桌面上让每次子代理 spawn 都带上可核对的路由理由,可从上述 GitHub 安装或在发现页添加索引源。源码与文档:github.com/AshenSeeker/dsh-subagent-switch;社区条目:skillhub.cn/plugins/AshenSeeker/dsh-subagent-switch。

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

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

Xiaoye