Agent 生命周期
生命周期描述的是 Agent 的逻辑存在状态,而不是操作系统进程状态。进程可以重启,Agent 可以继续存在;任务可以结束,Agent 仍然可以保持活动或进入休眠。
状态模型
Created -> Initializing -> Active <--------------------+
| | |
| +-> Sleeping -> Waking ---+
| | |
| +-> Evolving -------------+
| | |
+-------------+-> Recovering -----------+
|
+-> Terminating -> Terminated
状态定义
| 状态 | 含义 | 允许的主要行为 | 退出条件 |
|---|---|---|---|
Created | 身份记录已创建,尚未具备运行条件 | 写入初始身份和配置 | 初始化命令被接受 |
Initializing | 加载配置、能力、记忆索引和依赖 | 校验版本、获取租约、建立环境连接 | 初始化成功或进入恢复 |
Active | 可以接收事件、规划和执行动作 | 观察、决策、行动、评估、记忆 | 休眠、演化、恢复或终止事件 |
Sleeping | 逻辑存在但不执行常规任务 | 接收有限唤醒事件、维护最小租约 | 唤醒、终止或恢复事件 |
Waking | 从快照重建运行上下文 | 验证快照、重建连接、追赶事件 | 激活成功或进入恢复 |
Recovering | 正在修复不一致或失败状态 | 诊断、补偿、回滚、重放、隔离 | 恢复成功、降级或终止 |
Evolving | 正在评估候选长期变更 | 实验、回归、审批、发布或拒绝 | 返回活动态或进入恢复 |
Terminating | 正在有序停止并固化最终记录 | 停止接单、处理在途动作、最终快照 | 终止提交完成 |
Terminated | 逻辑生命已结束 | 只读审计和归档 | 无;该状态不可逆 |
Waking 和 Terminating 是明确的过渡状态,避免把有副作用的唤醒或终止过程压缩成一个瞬时状态转换。
状态转换规则
每次状态转换必须包含:
transition_id:全局唯一标识,用于幂等提交;agent_id:目标 Agent;from_state与to_state:预期起点和终点;reason:业务原因或故障原因;trigger:用户、Agent、系统事件或恢复流程;expected_version:防止并发覆盖的状态版本;requested_at与committed_at:请求和提交时间;actor:发起者与授权主体;evidence_refs:日志、指标、快照或审批记录引用。
转换采用“校验 -> 准备 -> 执行副作用 -> 提交”的结构:
TransitionRequested
-> GuardChecked
-> TransitionPrepared
-> SideEffectsApplied
-> TransitionCommitted
如果在提交前失败,Runtime 必须根据已完成步骤执行重试、补偿或恢复;不能仅修改最终状态字段来掩盖中间失败。
关键转换
创建与初始化
- 分配不可复用的
agent_id。 - 写入身份、所有者、使命、初始策略和模式版本。
- 校验所需能力、权限和资源上限。
- 建立记忆索引、消息地址和运行租约。
- 生成第一个可恢复快照。
- 原子提交到
Active。
初始化失败时,Agent 不能伪装成 Active。可恢复错误进入 Recovering;不可恢复的配置错误保留在 Created 或进入终止流程,并保存原因。
休眠
休眠用于减少资源占用,而不是丢弃状态。进入 Sleeping 前必须:
- 停止接受新的普通任务;
- 完成、取消或转移在途动作;
- 固化必要工作记忆和待处理事件游标;
- 释放计算资源和短期连接;
- 保留唤醒条件、身份记录和最小可达地址。
唤醒
唤醒不是简单启动进程。Waking 需要验证:
- 快照模式和逻辑版本兼容;
- Agent 身份与恢复目标一致;
- 写租约未被其他实例持有;
- 休眠期间事件是否需要追赶、合并或丢弃;
- 外部依赖和权限是否仍然有效。
只有这些检查通过后才能进入 Active。
恢复
任何状态都可以在检测到不一致后进入 Recovering,但恢复策略取决于失败类型。恢复完成必须产生新的快照或明确引用已经验证的恢复点,不能复用未经验证的内存状态。
终止
终止分为请求和提交两个阶段:
- 进入
Terminating,拒绝新任务。 - 处理在途副作用和未确认消息。
- 撤销租约、权限和凭据引用。
- 生成最终审计记录和可选归档快照。
- 提交
Terminated。
Terminated 不允许直接回到其他状态。需要继续原使命时,应创建新 Agent,并显式记录继承关系。
心跳、租约与失联
心跳只证明实例在某个时间点仍能回应,不能单独证明业务健康。建议将健康状态拆成:
- 进程存活:实例是否可达;
- 租约有效:实例是否仍拥有写权限;
- 依赖健康:模型、存储、队列和工具是否可用;
- 进度健康:任务游标是否持续前进;
- 语义健康:输出是否满足约束和质量阈值。
写租约必须有期限和持有者。续租失败后,旧实例应立即停止产生外部副作用,防止“双活”同时写入。
快照与恢复点
生命周期快照至少包含:
Snapshot
├── identity: id / version / owner / mission
├── lifecycle: state / state_version / lease
├── goals: active / queued / suspended
├── tasks: cursors / pending effects / deduplication keys
├── memory: indexes / working set / retention metadata
├── world: entities / relations / observation watermark
├── capabilities: versions / permissions / performance evidence
├── relationships: peers / roles / trust / active protocols
└── recovery: checkpoint / schema_version / created_at / checksum
快照不是数据库全量备份。它是足以重建 Agent 逻辑连续性的、版本化且一致的恢复单元。
并发与幂等
生命周期控制面必须防止:
- 同一 Agent 同时存在两个有效写实例;
- 相同唤醒事件重复创建实例;
- 超时重试导致重复终止或重复迁移;
- 旧版本实例覆盖新版本快照;
- 恢复重放再次执行已完成的外部动作。
推荐使用预期版本比较、唯一转换 ID、租约和副作用幂等键共同解决,而不是只依赖分布式锁。
生命周期不变量
- 所有状态转换都可通过事件记录重建原因链。
- 任意时刻最多一个实例拥有写租约。
Active必须对应一个已验证的恢复点或初始化快照。Sleeping不持有常规计算资源,但保留可唤醒信息。Terminated不可逆,且不再持有运行权限。- 恢复过程不能降低身份版本或覆盖更新后的记忆。
验收场景
后续实现至少需要通过以下场景:
- 初始化中断后重试,不产生两个 Agent 身份;
Active实例失联后,新实例获得租约,旧实例无法继续写;- 休眠期间收到多个重复唤醒事件,只启动一次;
- 快照模式不兼容时拒绝进入
Active,并给出迁移或回滚路径; - 终止期间外部调用超时,系统进入可诊断状态而不是直接标记成功;
- 恢复重放时已提交副作用不会重复发生。