dsh-model-rotation:为 DeepSeek Harness 加一条按序兜底的模型链

前言

接第三方模型跑智能体时,最常见的问题是「这个路由今天不行了」。限流(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 及以上)。

建立组合

  1. 打开 Settings → 模型自动切换(或在 Plugins 下进入插件自己的页面)。
  2. 新建组合,填写名称并添加成员,选择器按模型 id 或名称搜索;用 ↑/↓ 调整顺序,顺序即失败转移顺序。
  3. 可选:指定「DSH 兜底模型」,整条链耗尽时使用。
  4. 保存组合,然后在模型选择器里按名称选中这条链。

组合卡片会显示每个已保存组合的成员、每条链的超时上限、当前是否可用。

每条链的配置项

配置项 含义
超时上限 一个成员可承受几次超时才切换,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 平台模型。把它们排成链,比如:

  1. 主力第三方模型放第一位,超时上限设 2。
  2. 备用第三方模型放第二位,超时上限设 2。
  3. 指定 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

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

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

小夜