dsh-empty-turn-guard:兜住「只有思考、零輸出」的空回合

前言

在 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 需要裁判模型做主觀判斷;本插件用三個布爾值即可,不產生額外模型調用。

核心功能與判定規則

要觸發補救,必須同時滿足:

  1. 本輪沒有非空 text 塊;
  2. 本輪沒有 tool-call 塊;
  3. 本輪至少有一條 assistant 消息;
  4. 思考文字長度 ≥ 配置項 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 。

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

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

小夜