协作运行约 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
源码TaskStateagent-solution/common/agent-runtime-ext-python/agent_runtime/domain/task/state_machine.py:15@bf702bc9

合法转移

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 存储。

源码出处

链接指向固定提交,仓库后续更新不影响这里的行号。

过关测验

  1. 1. 下面哪个转移会被守卫拒绝?

  2. 2. 这个状态机模块自己存 Task 状态吗?

通关条件

  • ○ 完成模拟器任务(0/4)
  • ○ 测验全部答对