Cron vs Heartbeat:何时使用每个
心跳和定时任务都可以让你按计划运行任务。本指南帮助你选择正确的机制。
快速决策指南
| 用例 | 推荐 | 原因 |
|---|---|---|
| 每 30 分钟检查收件箱 | 心跳 | 与其他检查批量处理,上下文感知 |
| 每天 9 点整发送报告 | Cron(隔离) | 需要精确时间 |
| 监控日历的即将到来的事件 | 心跳 | 定期意识的自然选择 |
| 运行每周深度分析 | Cron(隔离) | 独立任务,可以使用不同模型 |
| 20 分钟后提醒我 | Cron(主,--at) | 一次性精确计时 |
| 后台项目健康检查 | 心跳 | 搭乘现有周期 |
心跳:定期意识
心跳在主会话中以固定间隔运行(默认:30 分钟)。它们设计用于智能体检查事物并显示任何重要内容。
何时使用心跳
- 多个定期检查:不要使用 5 个单独的定时任务检查收件箱、日历、天气、通知和项目状态,单个心跳可以将所有这些批量处理。
- 上下文感知决策:智能体有完整的主会话上下文,因此可以智能决定什么是紧急的,什么可以等待。
- 对话连续性:心跳运行共享相同会话,因此智能体记得最近的对话,可以自然地跟进。
- 低开销监控:一个心跳替换许多小轮询任务。
心跳优势
- 批量多个检查:一个智能体轮次可以一起检查收件箱、日历和通知。
- 减少 API 调用:单个心跳比 5 个隔离的定时任务更便宜。
- 上下文感知:智能体知道你一直在做什么,可以相应地确定优先级。
- 智能抑制:如果不需要注意,智能体回复
HEARTBEAT_OK并且不发送消息。 - 自然计时:根据队列负载轻微漂移,这对于大多数监控来说没问题。
心跳示例:HEARTBEAT.md 检查清单
md
# 心跳检查清单
- 检查收件箱中紧急邮件
- 回顾接下来 2 小时内的日历事件
- 如果后台任务完成,总结结果
- 如果空闲 8 小时以上,发送简要检查智能体在每次心跳时读取这个并在一个轮次中处理所有项目。
配置心跳
json5
{
agents: {
defaults: {
heartbeat: {
every: "30m", // 间隔
target: "last", // 发送告警的位置
activeHours: { start: "08:00", end: "22:00" } // 可选
}
}
}
}见心跳了解完整配置。
Cron:精确调度
定时任务在精确时间运行,可以在不影响主上下文的情况下在隔离会话中运行。
何时使用 cron
- 需要精确时间:"每周一 9:00 发送这个"(不是"大约 9 点")。
- 独立任务:不需要对话上下文的任务。
- 不同模型/思考:需要更强大模型的深度分析。
- 一次性提醒:
--at用于精确的未来时间戳。 - 嘈杂/频繁任务:会弄乱主会话历史的任务。
- 外部触发:应该独立于智能体是否活动而运行的任务。
Cron 优势
- 精确计时:带时区支持的 5 字段 cron 表达式。
- 会话隔离:在
cron:<jobId>中运行,不会污染主历史。 - 模型覆盖:每个任务可以使用更便宜或更强大的模型。
- 交付控制:可以直接交付到通道;仍然默认发布摘要到主(可配置)。
- 不需要智能体上下文:即使主会话空闲或压缩也会运行。
- 一次性支持:
--at用于精确的未来时间戳。
Cron 示例:每日早晨简报
bash
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 示例:一次性提醒
bash
openclaw cron add \
--name "会议提醒" \
--at "20m" \
--session main \
--system-event "提醒:10 分钟后站会开始。" \
--wake now \
--delete-after-run见定时任务了解完整 CLI 参考。
决策流程图
任务是否需要在精确时间运行?
是 -> 使用 cron
否 -> 继续...
任务是否需要与主会话隔离?
是 -> 使用 cron(隔离)
否 -> 继续...
这个任务可以与其他定期检查批量处理吗?
是 -> 使用心跳(添加到 HEARTBEAT.md)
否 -> 使用 cron
这是一次性提醒吗?
是 -> 使用 cron 和 --at
否 -> 继续...
它需要不同的模型或思考级别吗?
是 -> 使用 cron(隔离)和 --model/--thinking
否 -> 使用心跳两者结合
最有效的设置使用两者:
- 心跳处理常规监控(收件箱、日历、通知)每 30 分钟在一个批量轮次中。
- Cron处理精确计划(每日报告、每周回顾)和一次性提醒。
示例:高效自动化设置
HEARTBEAT.md(每 30 分钟检查):
md
# 心跳检查清单
- 扫描收件箱中的紧急邮件
- 检查接下来 2 小时的日历事件
- 审查任何待处理任务
- 如果安静 8 小时以上,轻微检查定时任务(精确计时):
bash
# 每天早上 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 nowLobster:确定性工作流与批准
Lobster 是多步骤工具管道的工作流运行时,需要确定性执行和明确批准。 当任务不止一个智能体轮次,并且你想要可恢复的工作流和人工检查点时使用它。
Lobster 何时适合
- 多步骤自动化:你需要固定的工具调用管道,而不是一次性的提示。
- 批准门:副作用应该暂停直到你批准,然后恢复。
- 可恢复运行:继续暂停的工作流而不重新运行 earlier 步骤。
它如何与心跳和 cron 配对
- 心跳/cron 决定何时运行发生。
- Lobster 定义什么步骤在运行开始时发生。
对于调度工作流,使用 cron 或心跳触发调用 Lobster 的智能体轮次。 对于临时工作流,直接调用 Lobster。
运维说明(来自代码)
- Lobster 作为本地子进程运行(
lobsterCLI)在工具模式下并返回 JSON 信封。 - 如果工具返回
needs_approval,你使用resumeToken和approve标志恢复。 - 该工具是可选插件;通过
tools.alsoAllow: ["lobster"]添加启用(推荐)。 - 如果你传递
lobsterPath,它必须是绝对路径。
见 Lobster 了解完整用法和示例。
主会话 vs 隔离会话
心跳和 cron 都可以与主会话交互,但方式不同:
| 心跳 | Cron(主) | Cron(隔离) | |
|---|---|---|---|
| 会话 | 主 | 主(通过系统事件) | cron:<jobId> |
| 历史 | 共享 | 共享 | 每次运行刷新 |
| 上下文 | 完整 | 完整 | 无(干净开始) |
| 模型 | 主会话模型 | 主会话模型 | 可以覆盖 |
| 输出 | 如果不是 HEARTBEAT_OK 则交付 | 心跳提示 + 事件 | 摘要发布到主 |
何时使用主会话 cron
当你想用 --session main 和 --system-event 时:
- 提醒/事件出现在主会话上下文中
- 智能体在下一次心跳时用完整上下文处理它
- 没有单独的隔离运行
bash
openclaw cron add \
--name "检查项目" \
--every "4h" \
--session main \
--system-event "是时候进行项目健康检查了" \
--wake now何时使用隔离 cron
当你想用 --session isolated 时:
- 没有先前上下文的干净状态
- 不同模型或思考设置
- 输出直接交付到通道(摘要仍然默认发布到主)
- 不会弄乱主会话的历史
bash
openclaw cron add \
--name "深度分析" \
--cron "0 6 * * 0" \
--session isolated \
--message "每周代码库分析..." \
--model opus \
--thinking high \
--deliver成本考量
| 机制 | 成本概况 |
|---|---|
| 心跳 | 每 N 分钟一个轮次;随 HEARTBEAT.md 大小扩展 |
| Cron(主) | 将事件添加到下次心跳(没有隔离轮次) |
| Cron(隔离) | 每个任务完整智能体轮次;可以使用更便宜的模型 |
提示:
- 保持
HEARTBEAT.md小以最小化 token 开销。 - 将类似检查批量到心跳而不是多个 cron 任务。
- 如果你只需要内部处理,在心跳上使用
target: "none"。 - 对常规任务使用带更便宜模型的隔离 cron。