dsh-cooldown-retry:爲 DeepSeek Harness 提供上游 429 冷卻等待與容錯重試

前言

在使用共享 LLM 網關(如校園網代理、自建網關、提供商池)時,網關經常返回 429 狀態碼,並在響應體中附帶明確的 retry_after_seconds 提示,例如:“所有上游提供商正在冷卻中,請在 28 秒後重試”。

DeepSeek Harness 的內置 llm-retry 機制雖然支持 failure.providerRetryAfterMs,但該字段通常由適配器解析 HTTP 頭填充。當提示僅存在於響應體文本中(如 llm-pi-ai 適配器不解析頭),llm-retry 會回退到本地退避策略(500ms → 1s,共 2 次),導致請求在冷卻窗口內失敗,而實際上等待 28 秒即可成功。這個插件旨在填補這一空白。

插件介紹

dsh-cooldown-retry 是一個 DeepSeek Harness 插件,提供耐心的自動重試機制。它從上游 429 容量冷卻消息中讀取重試延遲,而不是在兩次快速嘗試後放棄。

  • 所有者: dboycht
  • 分類: 工作流
  • 許可證: MIT

核心功能

  1. 耐心重試: 對 DeepSeek Harness 進行自動重試,而非在兩次快速嘗試後放棄。
  2. 讀取上游延遲: 從上游 429 容量冷卻消息中讀取重試延遲(retry_after_seconds 等)。
  3. 吸收誤標 400: 吸收網關飽和時誤標爲“不支持音頻模態”的 400 錯誤。
  4. 預算管理: 按輪次和提供商管理重試預算。
  5. 中止感知等待: 支持在輪次被取消時立即結束等待。

安裝與啓用

推薦使用官方安裝命令添加插件。

dsh plugin --profile web add github:dboycht/dsh-cooldown-retry

前置條件: 安裝命令需要 git 在系統 PATH 中(用於 github: 指定符)。
安裝後,需要重新加載配置以生效,無需重啓進程。

驗證安裝是否成功:

dsh --profile web --dump-config | grep -A2 'cooldown-retry'

注意: 插件行必須出現在內置 llm-retry 行之後。agent/request-error 是一個瀑布流,後註冊的監聽器作爲內層監聽器,因此該插件能優先攔截失敗。

配置與用法

默認配置如下:
* maxRetries: 5
* minDelayMs: 1000
* maxDelayMs: 300000
* acrossSteps: true
* mislabeledClientError: true

可通過自定義配置覆蓋默認值。由於非 insert 補丁會替換整行配置,修改時需重申所有保留的鍵。

- id: cooldown-retry
  config:
    maxRetries: 10
    maxDelayMs: 600000

主要配置項說明:
* maxRetries: 每輪次/每個提供商在將失敗傳遞給下游之前的耐心重試次數。
* minDelayMs / maxDelayMs: 每次等待的窗口限制(1s - 300s)。
* acrossSteps: 默認爲 true,表示在輪次的所有步驟中共享一個預算;設爲 false 則恢復每步獨立預算。
* mislabeledClientError: 默認爲 true。當同一提供商在短時間內出現過容量冷卻,且網關返回聲稱“不支持模態”的 400 錯誤時,插件會將其視爲電路重放並等待,而非直接報錯。
* mislabeledMaxRetries: 專門用於處理“誤標 400”的獨立重試預算,與 maxRetries 分離。
* mislabeledEvidenceMs: 容量冷卻作爲“證據”的有效時間窗口。

限制:
* maxRetries 和 mislabeledMaxRetries 上限爲 100。
* 非插入(非 insert)的補丁會替換整行配置,因此必須重申所有希望保留的鍵。

觀察性

每次等待和放棄都會通過 ctx.logger 記錄,標籤爲 cooldown-retry。這有助於在日誌中追蹤具體的重試行爲和延遲時間。

結語

該插件通過解析上游響應體中的冷卻提示,解決了共享網關環境下常見但被內置重試策略忽略的 429 處理問題,並提供了針對網關誤標錯誤的容錯機制。對於依賴不穩定網關或需要高可用性的 DSH 工作流,這是一個實用的增強。

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

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

小夜