alaxrpg/dsh-adaptive-model-router ↗★ 0
dsh-adaptive-model-router
Adaptive model discovery, evaluation, tiering, and subagent routing for DeepSeek Harness
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:alaxrpg/dsh-adaptive-model-router说明文档
阅读完整 README ↗配置
可视化配置
在 DSH Web profile 中,插件会在 webServer 可用时注册一个不依赖外网 CDN 的本地配置页:
http://127.0.0.1:3080/adaptive-model-router/config
端口请以 DSH 启动时输出为准。页面可编辑启用状态、难度策略、刷新周期、路由/回退、分档阈值、评价权重以及 Provider 的人工档位、别名和回退模型。保存时页面回传读取到的 settings revision,Host 只对白名单路径调用 SettingsProvider.mutate():Provider/别名删除可立即生效,浏览器未获取的 discovery、凭据、外部源、probe 和内部路径不会被重写;过期 revision 会被拒绝。提交后通过 SettingsScope.watch() 热重载路由运行时。
安全边界:
- 页面和 API 只由当前 DSH 同源提供;修改请求必须使用 loopback Host(
127.0.0.1、localhost或[::1])、匹配的 Origin 和application/json,且请求体有大小上限。 apiKey、外部源headers、toolName、subagentProvider、dataDir和 discovery 连接参数不会发送到浏览器,API 也拒绝写入这些字段。- Provider 删除按层区分:settings.yaml 用户层中的 Provider 会被真正删除(
unset);由 profile 组合基座(cordis.patch.yml的插件config)定义的 Provider 无法通过浏览器删除——删除请求会改写为enabled: false的用户层覆盖,避免“删不掉又悄悄复活”的假象,真正移除需修改基座配置。 - 悬挂或缓慢的请求体读取有超时上限;非预期错误只返回通用提示,不回显内部路径。
- 付费
evaluation.probes只读显示当前启用状态,不能通过页面启用或修改预算;默认仍为关闭。 - CLI profile 没有
webServer时只不注册页面,路由工具和 settings 热重载不受影响。
DSH 0.1.0-rc.6 的内置“插件配置”页面并不会根据任意第三方 Schemastery schema 自动生成表单,Host API proxy 也对可从 Web 访问的 settings namespace 使用显式白名单。因此本插件按官方的 webServer 路由扩展点提供自带页面,不修改 DSH core 或安装目录。参见 DeepSeek Harness Architecture 和 Extension Cookbook。DSH 当前仍是 developer preview,升级后应重新验证此集成边界。
官方设置面板“插件配置”卡片
自 DSH 0.1.0-rc.7 起,Host API 已全量暴露第三方 settings 命名空间,官方设置面板新增“插件配置”标签页,通过 settings.plugin.item 槽以命名空间为键配对浏览器卡片。本插件随包提供浏览器半身(package.json 的 dsh.client 声明 + exports["./client"]),因此在 DSH Web profile 的 设置 → 插件 → 插件配置 中会显示“自适应模型路由”卡片,可编辑:启用开关、难度模式、默认档位,以及每个 Provider 的启用与 easy/normal/hard 三档模型(下拉含已发现模型,未指定时标注当前自动档位模型)。保存走 revision-fenced 的嵌套路径 mutate,与独立页面同一套写语义。
浏览器半身源码在 src-client/,构建产物为 lib/client.js(lazy-CJS factory 格式)。修改源码后需重新构建:
npm run build:client
构建依赖(esbuild)与宿主提供的 client 服务声明在 package.json 的 dsh.client.inject。插件集变更需重启 DSH 生效。
最小配置:
adaptive-model-router:
enabled: true
providers: {}
完整默认值和单 Provider 人工三档配置见 examples/settings.yaml。关键配置如下:
| 配置 | 默认值 | 说明 |
|---|---|---|
difficulty.defaultTier | normal | 自动难度无法可靠判断时使用 |
refresh.runOnStart | true | 启动后执行一次刷新 |
refresh.intervalMinutes | 360 | 周期刷新间隔 |
refresh.jitterMinutes | 15 | 最多附加的随机抖动 |
refresh.staleAfterHours | 72 | 自动策略过期界线 |
routing.unavailableAction | fallback | 显式 Provider/模型不可用时回退并记录原因,或用 error 直接报错 |
evaluation.minimumConfidence | 0.60 | 自动路由最低置信度 |
evaluation.probes.enabled | false | 是否允许真实调用探测 |
evaluation.probes.estimatedCostUsd | 未设置 | 模型价格未知时,每个 probe 请求预留的最坏费用;未设置则拒绝探测 |
classification.strategy | thresholds | thresholds 或 Provider 内 percentile |
routing.staleAction | last-known-good | 策略过期后的动作 |
每个 Provider 的 tiers.easy/normal/hard 支持:
mode: auto:选择最新、未过期、置信度合格的自动评价结果。mode: prefer:优先指定model,不可用时回到自动选择。mode: manual:固定指定model。locked: true:周期刷新不能替换该档的人工结果。
同一模型可人工配置到全部三个档位;只有一个可用模型时无需伪造三个不同候选。
可视化配置
在 DSH Web profile 中,插件会在 webServer 可用时注册一个不依赖外网 CDN 的本地配置页:
http://127.0.0.1:3080/adaptive-model-router/config
端口请以 DSH 启动时输出为准。页面可编辑启用状态、难度策略、刷新周期、路由/回退、分档阈值、评价权重以及 Provider 的人工档位、别名和回退模型。保存时页面回传读取到的 settings revision,Host 只对白名单路径调用 SettingsProvider.mutate():Provider/别名删除可立即生效,浏览器未获取的 discovery、凭据、外部源、probe 和内部路径不会被重写;过期 revision 会被拒绝。提交后通过 SettingsScope.watch() 热重载路由运行时。
安全边界:
- 页面和 API 只由当前 DSH 同源提供;修改请求必须使用 loopback Host(
127.0.0.1、localhost或[::1])、匹配的 Origin 和application/json,且请求体有大小上限。 apiKey、外部源headers、toolName、subagentProvider、dataDir和 discovery 连接参数不会发送到浏览器,API 也拒绝写入这些字段。- Provider 删除按层区分:settings.yaml 用户层中的 Provider 会被真正删除(
unset);由 profile 组合基座(cordis.patch.yml的插件config)定义的 Provider 无法通过浏览器删除——删除请求会改写为enabled: false的用户层覆盖,避免“删不掉又悄悄复活”的假象,真正移除需修改基座配置。 - 悬挂或缓慢的请求体读取有超时上限;非预期错误只返回通用提示,不回显内部路径。
- 付费
evaluation.probes只读显示当前启用状态,不能通过页面启用或修改预算;默认仍为关闭。 - CLI profile 没有
webServer时只不注册页面,路由工具和 settings 热重载不受影响。
DSH 0.1.0-rc.6 的内置“插件配置”页面并不会根据任意第三方 Schemastery schema 自动生成表单,Host API proxy 也对可从 Web 访问的 settings namespace 使用显式白名单。因此本插件按官方的 webServer 路由扩展点提供自带页面,不修改 DSH core 或安装目录。参见 DeepSeek Harness Architecture 和 Extension Cookbook。DSH 当前仍是 developer preview,升级后应重新验证此集成边界。
官方设置面板“插件配置”卡片
自 DSH 0.1.0-rc.7 起,Host API 已全量暴露第三方 settings 命名空间,官方设置面板新增“插件配置”标签页,通过 settings.plugin.item 槽以命名空间为键配对浏览器卡片。本插件随包提供浏览器半身(package.json 的 dsh.client 声明 + exports["./client"]),因此在 DSH Web profile 的 设置 → 插件 → 插件配置 中会显示“自适应模型路由”卡片,可编辑:启用开关、难度模式、默认档位,以及每个 Provider 的启用与 easy/normal/hard 三档模型(下拉含已发现模型,未指定时标注当前自动档位模型)。保存走 revision-fenced 的嵌套路径 mutate,与独立页面同一套写语义。
浏览器半身源码在 src-client/,构建产物为 lib/client.js(lazy-CJS factory 格式)。修改源码后需重新构建:
npm run build:client
构建依赖(esbuild)与宿主提供的 client 服务声明在 package.json 的 dsh.client.inject。插件集变更需重启 DSH 生效。
最小配置:
adaptive-model-router:
enabled: true
providers: {}
完整默认值和单 Provider 人工三档配置见 examples/settings.yaml。关键配置如下:
| 配置 | 默认值 | 说明 |
|---|---|---|
difficulty.defaultTier | normal | 自动难度无法可靠判断时使用 |
refresh.runOnStart | true | 启动后执行一次刷新 |
refresh.intervalMinutes | 360 | 周期刷新间隔 |
refresh.jitterMinutes | 15 | 最多附加的随机抖动 |
refresh.staleAfterHours | 72 | 自动策略过期界线 |
routing.unavailableAction | fallback | 显式 Provider/模型不可用时回退并记录原因,或用 error 直接报错 |
evaluation.minimumConfidence | 0.60 | 自动路由最低置信度 |
evaluation.probes.enabled | false | 是否允许真实调用探测 |
evaluation.probes.estimatedCostUsd | 未设置 | 模型价格未知时,每个 probe 请求预留的最坏费用;未设置则拒绝探测 |
classification.strategy | thresholds | thresholds 或 Provider 内 percentile |
routing.staleAction | last-known-good | 策略过期后的动作 |
每个 Provider 的 tiers.easy/normal/hard 支持:
mode: auto:选择最新、未过期、置信度合格的自动评价结果。mode: prefer:优先指定model,不可用时回到自动选择。mode: manual:固定指定model。locked: true:周期刷新不能替换该档的人工结果。
同一模型可人工配置到全部三个档位;只有一个可用模型时无需伪造三个不同候选。