OpenClaw从入门到应用——自动化:对比Cron 与 Heartbeat
通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》
心跳(Heartbeat)和定时任务(Cron)都能让你按计划运行任务。本指南帮助你根据实际场景选择最合适的机制。
快速决策指南
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 每 30 分钟检查一次收件箱 | 心跳 | 与其他检查任务批量处理,感知上下文 |
| 上午 9 点整发送日报 | 定时任务(隔离) | 需要精确计时 |
| 监控日历中即将发生的事件 | 心跳 | 天然适合周期性感知 |
| 每周运行一次深度分析 | 定时任务(隔离) | 独立任务,可使用不同模型 |
| 20 分钟后提醒我 | 定时任务(主会话,--at) | 一次性且需要精确计时 |
| 后台项目健康检查 | 心跳 | 搭载在现有循环上 |
心跳:周期性感知
心跳在主会话中以固定间隔(默认:30 分钟)运行。它们的设计初衷是让代理检查各项事务,并提醒任何重要情况。
何时使用心跳
- 多项周期性检查:与其创建 5 个独立的定时任务来分别检查收件箱、日历、天气、通知和项目状态,不如用单个心跳将所有检查批量处理。
- 上下文感知决策:代理拥有完整的主会话上下文,因此能够智能判断哪些事项紧急,哪些可以稍后处理。
- 对话连续性:心跳运行共享同一会话,因此代理能记住最近的对话,并自然地进行跟进。
- 低开销监控:一个心跳可替代许多零散的轮询任务。
心跳的优势
- 批量处理多项检查:代理的一次动作便可同时检查收件箱、日历和通知。
- 减少 API 调用:单个心跳比 5 个隔离的定时任务更经济。
- 上下文感知:代理知道你正在处理什么工作,并能相应地进行优先级排序。
- 智能静默:如果没有需要关注的事项,代理会回复
HEARTBEAT_OK,不会发送任何消息。 - 自然的时间偏差:基于队列负载会有轻微延迟,这对大多数监控任务来说完全可以接受。
心跳示例:HEARTBEAT.md 检查清单
# 心跳检查清单 - 检查邮件是否有紧急消息 - 查看日历中未来 2 小时内的事件 - 如果后台任务完成,总结结果 - 如果空闲超过 8 小时,发送一个简短的签到消息代理在每次心跳时读取此清单,并在一个动作中处理所有事项。
配置心跳
{ agents: { defaults: { heartbeat: { every: "30m", // 间隔时间 target: "last", // 明确的警报送达目标(默认为 "none") activeHours: { start: "08:00", end: "22:00" }, // 可选 }, }, }, }完整配置请参阅 Heartbeat。
定时任务:精确调度
定时任务在精确的时间点运行,并且可以在隔离的会话中运行,不影响主会话的上下文。整点重复执行的任务计划会自动通过一个确定性的、每个任务独有的、在 0-5 分钟窗口内的偏移量来进行负载分散。
何时使用定时任务
- 需要精确计时:“每周一上午 9:00 发送此内容”(而不是"9点左右")。
- 独立任务:不需要对话上下文的任务。
- 不同的模型或思维模式:值得使用更强大模型进行深度分析。
- 一次性提醒:使用
--at参数实现"20 分钟后提醒我"。 - 频繁或嘈杂的任务:会扰乱主会话历史记录的任务。
- 外部触发器:应独立于代理是否处于活动状态而运行的任务。
定时任务的优势
- 精确计时:支持 5 位或 6 位(含秒)的 cron 表达式,并支持时区。
- 内置负载分散:默认情况下,整点执行的周期性任务最多会错开 5 分钟。
- 每个任务独立控制:使用
--stagger覆盖错开策略,或使用--exact强制精确计时。 - 会话隔离:在
cron:会话中运行,不会污染主会话历史。 - 模型覆盖:可为每个任务单独指定更便宜或更强大的模型。
- 投递控制:隔离任务默认为
announce(摘要);可根据需要选择none。 - 即时投递:宣告模式直接发布消息,无需等待心跳。
- 无需代理上下文:即使主会话空闲或已压缩也能运行。
- 支持一次性任务:使用
--at指定精确的未来时间戳。
定时任务示例:每日早间简报
openclawcronadd\--name"晨间简报"\--cron"0 7 * * *"\--tz"America/New_York"\--sessionisolated\--message"生成今天的简报:天气、日历、重要邮件、新闻摘要。"\--modelopus\--announce\--channelwhatsapp\--to"+15551234567"这将在纽约时间上午 7:00 准时运行,使用 Opus 模型确保质量,并直接宣告摘要到 WhatsApp。
定时任务示例:一次性提醒
openclawcronadd\--name"会议提醒"\--at"20m"\--sessionmain\--system-event"提醒:站会将在 10 分钟后开始。"\--wakenow\--delete-after-run完整的 CLI 参考请查看 Cron jobs。
决策流程图
任务是否需要在精确的时间运行? 是 -> 使用定时任务 否 -> 继续... 任务是否需要与主会话隔离? 是 -> 使用定时任务 (隔离) 否 -> 继续... 此任务能否与其他周期性检查批量处理? 是 -> 使用心跳 (添加到 HEARTBEAT.md) 否 -> 使用定时任务 这是一个一次性提醒吗? 是 -> 使用定时任务 (带 --at) 否 -> 继续... 是否需要不同的模型或思维模式级别? 是 -> 使用定时任务 (隔离) 并设置 --model/--thinking 否 -> 使用心跳结合使用两者
最高效的设置是两者并用:
- 心跳:每 30 分钟在一个批量动作中处理日常监控(收件箱、日历、通知)。
- 定时任务:处理精确的时间计划(每日报告、每周回顾)和一次性提醒。
示例:高效的自动化设置
HEARTBEAT.md(每 30 分钟检查一次):
# 心跳检查清单 - 扫描收件箱中的紧急邮件 - 检查日历中未来 2 小时内的事件 - 审查所有待处理的任务 - 如果超过 8 小时没有活动,发送一个简短的签到消息定时任务(精确计时):
# 每天早上7点发布早间简报openclawcronadd--name"晨间简报"--cron"0 7 * * *"--sessionisolated--message"..."--announce# 每周一上午9点进行项目回顾openclawcronadd--name"每周回顾"--cron"0 9 * * 1"--sessionisolated--message"..."--modelopus# 一次性提醒openclawcronadd--name"回电"--at"2h"--sessionmain --system-event"给客户回电"--wakenowLobster:带审批的确定性工作流
Lobster 是用于多步骤工具流水线的工作流运行时,这些流水线需要确定性执行和明确的审批。当任务不止是单次代理动作,并且你想要一个带有人工检查点的、可恢复的工作流时,可以使用它。
Lobster 适用场景
- 多步骤自动化:你需要一个固定的工具调用流水线,而不是一次性的提示。
- 审批关卡:副作用操作应暂停,直到你批准后再恢复。
- 可恢复运行:无需重新运行前面的步骤,即可继续暂停的工作流。
它如何与心跳和定时任务搭配使用
- 心跳/定时任务决定了运行发生的时间。
- Lobster定义了运行开始后需要执行的步骤。
对于计划性工作流,使用定时任务或心跳来触发一个代理动作,该动作再调用 Lobster。对于临时工作流,则直接调用 Lobster。
操作说明(源自代码)
- Lobster 作为本地子进程(
lobsterCLI)以工具模式运行,并返回一个JSON 信封。 - 如果工具返回
needs_approval,你可以使用resumeToken和approve标志来恢复运行。 - 该工具是一个可选插件;建议通过
tools.alsoAllow: ["lobster"]来额外启用它。 - Lobster 期望
lobsterCLI 在系统的PATH路径中可用。
完整用法和示例请参见 Lobster。
主会话 vs 隔离会话
心跳和定时任务都可以与主会话交互,但方式有所不同:
| 心跳 | 定时任务 (主会话) | 定时任务 (隔离) | |
|---|---|---|---|
| 会话 | 主会话 | 主会话 (通过系统事件) | cron:或自定义会话 |
| 历史 | 共享 | 共享 | 每次运行都是全新的 (隔离) / 持久化 (自定义) |
| 上下文 | 完整 | 完整 | 无 (隔离) / 累积的 (自定义) |
| 模型 | 主会话模型 | 主会话模型 | 可以覆盖 |
| 输出 | 如果不是HEARTBEAT_OK则投递 | 心跳提示 + 事件 | 宣告摘要 (默认) |
何时使用主会话定时任务
当你想要以下效果时,使用--session main和--system-event:
- 提醒/事件出现在主会话上下文中
- 代理在下一次心跳期间利用完整上下文处理它
- 不需要单独的隔离运行
openclawcronadd\--name"检查项目"\--every"4h"\--sessionmain\--system-event"是时候进行一次项目健康检查了"\--wakenow何时使用隔离定时任务
当你想要以下效果时,使用--session isolated:
- 一个没有先前上下文的干净环境
- 不同的模型或思维模式设置
- 直接向频道宣告摘要
- 历史记录不会扰乱主会话
openclawcronadd\--name"深度分析"\--cron"0 6 * * 0"\--sessionisolated\--message"每周代码库分析..."\--modelopus\--thinkinghigh\--announce成本考量
| 机制 | 成本概况 |
|---|---|
| 心跳 | 每隔 N 分钟一个动作;成本随 HEARTBEAT.md 内容大小而增加 |
| 定时任务 (主会话) | 向下一个心跳添加事件(无隔离动作) |
| 定时任务 (隔离) | 每个任务一个完整的代理动作;可以使用更便宜的模型 |
提示:
- 保持
HEARTBEAT.md精简以最小化 Token 开销。 - 将相似的检查批量合并到心跳中,而不是创建多个定时任务。
- 如果你只需要内部处理,可在心跳中设置
target: "none"。 - 对于常规任务,使用带有更便宜模型的隔离定时任务。
相关链接
- Heartbeat - 完整的心跳配置
- Cron jobs - 完整的定时任务 CLI 和 API 参考
- System - 系统事件与心跳控制
