dsh-loop-guard:在 DSH 裏攔截推理循環與重試風暴

前言

在 DeepSeek Harness(DSH)裏跑智能體對話時,模型有時會陷入「只出思考、不出正文或工具調用」的狀態,整條流卡住,或反覆吐出同一段文本。宿主按默認策略對同一次失敗重試多次後,一次本來幾秒內就能判定的異常,可能被放大成數十分鐘甚至數小時的會話空轉。

dsh-loop-guard 是社區維護的 DSH 工作流類插件:在流式輸出路徑上儘早掐斷這一次嘗試,並只對自己產生的失敗碼做有限次數的糾正重試,避免把同一確定性失敗重複跑滿默認重試輪次。下面介紹它的定位、規則、安裝方式與使用注意。

這是什麼

項目 說明
名稱 dsh-loop-guard(包名與倉庫一致)
維護者 zuaonew-ops
版本 0.5.1(資料來自倉庫 package.json)
許可 MIT
形態 DSH 插件:宿主半區 index.js、設置頁 client.js、中英界面文案 locale/*.json
發佈 未發佈到 npm(private: true),需從 GitHub 安裝
依賴 無第三方依賴;可選 webServer(缺失時守衛仍工作,但沒有設置頁)

一句話:把一次可能卡幾十分鐘到幾小時的會話,壓縮成幾秒鐘的一次乾淨中止,並止住圍繞同一次循環的反覆重試。

它針對哪些現象

用戶側常見表述包括「對話無限重複」「卡會話」「子會話運行時間過長」。資料中的因果鏈可概括爲:

  1. 模型推理循環、流卡死或輸出退化,導致本次嘗試以錯誤結束;
  2. 宿主默認重試策略對同一次失敗再試多輪(資料寫明默認可至 5 次);
  3. 每輪嘗試本身可能耗時數分鐘到數小時,子會話時間預算被耗盡後零產出。

插件用實測會話區分四類壞形態(另有第五條絕對時間兜底):

形態 簡要現象
分片洪水 多次重試均大量推理分片、正文分片爲 0
卡住不動 長時間沒有任何分片到達
慢速滲流 分片持續到來但長時間仍無產出(僅盯分片數或空檔的規則可能漏檢)
輸出退化重複 思考內容中行級或片段級高度重複

核心功能:五條規則與觸發後行爲

任一規則命中即掐斷;優先級自上而下。判據與默認閾值以倉庫 README 爲準。

# 規則 默認閾值要點
1 chunk(分片洪水) 推理分片 ≥ reasoningChunkLimit 且產出分片 = 0,默認 20,000 片
2 stall(卡住不動) 距上一分片(或起始)≥ stallTimeoutMs,默認 180,000 ms(3 分鐘)
3 noOutput(慢速滲流) 已耗時 ≥ noOutputMs 且產出 = 0,默認 600,000 ms(10 分鐘)
4 repeat(輸出退化) 行判據 + 片段兜底,見配置項 repeat* 默認值
5 absolute(兜底) 單次嘗試已耗時 ≥ attemptBudgetMs,默認 1,800,000 ms(30 分鐘),不看產出

關鍵定義:產出分片 = text-delta + tool-call-delta;reasoning-delta 不計入產出。

觸發之後(資料中的鏈路):

  1. 掐斷:停止向上遊取值,向下遊發送終結塊 {type:'finish', reason:{kind:'error', failure:{code:'LOOP_GUARD', …}}};觸發前已到達的塊原樣透傳。
  2. 止住重試風暴:僅對 LOOP_GUARD 接管;同一 turn/step 允許 maxGuardedRetries 次糾正重試(默認 1),之後終結;其它失敗碼走宿主默認策略。
  3. 降檔(可選):最近 120 秒內觸發過循環的 agent,下一次請求將 reasoningEffort 降一檔(max → high → low → off),可由配置關閉。

邊界(README 明確列出):不修復模型本身的循環;不改寫、不丟棄、不重排上游數據塊;統計在內存、不寫會話數據;只處理本插件產生的 LOOP_GUARD;不做遙測、不髮網絡請求(設置除寫入本地設置文件外無額外落盤)。

安裝與啓用

前置:DSH 宿主能正常啓動,環境具備 plugin_manager 工具。

從 GitHub 安裝

dsh plugin add github:zuaonew-ops/dsh-loop-guard

資料註明該命令鏈路在作者環境中未實測;另一種已實測方式爲克隆倉庫後用 plugin_manager action=install_bundle 指定本地絕對路徑(任務要求禁止 git clone,生產安裝以上述 dsh plugin add 爲準)。

重啓宿主

裝完後必須重啓一次 DSH 宿主,否則守衛可能已生效但設置頁進不了瀏覽器 boot graph(左側導航無「循環守衛」)。

確認裝上

  1. 打開 設置 → 左側導航「循環守衛」;
  2. 或請求狀態端點:
curl -s http://127.0.0.1:<宿主端口>/loop-guard/state

期望 ok 爲 true,value.enabled 爲 true,value.config 含與文檔一致的配置鍵;對話一輪後 value.stats.attempts 會增大,表示監聽已掛上。更完整的安裝、升級、卸載與排障見倉庫 docs/INSTALL.md。

配置與設置頁

設置頁路徑:設置 → 循環守衛(約每 5 秒刷新)。可改總開關、11 個閾值(時間類在界面按秒填寫)、「重試時降低推理檔位」開關,並查看統計、按規則分佈與最近觸發記錄。

配置分三層優先級(低 → 高):包內 cordis.patch.yml → $DSH_HOME/loop-guard-settings.json(未設 DSH_HOME 時爲 ~/.dsh/loop-guard-settings.json,僅在插件掛載時讀一次)→ 設置頁或 POST /loop-guard/config 寫盤。運行中直接改 JSON 文件不生效,需用設置頁或重啓宿主。

HTTP 端點(需 webServer):

方法 路徑 用途
GET /loop-guard/state 開關、可改配置、統計、最近觸發
POST /loop-guard/config 改配置
POST /loop-guard/reset 統計清零

資料強調 noOutput 在五條規則中最可能誤殺「長時間思考後纔出第一個產出」的正常請求;若有此類負載,應優先調大 noOutputMs。absolute 到 30 分鐘無條件切斷,屬於 deliberate 兜底。

適用場景與注意

適合誰:長期在 DSH 上跑多步智能體、且遇到過流卡死、推理洪水、重複退化或子會話被重試拖垮的開發者。

權限與安全:插件以當前 DSH 進程權限運行,安裝前應自行查看倉庫源碼與 MIT 許可證。社區插件目錄(如 SkillHub)與 DeepSeek / 幻方無官方從屬關係,不宜當作官方應用商店。

能力上限:上游連接徹底掛起時,iterator.return() 能否打斷掛起的 next() 取決於適配器實現;插件保證的是下游在超時時刻收到終結塊並結束自己的流。

結尾

dsh-loop-guard 用可配置的流式判據提前結束壞嘗試,並用 LOOP_GUARD 與有限糾正重試打斷默認多輪重試放大效應,配合可選推理降檔,把「卡死數十分鐘」收成「數秒內可判定的一次失敗」。查閱插件說明與源碼:

  • 目錄頁:https://www.skillhub.cn/plugins/zuaonew-ops/dsh-loop-guard
  • GitHub:https://github.com/zuaonew-ops/dsh-loop-guard

配套文檔:倉庫內 docs/INSTALL.md、docs/CONFIG.md、docs/FAQ.md。

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

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

小夜