dsh-deadman:DeepSeek Harness 的死手开关

前言

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 进程的权限运行,执行的命令完全由布防方指定。

核心功能

插件提供了三种工具命令和斜杠命令。

工具命令

  1. deadman_arm
    - 作用:布防。设置任务名称、执行命令、首次巡检时间、周期时间等。
    - 机制:首次在 after_minutes 后巡检;被报活则按 interval_minutes 重排;执行成功一次即自动收工。

  2. deadman_hold
    - 作用:报活。告诉插件”我还在干活”,跳过本轮执行。
    - 特性:任何会话都能报活(Fail-safe 语义)。

  3. deadman_disarm
    - 作用:撤防。仅布防会话或其直接子代理可用;其他会话需显式 force=true,且会被记入日志。

斜杠命令

  • /deadman:在当前会话布防。
  • /deadman all:在全部会话布防。
  • /deadman cancel <name>:取消指定任务。

工作原理

插件通过”活跃度”而非”状态”来判定是否执行命令。

  1. 解析属主会话:先获取会话。如果会话没打开,会尝试恢复,避免消息掉进黑洞。
  2. 投递巡检询问:向 agent 发送消息,要求对方二选一:报活或保持沉默。
  3. 巡检循环与判定:
    - 任一 agent 自上次巡检有新事件(session.seq 推进)⇒ 还在推进,继续等。
    - 全部无推进 ⇒ 开始计宽限 holdWindowSeconds。
    - 有”待用户回答的提问”(userQuestions 投影里 state === 'open')⇒ 单独计时,最长 questionBlockSeconds 后放行。
    - 从触发时刻起的总上限 maxHoldMinutes,到顶一律放行(Fail-open)。
  4. 执行命令:放行后执行命令。成功后任务自动收工并通知属主。

报活通道

  1. 使用 deadman_hold 工具。
  2. 在当前工作目录建标记文件 .deadman-hold-<name>。
  3. 在插件数据目录 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/)

适用场景与注意

适用场景

  • 夜间编译、训练、批量渲染等长任务。
  • 需要防止模型挂掉或额度耗尽后资源未被释放的场景。

注意事项

  1. 长期运行依赖:调度器活在 dsh 进程内。在 headless 一次性进程里布防,进程退出后没人巡检(除非之后有长驻实例启动时把它载入)。
  2. 单写者假设:tasks.json 是普通 JSON 文件,多进程同时写会互相覆盖。不要在多进程里同时布防。
  3. 权限控制:报活无权限限制(谁都能喊停),但撤防有权限限制。
  4. 数据持久化:重启不丢,但已执行的任务记录在 tasks.json 中。

结语

dsh-deadman 提供了与 dsh 内置 dsh-schedule 互补的能力:不依赖模型处理,直接执行命令,并具备”报活闸门”机制。它适合作为无人值守任务的”死手开关”。

插件目录:https://www.skillhub.cn/plugins/0gl20shk0sbt36/dsh-timer-task
GitHub:https://github.com/0gl20shk0sbt36/dsh-timer-task

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

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

小夜