前言¶
在 DeepSeek Harness(DSH)裏跑 Agent 時,模型請求一旦遇到 429 或網關限流,內置策略只會做有界重試:默認最多 5 次,退避從 0.5 秒漲到 10 秒。限流若持續幾十秒到幾分鐘,五次用盡後輪次直接失敗,只能手動重發。下面介紹社區插件 dsh-plugin-retry-backoff(維護者 zmy15,分類:模型推理),它在官方 @deepseek-ai/dsh-llm-retry 之前掛到同一條 agent/request-error waterfall 上,用你設定的輪次與退避曲線追加一層預算;預算用盡後仍交回 DSH 原生策略,而不是替換官方行爲。
這是什麼¶
dsh-plugin-retry-backoff 是 DSH 的 bundle 型插件:宿主半邊在失敗分片時決策等待與重試,前端半邊在官方設置面板左側增加「重試退避」一節。網頁端與桌面端共用同一份設置真源(插件自有 JSON 文件,不依賴 DSH 0.2.x 已移除的 settings 註冊接口)。當前倉庫版本爲 1.0.4,許可證 MIT。
- 目錄頁:https://www.skillhub.cn/plugins/zmy15/dsh-plugin-retry-backoff
- 源碼:https://github.com/zmy15/dsh-plugin-retry-backoff
核心功能¶
與內置重試的組合關係¶
Agent loop 在模型請求以失敗分片結束時,會跑 agent/request-error waterfall;返回 { kind: 'retry' } 時在同一打開的輪次內重跑失敗步驟。本插件登記在官方 dsh-llm-retry 之前:
失敗 → 本插件(用戶自定義退避,自己的預算)
├─ 還有預算 → 等待 → 返回 retry
└─ 預算耗盡 / 已禁用 / 失敗碼不在集合 → next() → 官方策略照常接管
禁用插件或把「延長輪次」設爲 0,行爲與未安裝時一致。
設置面板與默認值¶
安裝並在 profile 中啓用後,設置裏會出現「重試退避」,主要控件如下(默認值來自 README):
| 控件 | 默認 | 說明 |
|---|---|---|
| 啓用本插件 | 開 | 關則完全回到 DSH 原生行爲 |
| 延長輪次 | 8 | 本插件最多追加多少次重試;0 表示不介入;可調至 200 |
| 首次等待 | 2000 ms | 第 1 輪退避時長 |
| 退避倍率 | 2 | 每輪等待 ×N;1 爲固定間隔 |
| 單輪上限 | 60000 ms | 單輪等待上限 |
| 抖動比例 | 0.2 | ±20% 隨機,減輕多會話同時重試 |
| 尊重 Retry-After | 開 | 提供方給出的等待(不超上限時)優先於本地曲線 |
| 重試哪些失敗碼 | 四類默認 | 限流 / 服務端 / 超時 / 傳輸;默認不含 AUTH、QUOTA、INVALID_REQUEST、CONTEXT |
面板可查看整條退避曲線的柱狀圖與累計最長等待時間。
設置存儲與環境變量¶
設置保存在插件自有文件中:
$DSH_HOME/retry-backoff/settings.json # 缺省 ~/.dsh/retry-backoff/settings.json
寫入採用同目錄 tmp 再 rename 的原子方式;併發保存會排隊。可用環境變量 DSH_RETRY_BACKOFF_SETTINGS 指向其他路徑(測試或便攜場景)。
實現上的三條不變量¶
- 先持久、後等待:計劃重試前會先追加非 surface 的會話事件
llm/retry-backoff,避免崩潰或取消後留下不可見的待處理重試。 - 可取消:退避等待監聽 loop 的
signal與插件生命週期,取消或卸載會中止等待。 - 預算持久:輪次計數從會話日誌的
llmRetryBackoff投影讀出,重連恢復不會清零;step/start與turn/end會重置預算。預算按 provider 分別計數,同一 provider 上多個模型共用一份預算。
安裝與啓用¶
本插件按 bundle 渠道裝入 profile,資料未給出 dsh plugin add 一類的一行命令。做法是在所用 profile 的 package.json 裏登記 bundle,並把包裝進該 profile 的 node_modules:
// ~/.dsh/profiles/<name>/package.json
"dsh": { "profile": { "bundles": [ ..., "dsh-plugin-retry-backoff" ] } }
包本體路徑:<profile>/node_modules/dsh-plugin-retry-backoff。
改完 profile 後必須重啓 DSH:宿主半邊在啓動期掛載,熱重載不會帶入 bundle 行;前端半邊刷新後會重新注入。
版本閘門¶
DSH 啓動時會校驗插件 peerDependencies 與本機運行時是否兼容,不兼容則整行跳過(日誌中常見 skipping profile bundle "…",前端看不到面板)。本插件要求 engines.dsh 與相關 peer 爲 >=0.1.5-rc.1 的開放下界,避免 caret 在 0.x 下把 0.2.x 排除在外。倉庫內可用 node test/verify-client-contract.mjs 與 node test/verify-semver.mjs 做安裝期對照(面向插件開發者,非終端用戶必做步驟)。
典型用法¶
- 在 profile 中加入 bundle 並安裝包到
node_modules,重啓 DSH。 - 打開官方設置,左側進入「重試退避」,按需調整延長輪次與退避參數;遇到持續 429 時可提高「延長輪次」、拉大「單輪上限」,並保留「尊重 Retry-After」。
- 需要手改或備份時,直接編輯
settings.json,下一次重試或打開面板即可讀到新值。 - 若「保存 / 恢復默認」變灰,面板會提示原因;1.0.3 起通常只有宿主無法寫入
$DSH_HOME/retry-backoff時纔會只讀——可點「重新檢測」,並查看宿主日誌中的retry-backoff: settings write failed。
端到端驗證腳本中的示例曲線爲連續失敗後再成功時,等待按 100→200→400→800 ms 遞增(測試配置,非面板默認值)。
適用場景與注意¶
適合:長時間跑 Agent、經常撞上 provider 限流或服務端瞬時錯誤,希望在同一輪次內自動拉長等待而不是五次失敗後立刻交卷的用戶。
務必知曉:
- 插件以當前 DSH 進程權限運行;安裝前應自行審閱源碼與 MIT 許可證。
- 只覆蓋 agent 輪次邊界 上的失敗重試;直接調用
ctx.llm.stream()的路徑仍是一次性嘗試,與官方llm-retry相同約束。 - 每次重試都是真實請求,會重複計費輸入 token;調大輪次與上限前請確認額度。
- 插件不判斷「值不值得等」;若手動把 AUTH 等碼加入重試集合,會按你的配置一直重試。
- 社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係;DSH 生態是「一切皆插件」,本介紹事實均來自上述 GitHub README 與 package.json。
結尾¶
dsh-plugin-retry-backoff 在官方有界重試之上追加可配置的指數退避預算,限流耗盡內置次數後仍有機會在同一輪內等到成功;設置獨立於 DSH settings 服務,網頁與桌面共用一份 JSON。進一步瞭解可訪問 SkillHub 目錄頁 與 GitHub 倉庫。