会话心跳(/heartbeat)

/heartbeat 为当前会话设置一条周期性指令。每当会话空闲且间隔已到,该提示词就会作为一次普通用户回合触发——同一段对话、同一份上下文、同一个提示词缓存。

/heartbeat every 10m 检查部署状态并报告有意义的变化

灵感来自 Prime-Agent 的 /heartbeat。Hermes 的改编保留了严格的消息流不变式:心跳只在回合之间注入(绝不会在运行中途),以一条普通的 user 角色消息形式出现。

心跳 vs cron:我该用哪个?

二者看似相似,但职责不同:

/heartbeathermes cron
运行于本段对话——完整上下文、对讨论的记忆每次触发都是全新的隔离会话
能否跨进程重启存活状态存活(SessionDB);重启后网关 watch 自动恢复是——完全持久化的调度器
数量每个会话一条不限数量的任务
最适合"我们干活的同时,在这条线程里盯着 X"常驻任务、报告、看门狗、投递

经验法则:如果周期性提示词需要对话上下文,用 /heartbeat。如果是自包含的任务,用 cron。

命令

命令作用
/heartbeat every <间隔> <提示词>设置(或替换)会话的心跳。间隔:90s、10m、2h、1d(最短 60s)。
/heartbeat 或 /heartbeat status显示心跳内容、间隔及距下次触发的时间。
/heartbeat pause暂停触发但不清除。
/heartbeat resume恢复(重新锚定计时器——不会立即触发陈旧的一次)。
/heartbeat clear移除心跳。

/hb 是别名。在 CLI、TUI / 桌面应用以及网关平台上均可用(在 Slack 上使用 /hermes heartbeat …)。

行为细节

  • 仅在空闲时。 心跳绝不会打断正在运行的回合。如果 tick 到期时 agent 正忙,它会在下一次空闲轮询时触发。在网关中,被 watch 的空闲会话会被主动唤醒;无需新的入站消息。
  • 错过的 tick 合并。 如果会话在多个间隔期间一直忙碌(或进程未运行),你只会得到一个心跳回合,而非积压。计时器每次触发都重新锚定。
  • 用户消息优先。 排队的用户消息总是优先;心跳会等待输入队列排空。
  • 由设置它的界面拥有。 从某个消息聊天设置的心跳,即使同一会话在 TUI / 桌面应用中打开着,也会从网关触发并回复到该聊天;查看端绝不会认领这个 tick。
  • 缓存安全。 注入的提示词是一条普通用户消息。不改动系统提示词,不改变工具集。
  • 网关恢复。 启动时使用当前持久化的对话和线程路由、在所属 profile 中恢复活跃心跳。每次轮询都会在临时存储故障或适配器停机后重试恢复;已暂停和已清除的心跳、以及挂起的对话不会重启。无需新的聊天消息。
  • 持久化与对话边界。 状态存于 SessionDB.state_meta,以 heartbeat:<session_id> 为键,并跟随上下文压缩的会话轮转。在消息网关中,通过 reset、切换或挂起离开对话会清除其心跳;恢复该已归档对话不会让它复活。触发要求属主进程(CLI 会话或网关)正在运行。已被接纳的网关 tick 在会话解析后、agent 执行前会再次检查:它可能跟随一个压缩子会话,但不能把旧指令带入已 reset 或已切换的对话。
  • 执行记账。 网关在适配器接纳时为到期 tick 预留配额。若该次尝试在进入 agent 运行器之前结束(包括取消,或路由、鉴权、紧急停止、准备阶段的拒绝),只要此后调度未变,就退还该 tick。一旦进入 agent 运行器,即使执行失败或被中断,这次触发仍计入。这个计数不代表模型成功响应或出站投递成功;进程突然死亡可能阻止退还回调。
  • 无话可说时保持安静(网关)。 计划内的心跳回合可能以一个裸的静默标记(NO_REPLY / [SILENT])结束:网关不发送任何内容,这与仅返回标记的人类消息不同(后者仍会出现可见的"请重试"提示)。心跳运行期间不发布输入指示器、工具进度、流式草稿或"仍在处理"气泡;它最终投递的结果会路由到聊天/话题,且不引用设置心跳的那条消息。审批提示和失败仍保持可见。
  • 不凭空造活的守卫。 注入的提示词要求 agent 在没有有意义变化时简短回复并停止,这样空闲心跳不会产生忙务。

示例

你:/heartbeat every 15m 检查 PR #1234 的 CI 运行是否结束;结束后总结结果

  ♥ 心跳已设置(每 15m):检查 PR #1234 的 CI 运行是否结束;……

[你在同一会话中处理其他事务的 15 分钟]

Hermes:[心跳——周期性指令,每 15m 触发]
  💻 gh pr checks 1234   (1.2s)
  CI 仍在运行(37 项检查完成 14 项)。暂无内容可报告。

当答案不再变化时,用 /heartbeat clear 清除它——或者让它继续守着。