sidebar_position: 17 title: “Session Heartbeats” description: “A recurring prompt that re-enters your current session whenever it’s idle — /heartbeat every 10m Check the deployment.”
会话心跳检测(/heartbeat)
/heartbeat 会为当前会话发送一条周期性指令。每当会话处于空闲状态且达到预设的时间间隔后,系统就会像普通用户轮次一样触发提示——对话内容、上下文以及提示词缓存均保持不变。
/heartbeat every 10m Check the deployment and report meaningful changes
该机制灵感源自 Prime-Agent 的 /heartbeat 功能。Hermes 版本严格遵循了消息流的约束规则:心跳信号仅会在对话轮次之间发送(绝不会在任务执行过程中插入),且以普通的用户-角色消息形式呈现。
Heartbeat 与 cron:我该选哪个?
二者外观相似,但功能各异:
/heartbeat | hermes cron | |
|---|---|---|
| 执行场景 | 当前对话——保留完整上下文及讨论历史 | 每次触发都会启动一个全新的独立会话 |
| 进程重启后状态 | 状态得以保留(存储在 SessionDB 中);网关会在重启后自动恢复任务 | 是——具备完全持久化的调度能力 |
| 任务数量 | 每个会话仅一个 | 无限制的任务数量 |
| 最佳适用场景 | “在我们处理任务的同时,持续监控当前对话中的X内容” | 长期运行的任务、报告生成、监控功能以及定时交付任务 |
经验法则:如果周期性任务需要依赖对话上下文,请使用 /heartbeat;若是独立运行的任务,则适合使用 cron。
命令说明
| 命令 | 功能 |
|---|---|
/heartbeat every <间隔时间> <提示语> | 设置(或替换)会话的心跳信号。支持的间隔时间为:90s、10m、2h、1d(最小间隔为 60 秒)。 |
/heartbeat 或 /heartbeat status | 显示当前心跳信号的间隔时间以及下一次触发时间。 |
/heartbeat pause | 暂停发送心跳信号,但不会清除现有设置。 |
/heartbeat resume | 恢复心跳信号的发送(重新启动计时器——不会立即发送过期数据)。 |
/heartbeat clear | 删除当前的心跳信号设置。 |
/hb 是该命令的别名。该功能在 CLI、TUI/桌面应用以及网关平台上均可使用(在 Slack 上则需使用 /hermes heartbeat …)。
行为细节
- 仅空闲时触发。心跳信号不会中断正在处理的轮次。若在预定时间点代理处于忙碌状态,它将在下一次空闲时再发送心跳信号。在网关端,处于监控状态的会话会主动恢复活跃状态,无需新的入站消息。
- 错过的计时间隔合并处理。如果某个会话在多个时间间隔内一直处于忙碌状态(或进程未运行),系统只会触发一次心跳信号,而不会累积未处理的信号。计时器会在每次发送心跳时重新校准。
- 用户消息优先。已排队的用户消息始终具有最高优先级;心跳信号会等待输入队列中的消息处理完毕。
- 缓存安全。注入的提示内容属于普通用户消息,系统不会对其进行任何修改,也不会更改工具集配置。
- 网关自动恢复。系统启动时会利用当前保存的对话记录和线程路由信息,在对应的用户配置文件中恢复活跃的心跳信号发送。在临时存储故障或适配器停机后,系统会自动尝试恢复;而已暂停或清除的心跳信号以及挂起的对话不会自动重启,也无需新的聊天消息。
- 状态持久性与对话边界。状态存储在
SessionDB.state_meta中,键名为heartbeat:<session_id>,并会随着上下文压缩后的对话轮转而变化。在消息网关中,通过重置、切换或暂停来结束当前对话会清除其心跳信号;即便之后恢复该已归档的对话,也无法使其重新活跃。触发任务需要对应的进程(CLI 会话或网关)处于运行状态。在会话解析完成且代理开始执行之前,系统会再次检查该网关是否已被纳入调度列表:它虽可跟随压缩后的子对话继续运行,但无法将其原有的指令带入新的重置或切换后的对话中。 - 执行计数机制。网关在适配器被接纳时会预留一个指定的调度时段。如果该次尝试在进入代理执行阶段之前就结束(包括取消操作,或是路由失败、授权拒绝、紧急停止或准备阶段被驳回),除非后续调度计划发生变动,否则该预留时段将会被退还。一旦进入代理执行阶段,即便任务执行失败或被中断,该计时仍会被计入。但这一计数并不代表模型已成功响应或消息已成功发送;进程的突然终止可能会导致退还操作的回调无法执行。
- 避免无效工作的保护机制。系统会注入特定提示,要求代理仅作简短回复,并在未出现任何有意义的变化时立即停止,从而避免因空闲的心跳信号而产生不必要的处理工作。
示例
You: /heartbeat every 15m Check whether the CI run for PR #1234 finished; summarize the result when it does
♥ Heartbeat set (every 15m): Check whether the CI run for PR #1234 finished; ...
[15 minutes of you working on other things in the same session]
Hermes: [Heartbeat — recurring instruction, fires every 15m]
💻 gh pr checks 1234 (1.2s)
CI is still running (14/37 checks complete). Nothing to report yet.
当答案不再发生变化时,可使用 /heartbeat clear 停止其监测——或者让它继续保持监控状态。