用 dsh-auto-continue 在 DeepSeek Harness 裏自動續上中斷的請求

前言

用 DeepSeek Harness(CLI 名 dsh)跑一輪稍長的 Agent 任務時,最常見的打斷往往不是你主動點了停止,而是網絡抖動、上游超時、5xx 或輸出觸到 token 上限。Web UI 裏這一輪已經結束,會話日誌停在失敗處;要讓模型接着幹,習慣做法是自己再打一句「繼續」發出去。任務一長,這件事就會反覆出現。

DeepSeek Harness 的設計原則是「一切皆插件」:模型、工具、會話、UI 都可以在配置層替換,不必改核心源碼。社區因此出現了一批獨立插件目錄,其中 deepseek-harness-plugin.com 是第三方收錄站點,與 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。本文介紹的 dsh-auto-continue 就列在該目錄的「界面增強」分類裏。

下面按目錄詳情頁、GitHub 倉庫 README、package.json 和 npm 頁面交叉覈對後整理:它是什麼、會自動續哪些錯誤、怎麼裝、怎麼配。

這是什麼

dsh-auto-continue 是給 dsh web 用的 Web UI 插件,由 HsiangNianian 維護,許可證 MIT。npm 上的包名是 dsh-client-auto-continue,當前版本 0.6.0(2026-08-16 發佈)。GitHub 倉庫截至 2026-08-17 爲 23 星;社區目錄頁同期仍顯示 12 星,以倉庫一手數據爲準。

它要解決的問題很具體:當 Web GUI 裏的請求因爲非人爲原因中斷時,插件在瀏覽器裏模擬用戶輸入「繼續」併發送。這條消息會進入會話日誌,對模型可見,效果和你自己點發送一樣,中斷的工作可以接着跑。

它不是 Agent 循環本身,也不改 Harness 核心。插件在瀏覽器端掛上額外的事件監聽,再調用和「發送」按鈕相同的 sessions.prompt。倉庫 README 寫明:它不碰文件、不碰憑據,也不訪問 dsh 宿主以外的網絡。

核心功能

倉庫把恢復策略都做成可配置項,默認行爲如下。

錯誤分類

打開分類(默認開啓)後,插件只自動續臨時性失敗,例如網絡錯誤、超時、5xx、429。下面這類會被當成永久性錯誤:跳過自動續跑,並可以發通知——

  • HTTP 狀態碼 401 / 403
  • code 或 message 命中認證、憑據 / API Key、餘額 / 配額、模型不存在、上下文長度 / 超限等關鍵詞

關掉分類後,符合觸發條件的中斷都會自動繼續。認證失敗、額度用盡這類問題,重試通常沒有意義,默認把它們排除是合理的。

自適應退避

同一會話連續失敗時,等待時間按「冷卻 × 係數」遞增。默認冷卻 20 秒、係數 2,也就是 20s → 40s → 80s,上限默認 300000 ms(5 分鐘)。失敗嘗試也計入冷卻,避免對已經故障的上游連續打請求。

模板化「繼續」文本

默認發送的就是「繼續」。continueText 支持佔位符,可以把失敗上下文帶進續跑消息,例如:

繼續 ({tool}: {code})

可用佔位符包括 {code}{message}{status}{tool}(失敗前最後一次工具調用)、{turn}{errorCount}(連續失敗次數,含本次)、{sessionTitle}{elapsed}(距失敗經過的時間,如 1m5s)。達到輸出 token 上限時,使用另一套模板 continueTextMaxTokens,README 給的示例是「繼續輸出, 不要重複已生成的內容」。

冪等護欄

續跑前可以檢查上一步工具調用,避免把「可能已經執行過」的操作再跑一遍:

  • 結果未確認(回合在工具執行中途夭折,例如一次 git push 不確定是否已經推上去):提示模型先確認狀態,不要重複執行
  • 工具已確認成功:說明已完成,請勿重複
  • 工具失敗:不加護欄,因爲重試本來就是目的

兩段護欄文本都可以改,支持 {tool} / {result} 佔位符。

暫停、通知和統計

