dsh-subagent-default-model
English | 中文
为 DeepSeek Harness (DSH) 中的子代理(subagent)派发选择默认模型,可通过插件自己的设置卡片(其 Cordis Config)配置,存在 profile 的 cordis.patch.yml。
当创建子代理时未显式指定 model,本插件注入配置的默认模型 —— 因此所有 subagent、subagent_fork 以及任何省略 agentOptions 的工具调用都会经过它。显式传参的覆盖始终生效;配置段缺失或不完整时保持原有行为(子代理继承父会话路由)。
功能特性
- 单模型 —— 所有子代理运行在同一个配置模型上。
- 多模型 ——
models 列表配合 round-robin / random 策略,让并行子代理分散到多个模型。
- 连接失败自动切换 —— 子代理遇到连接类失败时,在
models 列表内按 strategy 自动切换模型重试(仅 subagent,主代理不受影响)。
- 推理强度 —— 可为每个模型条目指定
reasoningEffort(如 high、medium、low);Web 界面从模型目录加载可用的强度。
- 热重载 —— 设置变更立即作用于下一次派发。
- 干净卸载 —— Cordis 销毁时还原原始服务方法。
截图
设置面板(设置 → 插件配置 → 子代理默认模型):配置一个或多个模型路由,支持 round-robin / random 分配策略与每路由推理强度。

效果验证:10 个子代理在 deepseek-v4-flash 与 Kimi-k3 之间 5/5 均衡分配(round-robin 实测)。

市场

