Cron 与心跳:何时使用各自
心跳和定时任务都可以让您按计划运行任务。本指南帮助您为您的用例选择正确的机制?
快速决策指?
| 用例 | 推荐 | 原因 |
|---|---|---|
| ?30 分钟检查收件箱 | 心跳 | 与其他检查批量处理,上下文感? |
| 每天上午 9 点准时发送报? | Cron(独立) | 需要精确时? |
| 监控日历以获取即将到来的事件 | 心跳 | 适合定期感知 |
| 运行每周深度分析 | Cron(独立) | 独立任务,可以使用不同的模型 |
| 20 分钟后提醒我 | Cron(主会话,--at? | 一次性精确时间提? |
| 后台项目健康检? | 心跳 | 搭便车现有周? |
心跳:周期性感?
心跳在固定间隔(默认?0 分钟)在**主会?*中运行。它们专为代理检查事物并显示重要内容而设计?
何时使用心跳
- **多个定期检?*:与其使?5 个单独的定时任务检查收件箱、日历、天气、通知和项目状态,不如将它们全部批处理到一个心跳中?
- **上下文感知决?*:代理拥有完整的主会话上下文,因此可以智能地决定什么是紧急的,什么可以等待?
- **对话连续?*:心跳运行共享同一个会话,因此代理记得最近的对话,可以自然地跟进?
- 低开销监控:一个心跳取代许多小型轮询任务?
心跳优势
- **批量多个检?*:一个代理回合可以一起查看收件箱、日历和通知?
- 减少 API 调用:单个心跳比 5 个独立定时任务更便宜?
- **上下文感?*:代理知道您一直在做什么,可以相应地确定优先级?
- 智能抑制:如果不需要关注,代理会回?
HEARTBEAT_OK,不会投递任何消息? - 自然时间:根据队列负载轻微漂移,这对大多数监控来说没问题?
心跳示例:HEARTBEAT.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
代理在每次心跳时读取此内容,在一个回合中处理所有项目?
配置心跳
{
agents: {
defaults: {
heartbeat: {
every: "30m", // 间隔
target: "last", // 明确的告警投递目标(默认?"none"?
activeHours: { start: "08:00", end: "22:00" }, // 可?
},
},
},
}
请参阅心跳获取完整配置?
Cron:精确调?
定时任务在精确时间运行,可以在不影响主上下文的情况下在独立会话中运行? 重复的整点计划会自动通过每任务确定性偏移在 0-5 分钟窗口内分散?
何时使用 cron
- **需要精确时?*?每周一上午 9:00 发送这?(不?大约 9 ?)?
- 独立任务:不需要对话上下文的任务?
- **不同模型/思?*:值得使用更强大模型的重型分析?
- **一次性提?*?20 分钟后提醒我”,使?
--at? - **嘈杂/频繁的任?*:会弄乱主会话历史的任务?
- 外部触发:无论代理是否在其他地方活跃都应该独立运行的任务?
Cron 优势
- 精确时间:支持时区的 5 字段?6 字段(秒)cron 表达式?
- 内置负载分散:重复的整点计划默认最多分?5 分钟?
- **每任务控?*:用
--stagger <duration>覆盖抖动或用--exact强制精确时间? - 会话隔离:在
cron:<jobId>中运行,不会污染主历史? - 模型覆盖:每个任务可以使用更便宜或更强大的模型?
- **投递控?*:独立任务默认为
announce(摘要);根据需要选择none? - **即时投?*:宣布模式直接发布,无需等待心跳?
- 不需要代理上下文:即使主会话空闲或压缩也会运行?
- **一次性支?*:用于精确未来时间戳?
--at?
Cron 示例:每日早间简?
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 \
--announce \
--channel whatsapp \
--to "+15551234567"
这在纽约时间上午 7:00 精确运行,使?Opus 以获得质量,并直接将摘要宣布?WhatsApp?
Cron 示例:一次性提?
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 参考?
决策流程?
任务需要精确时间运行吗?
?-> 使用 cron
?-> 继续...
任务需要与主会话隔离吗?
?-> 使用 cron(独立)
?-> 继续...
这个任务可以与其他定期检查批量处理吗?
?-> 使用心跳(添加到 HEARTBEAT.md?
?-> 使用 cron
这是一次性提醒吗?
?-> 使用?--at ?cron
?-> 继续...
它需要不同的模型或思考级别吗?
?-> 使用?--model/--thinking ?cron(独立)
?-> 使用心跳
两者结?
最高效的设?*同时使用**两者:
- 心跳?30 分钟在一个批量回合中处理常规监控(收件箱、日历、通知)?
- Cron处理精确计划(每日报告、每周审查)和一次性提醒?
示例:高效自动化设置
HEARTBEAT.md(每 30 分钟检查)?
# 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
定时任务(精确时间)?
# 每天上午 7 点的早间简?
openclaw cron add --name "Morning brief" --cron "0 7 * * *" --session isolated --message "..." --announce
# 每周一上午 9 点的每周项目审查
openclaw cron add --name "Weekly review" --cron "0 9 * * 1" --session isolated --message "..." --model opus
# 一次性提?
openclaw cron add --name "Call back" --at "2h" --session main --system-event "Call back the client" --wake now
Lobster:带审批的确定性工作流
Lobster 是需要确定性执行和明确审批?*多步骤工具管?*的工作流运行时? 当任务不仅仅是单个代理回合,且您想要具有人工检查点的可恢复工作流时使用它?
Lobster 适合的场?
- 多步骤自动化:您需要固定的工具调用管道,而不是一次性提示?
- **审批?*:副作用应暂停直到您批准,然后恢复?
- **可恢复运?*:继续已暂停的工作流,而无需重新运行 earlier 步骤?
它如何与心跳?cron 配对
- 心跳/cron 决定运行何时发生?
- Lobster 定义一旦运行开?发生什么步??
对于计划的工作流,使?cron 或心跳触发调?Lobster 的代理回合? 对于临时工作流,直接调用 Lobster?
运营说明(来自代码)
- Lobster 作为**本地子进?*(
lobsterCLI)在工具模式下运行,并返?JSON 信封? - 如果工具返回
needs_approval,您可以使用resumeToken?approve标志恢复? - 该工具是**可选插?*;通过
tools.alsoAllow: ["lobster"]附加启用(推荐)? - Lobster 期望
lobsterCLI ?PATH上可用?
请参?Lobster 获取完整用法和示例?
主会?vs 独立会话
心跳和定时任务都可以与主会话交互,但方式不同?
| 心跳 | Cron(主会话? | Cron(独立) | |
|---|---|---|---|
| 会话 | ? | 主(通过系统事件? | cron:<jobId> |
| 历史 | 共享 | 共享 | 每次运行全新 |
| 上下? | 完整 | 完整 | 无(全新开始) |
| 模型 | 主会话模? | 主会话模? | 可以覆盖 |
| 输出 | 如果不是 HEARTBEAT_OK 则投? | 心跳提示 + 事件 | 宣布摘要(默认) |
何时使用主会?cron
当您想要以下情况时,使用 --session main ?--system-event?
- 提醒/事件出现在主会话上下文中
- 代理在下次心跳时使用完整上下文处理它
- 没有单独的独立运?
openclaw cron add \
--name "Check project" \
--every "4h" \
--session main \
--system-event "Time for a project health check" \
--wake now
何时使用独立 cron
当您想要以下情况时,使用 --session isolated?
- 没有先前上下文的全新开?
- 不同的模型或思考设?
- 直接向频道宣布摘?
- 不会弄乱主会话的历史
openclaw cron add \
--name "Deep analysis" \
--cron "0 6 * * 0" \
--session isolated \
--message "Weekly codebase analysis..." \
--model opus \
--thinking high \
--announce
成本考虑
| 机制 | 成本配置 |
|---|---|
| 心跳 | ?N 分钟一轮;?HEARTBEAT.md 大小扩展 |
| Cron(主会话? | 添加事件到下次心跳(无独立回合) |
| Cron(独立) | 每任务完整代理回合;可以使用更便宜的模型 |
提示?
- 保持
HEARTBEAT.md较小以最小化令牌开销? - 将类似的检查批量到心跳中,而不是多个定时任务?
- 如果您只想要内部处理,请在心跳上使用
target: "none"? - 对常规任务使用带更便宜模型的独立 cron?