定时任务与心跳:何时使用哪种方式
心跳和定时任务都可以按计划运行任务。本指南帮助你根据使用场景选择合适的机制 。
快速决策指南
| 使用场景 | 推荐方式 | 原因 |
|---|---|---|
| 每 30 分钟检查收件箱 | 心跳 | 可与其他检查批量处理,具备上下文感知能力 |
| 每天上午 9 点准时发送报告 | 定时任务(隔离式) | 需要精确定时 |
| 监控日历中即将到来的事件 | 心跳 | 天然适合周期性感知 |
| 运行每周深度分析 | 定时任务(隔离式) | 独立任务,可使用不同模型 |
| 20 分钟后提醒我 | 定时任务(主会话,--at) | 精确定时的一次性任务 |
| 后台项目健康检查 | 心跳 | 搭载在现有周期上 |
心跳:周期性感知
心跳在主会话中以固定间隔运行(默认:30 分钟)。它的设计目的是让智能体检查各种事项并呈现重要信息。
何时使用心跳
- 多个周期性检查:与其设置 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", // 告警投递目标
activeHours: { start: "08:00", end: "22:00" }, // 可选
},
},
},
}
完整配置请参阅心跳。
定时任务:精确调度
定时任务在精确时间运行,可以在隔离会话中运行而不影响主会话上下文。
何时使用定时任务
- 需要精确定时:"每周一上午 9:00 发送"( 而不是"大约 9 点左右")。
- 独立任务:不需要对话上下文的任务。
- 不同的模型/思维级别:需要更强大模型的深度分析。
- 一次性提醒:使用
--at实现"20 分钟后提醒我"。 - 嘈杂/频繁的任务:会把主会话历史搞得杂乱的任务。
- 外部触发器:无论智能体是否处于活跃状态都应独立运行的任务。
定时任务优势
- 精确定时:支持带时区的 5 字段 cron 表达式。
- 会话隔离:在
cron:<jobId>中运行,不会污染主会话历史。 - 模型覆盖:可按任务使用更便宜或更强大的模型。
- 投递控制:隔离任务默认以
announce投递摘要,可选none仅内部运行。 - 无需智能体上下文:即使主会话空闲或已压缩,也能运行。
- 一次性支持:
--at用于精确的未来时间戳。
定时任务示例:每日早间简报
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。
定时任务示例:一次性提醒
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 参考请参阅定时任务。
决策流程图
任务是否需要在精确时间运行?
是 -> 使用定时任务
否 -> 继续...
任务是否需要与主会话隔离?
是 -> 使用定时任务(隔离式)
否 -> 继续...
此任务能否与其他周期性检查批量处理?
是 -> 使用心跳(添加到 HEARTBEAT.md)
否 -> 使用定时任务
这是一次性提醒吗?
是 -> 使用定时任务配合 --at
否 -> 继续...
是否需要不同的模型或思维级别?
是 -> 使用定时任务(隔离式)配合 --model/--thinking
否 -> 使用心跳