前言¶
在 DeepSeek Harness(DSH)裏跑 agent 循環時,有時會出現這樣一種收尾:界面上只有一個思考氣泡,標記爲「已完成」,正文和工具調用都沒有。DSH 看到「沒有工具調用、也沒有文本」,會按正常完成處理,無法區分「模型認爲不需要回答」和「模型卡死說不出話」。維護者 nlflora 的插件 dsh-empty-turn-guard 專門監聽回合結束前的鉤子,用純結構判斷認出這類輪次,並在同一輪裏 steer 一條提示,讓循環再走一步。下面介紹它的定位、安裝與配置。
這是什麼¶
@nlflora/dsh-empty-turn-guard(GitHub:nlflora/dsh-empty-turn-guard)是 DSH 社區插件,當前版本 0.1.0,MIT 許可證。它監聽 agent/turn-stopping,在模型整輪只產出 reasoning、既沒有正文也沒有調用任何工具時介入,避免 agent 把空回合當作正常完成。
插件不調用裁判模型,只靠若干布爾條件做結構判斷,因此不會爲判定額外消耗 token。
它治的是什麼問題¶
作者在 216 個會話、13758 條 assistant 消息裏統計到 49 例「只有思考、沒有輸出」。按結束原因大致分爲:max-tokens(思考佔滿輸出額度)、aborted(用戶中斷)、completed(正常結束但零輸出)。本插件主要針對最後一類,以及因思考過長撞到輸出上限、尚未寫到正文的情況。
典型「思考退化」包括模型側重複循環,例如英文裏反覆出現 “Let me go / the tool call / the script”,或中文裏連續重複的「做。」——DSH 仍可能以 completed 收尾。
需要與同類插件區分:dsh-loop-continue 處理的是模型寫了「現在要重新應用修改」卻忘記調工具的場景,且要求本回合此前至少調用過一次工具、結束在只有文本的 step。空回合場景往往一個字都沒有,首次 step 就可能卡死,兩條門檻都不滿足,因此單獨做成 dsh-empty-turn-guard。另外,dsh-loop-continue 需要裁判模型做主觀判斷;本插件用三個布爾值即可,不產生額外模型調用。
核心功能與判定規則¶
要觸發補救,必須同時滿足:
- 本輪沒有非空
text塊; - 本輪沒有
tool-call塊; - 本輪至少有一條 assistant 消息;
- 思考文字長度 ≥ 配置項
minReasoningChars(默認 40)。
任一不滿足則放行,回合正常結束。只調工具、不說話的 step 帶有 tool-call,不會被誤傷。
補救時在同一輪內 steer 提示;maxContinuations 限制每輪最多補救次數,防止無限循環。可選重複檢測(detectRepetition)主要影響日誌裏的原因標註;是否撞到輸出 token 上限可參考 assumedMaxOutputTokens(默認 4096),並選用不同的內置 steer 文案(常規 vs 要求壓縮思考)。
插件明確不做的事:不改模型行爲,不能保證下一次不犯同樣錯誤;不處理用戶主動 aborted 的輪次;不增加裁判模型調用。
安裝與啓用¶
在指定 profile 下安裝(命令來自項目 README):
dsh plugin --profile <profile> add @nlflora/dsh-empty-turn-guard
本地開發可鏈接目錄:
dsh plugin --profile <profile> add link:/path/to/dsh-empty-turn-guard
運行環境要求(見 package.json):Node.js >= 22,DSH >= 0.2.1-rc.1;peer 依賴 @deepseek-ai/cordis ^4.0.1,@deepseek-ai/dsh-llm 爲可選。
在 profile 的 cordis.patch.yml 裏按插件 id empty-turn-guard 覆蓋配置,例如:
- id: empty-turn-guard
config:
enabled: true
maxContinuations: 2 # 每輪最多補救幾次
minReasoningChars: 40 # 思考少於這個字數就不管
detectRepetition: true # 是否檢測重複退化
repetitionMinRepeats: 6 # 同一短語連續重複多少次算退化
assumedMaxOutputTokens: 4096
debug: false
| 字段 | 默認 | 說明 |
|---|---|---|
enabled |
true |
總開關 |
maxContinuations |
2 |
每輪最多補救次數 |
minReasoningChars |
40 |
思考太短視爲「選擇不回答」,不干預 |
detectRepetition |
true |
是否做重複檢測(日誌原因標註) |
repetitionMinRepeats |
6 |
退化重複次數閾值 |
assumedMaxOutputTokens |
4096 |
判斷是否撞到輸出上限 |
steerText |
內置 | 常規補救提示,可整段替換 |
steerTextCapped |
內置 | 撞到輸出上限時的提示 |
debug |
false |
打印每次判定 |
典型用法與適用場景¶
典型用法是:在經常遇到 reasoning 模型或長思考鏈的 agent profile 上啓用插件,保持默認配置先試;若仍頻繁撞到 4096 輸出上限,可調整 assumedMaxOutputTokens 或自定義 steerTextCapped;若誤觸發過多,可提高 minReasoningChars 或降低 maxContinuations。
適合:自建 DSH agent、希望減少「界面顯示已完成卻沒有任何可讀輸出」的開發者。不適合指望插件根治模型重複退化——它只能事後 steer 一步。
注意:DSH 插件在當前 dsh 進程權限下運行;安裝前請自行查看 GitHub 源碼與 MIT 許可證。社區目錄站點與 DeepSeek / 幻方無官方從屬關係,可按目錄頁瀏覽同類插件,但不必當作官方應用商店。
結尾¶
dsh-empty-turn-guard 用結構化的 turn-stopping 判定,在零文本、零工具調用的空回合上多給 agent 一次機會,且不加裁判模型開銷。目錄頁:https://www.skillhub.cn/plugins/nlflora/dsh-empty-turn-guard ;源碼與完整說明:https://github.com/nlflora/dsh-empty-turn-guard 。