dsh-auto-rerun:模型斷連時在會話內自動重試與續跑

前言

在 DeepSeek Harness(DSH)裏跑 Agent,任務往往要連續多輪請求模型。網絡抖動、代理重啓、供應商 5xx、流中斷或 429 限流,都會在界面裏留下一條失敗終態;內置的 @deepseek-ai/dsh-llm-retry 只覆蓋短窗口內的幾次抖動,分鐘級配額或回合已經斷在中間時,仍需要有人手動點重試或換模型。dsh-auto-rerun 是社區維護者 good-saltfish 發佈的宿主插件(分類:模型推理),專門接管「斷連類」失敗:同回合內長退避重試、可選回合級 followup 續跑、可選換路線,並在右側欄展示狀態與可調參數。下面介紹它的定位、三層機制、安裝與配置要點。

這是什麼

dsh-auto-rerun(npm 包名同名,當前發佈版本 1.8.5,MIT 許可證)掛在 DSH 的 Cordis 插件體系上,監聽 agent/request-error 與 agent/error 等事件。當失敗被判定爲斷連類(而非 401/403、400、上下文超長等「重試無意義」的錯誤)時,插件在會話內繼續嘗試,而不是立刻把終態拋給用戶。它與內置重試互補:內置層做供應商 retryPolicy.normal 下的短退避;本插件做長窗口、限流專用退避、retryUntilSuccess 一直試到成功,以及 Layer B/C 的續跑與選模型(後者默認關閉)。

核心機制:三層互補

README 用 Layer A/B/C 說明行爲邊界,與內置 @deepseek-ai/dsh-llm-retry 不衝突。

Layer A:請求級接管

觸發條件:瀑布下游在內置重試預算耗盡或無 provider policy 後讓出終態,且失敗屬於斷連類。插件追加自己的重試,返回 { kind: 'retry' }。

  • 普通斷連:默認最多 3 次接管,退避 5s 起、最大 60s,指數係數 2,jitter 20%。
  • 限流(429、RATE_LIMIT、tpm exhausted):單獨使用 30s→60s→120s→180s 的長窗口,避免短退避反覆撞牆。
  • 若響應頭有 Retry-After,或失敗文本含 retry in ~3s、retry_after: 5、請 3 秒後重試 等(honorMessageRetryHint 默認開),按服務端指示等待,優先於固定窗口。

默認 retryUntilSuccess: true:同一模型、同一會話內,只要不是「死路」(401/403、訂閱過期、key 失效、永久沒額度),就持續重連直到成功;退避仍有封頂,不會打爆端點。連續 retryUntilSuccessMaxMs(默認 7200000 ms,即 2 小時)仍無成功請求時,把錯誤交還宿主,避免路線徹底壞掉卻永遠靜默重試。關閉 retryUntilSuccess 則回到計數與時間預算制(如 busyRouteBudgetMs)。

Layer B:回合級續跑

請求仍終態失敗且觸發 agent/error,且失敗碼不在 rerunExcludeCodes(默認含 RATE_LIMIT)時,延遲 rerunDelayMs(默認 3s)後自動 agent.followup,讓 Agent 新開回合從中斷處續跑。連續自動續跑上限默認 reruns: 1。限流類默認只走 Layer A 靜默重試,不向會話發可見續跑消息。

Layer C:選模型重試(默認關)

自 1.6.0 起 modelFallback.enabled 默認爲 false。開啓後,同一路線預算用盡或 retryUntilSuccess 模式下連續失敗超過 fallbackAfterMs,或出現死路信號時,可換 provider/model 再試;死路路線進入約 30 分鐘黑名單。單次事故最多換 fallbackMaxSwitches(默認 2)次。換路線優先走宿主 selectForNextRequest,會話裏會出現 [model changed: …];拿不到該服務時纔在 agent/request 外層改寫 provider/model。候選順序:fallbackRoutes → 同 model id 的另一 provider → 本進程已見過的路線 → 目錄其餘模型。

斷連類如何判定

