dsh-model-auto-retry:429 限流下讓 DSH Agent 不中斷

前言

在 DeepSeek Harness(DSH)裏跑長任務時,模型 provider 一旦返回 HTTP 429 或 RATE_LIMIT,內置的 @deepseek-ai/dsh-llm-retry 會把 maxRetries 用完後,由 @deepseek-ai/dsh-agent-loop 把失敗升級成終結錯誤:寫 turn/end { reason: { kind: 'error' } }、發 agent/error,Agent 回到 idle。任務停在半路,只能人工再發一條消息才能繼續。限額場景下這很常見——倉庫 README 裏記錄的一次實測會話中有 744 次 llm/retry、7 次以 error 結束的 turn/end,且均爲 429。

下面介紹社區插件 dsh-model-auto-retry(維護者 kocor01),它在 DSH 宿主側補一層「限流自愈」:先讓內置重試跑完,再原地重試 429,必要時自動發續跑 follow-up,儘量無人值守把任務跑完。

這是什麼

dsh-model-auto-retry 是 DSH 的 host 插件,分類屬於工作流。一句話定位:在模型請求被限流(HTTP 429 / RATE_LIMIT)時保持 Agent 存活——循環內原地重試,重試用盡後再自動發送「如果任務未完成,請繼續執行」類 follow-up。

倉庫根目錄即插件包(package.json、index.js、cordis.patch.yml 在頂層),可從 npm 或 GitHub 直接安裝。

核心功能:兩層,只處理 429

處理順序可以概括爲:

請求失敗
  └─ 內置 llm-retry:還能重試嗎?能 → 它重試(本插件完全不介入)
                     不能 → 輪到本插件
  └─ 第一層:是 429 嗎?→ 按 Retry-After / 指數退避等待 → 返回 { kind: 'retry' }
                         → 循環原地重試,Agent 不中斷
  └─ 第二層:turn 因 429 終結 → 等 Agent 變 idle → agent.followup('如果任務未完成,請繼續執行')

兩層都只在 429 / RATE_LIMIT 上生效;配額耗盡、鑑權失敗等「重試也不會變好」的錯誤保持原樣,仍交人工處理。

實現上有三條硬約束(改代碼前宜讀倉庫 index.js 模塊註釋):

  1. 一定先 await next(),讓內置重試優先,本插件只當最後一層,與加載順序解耦。
  2. 續跑消息只能在 idle 時發——running 階段的 followup 只會入隊,不會喚醒驅動。
  3. 不寫自定義 session 事件——狀態只放內存。

默認策略 mode: hybrid 同時開啓兩層;也可只開原地重試(in-loop)、只開中斷後續跑(continue),或 off 關閉。

安裝與啓用

安裝會在 profile 的 bundle 列表裏增加條目,並通過包內 cordis.patch.yml 在 profile 根部插入插件行。裝完後可用 cordis_inspect_query → host / Config / listConfigs,傳 {"name": "dsh-model-auto-retry"};該行 status 爲 absent 是正常的——本插件不導出 Config schema,不是未掛載。注意 desktop profile 由 Electron 獨佔,dsh --profile desktop --dump-config 會報錯,不要用該命令驗證 desktop。

從 npm 安裝(推薦)

把 desktop 換成你的 profile 名(dsh --help 會列出):

dsh plugin --profile desktop add dsh-model-auto-retry

從 GitHub 安裝

dsh plugin --profile desktop add "github:kocor01/dsh-model-auto-retry"

私有倉庫需先配置 git 憑據,或使用 SSH:

dsh plugin --profile desktop add "git+ssh://git@github.com/kocor01/dsh-model-auto-retry.git"

升級與卸載

三種安裝方式升級後都需重啓 DSH 纔會重新加載模塊;npm 包可用 update,GitHub 來源可重跑 add,本地目錄鏈接需自行 git pull。

dsh plugin --profile desktop update dsh-model-auto-retry
dsh plugin --profile desktop remove dsh-model-auto-retry

也可在 DSH 裏通過 plugin_manager 的 install_bundle / remove_bundle 操作;target 傳倉庫根目錄絕對路徑。