安装
从 npm registry 安装:
npm install dsh-subagent-default-model
或通过 DSH 插件命令(等价,内部同样走 npm):
dsh plugin --profile desktop add dsh-subagent-default-model
发布(Release / Publish)
发布到 npm registry。完整权威流程见仓库根目录 RELEASING.md(含 2FA 确认、tag 修正、代理、验证步骤)。
要点速览:
git add plugin/package.json plugin/CHANGELOG.md
git commit -m "chore: 版本升级至 X.Y.Z"
git tag -a vX.Y.Z -m "vX.Y.Z: <说明>"
git push origin main
git push origin vX.Y.Z
cd plugin
npm publish
⚠️ 发布前先跑一遍测试:npm --prefix plugin test。
package.json 的 files 字段已限定只发布 lib/、icons/、cordis.patch.yml、LICENSE、README.md、README.en.md、CHANGELOG.md,test/ 和 node_modules/ 不会进入发布包。
本地安装(DSH Desktop / desktop profile):
npm install dsh-subagent-default-model
说明:
- 本地开发用
link: 安装:dsh plugin --profile desktop add /Users/dmh2002/DshProject/dsh-subagent-default-model/plugin,node_modules 里是源码软链,改代码后重启 DSH Desktop 生效
- 正式安装 / 他机安装使用 npm registry 版本(见上方 Install)
配置
优先用 Web 设置卡片(设置 → 插件 → dsh-subagent-default-model)。
也可以直接编辑 profile 的 patch 文件 ~/.dsh/profiles/<profile>/cordis.patch.yml:DSH 0.1.7 起设置就存在这里,段名是本插件的 Loader 条目 id dsh-subagent-default-model:
- id: dsh-subagent-default-model
name: dsh-subagent-default-model
config:
provider: deepseek-official
model: deepseek-v4-pro
provider: deepseek-official
models:
- deepseek-v4-pro
- deepseek-v4-flash
strategy: round-robin
provider: deepseek-official
models:
- model: deepseek-v4-reasoner
reasoningEffort: high
- provider: other-provider
model: gpt-5.6
reasoningEffort: max
failoverEnabled: true
从 0.1.6 及更早版本升级:旧版把配置写在 ~/.dsh/settings.yaml 的 subagent-default-model 段。0.1.7 会在启动时把该文件一次性导入并改名为 settings.yaml.imported,改名后不再回读。导入按段名直接当条目 id 用,而本插件的条目 id 是 dsh-subagent-default-model,因此旧段不会被导入(宿主日志留一条 section subagent-default-model … was not imported into entry subagent-default-model),旧值只留在改名后的文件里——需要手工搬到上面的 config: 里。
平台支持
Windows / macOS / Linux 均受支持,且不需要任何平台专用配置。本插件的运行时代码是纯 JavaScript:lib/index.js(宿主半边)与 lib/client.js(客户端半边)不读取文件系统、不拼接路径、不派生进程、也不判断 process.platform——它只消费 DSH 宿主暴露的服务与事件,因此平台差异完全由 DSH 宿主承担。
已被检查并纳入持续验证的平台相关面:
- 配置路径:profile patch 位于用户主目录下的
.dsh/profiles/<profile>/cordis.patch.yml。Windows 上是 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml(通常是 C:\Users\<你>\.dsh\...),与 macOS/Linux 的 ~/.dsh/... 指向同一处约定。
- 依赖树:
package-lock.json 同时锁定 Windows 三套可选原生构建(win32-x64-msvc、win32-arm64-msvc、win32-ia32-msvc),npm 只安装与当前平台匹配的那一个;本插件的直接依赖 @deepseek-ai/schemastery 是纯 JS。
- 换行符:仓库未固定
core.autocrlf,Windows 检出可能得到 CRLF 源码。全部测试已在该形态下验证通过——解析源码的断言都基于子串而非行尾,因此 CRLF/LF 不影响结果。
- 路径解析:仓库脚本统一用
fileURLToPath 而非 URL.pathname。后者在 Windows 上会得到 /C:/... 并被 path.join 折成不存在的 \C:\...,属于只会在 Windows 上暴露的硬故障。
- 测试发现:
npm test 直接调用 node --test(不带 glob),由 Node 测试运行器自行发现用例,不依赖 shell 展开——test/*.test.mjs 这类 glob 在 POSIX sh 下会展开、在 cmd/PowerShell 下会原样传入,行为不一致。
CI 在 ubuntu-latest、windows-latest、macos-latest 三个平台上同时运行同一套测试,因此上述约定有持续验证而非一次性声明。
provider | string | — | 字符串类型模型条目的 provider。 |
model | string | — | 单模型 id(向后兼容)。 |
models | array | [] | 模型条目列表(string 或 {provider, model, reasoningEffort?} 对)。 |
strategy | string | round-robin | 分配策略:round-robin 或 random。 |
failoverEnabled | boolean | true | 子代理连接失败时在 models 列表内按队列与策略切换模型(仅 subagent)。 |
reasoningEffort | string | — | 可选推理强度(如 high、max)。 |
子代理连接失败自动切换
开启 failoverEnabled(默认开启)后,子代理自身的循环遇到连接类失败时,插件会在 models 列表内按 strategy 自动切换模型并重试:
- 连接类失败 —— 命中以下任一错误码才切换:
RATE_LIMIT、QUOTA、SERVER、TIMEOUT、TRANSPORT、EMPTY_RESPONSE。认证错误(如 AUTH)等非连接类失败不会触发切换。
round-robin:按列表顺序切到下一个模型(队列)。
random:随机挑一个模型(不判断之前是否用过)。
- 需要 ≥ 2 个模型 —— 当
models 少于 2 项时本功能不生效。
- 耗尽即放行 —— 列表内全部模型轮试失败后,放行真实错误,不做无限重试。
- 切换时丢弃继承的
reasoningEffort —— 换到新 provider/model 后按默认推理强度请求,避免把主模型的强度强加给不支持它的 provider。
- Run 内粘性 —— 同一子代理 run 的后续 step 保持在切换后的模型上。
该机制基于官方 agent/request-error + agent/request 瀑布,且仅对 subagent 生效——主代理循环不会被切换。
工作原理
请求携带显式 agentOptions
→ subagent-default-model 设置
→ 继承父会话路由
插件包装宿主 ctx.subagents 服务(start / startContinuable),覆盖所有派发路径 —— 内置的 subagent / subagent_fork 工具,以及任何调用该服务但未提供 agentOptions 的自定义工具。
许可证
本项目采用 MIT 许可证 开源发布,版权归属:Copyright (c) 2026 LaoDing。
MIT 许可证授予任何人免费处理本软件(包括使用、复制、修改、合并、发布、分发、再许可及出售副本)的权利,前提是所有副本或实质性部分均保留上述版权声明与本许可声明;软件按“原样”提供,不附带任何明示或暗示的担保。完整条款见 LICENSE。