前言¶
在 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。
- 目錄頁:https://www.skillhub.cn/plugins/kocor01/dsh-model-auto-retry
- 源碼與說明:https://github.com/kocor01/dsh-model-auto-retry
- 當前 npm 包版本(package.json):
0.1.0,許可證 MIT,要求 Node>=20.3
倉庫根目錄即插件包(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 模塊註釋):
- 一定先
await next(),讓內置重試優先,本插件只當最後一層,與加載順序解耦。 - 續跑消息只能在
idle時發——running階段的followup只會入隊,不會喚醒驅動。 - 不寫自定義 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。