設置卡片裏有全局「暫停自動繼續」開關,打開後即時監聽和啓動掃描都立刻停掉。通知裏還可以按會話暫停 1 小時,或點「立即續跑」(無視冷卻和連續次數上限)。

卡片上還有今日統計:自動繼續次數、恢復成功、繼續後失敗、永久性跳過、達上限停止,可按錯誤碼看分佈,並能一鍵清零。瀏覽器通知默認關閉,打開後會在自動繼續成功、放棄或遇到永久性錯誤時提醒;首次使用時請求權限,拒絕後不再彈出。

監聽哪些事件

插件在瀏覽器裏額外打開兩條 SSE:events.mux(會話事件)和 events.host(宿主事件)。宿主支持多消費者,不會擠掉內置運行時。它對下面幾種結束狀態作出反應:

事件 含義
turn/enderror 回合失敗(模型 / 網絡 / 超時等)
turn/endinterrupted 宿主崩潰重啓後留下的中斷回合,由啓動掃描恢復
turn/endmax-tokens 達到輸出 token 上限
host/agent-error 沒有回合位置的 Agent 失敗;僅網絡 / 超時類消息會自動續跑

下面這些情況不會自動繼續:用戶主動停止(aborted)、策略拒絕(blocked);即時流裏的 interrupted(該標記只在宿主重載時由崩潰修復寫入,孤兒回合走啓動掃描,不走即時路徑);宿主已經自行恢復的會話;正在運行或已有排隊消息的會話;子代理會話;仍處於冷卻期或已達到連續次數上限的會話。

檢測到中斷後,插件先等一段寬限期(默認 3 秒)。這段時間裏如果宿主自己發起了新回合(turn/start),自動繼續就會取消,然後再以 queue 模式調用 sessions.prompt

頁面加載或重連時,還會掃描最近更新的會話:最後一個回合在掃描時間窗內(默認 15 分鐘)以非人爲原因結束、之後又沒有新的 turn/start 或用戶消息,也會被續上。這能覆蓋「瀏覽器關着、宿主卻崩了」這類情況。多個標籤頁同時打開時,用 localStorage 互斥鎖加上每會話冷卻記錄,保證只有一個標籤頁發送,避免兩條「繼續」疊在一起。

安裝與啓用

DSH 插件裝進 profiledsh web 對應的是 web profile。裝完後需要再啓動一次 dsh web

社區目錄頁給出的安裝命令原文如下,在 DeepSeek Harness 終端裏執行即可:

dsh plugin add github:HsiangNianian/dsh-auto-continue

目錄頁同時提示:如需可復現安裝,請固定 commit 哈希。當前 main 分支最新提交是 98181b0e5e0afd33ca89b314fc3957a2634602e4(將版本升到 0.6.0),寫法是:

dsh plugin add github:HsiangNianian/dsh-auto-continue#98181b0e5e0afd33ca89b314fc3957a2634602e4

倉庫 README 寫得更完整:插件要進 web profile,並推薦優先走 npm(包名 dsh-client-auto-continue)。從 GitHub 默認分支安裝會跟蹤 main,適合跟最新改動;要相對穩定,用 npm。

# README 推薦:從 npm 安裝
dsh plugin --profile web add dsh-client-auto-continue
dsh web

# 或直接從 GitHub 安裝(構建產物已提交,不必本地 clone)
dsh plugin --profile web add github:HsiangNianian/dsh-auto-continue
dsh web

從倉庫本地安裝需要 Node.js ≥ 18,先 npm installnpm run build,再用 dsh plugin --profile web add link:$(pwd)。包自帶 cordis.patch.yml,插件行會自動註冊。

驗證配置層是否掛上:

dsh --profile web --dump-config | grep auto-continue

瀏覽器控制檯(Ctrl/Cmd+Shift+I)裏應出現類似 [auto-continue] 已啓動(文本="繼續", …) 的日誌。之後每次檢測到中斷和自動發送都會再打日誌。

卸載(npm / 倉庫安裝):

dsh plugin --profile web remove dsh-client-auto-continue
dsh web

典型用法

