dsh-model-rotation
Model rotation for DeepSeek Harness: groups each provider's models by source, orders them by hand or by measured success rate and latency, stores model plus reasoning-effort presets, falls over to the next entry when a model hits its quota or is unavailable, resends the same step on the next model,
Install
dsh plugin --profile web add dsh-model-rotation
Sandbox test
This plugin has not been tested yet. Submit a test →
README
dsh-model-rotation



给 DeepSeek Harness 用的多来源模型轮询插件:把 Gemini / Claude / GPT / DeepSeek 排成一条链,
前一档额度用尽或报错就自动换下一档,并把这一步自动重发;还能随时看到「这次到底是哪个模型答的」。
TL;DR — 注册一个虚拟模型 rotation/auto。选中它,之后每次提问都按你排好的顺序挑模型:
失败自动降级、必要时整步重发,模型选择器 / 会话头 / 设置页三处都能看到实际用了谁。
模型选择器:置顶的「⚡ 自动轮询」 · 会话头:本次回答的模型
 · 
截图由插件真实组件离线渲染(数据为示例):composer 菜单 / 会话头徽章 / 设置页。
English (short)
dsh-model-rotation is a DeepSeek Harness plugin that turns
your LLM subscriptions into one ordered, self-healing model chain.
- One virtual model
rotation/auto— select it once and every turn uses your chain. - Grouped by source — agy account pool (Gemini / Claude / GPT-OSS), Codex subscription, DeepSeek API keys, built-in DeepSeek; filter models per group and pick one.
- Order it your way — manual order (
order/move/up/down) or automatic order by measured success rate & latency. - Quota-aware failover — hard failures (quota, auth, region
ELIGIBILITY) get a long cooldown; the next attempt simply uses the next model, and the whole step is re-sent automatically (autoResend). - Presets — bundle model + reasoning effort (e.g.
Gemini 3.8 high,Codex GPT-6.1-Sol high) and switch with one click. - See who answered — composer picker, session-header badge and the settings page all show the model that actually produced the reply.
Install (DSH desktop, local clone): node scripts/install.mjs → restart the app → Settings → 模型轮询.
给 DeepSeek Harness 用的有序多来源模型轮询 + 排序 + 预设插件。
- 一条可排序的链(默认就是「Gemini 3.8 high → Codex GPT-6.1 Sol high → xiao-DeepSeek Flash → 内置 DeepSeek Flash」),
前一档额度用尽 / 鉴权失败 / 报错时自动切下一档;
- 按来源分组:agy 账号池 / Codex 订阅 / 两家 DeepSeek API / 内置 DeepSeek 各自成组,
组内模型可筛选后再加进链(同名模型也不会混,比如 Codex 的 gpt-6.1-sol 与 apixiao 的 gpt-6.1-sol);
- 手动排序:严格按你排的顺序走;
- 自动排序:按实测成功率 / 延迟动态调整尝试顺序;
- 预设:把「用哪些模型 + 各自思考强度」存成一组(
example/fast/coding/quality内置,也可自存),
一句话切换,适合按任务类型换档。
界面导览(设置 → 模型轮询)
打开 DSH 设置,左侧最下面一项就是 「模型轮询」。整页从上到下是:
区域 · 内容
三步上手 · 首次使用的引导卡:一句说明 + 四个一键按钮(推荐链 / 自动排序 / 探测全部 / 命令速查)
顶部状态条 · 排序模式、预设、冷却中 N 档、上次回答:哪个模型(悬停看耗时与切换)
① 排序方式 · 手动 / 自动;自动再选偏好(均衡 / 更快 / 更稳)
② 轮询链 · 每一档的序号、↑↓、勾选启用、模型、思考强度、成功率与延迟、探测 / 删除
③ 添加候选 · 先选分组,再在组内按关键字筛选模型,选强度后加入链尾
④ 预设 · 下拉应用内置/自存预设;输入名字把当前链存成预设;删除自定义预设
⑤ 状态与维护 · 刷新、重置冷却与统计、恢复默认(两次确认)、尝试顺序说明、命令输出
页面每 5 秒自动刷新状态;所有按钮都等价于一条 /rotation 命令,所以命令和界面可以混用。
不确定从哪开始,就点引导卡里的 「一键:推荐链」——它会套用内置的 example 预设
(Gemini 3.8 Flash[high] → Codex GPT-6.1 Sol[high] → xiao-DeepSeek Flash → 内置 DeepSeek Flash)。
模型选择器:置顶的「⚡ 自动轮询」
composer 右下角的模型选择器(conversation.input.model 槽位)被本插件接管,菜单第一行固定是
「⚡ 自动轮询(Auto)」,点它就把当前会话切到 rotation/auto,也就是进入本插件的轮询模式 ——
之后每次调用都按设置里的链逐档尝试,前一档失败自动换下一档。
菜单里其余入口保持原样:
- 模型 › —— 按来源分组列出所有模型(
agy 账号池/Codex 订阅/DeepSeek API/
GPT API / DeepSeek 内置 / DeepSeek 账号池),模型数 > 4 时带搜索框;
- 思考强度 › —— 当前模型支持的强度(各来源不一样:Gemini
low/medium/high、
Codex low/medium/high/xhigh/max、内置 DeepSeek off/low/high/max)。
当前是轮询模式时,选择器会显示品牌色的 ⚡ 自动轮询;选中普通模型则自动退出轮询模式(回到该模型直连)。
所有选择都走官方同一个 per-session ModelDirectory(directory.select),所以和官方选择器、
/model 命令的行为完全一致。
说明:官方槽位是 single 槽,插件用更低的 slot priority 遮蔽官方那一份来做整体替换
(single 槽的同 priority 注册会直接抛错)。若哪天官方改了这块结构导致接管失败,
插件只在控制台 warn,不影响 /rotation 命令与设置页。
对话头上:本次回答到底用了哪个模型
轮询模式下「这次是谁答的」不再靠猜。会话头(标题右侧的 actions 区,conversation.session.header.actions 槽位)
会显示一个胶囊徽章,例如:
⚡ Codex GPT-6.1 Sol · high · 7.6s · ↻1
- 模型名:实际成功回答的那一档(不是链的第一档);
- 强度:本次实际生效的思考强度;
- 耗时:该档自身的延迟;
- ↻N:本次回答前有 N 档失败被切换掉了(没有切换则不显示);
- 悬停:完整说明,含分组、总耗时、前面每档失败的原因码,以及整段「尝试轨迹」
(✅/❌ CODE [分组] provider/model 秒数)。
徽章显示「本会话最近一次轮询回答」,每 4 秒刷新一次;按会话分别保存(最多 100 个),
不会被另一会话、标题生成或上下文压缩覆盖。强度取真实委托参数,而不是仅取预设值。
直连的模型也认。 插件同时监听每一次模型调用(llm/stream),所以就算你在选择器里直接选了
Codex / GPT-6.1 Sol(没走轮询),徽章也会显示 ◆ deepseek-flash · low · 0.9s · 直连,
标题是「本会话最近一次回答(直连):provider/model」。标题生成、上下文压缩这类后台调用不参与,
不会把你的徽章改掉。
额度用尽 → 自动「再发一次」
适配器里的切换只对「还没吐出任何内容」的失败安全(已经输出一半再换模型会拼出两截答案)。
所以插件还接管了 agent 循环的失败回调(agent/request-error):
- 轮询模式下的某一步请求失败(额度用尽 / 鉴权失效 / 限流 / 5xx …,中断不算);
- 失败的那一档已经在适配器里进了冷却,于是直接让 agent 循环重跑这一步,
下一次自然落到链里的下一档模型 —— 效果等同于「自动再发一次你的消息,换成下一个模型回答」;
- 最多重发
maxAutoResends次(默认 2),用完就把错误交还给正常流程; - 链里所有档都在冷却时不做重发(避免无意义的空转)。
这一层不依赖模型选择器,rotation/auto 或 Model Rotation / Auto 都一样生效。
v0.6.1 真机修复
另一个插件的模型选择器 installDirectorySlots 使用 priority -10,遮住了先前 -1 的 Auto 选择器。
本版改为 -20,回归测试包含与 -10 的竞争检查。会话头仍用独立 list 槽追加,不遮挡其它功能。
诊断:接管失败时不再静默
浏览器 console 的错误进不了 host 日志,所以插件自带一条极小的诊断通道:
- client 端在关键节点上报(
apply/ 座位注册成功或失败 / 座位渲染崩溃 / 兜底按钮点击),
写入 POST /plugins/model-rotation/client-report;
- host 端把它写进
<状态目录>/client-report.jsonl(保留最近 40 条),
同时并入 GET /plugins/model-rotation/state 的 clientReports;
- 座位渲染一旦崩溃,
SeatBoundary会兜底成一个「⚡ 自动轮询」按钮(点击仍能切到轮询模式),
并把错误栈上报 —— 这样即使官方改结构导致接管失败,也不会把你的模型选择器弄没。
排查时:_probe_rotation_live.mjs 直接打印运行中的 state / clientReports,或看
%APPDATA%\dsh-desktop\harness\state\dsh-model-rotation\client-report.jsonl。
图形界面:在设置里配置(推荐)
插件带了 client 上半,会在 设置 → 模型轮询 里加一整页可视化面板(settings.section 槽位,排在「插件」后面):
- 排序方式:手动 / 自动一键切,自动模式还能选偏好(均衡 / 速度优先 / 稳定优先);
- 轮询链:每档一行 —— 分组徽章、↑/↓ 上下移、启用勾选、直接下拉换模型、下拉改思考强度、
删除、单档探测;行内实时显示 成功 87% · 1200ms 或 冷却 12m(QUOTA);
- 添加候选:先选分组(agy / Codex / 两家 DeepSeek API / 内置 DeepSeek),
再用关键字筛选组内模型,选模型 → 选思考强度 → 添加;
- 预设:下拉应用内置/自定义预设,输入 id 把当前链存成新预设,一键删除;
- 状态与维护:调用/切换次数、当前尝试顺序、探测全部、端到端测试、重置冷却、恢复默认。
面板 5 秒轮询一次 `GET /p
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::3,最后更新 2026-10-28