前言¶
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