裝好並打開 dsh web 之後,插件按默認值工作:中斷後等 3 秒,若宿主沒有自行恢復,就發送「繼續」;同一會話最多連續自動續 3 次;只續臨時性錯誤。

需要改行爲時,打開 設置 → 插件,找到 dsh-client-auto-continue 配置卡片。卡片改動是暫存式的,點「保存」才寫入磁盤。也可以直接改 ~/.dsh/settings.yaml 裏的 auto-continue 段,文件會被監聽,保存後即時生效;已經打開的頁面如果沒反應,重啓 dsh web。下面是 README 給出的默認配置,未填寫的字段會回落到這些值:

auto-continue:
  paused: false
  continueText: '繼續'
  continueTextMaxTokens: '繼續'
  guardTools: true
  guardPendingText: '(上一步工具「{tool}」可能未完成, 先確認狀態再繼續, 不要重複執行)'
  guardDoneText: '(上一步工具「{tool}」已完成, 結果: {result}; 不要重複執行, 直接繼續)'
  graceMs: 3000
  cooldownMs: 20000
  maxConsecutive: 3
  scanOnBoot: true
  scanLimit: 8
  freshMs: 900000
  reconnectScanDelayMs: 5000
  reconnectBackoffMs: 3000
  verbose: true
  classify: true
  backoffFactor: 2
  backoffMaxMs: 300000
  notify: false

幾個常用改法:

  1. 希望 token 超限後續寫、且不要重複已生成內容,把 continueTextMaxTokens 改成 README 示例那種提示。
  2. 希望續跑消息帶上失敗原因,把 continueText 改成 繼續 ({tool}: {code})
  3. 臨時關掉自動續跑,把 paused 設爲 true,或在設置卡片裏打開「暫停自動繼續」。
  4. 需要桌面提醒時打開 notify

倉庫 README 還提到一項 DSH 0.1.0-rc.6 的已知限制:Web UI 設置區目前只暴露 @deepseek-ai/dsh-host-apiproxy 包裏硬編碼白名單中的命名空間。在上游改成 settings.register() 驅動之前,如果卡片不出現,可以執行一次冪等補丁,讓所有插件註冊的命名空間都可見:

npx --yes --package dsh-client-auto-continue patch-expose
dsh web

自動續跑引擎本身不依賴這個補丁,隻影響 GUI 設置區是否顯示。補丁打不上時,直接改 ~/.dsh/settings.yaml 即可。重新安裝 dsh 後需要再跑一次該腳本。

適用場景與注意事項

適合已經在用 dsh web、任務經常被網絡或超時打斷、又不想每次手動打「繼續」的人。它只作用於 Web UI 會話,不會去續子代理,也不會在用戶主動停止或策略攔截時強行重試。

使用前注意這幾件事:

  1. 權限與來源。插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源代碼倉庫和許可證。本文覈對過的許可證是 MIT,源碼在 HsiangNianian/dsh-auto-continue。社區目錄頁也寫了同一條警告。
  2. 它不會替你判斷任務該不該繼續。分類能擋住認證、餘額、模型不存在這類永久性錯誤,但臨時性失敗被續上之後,模型仍可能重複或接錯上下文。冪等護欄只是在續跑文本里提示,不是事務回滾。
  3. 連續上限。默認同一會話連續自動續 3 次就會停,直到你介入或出現一次成功回合。上游持續故障時,應先查網絡和 API,而不是把 maxConsecutive 調到很大。
  4. 設置卡片可能看不到。若你用的是 0.1.0-rc.6 附近的 dsh,先按上一節補丁處理,或改 yaml。
  5. 卸載後配置段落會留在 ~/.dsh/settings.yaml,倉庫說明這是無害的,要清理需手動刪除。

小結

dsh-auto-continue 做的事情很窄:在 dsh web 裏把「網絡等原因把一輪打斷、人再補一句繼續」自動化,並配上錯誤分類、退避、護欄和啓動掃描。它不替代你對任務對錯的判斷,只減少重複的手動發送。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-auto-continue/

GitHub:https://github.com/HsiangNianian/dsh-auto-continue

npm:https://www.npmjs.com/package/dsh-client-auto-continue

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

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

小夜