协作运行约 10 分钟
A2A Task 状态机
一个任务从提交到结束的 8 个状态;挂起和续接前先过转移守卫,终态不可再转出。
依据 agent-solution 0.1.3 · main@bf702bc9(2026-11-03)核实
8 个状态
agent-solution 的 Python 运行时扩展里,Task 状态与 A2A 协议的 TaskState 对齐:
| 类别 | 状态 |
|---|---|
| 起点 | SUBMITTED |
| 进行中 | WORKING |
| 挂起 | INPUT_REQUIRED(等用户补信息)、AUTH_REQUIRED(等授权) |
| 终态 | COMPLETED、FAILED、CANCELED、REJECTED |
合法转移
SUBMITTED → WORKING、REJECTED、任一终态
WORKING → INPUT_REQUIRED、AUTH_REQUIRED、任一终态
INPUT_REQUIRED → WORKING、任一终态
AUTH_REQUIRED → WORKING、任一终态
终态 → (不能再转)
守卫函数只有几行:
def check_transition(src, dst):
if is_terminal(src):
return False
return dst in _TRANSITIONS.get(src, frozenset())
节选自源码,去掉了类型标注。
源码check_transitionagent-solution/common/agent-runtime-ext-python/agent_runtime/domain/task/state_machine.py:47@bf702bc9两条规则撑起多轮和幂等
WORKING ⇄ 挂起可以来回多次。 交期承诺智能体可以先问包装规格(INPUT_REQUIRED),续跑后再请经理授权(AUTH_REQUIRED),每次都回到 WORKING,始终是同一个任务。agent-runtime 的 A2A 服务也用 INPUT_REQUIRED 判断续轮,思路一致。
终态不能再转出。 源码注释称它是"幂等和防抢占的基石":任务一旦取消,迟到的计算结果改不了它;同一个完成回调来两次,第二次也会被挡住。
它不是状态存储
这个模块刻意"框架中立",不引入 A2A SDK:权威的 Task 状态存在 A2A SDK 的 TaskStore 里,这里只在挂起、续接、结束之前判断"这一步能不能走"。适配层负责把两边的状态值对上。
动手:做一回守卫
模拟器加载中…
小结
- 8 个状态:一个起点、一个进行中、两个挂起、四个终态。
- 进行中和挂起之间可以多轮往返;终态不可再转出。
- 守卫只判断合法性,权威状态由 A2A SDK 存储。
源码出处
- agent-solution/common/agent-runtime-ext-python/agent_runtime/domain/task/state_machine.py:15
class TaskState8 个状态 - agent-solution/common/agent-runtime-ext-python/agent_runtime/domain/task/state_machine.py:47
def check_transition转移守卫 - agent-solution/common/agent-runtime-ext-python/README.mdPython 运行时扩展的交付说明
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. 下面哪个转移会被守卫拒绝?
2. 这个状态机模块自己存 Task 状态吗?