前言¶
在 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 插件页。
本地 link 开发¶
README 另述通过 package.json 的 link:<插件目录>、bundles 与 node_modules 软链接装载,改插件宿主代码后需重启 DSH(bundle 启动时加载)。
典型用法¶
装上后默认即:免费优先 + 能力匹配 + 路由门禁,无需先改配置。
- 打开左侧「子代理模型切换」,先看顶部说明区(档带、provider 过滤、升级与 overrides 路径)。
- 查看「本次路由预览」,确认六类任务当前会选中的模型与
matched/ 兜底说明。 - 在模型表中调整优先级,或对被门禁挡住的模型点「放行」。
- 需为某任务类固定模型时,在配置中使用
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。