前言¶
接第三方模型跑智能体时,最常见的问题是「这个路由今天不行了」。限流(429)要立刻换一条路,超时则是偶发的、换一换可能就好了,这两种情况处理方式并不一样。手工改配置重启,或者写一段自己的重试逻辑,时间一长就散了。
下面介绍 dsh-model-rotation:由 Chrono-rigger 维护的 DSH 插件,思路是把一组模型排成一条链,按定义的顺序依次试,把限流、超时、无适配器这几类失败分别处理,最后落到 DSH 平台模型上。它属于模型推理分类,在社区目录上目前星标为 0。
这是什么¶
一句话定位:在 DeepSeek Harness 的 agent/request 瀑布事件上重写路由,实现「顺序失败转移 + 超时复测 + 平台兜底」。
它解决的是:让一条逻辑上的模型链替代单个模型选择,使得上游波动时不需要人工介入,也不会因为某一个模型临时抽风就整体失败。
它和手写重试逻辑的区别是:这里的失败分类是约定好的(限流立即换,超时累计到阈值才换,配额耗尽立即换,无适配器/认证失败直接跳过),并且链耗尽之后还有一轮复测和一个粘性的平台兜底。
核心能力¶
- 顺序失败转移:成员顺序就是尝试顺序,可以自由排列。
- 限流(429)立即切换;超时按模型计数,达到每条链设定的超时上限才切换。
- 复测轮:第一轮只是超时的模型,在链耗尽后还会再给一轮新的超时预算。
- DSH 平台兜底:链条全挂时落到你指定的平台模型(例如
deepseek-account/deepseek-flash),并且是粘性的,不会因为第三方路由一恢复就跳回去。 - 不打扰其他选择:保存的组合会作为「模型自动切换」provider 下的模型出现在模型选择器里,选别的东西时请求完全不被改动。
- 当前无适配器的成员会被标为「当前不可用」并在巡游中跳过,而不是让请求失败。
安装与启用¶
从 npm 安装:
dsh plugin --profile <your-profile> add dsh-model-rotation
也可以直接从仓库安装:
dsh plugin --profile <your-profile> add github:Chrono-rigger/dsh-model-rotation
装完重启 DSH。
前置条件:DSH 需要提供 agent/request 与 agent/request-error 瀑布事件(0.2.x 及以上)。
建立组合¶
- 打开 Settings → 模型自动切换(或在 Plugins 下进入插件自己的页面)。
- 新建组合,填写名称并添加成员,选择器按模型 id 或名称搜索;用 ↑/↓ 调整顺序,顺序即失败转移顺序。
- 可选:指定「DSH 兜底模型」,整条链耗尽时使用。
- 保存组合,然后在模型选择器里按名称选中这条链。
组合卡片会显示每个已保存组合的成员、每条链的超时上限、当前是否可用。
每条链的配置项¶
| 配置项 | 含义 |
|---|---|
| 超时上限 | 一个成员可承受几次超时才切换,0 表示第一次超时就切换 |
| 短时限流原地重试 | 默认关闭;开启后,声明等待时间较短的 429 会在当前模型原地重试而不是立刻切换,适合那些本质已经在账号池里轮转的路由。配额耗尽始终立即切换 |
| 最长等待 / 原地重试次数 | 原地重试等待上限(毫秒),以及一条路被判死前可获得的原地重试次数 |
状态机¶
round1 按顺序遍历成员
限流 / 配额耗尽 → 标记死亡,继续下一个
超时 → 计数 +1,达到上限后继续下一个
无适配器 / 认证 → 标记死亡,继续下一个
↓ 全部成员死亡或耗尽
retest 第一轮只超时的模型获得新的超时预算再测一轮
↓ 耗尽
fallback DSH 平台模型(指定或自动发现)——粘性
插件不负责的失败(SERVER、TRANSPORT、EMPTY_RESPONSE 等)原样交还给 harness 自己的重试策略。
运行时状态写在 ~/.dsh/model-auto-switch-state.json(或 $DSH_HOME),属于尽力而为:文件损坏时回退到插件配置,不会阻止启动。
通过工具动手脚¶
agent 侧同样可以操作这套状态:
model_rotation_catalog— 列出本安装里所有可用的 provider/model 组合model_rotation_set— 替换当前链的成员model_rotation_status— 查看各条链、每个 agent 的实时阶段与决策日志model_rotation_reset— 忘掉失败记录,重新开始巡游
典型用法¶
典型场景是:你有两三个第三方模型路由,外加一个 DSH 平台模型。把它们排成链,比如:
- 主力第三方模型放第一位,超时上限设 2。
- 备用第三方模型放第二位,超时上限设 2。
- 指定 DSH 兜底模型。
出现限流时立即跳第二位;出现两次超时也跳第二位。如果第一位只是偶发超时,第一轮结束后在复测轮里还能再试它一次。全部用尽时落到平台模型,且不自动跳回。
选器里把这条链选上即可,日常不需要再改任何配置。
另外,如果你的 provider 支持图片输入,harness 会注册一个 -vision 变体,列的是同一批模型,区别只在于接受图片。选择器默认隐藏它们,需要时打开「显示『自动识图』变体」。纯文本任务用普通入口即可(更便宜、上下文相同),只有确实要发图时才加视觉变体。
与 provider 级轮转的兼容性¶
插件在 agent/request 瀑布事件里重写路由,这个时机早于适配器绑定。所以某成员自身如果已经在 provider id 后面轮转账号(如 WorkBuddy、免费模型池等),它的轮转行为保持不变:先跑它自己的失败转移,整个池子都失败才会到达这个插件。
适用场景与注意¶
适合:担心单一第三方路由不稳定、希望限流与超时分类处理、想用平台模型做最后防线的 DSH 用户和智能体开发者。
需要注意的是:
- 插件以当前 DSH 进程的权限运行,会读写
~/.dsh下的状态文件。安装前先读源码并确认许可证。 - 当前资料里许可证为 MIT,仓库用 JavaScript 编写。
- 依赖低版本 DSH(低于 0.2.x,没有那两个瀑布事件)时插件不能工作。
结语¶
它的价值在于把「换模型」从手工操作变成一条有状态机的链:限流即切、超时累计、超时者复测、链尾粘性兜底。对你明确配置的模型组合才生效,选别的时候不干扰。
目录页:https://www.skillhub.cn/plugins/Chrono-rigger/dsh-model-rotation
GitHub:https://github.com/Chrono-rigger/dsh-model-rotation