配置

在 profile 的 cordis.patch.yml 裏按 id 覆蓋(不要改倉庫內那份,升級會被覆蓋)。Loader 規則是覆蓋即替換整個 config 對象;本插件對每個鍵都有代碼內默認值,只寫部分鍵是安全的。

- id: model-auto-retry
  config:
    mode: hybrid              # hybrid | in-loop | continue | off
    rateLimitCodes: ['RATE_LIMIT']
    rateLimitStatuses: [429]
    messagePattern: '^\s*429\b'
    excludeCodes: ['QUOTA', 'ACCOUNT_QUOTA', 'AUTH', 'INVALID_CREDENTIAL', 'CONTEXT_WINDOW_EXCEEDED']
    respectRetryAfter: true
    initialDelayMs: 5000
    maxDelayMs: 300000
    jitterRatio: 0.2
    maxInLoopRetries: 6
    continueText: '如果任務未完成,請繼續執行'
    maxContinues: 8
    resetWindowMs: 1800000
    includeSubagents: true
    continueSource: 'user'

常用調整:mode 控制策略組合;maxInLoopRetries / maxContinues 與 resetWindowMs 控制原地重試與續跑預算;continueSource 爲 notice 時續跑以提示條出現而非用戶氣泡。配置寫錯會在激活期直接報錯,不會出現「裝了但沒生效」的靜默狀態。

典型現象與驗證

聊天與日誌

  • hybrid / in-loop:聊天裏通常沒有額外消息,只有請求變慢;恢復過程在宿主日誌裏,前綴 model-auto-retry:。
  • hybrid / continue:中斷後會出現內容爲默認續跑文案的用戶消息(或 notice 提示條),隨後 Agent 繼續。
  • 預算用盡或非 429:與未裝插件相同——報錯、停下、等人處理。

單元測試

在倉庫根目錄:

node --check index.js
node test/unit.test.mjs

README 說明在受限沙箱裏 node --test 可能因 spawn EPERM 失敗,直接運行 node test/unit.test.mjs 即可。

端到端(隔離 DSH_HOME)

README 提供可復現流程:起假 429 服務、設置 DSH_HOME 與 MOCK_API_KEY、用 headless profile 安裝本地包路徑並 --patch test\e2e-overlay.yml 跑任務,再讀會話日誌確認只有 completed、沒有 error。對照組可用 e2e-overlay-control.yml(插件 off)與 e2e-overlay-continue.yml(只測第二層)。

倉庫內表格記錄:假服務前 3 次 429、內置 maxRetries: 1 時,hybrid 得到 turn/end completed;off 對照組爲 turn/end error 且 CLI 非 0。

適用場景與注意

適合誰:經常 hit provider 限流、希望長任務少人工點「繼續」的 DSH 用戶;子 Agent 多時可把 includeSubagents 設爲 false 避免併發放大。

邊界(來自 README「已知邊界」):

  • 重試與續跑預算在內存中,重啓 DSH 或熱重載插件後歸零。
  • 無設置 UI,調參只靠 profile 的 cordis.patch.yml。
  • 插件是「失敗後恢復」,不是主動限速;要壓 429 仍需配合 provider 的 retryPolicy 或上游配額。
  • 若 provider 已設 retryPolicy.mode: always,內置策略永不放棄,第一層往往不會觸發。

安全與信任:插件以當前 DSH 進程的權限運行,會向 Agent 注入續跑消息並攔截 LLM 失敗路徑。安裝前應閱讀 index.js 與 LICENSE,僅從可信來源安裝。

DSH 生態強調「一切皆插件」;SkillHub 上的插件目錄是社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-model-auto-retry 在內置 LLM 重試耗盡之後,針對 429 做原地重試與 idle 後的自動 follow-up,把「限流導致 Agent 半路 idle」從常態故障改成可配置的自愈流程。需要詳情、Issue 與完整配置表時,見目錄頁 https://www.skillhub.cn/plugins/kocor01/dsh-model-auto-retry 與 GitHub https://github.com/kocor01/dsh-model-auto-retry。

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

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

小夜