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

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

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

小夜