287 lines
11 KiB
Markdown
287 lines
11 KiB
Markdown
---
|
||
read_when:
|
||
- 决定如何调度周期性任务
|
||
- 设置后台监控或通知
|
||
- 优化定期检查的 token 用量
|
||
summary: 选择心跳还是定时任务进行自动化的指南
|
||
title: 定时任务与心跳对比
|
||
x-i18n:
|
||
generated_at: "2026-02-01T19:38:18Z"
|
||
model: claude-opus-4-5
|
||
provider: pi
|
||
source_hash: 5f71a63181baa41b1c307eb7bfac561df7943d4627077dfa2861eb9f76ab086b
|
||
source_path: automation/cron-vs-heartbeat.md
|
||
workflow: 14
|
||
---
|
||
|
||
# 定时任务与心跳:何时使用哪种方式
|
||
|
||
心跳和定时任务都可以按计划运行任务。本指南帮助你根据使用场景选择合适的机制。
|
||
|
||
## 快速决策指南
|
||
|
||
| 使用场景 | 推荐方式 | 原因 |
|
||
| ------------------------- | -------------------------- | ---------------------------------------- |
|
||
| 每 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", // 间隔
|
||
target: "last", // 告警投递目标
|
||
activeHours: { start: "08:00", end: "22:00" }, // 可选
|
||
},
|
||
},
|
||
},
|
||
}
|
||
```
|
||
|
||
完整配置请参阅[心跳](/gateway/heartbeat)。
|
||
|
||
## 定时任务:精确调度
|
||
|
||
定时任务在**精确时间**运行,可以在隔离会话中运行而不影响主会话上下文。
|
||
|
||
### 何时使用定时任务
|
||
|
||
- **需要精确定时**:"每周一上午 9:00 发送"(而不是"大约 9 点左右")。
|
||
- **独立任务**:不需要对话上下文的任务。
|
||
- **不同的模型/思维级别**:需要更强大模型的深度分析。
|
||
- **一次性提醒**:使用 `--at` 实现"20 分钟后提醒我"。
|
||
- **嘈杂/频繁的任务**:会把主会话历史搞得杂乱的任务。
|
||
- **外部触发器**:无论智能体是否处于活跃状态都应独立运行的任务。
|
||
|
||
### 定时任务优势
|
||
|
||
- **精确定时**:支持带时区的 5 字段 cron 表达式。
|
||
- **会话隔离**:在 `cron:<jobId>` 中运行,不会污染主会话历史。
|
||
- **模型覆盖**:可按任务使用更便宜或更强大的模型。
|
||
- **投递控制**:隔离任务默认以 `announce` 投递摘要,可选 `none` 仅内部运行。
|
||
- **无需智能体上下文**:即使主会话空闲或已压缩,也能运行。
|
||
- **一次性支持**:`--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 \
|
||
--announce \
|
||
--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 参考请参阅[定时任务](/automation/cron-jobs)。
|
||
|
||
## 决策流程图
|
||
|
||
```
|
||
任务是否需要在精确时间运行?
|
||
是 -> 使用定时任务
|
||
否 -> 继续...
|
||
|
||
任务是否需要与主会话隔离?
|
||
是 -> 使用定时任务(隔离式)
|
||
否 -> 继续...
|
||
|
||
此任务能否与其他周期性检查批量处理?
|
||
是 -> 使用心跳(添加到 HEARTBEAT.md)
|
||
否 -> 使用定时任务
|
||
|
||
这是一次性提醒吗?
|
||
是 -> 使用定时任务配合 --at
|
||
否 -> 继续...
|
||
|
||
是否需要不同的模型或思维级别?
|
||
是 -> 使用定时任务(隔离式)配合 --model/--thinking
|
||
否 -> 使用心跳
|
||
```
|
||
|
||
## 组合使用
|
||
|
||
最高效的配置是**两者结合**:
|
||
|
||
1. **心跳**处理常规监控(收件箱、日历、通知),每 30 分钟批量处理一次。
|
||
2. **定时任务**处理精确调度(每日报告、每周回顾)和一次性提醒。
|
||
|
||
### 示例:高效自动化配置
|
||
|
||
**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
|
||
# 每天早上 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
|
||
|
||
- **多步骤自动化**:你需要一个固定的工具调用管道,而不是一次性提示。
|
||
- **审批关卡**:副作用应暂停直到你批准,然后继续执行。
|
||
- **可恢复运行**:继续暂停的工作流而无需重新运行之前的步骤。
|
||
|
||
### 如何与心跳和定时任务配合
|
||
|
||
- **心跳/定时任务**决定*何时*运行。
|
||
- **Lobster** 定义运行开始后*执行哪些步骤*。
|
||
|
||
对于计划性工作流,使用定时任务或心跳触发一次调用 Lobster 的智能体轮次。对于临时工作流,直接调用 Lobster。
|
||
|
||
### 操作说明(来自代码)
|
||
|
||
- Lobster 以**本地子进程**(`lobster` CLI)在工具模式下运行,并返回 **JSON 信封**。
|
||
- 如果工具返回 `needs_approval`,你需要使用 `resumeToken` 和 `approve` 标志来恢复。
|
||
- 该工具是**可选插件**;建议通过 `tools.alsoAllow: ["lobster"]` 附加启用。
|
||
- 如果传入 `lobsterPath`,必须是**绝对路径**。
|
||
|
||
完整用法和示例请参阅 [Lobster](/tools/lobster)。
|
||
|
||
## 主会话与隔离会话
|
||
|
||
心跳和定时任务都可以与主会话交互,但方式不同:
|
||
|
||
| | 心跳 | 定时任务(主会话) | 定时任务(隔离式) |
|
||
| ------ | ------------------------ | ---------------------- | --------------------- |
|
||
| 会话 | 主会话 | 主会话(通过系统事件) | `cron:<jobId>` |
|
||
| 历史 | 共享 | 共享 | 每次运行全新 |
|
||
| 上下文 | 完整 | 完整 | 无(从零开始) |
|
||
| 模型 | 主会话模型 | 主会话模型 | 可覆盖 |
|
||
| 输出 | 非 `HEARTBEAT_OK` 时投递 | 心跳提示 + 事件 | announce 摘要(默认) |
|
||
|
||
### 何时使用主会话定时任务
|
||
|
||
当你需要以下场景时,使用 `--session main` 配合 `--system-event`:
|
||
|
||
- 提醒/事件出现在主会话上下文中
|
||
- 智能体在下一次心跳时带着完整上下文处理它
|
||
- 不需要单独的隔离运行
|
||
|
||
```bash
|
||
openclaw cron add \
|
||
--name "Check project" \
|
||
--every "4h" \
|
||
--session main \
|
||
--system-event "Time for a project health check" \
|
||
--wake now
|
||
```
|
||
|
||
### 何时使用隔离式定时任务
|
||
|
||
当你需要以下场景时,使用 `--session isolated`:
|
||
|
||
- 无先前上下文的全新环境
|
||
- 不同的模型或思维设置
|
||
- 输出可通过 `announce` 直接投递摘要(或用 `none` 仅内部运行)
|
||
- 不会把主会话搞得杂乱的历史记录
|
||
|
||
```bash
|
||
openclaw cron add \
|
||
--name "Deep analysis" \
|
||
--cron "0 6 * * 0" \
|
||
--session isolated \
|
||
--message "Weekly codebase analysis..." \
|
||
--model opus \
|
||
--thinking high \
|
||
--announce
|
||
```
|
||
|
||
## 成本考量
|
||
|
||
| 机制 | 成本特征 |
|
||
| ------------------ | ---------------------------------------------- |
|
||
| 心跳 | 每 N 分钟一次轮次;随 HEARTBEAT.md 大小扩展 |
|
||
| 定时任务(主会话) | 将事件添加到下一次心跳(无隔离轮次) |
|
||
| 定时任务(隔离式) | 每个任务一次完整智能体轮次;可使用更便宜的模型 |
|
||
|
||
**建议**:
|
||
|
||
- 保持 `HEARTBEAT.md` 精简以减少 token 开销。
|
||
- 将类似的检查批量放入心跳,而不是创建多个定时任务。
|
||
- 如果只需要内部处理,在心跳上使用 `target: "none"`。
|
||
- 对常规任务使用隔离式定时任务配合更便宜的模型。
|
||
|
||
## 相关内容
|
||
|
||
- [心跳](/gateway/heartbeat) - 完整的心跳配置
|
||
- [定时任务](/automation/cron-jobs) - 完整的定时任务 CLI 和 API 参考
|
||
- [系统](/cli/system) - 系统事件 + 心跳控制
|