快速决策指南
| 用例 | 推荐 | 原因 |
|---|---|---|
| 每30分钟检查一次收件箱 | 心跳 | 可与其他检查批量处理,具备上下文感知能力 |
| 每天早上9点准时发送日报 | Cron(隔离) | 需要精确的定时 |
| 监控日历以获取即将到来的事件 | 心跳 | 非常适合周期性状态感知 |
| 每周运行深度分析 | Cron(隔离) | 独立任务,可使用不同模型 |
| 20分钟后提醒我 | Cron(主会话,--at) | 一次性任务,定时精准 |
| 后台项目健康检查 | 心跳 | 利用现有周期进行附加操作 |
心跳:周期性状态感知
心跳在主会话中以固定间隔(默认30分钟)运行。其设计目的是让代理定期检查各项状态,并及时上报重要信息。何时使用心跳
- 多项周期性检查:与其为收件箱、日历、天气、通知和项目状态分别配置5个独立的Cron作业,不如采用统一的心跳机制,批量处理所有这些任务。
- 上下文感知决策:代理能够全面掌握主会话的完整上下文,从而智能判断哪些事项紧急、哪些可以延后处理。
- 对话连续性:心跳在共享同一会话的基础上运行,使代理能够记住最近的对话,并自然地展开后续跟进。
- 低开销监控:只需一个心跳即可替代多个小型轮询任务。
心跳的优势
- 批量处理多项检查:只需一次代理调用,即可同时检查收件箱、日历和通知。
- 减少API调用:与五个独立的Cron作业相比,单个心跳更加经济高效。
- 上下文感知:代理能够了解你当前的工作内容,并据此智能地为相关事项分配优先级。
- 智能抑制:如果没有需要关注的事项,代理会回复
HEARTBEAT_OK,且不会发送任何消息。 - 自然的定时机制:定时可能会根据队列负载略有偏差,但这在大多数监控场景中是可以接受的。
心跳示例:HEARTBEAT.md检查清单
配置心跳
何时使用Cron
- 需要精确的定时:“每周一上午9:00发送”(而不是“大约9点”)。
- 独立任务:不需要对话上下文的任务。
- 不同的模型或思维模式:需要更强大模型的重型分析任务。
- 一次性提醒:“20分钟后提醒我”,使用
--at。 - 高频或嘈杂的任务:如果任务过于频繁,可能会干扰主会话历史记录。
- 外部触发:无论代理是否处于活动状态,任务都应独立运行。
- 精确的定时:支持带时区的5字段Cron表达式。
- 会话隔离:在
cron:<jobId>中运行,不会污染主历史记录。 - 模型覆盖:每个作业可以使用更便宜或更强大的模型。
- 交付控制:可以直接发送到某个渠道;默认仍会在主会话中发布摘要(可配置)。
- 无需代理上下文:即使主会话空闲或被压缩,也能正常运行。
- 支持一次性任务:
--at可用于精确的未来时间戳。
决策流程图
结合使用两者
最高效的设置是同时使用两者:- 心跳每30分钟批量处理例行监控任务(收件箱、日历、通知等)。
- Cron负责执行精确的定时任务(日报、周报)以及一次性提醒。
示例:高效自动化设置
HEARTBEAT.md(每30分钟检查一次):龙虾:带有审批的确定性工作流
Lobster是一种用于多步骤工具管道的工作流运行时,特别适用于需要确定性执行和显式审批的场景。 当任务涉及多步代理调用,并且你需要一个可恢复的工作流以及人工检查点时,就该使用Lobster。龙虾的适用场景
- 多步骤自动化:你需要一个固定的工具调用流水线,而不是一次性的提示。
- 审批关卡:副作用应在你批准后暂停,然后在你再次批准时继续。
- 可恢复运行:在暂停后,工作流可以从中断处继续执行,而无需重新运行之前的步骤。
如何与心跳和Cron配合使用
- 心跳/Cron决定何时运行。
- Lobster定义运行开始后执行的步骤。
操作注意事项(来自代码)
- Lobster以本地子进程(
lobsterCLI)的形式在工具模式下运行,并返回一个JSON封装。 - 如果工具返回
needs_approval,则需使用resumeToken和approve标志继续运行。 - 工具是可选插件;建议通过
tools.alsoAllow: ["lobster"]以附加方式启用。 - 如果传递
lobsterPath,则必须是绝对路径。
主会话与隔离会话
心跳和Cron都可以与主会话交互,但方式有所不同:| 心跳 | Cron(主会话) | Cron(隔离) | |
|---|---|---|---|
| 会话 | 主会话 | 主会话(通过系统事件) | cron:<jobId> |
| 历史 | 共享 | 共享 | 每次运行都是全新历史 |
| 上下文 | 完整 | 完整 | 无(从干净状态开始) |
| 模型 | 主会话模型 | 主会话模型 | 可覆盖 |
| 输出 | 若非 HEARTBEAT_OK ,则会送达 | 心跳提示 + 事件 | 摘要发布到主会话 |
何时使用主会话Cron
当您希望以下情况发生时,请使用--session main 并搭配 --system-event:
- 提醒/事件显示在主会话上下文中
- 代理在下次心跳时以完整上下文处理该事件
- 无需单独的隔离运行
何时使用隔离Cron
当您希望以下情况发生时,请使用--session isolated:
- 从干净状态开始,不携带先前的上下文
- 使用不同的模型或思维设置
- 输出直接发送到某个渠道(默认仍会在主会话中发布摘要)
- 历史记录不会污染主会话
成本考量
| 机制 | 成本概况 |
|---|---|
| 心跳 | 每N分钟调用一次;成本随HEARTBEAT.md大小而变化 |
| Cron(主会话) | 在下次心跳时添加事件(无需隔离运行) |
| Cron(隔离) | 每个作业都需要一次完整的代理调用;可使用更便宜的模型 |
- 保持
HEARTBEAT.md简短,以最大限度降低令牌开销。 - 将相似的检查合并到心跳中,而不是使用多个Cron作业。
- 如果只需内部处理,可在心跳中使用
target: "none"。 - 对于常规任务,可使用隔离Cron并搭配更便宜的模型。