Heartbeat(Gateway)
Heartbeat vs Cron? 参见 Cron vs Heartbeat 了解何时使用。Heartbeat 会在主会话中运行周期性 agent 回合,让模型在不骚扰的情况下提示需要关注的事项。
快速开始(新手)
- 保持 heartbeat 开启(默认
30m,Anthropic OAuth/setup-token 为1h)或自定频率。 - 在 agent workspace 创建小型
HEARTBEAT.md清单(可选但推荐)。 - 决定 heartbeat 消息投递位置(默认
target: "last")。 - 可选:开启 heartbeat 推理投递以增加透明度。
- 可选:仅在活跃时段运行(本地时间)。
默认值
- 间隔:
30m(或检测到 Anthropic OAuth/setup-token 时为1h)。设置agents.defaults.heartbeat.every或 per-agentagents.list[].heartbeat.every;用0m禁用。 - 提示词正文(可通过
agents.defaults.heartbeat.prompt配置):Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK. - Heartbeat 提示词逐字作为用户消息发送。System prompt 包含 “Heartbeat” 小节并在内部标记该运行。
- 活跃时段(
heartbeat.activeHours)按配置时区判断;窗口外跳过,直到下一次 tick 进入窗口。
Heartbeat 提示词的用途
默认提示词刻意宽泛:- 后台任务:“Consider outstanding tasks” 促使 agent 复查待办(收件箱、日程、提醒、排队工作)并提示紧急事项。
- 人类 check-in:“Checkup sometimes on your human during day time” 促使偶尔轻量问候,但会遵循你的本地时区,避免夜间打扰(见 /concepts/timezone)。
agents.defaults.heartbeat.prompt(或 agents.list[].heartbeat.prompt)为自定义正文(逐字发送)。
响应约定
- 若无需关注事项,回复
HEARTBEAT_OK。 - 在 heartbeat 运行中,OpenClaw 仅当
HEARTBEAT_OK出现在回复开头或结尾时视为 ack。该 token 会被剥离,若剩余内容**≤ackMaxChars**(默认 300)则丢弃回复。 - 若
HEARTBEAT_OK出现在回复中间,不作特殊处理。 - 对告警,不要包含
HEARTBEAT_OK;只返回告警文本。
HEARTBEAT_OK 会被剥离并记录;仅包含 HEARTBEAT_OK 的消息会被丢弃。
配置
作用域与优先级
agents.defaults.heartbeat设置全局 heartbeat 行为。agents.list[].heartbeat在其上合并;若任一 agent 有heartbeat块,则只有这些 agents运行 heartbeat。channels.defaults.heartbeat设置所有渠道的可见性默认。channels.<channel>.heartbeat覆盖渠道默认。channels.<channel>.accounts.<id>.heartbeat(多账号渠道)覆盖 per-channel 设置。
Per-agent heartbeats
若任一agents.list[] 条目包含 heartbeat,则只有这些 agents运行 heartbeat。per-agent 块会在 agents.defaults.heartbeat 之上合并(因此可设置共享默认,并按 agent 覆盖)。
示例:两个 agents,只有第二个运行 heartbeat。
字段说明
every:heartbeat 间隔(duration 字符串;默认单位=分钟)。model:heartbeat 运行的可选模型覆盖(provider/model)。includeReasoning:启用后,当可用时也会投递单独的Reasoning:消息(与/reasoning on同形)。session:heartbeat 运行的可选 session key。main(默认):agent 主会话。- 显式 session key(可从
openclaw sessions --json或 sessions CLI 复制)。 - Session key 格式见 Sessions 与 Groups。
target:last(默认):投递到上一次使用的外部渠道。- 显式渠道:
whatsapp/telegram/discord/googlechat/slack/msteams/signal/imessage。 none:运行 heartbeat 但不对外投递。
to:可选接收方覆盖(渠道特定 id,例如 WhatsApp E.164 或 Telegram chat id)。prompt:覆盖默认提示词正文(不合并)。ackMaxChars:HEARTBEAT_OK之后允许的最大字符数,超过则投递。
投递行为
- Heartbeat 默认在 agent 主会话运行(
agent:<id>:<mainKey>),或当session.scope = "global"时为global。设置session可覆盖到特定渠道会话(Discord/WhatsApp 等)。 session只影响运行上下文;投递由target与to控制。- 若需投递到特定渠道/接收方,设置
target+to。当target: "last"时,投递使用该会话最后一个外部渠道。 - 若主队列繁忙,heartbeat 会跳过并稍后重试。
- 若
target解析不到外部目的地,仍会运行但不发送外部消息。 - 仅 heartbeat 回复不会延长会话存活;
updatedAt会恢复,以保持空闲过期逻辑。
可见性控制
默认情况下,HEARTBEAT_OK ack 会被抑制,而告警内容会投递。你可按渠道或账号调整:
每个标志的作用
showOk:模型返回仅 OK 的回复时发送HEARTBEAT_OKack。showAlerts:模型返回非 OK 回复时发送告警内容。useIndicator:为 UI 状态表面发出 indicator 事件。
按渠道 vs 按账号示例
常见模式
| 目标 | 配置 |
|---|---|
| 默认行为(OK 静默、告警发送) | (no config needed) |
| 完全静默(无消息、无指示器) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false } |
| 仅指示器(无消息) | channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true } |
| 仅在某渠道显示 OK | channels.telegram.heartbeat: { showOk: true } |
HEARTBEAT.md(可选)
若 workspace 中存在HEARTBEAT.md,默认提示词会要求 agent 读取它。可把它视为“heartbeat 清单”:小、稳定且可每 30 分钟安全注入。
若 HEARTBEAT.md 存在但实际上为空(只有空行或 # Heading 之类的 Markdown 标题),OpenClaw 会跳过 heartbeat 运行以节省 API 调用。
若文件缺失,heartbeat 仍会运行,由模型决定。
保持它简短(小清单或提醒)以避免 prompt 膨胀。
示例 HEARTBEAT.md:
agent 能更新 HEARTBEAT.md 吗?
可以——只要你要求它。HEARTBEAT.md 是 agent workspace 中的普通文件,你可以在常规聊天中对它说:
- “更新
HEARTBEAT.md,添加每日日历检查。” - “重写
HEARTBEAT.md,更短并聚焦收件箱跟进。”
HEARTBEAT.md — 它会进入 prompt 上下文。
手动唤醒(按需)
可通过系统事件入队并立即触发 heartbeat:heartbeat,手动唤醒会立即运行每个 agent 的 heartbeat。
使用 --mode next-heartbeat 等到下一次计划 tick。
推理投递(可选)
默认情况下,heartbeat 仅投递最终“答案”。 如需透明度,启用:agents.defaults.heartbeat.includeReasoning: true
Reasoning: 开头的消息(与 /reasoning on 同形)。当 agent 管理多个 sessions/codexes 且你想看它为何提醒时很有用,但也可能泄露更多内部细节。在群聊中建议关闭。
成本意识
Heartbeat 运行完整 agent 回合。间隔越短消耗越多 tokens。保持HEARTBEAT.md 简短,并考虑使用更便宜的 model 或 target: "none"(若只需内部状态更新)。