跳到主要内容

Cron 与心跳:何时使用哪个

心跳和 cron 作业都可以让您按计划运行任务。本指南帮助您为您的用例选择合适的机制。

快速决策指南

用例推荐原因
每 30 分钟检查一次收件箱心跳与其他检查批量处理,具有上下文感知能力
每天上午 9 点准时发送报告Cron(隔离)需要精确时间
监控日历中的即将到来的活动心跳自然适合周期性感知
运行每周深度分析Cron(隔离)独立任务,可以使用不同模型
20 分钟后提醒我Cron(主,--at单次运行,具有精确时间
后台项目健康检查心跳依附于现有周期

心跳:周期性感知

心跳在 主会话 中以固定间隔(默认:30 分钟)运行。它们设计用于代理检查事物并显示任何重要内容。

何时使用心跳

  • 多个周期性检查:与其单独运行 5 个 cron 作业检查收件箱、日历、天气、通知和项目状态,不如用单个心跳批量处理所有这些。
  • 上下文感知决策:代理具有完整的主会话上下文,因此它可以智能地决定什么是紧急的,什么是可等待的。
  • 对话连续性:心跳运行共享同一会话,因此代理记住最近的对话并可以自然地跟进。
  • 低开销监控:一个心跳替代许多小轮询任务。

心跳优势

  • 批量处理多个检查:一个代理回合可以一起查看收件箱、日历和通知。
  • 减少 API 调用:一个心跳比 5 个隔离的 cron 作业更便宜。
  • 上下文感知:代理知道您正在做什么工作,可以相应地确定优先级。
  • 智能抑制:如果没有需要注意的内容,代理回复 HEARTBEAT_OK,不发送任何消息。
  • 自然时间:根据队列负载略有漂移,这对于大多数监控来说是可以接受的。

心跳示例:HEARTBEAT.md 检查清单

# 心跳检查清单

- 检查收件箱中的紧急邮件
- 查看日历中未来 2 小时的活动
- 如果后台任务完成,总结结果
- 如果空闲超过 8 小时,发送简短检查

代理在每次心跳时读取此内容,并在一个回合中处理所有项目。

配置心跳

{
agents: {
defaults: {
heartbeat: {
every: "30m", // 间隔
target: "last", // 何处传递警报
activeHours: { start: "08:00", end: "22:00" } // 可选
}
}
}
}

请参阅 心跳 了解完整配置。

Cron:精确调度

Cron 作业在 确切时间 运行,可以在隔离会话中运行而不影响主上下文。

何时使用 cron

  • 需要精确时间:"每周一上午 9:00 发送这个"(而不是"大约 9 点左右")。
  • 独立任务:不需要对话上下文的任务。
  • 不同模型/思考:需要更强大模型的繁重分析。
  • 单次提醒:使用 --at 进行"20 分钟后提醒我"。
  • 嘈杂/频繁任务:会混淆主会话历史的任务。
  • 外部触发:应该独立于代理是否活跃而运行的任务。

Cron 优势

  • 精确时间:5 字段 cron 表达式支持时区。
  • 会话隔离:在 cron:<jobId> 中运行,不会污染主历史。
  • 模型覆盖:为每个作业使用更便宜或更强大的模型。
  • 传递控制:可以直接传递到频道;默认情况下仍向主会话发布摘要(可配置)。
  • 无需代理上下文:即使主会话处于空闲或压缩状态也会运行。
  • 单次支持--at 用于精确的未来时间戳。

Cron 示例:每日晨间简报

moltbot 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 示例:单次提醒

moltbot cron add \
--name "会议提醒" \
--at "20m" \
--session main \
--system-event "提醒:站立会议将在 10 分钟后开始。" \
--wake now \
--delete-after-run

请参阅 Cron 作业 了解完整 CLI 参考。

决策流程图

任务是否需要在确切时间运行?
是 -> 使用 cron
否 -> 继续...

任务是否需要与主会话隔离?
是 -> 使用 cron(隔离)
否 -> 继续...

这个任务能否与其他周期性检查一起批处理?
是 -> 使用心跳(添加到 HEARTBEAT.md)
否 -> 使用 cron

是否是单次提醒?
是 -> 使用带 --at 的 cron
否 -> 继续...

是否需要不同的模型或思考级别?
是 -> 使用带 --model/--thinking 的 cron(隔离)
否 -> 使用心跳

结合两者

最有效的设置使用 两者

  1. 心跳 处理例行监控(收件箱、日历、通知)在一个批处理回合中,每 30 分钟一次。
  2. Cron 处理精确时间表(每日报告、每周回顾)和单次提醒。

示例:高效自动化设置

HEARTBEAT.md(每 30 分钟检查):

# 心跳检查清单
- 扫描收件箱中的紧急邮件
- 检查未来 2 小时的日历活动
- 审查任何待处理任务
- 如果安静超过 8 小时,轻度签到

Cron 作业(精确时间):

# 每日上午简报上午 7 点
moltbot cron add --name "晨间简报" --cron "0 7 * * *" --session isolated --message "..." --deliver

# 每周一上午 9 点的每周项目回顾
moltbot cron add --name "每周回顾" --cron "0 9 * * 1" --session isolated --message "..." --model opus

# 单次提醒
moltbot cron add --name "回电" --at "2h" --session main --system-event "回电给客户" --wake now

Lobster:具有批准的确定性工作流

Lobster 是 多步骤工具管道 的工作流运行时,需要确定性执行和明确批准。 当任务不仅仅是单个代理回合,并且您想要一个人工检查点的可恢复工作流时使用它。

Lobster 适用场景

  • 多步骤自动化:您需要固定的工具调用管道,而不是一次性提示。
  • 审批门:副作用应在您批准前暂停,然后继续。
  • 可恢复运行:继续暂停的工作流而不重新运行早期步骤。

如何与心跳和 cron 配对

  • 心跳/cron 决定运行 何时 发生。
  • Lobster 定义一旦运行开始 哪些步骤 发生。

对于计划的工作流,使用 cron 或心跳触发调用 Lobster 的代理回合。 对于临时工作流,直接调用 Lobster。

运维注意事项(来自代码)

  • Lobster 作为 本地子进程lobster CLI)在工具模式下运行并返回 JSON 信封
  • 如果工具返回 needs_approval,您使用 resumeTokenapprove 标志继续。
  • 该工具是 可选插件;通过 tools.alsoAllow: ["lobster"] 以附加方式启用(推荐)。
  • 如果您传递 lobsterPath,它必须是 绝对路径