任一命中即視爲斷連類:loop 失敗碼(默認 EMPTY_RESPONSE、RATE_LIMIT、SERVER、TIMEOUT、TRANSPORT);POSIX errno(如 ECONNRESET、ETIMEDOUT);HTTP 408/425/429/500/502/503/504 及消息正則(socket hang up、fetch failed、rate limit 等)。可通過 codes、extraCodes、statusSet、messagePattern 調整。

右側欄操作面板

插件通過 dsh-better-sidebar 在 Web 宿主右側欄註冊「自動重跑」頁(client.js)。狀態區展示版本、運行時長、當前路線、接管重連/續跑/換路線等計數與最近活動;開關區可改 retryUntilSuccess、modelFallback、debug;數字區可改 retries、reruns 等,失焦或回車提交。修改作用於運行中的配置,若配置了 settingsFile(默認 ${DSH_HOME:-~/.dsh}/auto-rerun-settings.json)會持久化;寫空字符串則僅內存。

安裝與啓用

插件已發佈到 npm,也可從 GitHub Release 安裝 tgz。安裝後新會話即生效;已在跑的會話建議重啓 DSH 以便宿主插件重新掛載。

從 npm 安裝(任意 DSH 會話裏):

plugin_manager install_bundle "dsh-auto-rerun"

從 GitHub 發佈包安裝(不依賴 npm,示例爲 v1.8.5):

plugin_manager install_bundle "https://github.com/good-saltfish/dsh-auto-rerun/releases/download/v1.8.5/dsh-auto-rerun-1.8.5.tgz"

本地開發調試:

plugin_manager install_bundle "<你本機的倉庫路徑>"

也可在 Plugin Manager 頁面手動安裝本地目錄。運行環境要求 Node.js >= 20;package.json 聲明 DSH 引擎 >=0.1.7-rc.1,peer 依賴 @deepseek-ai/cordis ^4.0.1。

配置入口

在 cordis.patch.yml 的 entry config 或插件行配置中調整。總開關 enabled 默認 true;Layer A/B 分別對應 request.enabled、rerun.enabled。完整選項約 34 項,README 配置表列出默認值與含義,包括限流延遲、事故間隔 incidentGapMs、續跑語言 lang(zh/en)、調試 debug、可選 logFile 與環境變量 DSH_AUTO_RERUN_LOG 等。需要「只守一個模型、一直重試」時保持默認即可;需要限流仍發續跑消息可將 rerunExcludeCodes 設爲 [](一般不建議)。

典型用法與注意

典型場景:長時間 Agent 任務、免費或易限流線路、VPN/代理不穩定環境——讓 Layer A 在後臺按長退避消化 429 與 5xx,避免任務死在一條紅字上;回合已失敗且非限流排除碼時,Layer B 自動 followup 一次續跑。

與內置重試的關係:不要關掉內置 retry 指望本插件替代短窗口;兩者分層,本插件只在內置讓出終態且屬斷連類時接管。

安全與權限:插件以當前 DSH 進程權限運行,會改寫請求路線、發 followup、可選寫 settingsFile 與日誌文件。安裝前請閱讀 GitHub 倉庫 源碼與 MIT 許可證,僅在信任維護者與配置的前提下啓用 modelFallback 與持久化路徑。

社區插件目錄見 SkillHub 條目(與 DeepSeek / 幻方無官方從屬關係,屬社區生態「一切皆插件」的一部分)。問題與版本更新以 GitHub Issues 與 Release 爲準。

結尾

dsh-auto-rerun 把斷連類故障從「一次失敗就停」變成「同會話內可控的重試與可選續跑」:限流用長退避、retryUntilSuccess 用時間天花板防止假死、死路與擁塞分開處理,右側欄可觀測可改參。若你經常在 DSH 裏跑長任務,值得在配置裏打開總開關並熟悉 Layer A 與 rerunExcludeCodes 的默認行爲,再按需開啓選模型重試。

  • 目錄頁:https://www.skillhub.cn/plugins/good-saltfish/dsh-auto-rerun
  • 源碼與文檔:https://github.com/good-saltfish/dsh-auto-rerun
羽毛球分组比赛记分
小程序二维码

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

小夜