前言¶
DeepSeek Harness (DSH) 的理念是「一切皆插件」。在智能體開發中,我們經常需要運行無人值守的長任務,例如夜間編譯、模型訓練或批量渲染。
Dsh 內置的 dsh-schedule 機制雖然可以投遞消息,但它是被動的:它會投遞一條消息讓模型決定幹什麼,但如果模型進程掛掉或額度耗盡,內置機制往往無法及時止損。
我們需要一種主動的機制:定期巡檢”還有人活着幹活嗎”,如果沒人報活,就直接執行 shell 命令來收掉資源。這就是 dsh-deadman 插件要解決的問題。
插件介紹¶
dsh-deadman 是 DeepSeek Harness (DSH) 的死手開關(deadman switch)插件,由用戶 0gl20shk0sbt36 維護。
它的核心邏輯是:佈防後定期巡檢,如果沒有人”報活”,就執行你預先指定的命令。這適合那些”活兒幹完/掛掉了,自動關機”的場景。
安裝與啓用¶
該插件要求 DSH 版本 0.2.0-rc.2(依賴精確鎖定)。在 Web / 桌面端,安裝後需在插件頁啓用 dsh-deadman。
在 CLI 中安裝(以 profile web 爲例):
dsh plugin --profile web add github:0gl20shk0sbt36/dsh-deadman
卸載命令:
dsh plugin --profile <name> remove dsh-deadman
注意:
1. 必須裝在長期運行的 profile(如 web)裏纔有意義。調度器活在 dsh 進程內,如果是 headless 的一次性進程,進程退出後沒人巡檢。
2. 安裝前請檢查源碼與許可證。
3. 插件以當前 dsh 進程的權限運行,執行的命令完全由佈防方指定。
核心功能¶
插件提供了三種工具命令和斜槓命令。
工具命令¶
-
deadman_arm
- 作用:佈防。設置任務名稱、執行命令、首次巡檢時間、週期時間等。
- 機制:首次在after_minutes後巡檢;被報活則按interval_minutes重排;執行成功一次即自動收工。 -
deadman_hold
- 作用:報活。告訴插件”我還在幹活”,跳過本輪執行。
- 特性:任何會話都能報活(Fail-safe 語義)。 -
deadman_disarm
- 作用:撤防。僅佈防會話或其直接子代理可用;其他會話需顯式force=true,且會被記入日誌。
斜槓命令¶
/deadman:在當前會話佈防。/deadman all:在全部會話佈防。/deadman cancel <name>:取消指定任務。
工作原理¶
插件通過”活躍度”而非”狀態”來判定是否執行命令。
- 解析屬主會話:先獲取會話。如果會話沒打開,會嘗試恢復,避免消息掉進黑洞。
- 投遞巡檢詢問:向 agent 發送消息,要求對方二選一:報活或保持沉默。
- 巡檢循環與判定:
- 任一 agent 自上次巡檢有新事件(session.seq推進)⇒ 還在推進,繼續等。
- 全部無推進 ⇒ 開始計寬限holdWindowSeconds。
- 有”待用戶回答的提問”(userQuestions投影裏state === 'open')⇒ 單獨計時,最長questionBlockSeconds後放行。
- 從觸發時刻起的總上限maxHoldMinutes,到頂一律放行(Fail-open)。 - 執行命令:放行後執行命令。成功後任務自動收工並通知屬主。
報活通道¶
- 使用
deadman_hold工具。 - 在當前工作目錄建標記文件
.deadman-hold-<name>。 - 在插件數據目錄
hold/下建以任務名命名的文件。
配置項¶
配置寫在 profile 的 cordis.patch.yml 裏:
- id: deadman
config:
holdWindowSeconds: 60
| 鍵 | 默認值 | 說明 |
|---|---|---|
holdWindowSeconds |
60 | 全部 agent 無推進後,再等多久執行 |
checkIntervalSeconds |
20 | 巡檢週期 |
maxHoldMinutes |
30 | 從觸發起的總上限,到頂一律放行 |
questionBlockSeconds |
600 | 被”待回答的提問”卡住時的最長等待 |
onUndeliverable |
execute | 屬主會話徹底投遞不到時的行爲:execute 或 skip |
progressScope |
global | 活躍度判據範圍:global(整機)或 owner(僅屬主) |
serializeCommands |
false | 多條動作命令是否排隊串行執行 |
commandTimeoutSeconds |
300 | 單條動作命令的執行超時 |
dataDir |
$DSH_HOME/plugins/dsh-deadman | 數據目錄(tasks.json + hold/) |
適用場景與注意¶
適用場景¶
- 夜間編譯、訓練、批量渲染等長任務。
- 需要防止模型掛掉或額度耗盡後資源未被釋放的場景。
注意事項¶
- 長期運行依賴:調度器活在 dsh 進程內。在 headless 一次性進程里布防,進程退出後沒人巡檢(除非之後有長駐實例啓動時把它載入)。
- 單寫者假設:
tasks.json是普通 JSON 文件,多進程同時寫會互相覆蓋。不要在多進程裏同時佈防。 - 權限控制:報活無權限限制(誰都能喊停),但撤防有權限限制。
- 數據持久化:重啓不丟,但已執行的任務記錄在
tasks.json中。
結語¶
dsh-deadman 提供了與 dsh 內置 dsh-schedule 互補的能力:不依賴模型處理,直接執行命令,並具備”報活閘門”機制。它適合作爲無人值守任務的”死手開關”。
插件目錄:https://www.skillhub.cn/plugins/0gl20shk0sbt36/dsh-timer-task
GitHub:https://github.com/0gl20shk0sbt36/dsh-timer-task