前言¶
DeepSeek Harness(DSH)內置的 dsh-llm-retry 對臨時故障使用有界指數退避策略,默認從 500ms 到 10s 共重試 5 次。當預算耗盡時,TPM/RPM 窗口仍然活躍,可能導致更嚴重的限流。OpenModel Platform(OMP)對速率限制的處理方式不同:它會重試最多 10 次,等待至少 30 秒,並接受 provider 的 Retry-After 頭,最長可達 5 分鐘。
這個插件爲 DSH 增加了一套與 OMP 對齊的 429 重試行爲,無需修改 DSH 核心代碼。
是什麼¶
dsh-omp-retry 是一個 DSH 插件,爲 HTTP 429(Too Many Requests)響應提供 OMP 風格的重試策略。它由 Rinai-R 維護,定位爲工作流類插件。插件會在 dsh-llm-retry 之前插入一個 agent/request-error 監聽器,只接管 RATE_LIMIT 錯誤碼,其餘錯誤碼仍由內置執行器處理。
核心功能¶
- 最多 10 次速率限制重試(可配置)。
- 延遲爲
max(30 s, provider Retry-After),即至少等待 30 秒,或使用 provider 返回的Retry-After頭。 - 若 provider 返回的
Retry-After超過 5 分鐘,則終止重試鏈,不再等待。 - 每次重試會持久化
llm/retry/llm/retry-started事件,保證重試 UI 和會話歷史正常工作。 - 取消操作、回合結束或插件銷燬會中斷當前等待。
SERVER、TIMEOUT、TRANSPORT、EMPTY_RESPONSE仍由dsh-llm-retry處理。CONTEXT_WINDOW_EXCEEDED、QUOTA、AUTH、INVALID_REQUEST不會重試。
安裝與啓用¶
使用官方安裝命令:
dsh plugin --profile desktop add github:Rinai-R/dsh-omp-retry
將 desktop 替換爲你的實際 profile 名稱(如 web 或自定義 profile),然後重啓 DSH。插件會在啓動時自動插入 omp-rate-limit-retry 配置行。
配置¶
默認配置爲:
maxRetries: 10floorMs: 30000maxDelayMs: 300000
在 profile 的 cordis.patch.yml 中覆蓋:
- id: omp-rate-limit-retry
config:
maxRetries: 10
floorMs: 30000
maxDelayMs: 300000
設爲 maxRetries: 0 可禁用插件。插件的重試預算獨立於 provider 的 retryPolicy.maxRetries:即使 provider 仍爲默認 5 次,該插件仍會進行最多 10 次速率限制重試。
典型用法¶
在 cordis.patch.yml 中爲 provider 配置 OMP 風格的本地退避,並將 RATE_LIMIT 放入可重試列表:
retryPolicy:
mode: normal
maxRetries: 10
retryableCodes:
- EMPTY_RESPONSE
- RATE_LIMIT
- SERVER
- TIMEOUT
- TRANSPORT
backoff:
initialDelayMs: 500
maxDelayMs: 8000
jitterRatio: 0.25
這樣,當 dsh-omp-retry 攔截到 429 響應時,會按 OMP 策略重試;未攔截的錯誤仍由 provider 策略處理。
適用場景與注意¶
適合需要與 OMP 行爲對齊、希望更長時間窗口內處理速率限制的開發者。插件以當前 DSH 進程權限運行,安裝前建議檢查源碼與許可證(MIT)。
限制¶
- 不適用於 Ghostty,也不是通用重試框架,僅覆蓋 HTTP 429 速率限制。
- 未實現 OMP 的 model/credential 降級鏈。
- 若 provider 的
Retry-After超過maxDelayMs,將不再等待。
總結¶
dsh-omp-retry 通過 OMP 風格的 429 重試策略,幫助 DSH 更好地處理速率限制場景。配合合適的 provider 重試配置,可以在保持會話歷史和 UI 正常工作的同時,延長重試窗口。更多細節見插件目錄頁或 GitHub 倉庫。