前言¶
做智能體開發的人,多半會遇到同一類問題:免費的模型平臺有幾個,各自額度不同,收尾時間也不同。跑在某個平臺時中間觸發額度上限,整個任務就斷了,前面的上下文都白跑。手工盯着換平臺、換模型,能解決但不可持續,尤其當平臺會增減、模型名在不同渠道叫法不一致時。
puppy-bai/dsh-quota-takeover 處理的就是這件事:在 Our Free Model(下稱 OFM)之上加一層「接力」邏輯——平臺額度不夠按你設定的順序換下一個,某個平臺沒有你要的模型就跳過,全都沒有就換下一檔模型再遍歷一遍,任務因額度中斷時自動切到新平臺並往中斷的會話裏發一條「繼續」。維護者是 puppy-bai,分類是模型推理。
本文只依據插件 README 與 package.json 中已有的內容介紹,不涉及未公開功能。
它解決什麼問題¶
OFM 負責把多個平臺的賬號、模型和剩餘額度聚合起來。它的短板是順序固定:一個平臺額度用完後,接力不會自動發生。本插件把「平臺順序 × 模型檔」編譯成一條有序候選鏈,寫回 OFM 的 combo(auto:main),由 OFM 的 fallback 策略逐項嘗試。
也就是說,插件本身不直接調用模型,它做的是編譯計劃和寫回計劃。
核心能力¶
下面按需求逐條列出已實現的行爲,來源是 README 的「它做什麼」表。
- 額度耗盡換下一個平臺:把「平臺順序 × 模型檔」編譯成候選鏈,寫回 OFM 的 combo(
auto:main)。 - 模型不存在則跳過:每個模型檔有別名錶,平臺模型清單匹配不到記爲
missing並跳過。別名匹配先精確比較,再去-free/-preview/eac:前綴小寫比較,最後按 id 最後一段比較——聚合渠道的siliconflow/deepseek-ai/DeepSeek-V3能被DeepSeek-V3命中。 - 全部換完還沒有就換檔重遍歷:遍歷形狀爲
tier-major(檔優先),先全平臺找第 1 檔,再全平臺找第 2 檔。 - 兜底:
finalResort.fallbackModels(如groq/llama-3.3-70b)非空時編譯兜底鏈;爲空則進入「等待恢復」。 - 中斷續跑:監聽
llm/stream的錯誤終點,分類爲額度/限流後寫冷卻、重編譯計劃、向該會話agent.followup(一條「繼續」消息)。 - 平臺表自動維護:平臺來源有三處——channel-pack 賬號池、OFM 聚合渠道
/providers、catalog 裏的新通道(如subscription:magpie/siliconflow/…)。每輪同步重新讀。連續platformPolicy.pruneAfterMisses(默認 3)輪讀不到的平臺從順序裏清掉;pruneZeroAccounts(默認開)會把賬號數爲 0 的渠道隱藏,之後補上賬號會自動回來;也可以在設置頁每行手動刪除平臺,寫進hiddenPlatforms和excludePlatforms,底部「已隱藏 N 個」點 ↺ 可放回。
爲什麼是兩個半身¶
OFM 的 API 掛在 harness 的信任圍欄後,插件進程內的 fetch 一律返回 401(README 提到實測,詳見設計文檔 §12.1)。所以讀賬號/額度、寫 combos 這兩件事只能由瀏覽器側代勞,host 側負責編譯計劃。
瀏覽器(帶 DSH 認證 cookie) 插件 host 進程
│ ① GET /api/our-free-model/combos │
│ ① GET /api/our-free-model/subscriptions │
│ ② POST /api/quota-takeover/snapshot ────▶│ 編譯計劃(平臺順序 × 模型檔 × 額度 × 冷卻)
│ ③ GET /api/quota-takeover/pending ◀──────│ 待寫回的 combos
│ ④ POST /api/our-free-model/combos │ (只有瀏覽器有寫權限)
│ ⑤ POST /api/quota-takeover/applied ─────▶│ 記錄已寫回
續跑不受這個限制影響,因爲它是進程內 agent.followup(),不經過 HTTP。
安裝與啓用¶
前提:先裝好 Our Free Model。沒有 OFM 時,本插件只剩續跑能力,沒有可接力的平臺。
從市場裝(發佈後可用):
DSH → Plugins → Discover 裏搜 quota-takeover
手動裝(開發或未發佈時),README 給出的命令如下:
cd ~/.dsh/profiles/desktop
npm i /path/to/dsh-quota-takeover-0.1.1.tgz # 或把源碼目錄拷到 node_modules/dsh-quota-takeover
# 然後在 package.json 的 dsh.profile.bundles 數組裏追加 "dsh-quota-takeover"
# 被 bundles 引用的包,其自帶 cordis.patch.yml 自動生效;
# 別再往 cordis.patch.yml 手寫同名條目,否則報 duplicate loader entry id
裝完要完全退出 DeepSeek Harness 再打開。host 半身只在進程啓動時 apply 一次,刷新頁面只重載瀏覽器半身。
三個檢查點:
| 檢查點 | 期望 |
|---|---|
| 設置 → 「額度接力」 | 頁面出現,且沒有紅色「宿主半身沒有加載」告警 |
| 平臺順序 / 模型檔 | 列出 channel-pack 裏啓用的平臺與它們的真實模型 |
~/.dsh/quota-takeover/journal.jsonl |
有 api-mounted;發生過失敗時有 failure / resume |
運行期數據放在 ~/.dsh/quota-takeover/{config,plan,bench,resume,platforms}.json 和 journal.jsonl。
配置¶
配置文件是 ~/.dsh/quota-takeover/config.json,也可以由設置頁「額度接力」寫入。README 提供的樣例:
{
"enabled": true,
"platformOrder": ["trae", "minimax", "zcode", "loomy", "raccoon", "gemini"],
"platformPolicy": {
"unknownTail": true,
"excludePlatforms": [],
"pruneMissing": true, // 讀不到的渠道自動從順序裏清掉
"pruneAfterMisses": 3, // 連續缺席幾輪才清(防一次探測失敗誤刪)
"pruneZeroAccounts": true // 0 賬號的空渠道自動隱藏(有賬號後自動回來)
},
"modelTiers": [
{ "id": "deepseek-flash", "label": "DeepSeek V4.1 Flash", "pinned": true,
"aliases": ["deepseek-v4.1-flash", "deepseek-v4-flash-0731", "deepseek-flash"] },
{ "id": "glm-flash", "label": "GLM 5.3 Flash", "aliases": ["glm-5.3-flash"] }
],
"traversal": { "order": "tier-major", "maxChainLength": 16, "optimisticOnUnknown": true },
"finalResort": { "fallbackModels": [], "retryAfterMinutes": 10 },
"resume": { "enabled": true, "onlyQuotaLike": true, "maxPerSession": 5, "requireCandidateChange": true }
}
幾個容易踩的點:
platformOrder沒列出的平臺排在後面(受platformPolicy.unknownTail控制)。pruneMissing/pruneAfterMisses決定撤掉的渠道何時被清理,缺席次數記在platforms.json。一輪讀不到任何平臺時整輪跳過,README 解釋這是爲了區分中繼故障和渠道被刪。optimisticOnUnknown:平臺模型清單未知時先把格子放進鏈,真沒有會讓 OFM 的 combo 自然失敗並前進——未知不等於不存在。resume.requireCandidateChange是核心防呆:候選鏈沒變化就不重複注入「繼續」,避免握着同一個額度耗盡的平臺反覆觸發。
HTTP API¶
以下接口在瀏覽器側使用,需要帶 DSH 認證 cookie:
| 方法 | 路徑 | 作用 |
|---|---|---|
| GET | /api/quota-takeover/status |
計劃 + 橋狀態 + 配置 |
| POST | /api/quota-takeover/compile |
手動重編譯 |
| POST | /api/quota-takeover/snapshot |
瀏覽器推賬號/額度/模型快照 |
| GET | /api/quota-takeover/pending |
取待寫回的 combos |
| POST | /api/quota-takeover/applied |
回報寫回成功 |
| GET | /api/quota-takeover/bridge |
中繼健康狀況 |
| POST | /api/quota-takeover/config |
改配置(合併後重編譯) |
| POST | /api/quota-takeover/bench/clear |
清空冷卻表 |
開發者自測¶
README 裏給的幾條命令,適合改完代碼後自己跑一遍:
node --test tests/*.test.js # 單測(編譯器 / 分類器 / 續跑狀態機,README 寫 32 個)
node probes/smoke-host.mjs # 假 ctx 裝載 host 半身,跑通中繼閉環
node probes/plan-preview.mjs # 用本地 state.json 預演一次編譯
node probes/ofm-probe.mjs <gui 地址> # 探針:OFM API 可達性(預期 401)
已知限制¶
按 README「已知限制」一節列出:
- 寫回依賴 GUI 打開。瀏覽器關掉時鏈停在舊計劃上;候選裏已帶 resolved 模型 id,舊鏈仍能跑。
- 默認不直接改 OFM 的
settings.json(除顯式writeBack.mode: "file")。OFM 把設置常駐內存,改盤不熱生效且會被下次保存覆蓋。 - 續跑只在「額度/限流」類失敗上生效(
onlyQuotaLike);用戶主動 abort 絕不續跑。 llm/stream目前只觀察不改道(探針 4 未驗),改道能力留作 M2。
適用場景與注意¶
適合已經在用 OFM 聚合多個免費或低價平臺的開發者:想把平臺增減、模型檔順序和額度中斷後的續跑交給插件維護,而不是手改 combo。平臺多、模型名在各渠道寫法參差、經常碰到額度用完時,這層接力能明顯減少人工介入。
需要注意:
- 插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證(README 的 license 字段寫的是 MIT)。
- 它是 OFM 之上的一層,前提是 OFM 已正確配置並啓用了 channel-pack 等渠道;沒有 OFM 時只剩續跑能力。
- 寫回依賴瀏覽器半身,長期運行的環境裏 GUI 不能隨便關。
結尾¶
dsh-quota-takeover 的價值在於把「額度耗盡 → 換平臺 / 換模型檔 → 繼續跑」這條鏈路自動化,並且用 resume.requireCandidateChange 等配置把誤續跑控制住。如果你的需求正好在 OFM 的射程之外,可以先看插件目錄頁和源碼再決定:
- 目錄頁:https://www.skillhub.cn/plugins/puppy-bai/dsh-quota-takeover
- GitHub:https://github.com/puppy-bai/dsh-quota-takeover
目錄站是獨立站點,與 DeepSeek / 幻方無官方從屬關係。