Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Heartbeat 与 cron? 请参阅 自动化,了解何时使用两者。
快速开始(初学者)
Pick a cadence
保持 Heartbeat 启用(默认是
30m,对于 Anthropic OAuth/token 凭证,包括 Claude CLI 复用,则为 1h),或设置你自己的频率。默认值
- 间隔:
30m(当检测到的凭证模式是 Anthropic OAuth/token 凭证,包括 Claude CLI 复用时,为1h)。设置agents.defaults.heartbeat.every或按智能体设置agents.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 提示会作为用户消息逐字发送。只有当默认智能体启用了 Heartbeat 时,系统提示才会包含 “Heartbeat” 部分,并且该运行会在内部被标记。
- 使用
0m禁用 Heartbeat 时,普通运行也会从启动上下文中省略HEARTBEAT.md,因此模型不会看到仅用于 Heartbeat 的指令。 - 活跃时段(
heartbeat.activeHours)会按配置的时区检查。在时间窗口外,Heartbeat 会跳过,直到窗口内的下一个 tick。 - 当 cron 工作处于活跃或排队状态时,Heartbeat 会自动延后。设置
heartbeat.skipWhenBusy: true后,如果某个智能体自己的基于会话键的子智能体或嵌套命令通道正忙,也会延后该智能体;同级智能体不会再仅因为另一个智能体有正在进行的子智能体工作而暂停。
Heartbeat 提示的用途
默认提示有意保持宽泛:- 后台任务:“Consider outstanding tasks” 会提示智能体审查后续事项(收件箱、日历、提醒、排队工作),并提出任何紧急事项。
- 人工 check-in:“Checkup sometimes on your human during day time” 会提示偶尔发送轻量级的“你有什么需要吗?”消息,但会通过你配置的本地时区避免夜间打扰(请参阅时区)。
agents.defaults.heartbeat.prompt(或 agents.list[].heartbeat.prompt)设置为自定义正文(逐字发送)。
响应契约
- 如果没有需要注意的事项,请回复
HEARTBEAT_OK。 - 支持工具的 Heartbeat 运行可以改为调用
heartbeat_respond,使用notify: false表示没有可见更新,或使用notify: true加notificationText发送警报。当存在结构化工具响应时,它优先于文本回退。 - 在 Heartbeat 运行期间,当
HEARTBEAT_OK出现在回复的开头或结尾时,OpenClaw 会将其视为 ack。该 token 会被移除,如果剩余内容 ≤ackMaxChars(默认:300),回复会被丢弃。 - 如果
HEARTBEAT_OK出现在回复的中间,则不会被特殊处理。 - 对于警报,不要包含
HEARTBEAT_OK;只返回警报文本。
HEARTBEAT_OK 会被移除并记录日志;仅包含 HEARTBEAT_OK 的消息会被丢弃。
配置
范围和优先级
agents.defaults.heartbeat设置全局 Heartbeat 行为。agents.list[].heartbeat在其上合并;如果任何智能体有heartbeat块,只有这些智能体会运行 Heartbeat。channels.defaults.heartbeat设置所有渠道的可见性默认值。channels.<channel>.heartbeat覆盖渠道默认值。channels.<channel>.accounts.<id>.heartbeat(多账号渠道)覆盖按渠道设置。
按智能体的 Heartbeat
如果任何agents.list[] 条目包含 heartbeat 块,只有这些智能体会运行 Heartbeat。按智能体的块会合并到 agents.defaults.heartbeat 之上(因此你可以先设置一次共享默认值,再按智能体覆盖)。
示例:两个智能体,只有第二个智能体运行 Heartbeat。
活动时段示例
将 Heartbeat 限制在特定时区的工作时间内:24/7 设置
如果你想让 Heartbeat 全天运行,请使用以下模式之一:- 完全省略
activeHours(无时间窗口限制;这是默认行为)。 - 设置全天窗口:
activeHours: { start: "00:00", end: "24:00" }。
多账号示例
使用accountId 在 Telegram 等多账号渠道上指定目标账号:
字段说明
Heartbeat 间隔(持续时间字符串;默认单位 = 分钟)。
Heartbeat 运行的可选模型覆盖(
provider/model)。启用后,在可用时也会投递单独的
Reasoning: 消息(形状与 /reasoning on 相同)。为 true 时,Heartbeat 运行使用轻量级引导上下文,并且只保留工作区引导文件中的
HEARTBEAT.md。为 true 时,每次 Heartbeat 都在没有先前对话历史的新会话中运行。使用与 cron
sessionTarget: "isolated" 相同的隔离模式。显著降低每次 Heartbeat 的 token 成本。与 lightContext: true 结合可最大限度节省成本。投递路由仍使用主会话上下文。为 true 时,Heartbeat 运行会在该智能体的额外繁忙通道上延后:它自己的按会话键标识的子智能体或嵌套命令工作。Cron 通道总是会延后 Heartbeat,即使没有此标志也是如此,因此本地模型宿主不会同时运行 cron 和 Heartbeat 提示。
last:投递到最近使用的外部渠道。- 显式渠道:任何已配置的渠道或插件 ID,例如
discord、matrix、telegram或whatsapp。 none(默认):运行 Heartbeat 但不要对外投递。
控制直接/私信投递行为。
allow:允许直接/私信 Heartbeat 投递。block:抑制直接/私信投递(reason=dm-blocked)。可选接收者覆盖(渠道特定 ID,例如 WhatsApp 的 E.164 或 Telegram 聊天 ID)。对于 Telegram 话题/线程,使用
<chatId>:topic:<messageThreadId>。多账号渠道的可选账号 ID。当
target: "last" 时,如果解析出的最近渠道支持账号,账号 ID 会应用于该渠道;否则会被忽略。如果账号 ID 与解析出的渠道中配置的账号不匹配,则会跳过投递。覆盖默认提示词正文(不会合并)。
递送前
HEARTBEAT_OK 之后允许的最大字符数。为 true 时,在 Heartbeat 运行期间抑制工具错误警告载荷。
将 Heartbeat 运行限制在一个时间窗口内。对象包含
start(HH:MM,含起点;一天开始使用 00:00)、end(HH:MM,不含终点;一天结束允许 24:00),以及可选的 timezone。- 省略或为
"user":如果已设置,则使用你的agents.defaults.userTimezone,否则回退到主机系统时区。 "local":始终使用主机系统时区。- 任意 IANA 标识符(例如
America/New_York):直接使用;如果无效,则回退到上面的"user"行为。 - 对于活跃窗口,
start和end不能相等;相等值会被视为零宽度(始终在窗口外)。 - 在活跃窗口之外,Heartbeat 会被跳过,直到窗口内的下一次 tick。
递送行为
会话和目标路由
会话和目标路由
- Heartbeat 默认在智能体的主会话中运行(
agent:<id>:<mainKey>),当session.scope = "global"时则在global中运行。设置session可覆盖为特定渠道会话(Discord/WhatsApp 等)。 session只影响运行上下文;递送由target和to控制。- 若要递送到特定渠道/接收方,请设置
target+to。使用target: "last"时,递送会使用该会话的最后一个外部渠道。 - Heartbeat 递送默认允许直接/私信目标。设置
directPolicy: "block"可在仍然运行 Heartbeat 轮次的同时抑制直接目标发送。 - 如果主队列、目标会话通道、cron 通道或活跃的 cron 作业正忙,Heartbeat 会被跳过并稍后重试。
- 如果
skipWhenBusy: true,此智能体按会话键划分的子智能体和嵌套通道也会推迟 Heartbeat 运行。其他智能体的忙碌通道不会推迟此智能体。 - 如果
target解析不到外部目的地,运行仍会发生,但不会发送出站消息。
可见性和跳过行为
可见性和跳过行为
- 如果
showOk、showAlerts和useIndicator全部禁用,运行会在开始前以reason=alerts-disabled跳过。 - 如果仅禁用了提醒递送,OpenClaw 仍可以运行 Heartbeat、更新到期任务时间戳、恢复会话空闲时间戳,并抑制对外提醒载荷。
- 如果解析出的 Heartbeat 目标支持输入状态,OpenClaw 会在 Heartbeat 运行期间显示输入中。这使用 Heartbeat 原本会向其发送聊天输出的同一目标,并且会被
typingMode: "never"禁用。
会话生命周期和审计
会话生命周期和审计
- 仅 Heartbeat 的回复不会让会话保持活跃。Heartbeat 元数据可能会更新会话行,但空闲过期使用最后一条真实用户/渠道消息的
lastInteractionAt,每日过期使用sessionStartedAt。 - 控制 UI 和 WebChat 历史会隐藏 Heartbeat 提示词以及仅 OK 的确认。底层会话转录仍可包含这些轮次,用于审计/重放。
- 分离的后台任务可以入队一个系统事件,并在主会话应快速注意到某事时唤醒 Heartbeat。该唤醒不会让 Heartbeat 运行成为后台任务。
可见性控制
默认情况下,HEARTBEAT_OK 确认会被抑制,而提醒内容会被递送。你可以按渠道或按账号调整:
每个标志的作用
showOk:当模型返回仅 OK 的回复时,发送HEARTBEAT_OK确认。showAlerts:当模型返回非 OK 回复时,发送提醒内容。useIndicator:为 UI Status 表面发出指示器事件。
按渠道与按账号示例
常见模式
| 目标 | 配置 |
|---|---|
| 默认行为(静默 OK,开启提醒) | (无需配置) |
| 完全静默(无消息、无指示器) | 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(可选)
如果工作区中存在HEARTBEAT.md 文件,默认提示词会告诉智能体读取它。可以把它看作你的 “Heartbeat 检查清单”:小巧、稳定,并且适合每 30 分钟纳入一次。
在正常运行中,只有为默认智能体启用 Heartbeat 指引时,才会注入 HEARTBEAT.md。使用 0m 禁用 Heartbeat 节奏,或设置 includeSystemPromptSection: false,会将其从正常启动上下文中省略。
如果 HEARTBEAT.md 存在但实际上为空(只有空行和类似 # Heading 的 Markdown 标题),OpenClaw 会跳过 Heartbeat 运行以节省 API 调用。该跳过会报告为 reason=empty-heartbeat-file。如果文件缺失,Heartbeat 仍会运行,并由模型决定要做什么。
保持精简(简短检查清单或提醒),以避免提示词膨胀。
HEARTBEAT.md 示例:
tasks: 块
HEARTBEAT.md 还支持一个小型结构化 tasks: 块,用于 Heartbeat 内部基于间隔的检查。
示例:
行为
行为
- OpenClaw 会解析
tasks:块,并根据每个任务自己的interval检查它。 - 每个 tick 的 Heartbeat 提示词中只会包含已到期任务。
- 如果没有任务到期,Heartbeat 会被完全跳过(
reason=no-tasks-due),以避免浪费模型调用。 HEARTBEAT.md中的非任务内容会被保留,并作为额外上下文追加到到期任务列表之后。- 任务的上次运行时间戳存储在会话状态中(
heartbeatTaskState),因此间隔能在正常重启后保留。 - 任务时间戳只会在 Heartbeat 运行完成其正常回复路径后推进。被跳过的
empty-heartbeat-file/no-tasks-due运行不会将任务标记为已完成。
智能体可以更新 HEARTBEAT.md 吗?
可以,只要你要求它这样做。HEARTBEAT.md 只是智能体工作区中的普通文件,因此你可以在正常聊天中告诉智能体,例如:
- “更新
HEARTBEAT.md,添加每日日历检查。” - “重写
HEARTBEAT.md,让它更短,并专注于收件箱跟进。”
手动唤醒(按需)
你可以用以下命令入队一个系统事件并触发即时 Heartbeat:heartbeat,手动唤醒会立即运行每个智能体的 Heartbeat。
使用 --mode next-heartbeat 可等待下一次计划 tick。
推理递送(可选)
默认情况下,Heartbeat 只递送最终“答案”载荷。 如果你想要透明度,请启用:agents.defaults.heartbeat.includeReasoning: true
Reasoning:(形态与 /reasoning on 相同)。当智能体管理多个会话/codex,而你想知道它为什么决定 ping 你时,这会很有用,但它也可能泄露比你想要更多的内部细节。建议在群聊中保持关闭。
成本意识
Heartbeat 会运行完整的智能体轮次。更短的间隔会消耗更多 token。要降低成本:- 使用
isolatedSession: true,避免发送完整对话历史(每次运行从约 100K token 降到约 2-5K)。 - 使用
lightContext: true,将启动文件限制为仅HEARTBEAT.md。 - 设置更便宜的
model(例如ollama/llama3.2:1b)。 - 保持
HEARTBEAT.md很小。 - 如果你只想更新内部状态,请使用
target: "none"。
Heartbeat 后的上下文溢出
如果某次 Heartbeat 之前把现有会话留在较小的本地模型上,例如带 32k 窗口的 Ollama 模型,而下一个主会话轮次报告上下文溢出,请将会话运行时模型重置回配置的主模型。当最后一个运行时模型匹配已配置的heartbeat.model 时,OpenClaw 的重置消息会指出这一点。
当前 Heartbeat 会在运行完成后保留共享会话的现有运行时模型。你仍可以使用 isolatedSession: true 在新会话中运行 Heartbeat,并结合 lightContext: true 获取最小提示词,或选择一个上下文窗口足以容纳共享会话的 Heartbeat 模型。