A2A:独立 Agent 之间的任务协议
A2A(Agent2Agent Protocol)让不同框架、语言或组织中的 Agent 以稳定的任务接口协作。调用方只依赖对方公开的能力和协议对象,不需要知道对方内部使用哪个模型、Prompt、工具或 Graph。
为什么不能只把另一个 Agent 当工具
短小、无状态、立即返回的能力可以包装成普通 Tool。远端 Agent 往往还有自己的计划、记忆和审批流程,并可能运行数分钟或数小时,需要暂停、恢复、流式更新、异步通知和正式产物。A2A 用 Task 把这些语义显式化。
A2A 1.0 的核心对象
A2A 1.0 的 AgentCard.supportedInterfaces 可以同时声明 JSONRPC、HTTP+JSON 和 GRPC 等绑定。协议版本归属于每个接口,使服务端可以并行暴露 0.3 与 1.0,支持渐进迁移。
标准交互流程
常用操作包括:
SendMessage:发送消息,返回 Message 或 Task;SendStreamingMessage:以流的方式返回状态、消息和 Artifact 更新;GetTask、ListTasks:查询调用方有权查看的任务;CancelTask:请求取消未进入终态的任务;SubscribeToTask:重新订阅未结束任务的更新;- Push Notification 配置操作:让服务端在长连接不可用时通知回调端点。
最小 HTTP 交互
下面使用 A2A 1.0 的 HTTP+JSON 风格。服务端可以直接完成,也可以返回一个需要后续查询的 Task。
这些枚举与对象结构属于 1.0。旧教程中的小写 user、agent、working,以及旧版 TextPart/FilePart 判别结构,不能直接复制到 1.0 实现。
Task 状态与恢复
常见状态包括 SUBMITTED、WORKING、INPUT_REQUIRED、AUTH_REQUIRED、COMPLETED、FAILED、CANCELED 和 REJECTED。工程上应按状态类别处理:
INPUT_REQUIRED 表示需要业务输入,AUTH_REQUIRED 表示需要补充认证或授权;它们不应被统一当作失败重试。Task ID、Context ID、客户端 Message ID 和业务幂等键也不能混用:分别承担资源定位、交互分组、消息去重和副作用去重。
鉴权与安全
A2A 把 Agent 视为普通企业应用。Agent Card 声明支持的安全方案,但凭据通过带外流程获得,并放在 HTTP header 等传输层位置,绝不能发布在 Agent Card 中。
生产实现需要额外约束:
- 对 Agent Card 的来源、签名或组织身份独立验证,不能“能发现即可信”。
- 每次请求都按调用方身份、tenant、Task 和动作授权;
GetTask/ListTasks不能泄露其他租户任务。 - Push Notification URL 必须防 SSRF,并验证回调所有权、签名、重放和重定向。
- URL Part 和 Artifact 下载必须限制域名、大小、媒体类型和有效期。
- 敏感副作用采用预览、审批、幂等键和完成前再校验,取消也要有确定语义。
- Trace 关联 Client、Server、Task、Message 和 Artifact,但不得记录 token 或未经脱敏的正文。
与其他协议的关系
- A2A 与 MCP 互补:A2A 委派给远端 Agent,远端 Agent 可再用 MCP 调用工具。
- BeeAI 的 Agent Communication Protocol 已并入 A2A,新项目优先采用 A2A,详见 ACP 迁移。
- ANP 更强调开放网络中的去中心化身份、发现和安全消息;需求只在已知端点之间委派任务时,A2A 通常更直接。
- A2A 不规定 Supervisor、Swarm 或 Debate。它可以承载这些拓扑,但拓扑和路由仍由 Graph/Loop 决定。