Agent 状态机
Agent State Machine
通过状态枚举和上下文管理器实现安全的 Agent 生命周期状态转换
子问题
1.状态转换安全
2.异常状态恢复
3.循环检测
4.资源清理
5.多路径终止信号协调
6.跨层状态传播(Flow→Agent)
7.步数限制与 token 限制双重保护
各项目的解法1 solutions
Signals
横向对比
| 维度 | OpenManus |
|---|---|
| 状态模型 | 4 态 str 枚举(IDLE/RUNNING/FINISHED/ERROR),ERROR 为瞬态非终态 |
| 转换守护 | asynccontextmanager + try/except/finally,异常时 ERROR 后自动恢复前态 |
| 重入防护 | run() 入口 IDLE 守卫,非 IDLE 直接 raise RuntimeError |
| 终止信号 | 子类直接赋值 self.state=FINISHED,多路径:special tool / token limit / max_steps |
| 循环检测 | 精确字符串匹配最近 N 条 assistant 消息,threshold=2,累积式 prompt 注入 |
| 资源清理 | 两层清理:ToolCallAgent 遍历工具 cleanup + BaseAgent 调用 SANDBOX_CLIENT.cleanup |
最佳实践
1.asynccontextmanager 管理状态转换
2.重复检测注入策略变更提示
3.str 枚举使状态值可直接 JSON 序列化
4.run() 入口 IDLE 守卫防止重入
5.两层资源清理:工具级 + 沙箱级