定时任务 vs 心跳:何时使用各自
心跳和定时任务都可以让你按计划运行任务。本指南帮助你为你的使用场景选择正确的机制。
快速决策指南
| 使用场景 | 推荐 | 原因 |
|---|---|---|
| 每 30 分钟检查收件箱 | 心跳 | 与其他检查批处理,上下文感知 |
| 每天上午 9 点准时发送报告 | 定时任务(隔离) | 需要精确时间 |
| 监控日历中即将到来的事件 | 心跳 | 自然适合定期感知 |
| 每周运行深度分析 | 定时任务(隔离) | 独立任务,可以使用不同模型 |
| 20 分钟后提醒我 | 定时任务(主会话,--at) | 精确时间的一次性任务 |
| 后台项目健康检查 | 心跳 | 依托现有周期 |
心跳:定期感知
心跳在主会话中以固定间隔运行(默认:30 分钟)。它们设计用于代理检查事项并浮现任何重要内容。
何时使用心跳
- 多个定期检查:无需 5 个独立的定时任务分别检查收件箱、日历、天气、通知和项目状态,单个心跳可以批量处理所有这些。
- 上下文感知决策:代理拥有完整的主会话上下文,因此可以对紧急事项和可等待事项做出明智决策。
- 对话连续性:心跳运行共享同一会话,因此代理记得最近的对话,可以自然跟进。
- 低开销监控:一个心跳替代许多小型轮询任务。
心跳优势
- 批量处理多个检查:一次代理回合可以一起检查收件箱、日历和通知。
- 减少 API 调用:单个心跳比 5 个隔离的定时任务更便宜。
- 上下文感知:代理知道你一直在做什么,可以相应地设置优先级。
- 智能抑制:如果没有需要关注的内容,代理回复
HEARTBEAT_OK,不会传递任何消息。 - 自然时间:根据队列负载略有漂移,这对大多数监控来说没问题。
心跳示例:HEARTBEAT.md 检查清单
md
# Heartbeat checklist
- Check email for urgent messages
- Review calendar for events in next 2 hours
- If a background task finished, summarize results
- If idle for 8+ hours, send a brief check-in代理在每次心跳时读取此内容,并在一次回合中处理所有项目。
配置心跳
json5
{
agents: {
defaults: {
heartbeat: {
every: "30m", // interval
target: "last", // where to deliver alerts
activeHours: { start: "08:00", end: "22:00" }, // optional
},
},
},
}完整配置请参见心跳。
定时任务:精确调度
定时任务在精确时间运行,可以在隔离会话中运行而不影响主上下文。
何时使用定时任务
- 需要精确时间:"每周一上午 9:00 发送此内容"(不是"9 点左右某个时间")。
- 独立任务:不需要对话上下文的任务。
- 不同模型/思考:需要更强大模型的繁重分析。
- 一次性提醒:"20 分钟后提醒我",使用
--at。 - 嘈杂/频繁任务:会使主会话历史混乱的任务。
- 外部触发器:应该独立运行的任务,无论代理是否处于活动状态。
定时任务优势
- 精确时间:支持时区的 5 字段 cron 表达式。
- 会话隔离:在
cron:<jobId>中运行,不污染主历史记录。 - 模型覆盖:每个任务可以使用更便宜或更强大的模型。
- 传递控制:可以直接传递到频道;默认仍会向主会话发布摘要(可配置)。
- 不需要代理上下文:即使主会话空闲或压缩也能运行。
- 一次性支持:
--at用于精确的未来时间戳。
定时任务示例:每日早间简报
bash
openclaw cron add \
--name "Morning briefing" \
--cron "0 7 * * *" \
--tz "America/New_York" \
--session isolated \
--message "Generate today's briefing: weather, calendar, top emails, news summary." \
--model opus \
--deliver \
--channel whatsapp \
--to "+15551234567"这在纽约时间上午 7:00 准时运行,使用 Opus 以保证质量,并直接传递到 WhatsApp。
定时任务示例:一次性提醒
bash
openclaw cron add \
--name "Meeting reminder" \
--at "20m" \
--session main \
--system-event "Reminder: standup meeting starts in 10 minutes." \
--wake now \
--delete-after-run完整 CLI 参考请参见定时任务。
决策流程图
Does the task need to run at an EXACT time?
YES -> Use cron
NO -> Continue...
Does the task need isolation from main session?
YES -> Use cron (isolated)
NO -> Continue...
Can this task be batched with other periodic checks?
YES -> Use heartbeat (add to HEARTBEAT.md)
NO -> Use cron
Is this a one-shot reminder?
YES -> Use cron with --at
NO -> Continue...
Does it need a different model or thinking level?
YES -> Use cron (isolated) with --model/--thinking
NO -> Use heartbeat同时使用两者
最高效的设置是同时使用:
- 心跳每 30 分钟在一次批处理回合中处理常规监控(收件箱、日历、通知)。
- 定时任务处理精确调度(每日报告、每周回顾)和一次性提醒。
示例:高效的自动化设置
HEARTBEAT.md(每 30 分钟检查一次):
md
# Heartbeat checklist
- Scan inbox for urgent emails
- Check calendar for events in next 2h
- Review any pending tasks
- Light check-in if quiet for 8+ hours定时任务(精确时间):
bash
# Daily morning briefing at 7am
openclaw cron add --name "Morning brief" --cron "0 7 * * *" --session isolated --message "..." --deliver
# Weekly project review on Mondays at 9am
openclaw cron add --name "Weekly review" --cron "0 9 * * 1" --session isolated --message "..." --model opus
# One-shot reminder
openclaw cron add --name "Call back" --at "2h" --session main --system-event "Call back the client" --wake nowLobster:具有审批的确定性工作流
Lobster 是用于多步骤工具管道的工作流运行时,需要确定性执行和明确审批。 当任务超过单个代理回合,并且你希望具有人工检查点的可恢复工作流时使用它。
何时适合 Lobster
- 多步骤自动化:你需要固定的工具调用管道,而不是一次性提示。
- 审批关卡:副作用应暂停直到你批准,然后恢复。
- 可恢复运行:继续暂停的工作流而无需重新运行早期步骤。
它如何与心跳和定时任务配对
- 心跳/定时任务决定运行_何时_发生。
- Lobster定义运行开始后_发生什么步骤_。
对于计划的工作流,使用定时任务或心跳触发调用 Lobster 的代理回合。 对于临时工作流,直接调用 Lobster。
操作说明(来自代码)
- Lobster 作为本地子进程(
lobsterCLI)在工具模式下运行,并返回一个 JSON 信封。 - 如果工具返回
needs_approval,你使用resumeToken和approve标志恢复。 - 该工具是可选插件;通过
tools.alsoAllow: ["lobster"](推荐)附加启用。 - 如果你传递
lobsterPath,它必须是绝对路径。
完整用法和示例请参见 Lobster。
主会话 vs 隔离会话
心跳和定时任务都可以与主会话交互,但方式不同:
| 心跳 | 定时任务(主会话) | 定时任务(隔离) | |
|---|---|---|---|
| 会话 | 主会话 | 主会话(通过系统事件) | cron:<jobId> |
| 历史记录 | 共享 | 共享 | 每次运行全新 |
| 上下文 | 完整 | 完整 | 无(干净启动) |
| 模型 | 主会话模型 | 主会话模型 | 可以覆盖 |
| 输出 | 如果不是 HEARTBEAT_OK 则传递 | 心跳提示 + 事件 | 摘要发布到主会话 |
何时使用主会话定时任务
当你希望以下情况时,使用带有 --system-event 的 --session main:
- 提醒/事件出现在主会话上下文中
- 代理在下一次心跳期间以完整上下文处理它
- 无单独的隔离运行
bash
openclaw cron add \
--name "Check project" \
--every "4h" \
--session main \
--system-event "Time for a project health check" \
--wake now何时使用隔离定时任务
当你希望以下情况时,使用 --session isolated:
- 没有先前上下文的干净状态
- 不同的模型或思考设置
- 输出直接传递到频道(摘要默认仍会发布到主会话)
- 不会使主会话混乱的历史记录
bash
openclaw cron add \
--name "Deep analysis" \
--cron "0 6 * * 0" \
--session isolated \
--message "Weekly codebase analysis..." \
--model opus \
--thinking high \
--deliver成本考虑
| 机制 | 成本概况 |
|---|---|
| 心跳 | 每 N 分钟一次回合;随 HEARTBEAT.md 大小扩展 |
| 定时任务(主会话) | 向下一次心跳添加事件(无隔离回合) |
| 定时任务(隔离) | 每个任务完整的代理回合;可以使用更便宜的模型 |
提示:
- 保持
HEARTBEAT.md小以最小化 token 开销。 - 将相似检查批处理到心跳中,而不是多个定时任务。
- 如果你只想要内部处理,在心跳上使用
target: "none"。 - 对常规任务使用带有更便宜模型的隔离定时任务。