请参阅 Lobster 了解完整用法和示例。

主会话 vs 隔离会话

心跳和 cron 都可以与主会话交互,但方式不同:

心跳Cron(主)Cron(隔离)
会话主(通过系统事件)cron:<jobId>
历史共享共享每次运行都是新的
上下文完整完整无(从干净开始)
模型主会话模型主会话模型可覆盖
输出如果不是 HEARTBEAT_OK 则传递心跳提示 + 事件摘要发布到主会话

何时使用主会话 cron

当您想要以下内容时,使用 --session main--system-event

  • 提醒/事件出现在主会话上下文中
  • 代理在下次心跳期间使用完整上下文处理它
  • 没有单独的隔离运行
moltbot cron add \
--name "检查项目" \
--every "4h" \
--session main \
--system-event "项目健康检查时间" \
--wake now

何时使用隔离 cron

当您想要以下内容时,使用 --session isolated

  • 没有先前上下文的干净 slate
  • 不同的模型或思考设置
  • 输出直接传递到频道(摘要仍默认发布到主会话)
  • 不会混淆主会话的历史
moltbot cron add \
--name "深度分析" \
--cron "0 6 * * 0" \
--session isolated \
--message "每周代码库分析..." \
--model opus \
--thinking high \
--deliver

成本考虑

机制成本概况
心跳每 N 分钟一个回合;随 HEARTBEAT.md 大小扩展
Cron(主)向下次心跳添加事件(无隔离回合)
Cron(隔离)每个作业的完整代理回合;可以使用更便宜的模型

提示

  • 保持 HEARTBEAT.md 小巧以最小化令牌开销。
  • 将类似的检查批量处理到心跳中,而不是多个 cron 作业。
  • 如果您只想进行内部处理,请在心跳上使用 target: "none"
  • 使用带更便宜模型的隔离 cron 进行例行任务。

相关

  • 心跳 - 完整的心跳配置
  • Cron 作业 - 完整的 cron CLI 和 API 参考
  • 系统 - 系统事件 + 心跳控制