Agent 异步与事件驱动执行是让 Agent 不必只在一次同步对话中完成任务,而能在外部事件到达时继续、恢复、调整或终止任务的运行方式。它适合等待时间长、需要后台处理,或会被新消息与系统事件改变的任务。
异步不等于“把任务丢到后台”。Agent 仍需要知道任务处于什么状态、事件属于哪个任务,以及收到事件后应该继续、抢占、合并、忽略还是请求人工处理。
事件从哪里来
常见事件包括:
- 用户补充、修改或取消请求;
- 定时器、计划任务和超时信号;
- Webhook、消息队列和外部系统回调;
- 后台工具或子任务完成、失败与进度更新;
- 流式数据、设备状态和监控告警。
为便于路由、去重和审计,事件通常应携带事件 ID、类型、来源、发生时间、关联任务、载荷和必要的优先级。CloudEvents 提供了一种通用事件描述规范;具体 Agent 系统可以采用其他格式,但仍应明确这些语义。
运行闭环
事件驱动 Agent 的基本流程是:
- 接收事件并验证来源与格式;
- 根据任务 ID、会话或业务对象找到关联状态;
- 判断事件是否重复、过期或与当前任务冲突;
- 选择排队、并行、抢占、合并或拒绝;
- 从安全边界恢复执行,形成新的动作;
- 检查动作结果,更新任务状态并决定是否继续等待。
这个过程仍然遵循“观察—决策—动作—新观察”的闭环,只是观察不再只来自紧接着的工具返回。
状态、检查点与恢复
长任务不能只依赖模型上下文。Harness 应持久化目标、约束、计划步骤、已完成结果、等待事项、审批状态和重试次数,并在关键阶段保存检查点。恢复时需要重新验证可能已经变化的外部状态,而不是把旧观察直接当作当前事实。
常见任务状态可包括:待处理、运行中、等待外部事件、等待用户、已完成、失败和已取消。状态变化应由真实事件与执行结果驱动,不能只依据模型声称“已经完成”。
插入新事件的安全边界
模型工具协议通常要求一次工具调用与对应结果保持完整配对。新事件不应任意插入到尚未完成的调用中间。常见做法是:
- 等当前工具调用结束后,在下一次模型调用前合并事件;
- 将紧急事件标记为取消或抢占请求,由 Harness 在可中断点处理;
- 为相互独立的事件创建单独运行,再通过共享的结构化状态协调。
可靠性设计
- 幂等与去重:同一事件可能重复投递,应使用事件 ID 或业务幂等键避免重复写入;
- 顺序与过期:事件到达顺序可能与发生顺序不同,需要版本号、时间或前置状态判断;
- 重试与退避:区分暂时故障和永久失败,限制重试次数并记录原因;
- 背压:事件过快时限制并发、合并低价值更新或延迟处理;
- 死信与人工接管:无法自动处理的事件应进入可检查队列,而不是静默丢失;
- 可观测性:记录事件、任务状态变化、动作结果和通知是否送达。
用户交互
异步 Agent 应明确告诉用户任务是否已开始、正在等待什么、何时需要输入,以及最终结果是否经过验证。快速确认可以先反馈“已经接收并开始处理”,但不能把中间状态伪装成最终完成。用户还应能查看、暂停或取消长任务。
安全边界
- 验证事件来源和签名,不把任意外部载荷当作高优先级指令;
- 对事件触发的写操作重新做身份、权限和审批检查;
- 限制单个来源的速率、并发和资源消耗;
- 对取消、支付、发布等敏感动作设置明确确认与回滚策略;
- 将外部内容视为不可信数据,防止提示注入改变系统规则。