心跳(Heartbeat)和 Cron 定时任务都可以让您按计划运行任务。本指南帮助您为特定用例选择合适的机制。
快速决策指南
| 使用场景 | 推荐方式 | 原因 |
|---|---|---|
| 每30分钟检查收件箱 | Heartbeat | 与其他检查批处理,具备上下文感知 |
| 每天上午9点准时发送报告 | Cron (isolated) | 需要精确时间 |
| 监控日历中即将到来的事件 | Heartbeat | 非常适合定期感知 |
| 每周运行深度分析 | Cron (isolated) | 独立任务,可使用不同模型 |
| 20分钟后提醒我 | Cron (main, --at) |
精确时间的一次性任务 |
| 后台项目健康检查 | Heartbeat | 搭载现有周期 |
Heartbeat:定期感知
心跳在主会话中以固定间隔运行(默认:30分钟)。它们旨在让代理检查事项并显示重要内容。
何时使用 Heartbeat
- 多个定期检查:不需要5个单独的 cron 任务分别检查收件箱、日历、天气、通知和项目状态,单个心跳可以批量处理所有这些。
- 上下文感知决策:代理拥有完整的主会话上下文,因此可以智能判断哪些紧急、哪些可以等待。
- 对话连续性:心跳运行共享同一会话,因此代理会记住最近的对话并可以自然跟进。
- 低开销监控:一个心跳替代许多小型轮询任务。
Heartbeat 的优势
- 批量处理多个检查:一次代理轮次可以同时审查收件箱、日历和通知。
- 减少 API 调用:单个心跳比5个隔离的 cron 任务更便宜。
- 上下文感知:代理知道您一直在做什么,可以相应地设置优先级。
- 智能抑制:如果没有需要注意的事项,代理回复
HEARTBEAT_OK,不会发送消息。 - 自然的时间安排:根据队列负载略有漂移,这对大多数监控来说都没问题。
Heartbeat 示例:HEARTBEAT.md 清单
# 心跳清单
- 检查电子邮件中的紧急消息
- 查看接下来2小时内的日历事件
- 如果后台任务完成,总结结果
- 如果闲置8小时以上,发送简短签到
代理在每次心跳时读取此清单,并在一次轮次中处理所有项目。
配置 Heartbeat
{
"agents": {
"defaults": {
"heartbeat": {
"every": "30m", // 间隔
"target": "last", // 发送警报的位置
"activeHours": { "start": "08:00", "end": "22:00" } // 可选
}
}
}
}
Cron:精确调度
Cron 任务在精确时间运行,可以在隔离会话中运行,不影响主上下文。
何时使用 Cron
- 需要精确时间:"每周一上午9:00发送此内容"(不是"大约9点左右")。
- 独立任务:不需要对话上下文的任务。
- 不同的模型/思考:需要更强大模型的重度分析。
- 一次性提醒:"20分钟后提醒我"使用
--at。 - 嘈杂/频繁的任务:会使主会话历史混乱的任务。
- 外部触发器:应该独立于代理是否活跃而运行的任务。
Cron 的优势
- 精确时间:5字段 cron 表达式,支持时区。
- 会话隔离:在
cron:<jobId>中运行,不污染主历史。 - 模型覆盖:每个任务可使用更便宜或更强大的模型。
- 交付控制:可以直接交付到频道;默认仍会发布摘要到主会话(可配置)。
- 无需代理上下文:即使主会话闲置或压缩也能运行。
- 一次性支持:
--at用于精确的未来时间戳。
Cron 示例:每日晨报
openclaw cron add \
--name "晨报" \
--cron "0 7 * * *" \
--tz "America/New_York" \
--session isolated \
--message "生成今日简报:天气、日历、热门邮件、新闻摘要。" \
--model opus \
--deliver \
--channel whatsapp \
--to "+15551234567"
此任务在纽约时间上午7:00准时运行,使用 Opus 保证质量,直接交付到 WhatsApp。
Cron 示例:一次性提醒
openclaw cron add \
--name "会议提醒" \
--at "20m" \
--session main \
--system-event "提醒:站会将在10分钟后开始。" \
--wake now \
--delete-after-run
决策流程图
任务是否需要在精确时间运行?
是 -> 使用 Cron
否 -> 继续...
任务是否需要与主会话隔离?
是 -> 使用 Cron (isolated)
否 -> 继续...
这个任务能否与其他定期检查批处理?
是 -> 使用 Heartbeat(添加到 HEARTBEAT.md)
否 -> 使用 Cron
这是一次性提醒吗?
是 -> 使用 Cron 配合 --at
否 -> 继续...
是否需要不同的模型或思考级别?
是 -> 使用 Cron (isolated) 配合 --model/--thinking
否 -> 使用 Heartbeat
结合使用两者
最高效的设置是同时使用:
- Heartbeat 处理常规监控(收件箱、日历、通知),每30分钟批量处理一次。
- Cron 处理精确时间表(每日报告、每周审查)和一次性提醒。
示例:高效的自动化设置
HEARTBEAT.md(每30分钟检查一次):
# 心跳清单
- 扫描收件箱中的紧急邮件
- 检查接下来2小时内的日历事件
- 查看任何待处理任务
- 如果8小时以上没有活动,轻量级签到
Cron 任务(精确时间):
# 每天上午7点的晨报
openclaw cron add --name "晨报" --cron "0 7 * * *" --session isolated --message "..." --deliver
# 每周一上午9点的项目审查
openclaw cron add --name "周审查" --cron "0 9 * * 1" --session isolated --message "..." --model opus
# 一次性提醒
openclaw cron add --name "回电" --at "2h" --session main --system-event "给客户回电" --wake now
主会话 vs 隔离会话
| Heartbeat | Cron (main) | Cron (isolated) | |
|---|---|---|---|
| 会话 | 主会话 | 主会话(通过系统事件) | cron:<jobId> |
| 历史 | 共享 | 共享 | 每次运行全新 |
| 上下文 | 完整 | 完整 | 无(干净启动) |
| 模型 | 主会话模型 | 主会话模型 | 可覆盖 |
| 输出 | 如果不是 HEARTBEAT_OK 则交付 |
心跳提示 + 事件 | 摘要发布到主会话 |
何时使用主会话 Cron
当您希望:
- 提醒/事件出现在主会话上下文中
- 代理在下一次心跳时使用完整上下文处理它
- 没有单独的隔离运行
openclaw cron add \
--name "检查项目" \
--every "4h" \
--session main \
--system-event "该进行项目健康检查了" \
--wake now
何时使用隔离 Cron
当您希望:
- 干净的环境,没有之前的上下文
- 不同的模型或思考设置
- 输出直接交付到频道(摘要仍默认发布到主会话)
- 历史不会使主会话混乱
openclaw cron add \
--name "深度分析" \
--cron "0 6 * * 0" \
--session isolated \
--message "每周代码库分析..." \
--model opus \
--thinking high \
--deliver
成本考虑
| 机制 | 成本特征 |
|---|---|
| Heartbeat | 每N分钟一次轮次;随 HEARTBEAT.md 大小扩展 |
| Cron (main) | 将事件添加到下一次心跳(无隔离轮次) |
| Cron (isolated) | 每个任务完整的代理轮次;可使用更便宜的模型 |
提示
成本优化技巧:
- 保持
HEARTBEAT.md精简以最小化 token 开销。 - 将类似的检查批量处理到心跳中,而不是多个 cron 任务。
- 如果只需要内部处理,在心跳上使用
target: "none"。 - 对于常规任务,使用更便宜的模型配合隔离 cron。