让不同框架、不同厂商的 AI Agent 发现彼此、安全协作的开放标准
Start Reading ↓A2A (Agent-to-Agent) 是由 Google 主导、Linux 基金会托管的开放协议,旨在实现不同 AI Agent 之间的通信与协作。
Agent 不需要暴露内部状态、记忆或工具实现
Agent 之间是平等的合作者,而非工具调用关系
支持文本、文件、结构化数据、表单等多种交互
内建认证、授权、多租户、可观测性支持
JSON-RPC 2.0 / gRPC / REST over HTTP(S)
/.well-known/agent.json (Agent Card)
同步 / SSE 流式 / 异步推送通知
当前 Agent 生态的痛点:每个框架都有自己的 Agent 实现,彼此之间无法直接通信。
这是大家最常问的问题 — A2A 和 MCP (Model Context Protocol) 有什么区别?
| 维度 | MCP | A2A |
|---|---|---|
| 定位 | Agent ↔ 工具/资源 | Agent ↔ Agent |
| 关系 | 主从关系(调用工具) | 对等关系(协作) |
| 交互模型 | 无状态、确定性 I/O | 有状态、自主推理、多轮对话 |
| 类比 | 程序员使用 IDE 插件 | 两个程序员结对编程 |
| 协议 | JSON-RPC | JSON-RPC / gRPC / REST |
店长 Agent 和机械师 Agent 之间的沟通 — 协商、协调、多轮对话
机械师 Agent 使用诊断仪器、查维修手册 — 确定性的工具调用
每个 Agent 通过发布一个 JSON 文件告诉世界 "我是谁、我能做什么、怎么联系我"。
默认位置:https://<host>/.well-known/agent.json
Task 是 A2A 的核心工作单元,有完整的状态机管理。
| 状态 | 含义 | 终态? |
|---|---|---|
| submitted | 已提交,未开始处理 | 否 |
| working | 正在处理中 | 否 |
| input-required | 需要客户端提供更多输入 | 否 |
| auth-required | 需要客户端提供认证 | 否 |
| completed | 成功完成 | 是 |
| failed | 处理失败 | 是 |
| canceled | 客户端取消 | 是 |
| rejected | 服务端拒绝 | 是 |
客户端和 Agent 之间的一次通信轮次,包含 role (user/agent) 和 parts 数组
消息内容载体:TextPart (文本) / FilePart (文件引用) / DataPart (结构化数据)
Agent 处理 Task 后的输出结果。一个 Task 可以产生多个 Artifact
Client Agent Server Agent
| |
| 1. GET /.well-known/agent.json |
|---------------------------------------->|
| <-- Agent Card |
|<----------------------------------------|
| |
| 2. tasks/send (Message) |
|---------------------------------------->|
| <-- Task (status: working) |
|<----------------------------------------|
| |
| 3. (Agent processing...) |
| |
| 4. tasks/get |
|---------------------------------------->|
| <-- Task (status: completed) |
| <-- Artifacts |
|<----------------------------------------|
| 操作 | JSON-RPC 方法 |
|---|---|
| 发送消息 | tasks/send |
| 流式发送 | tasks/sendSubscribe |
| 获取任务 | tasks/get |
| 列出任务 | tasks/list |
| 取消任务 | tasks/cancel |
| 订阅任务 | tasks/subscribe |
| 获取扩展名片 | agents/getCard |
| 操作 | Method | Path |
|---|---|---|
| 发送消息 | POST | /v1/tasks |
| 流式发送 | POST | /v1/tasks?stream=true |
| 获取任务 | GET | /v1/tasks/{id} |
| 列出任务 | GET | /v1/tasks |
| 取消任务 | POST | /v1/tasks/{id}:cancel |
| 订阅任务 | GET | /v1/tasks/{id}:subscribe |
基于 Protocol Buffers 定义,支持全双工流式通信。规范文件:a2a.proto
{
"jsonrpc": "2.0",
"id": "req-001",
"method": "tasks/send",
"params": {
"message": {
"role": "user",
"parts": [
{ "text": "将这段代码从 Python 转换为 Go" }
]
},
"configuration": {
"acceptedOutputModes": ["text/plain", "text/markdown"],
"historyLength": 10
}
}
}
| 认证方式 | 说明 |
|---|---|
| API Key | Header 或 Query 参数 |
| HTTP Bearer | 标准 HTTP Bearer Token |
| OAuth 2.0 | 授权码、客户端凭证、设备码流程 |
| OpenID Connect | 基于 OIDC 发现 |
| Mutual TLS | 双向 TLS 证书认证 |
| 错误码 | 含义 |
|---|---|
| TaskNotFoundError | 任务不存在 |
| TaskNotCancelableError | 终态任务不可取消 |
| UnsupportedOperationError | 不支持的操作 |
| ContentTypeNotSupportedError | 不支持的内容类型 |
| VersionNotSupportedError | 协议版本不兼容 |
A2A 适用于需要多个自治 Agent 协作的场景。以下从通用模式和行业垂直两个维度展开。
将复杂任务拆解给专业 Agent 串行/并行处理。例如内容创作:规划 Agent 拆解大纲 → 研究 Agent 搜集资料 → 写作 Agent 生成文章 → 审核 Agent 校对修改。
一个 Orchestrator Agent 作为中心路由器,根据任务类型将请求路由给不同的专业 Agent,无需 Agent 之间直接耦合。适合企业统一入口场景。
不同组织的 Agent 各自独立运行,通过公开 Agent Card 互相发现,实现跨公司边界的协作(如旅行平台 + 航空公司 + 酒店)。
通用 Agent 在运行时通过 Agent Card 发现专业 Agent 的能力,无需硬编码即可动态委托任务(代码审查、翻译、数据分析等)。
利用 input-required 状态在关键决策点暂停,等待人工审批后继续。适合金融审批、医疗诊断、合规审查等高风险场景。
Agent 之间通过 A2A 对等协作,每个 Agent 内部通过 MCP 调用自己的工具和数据源。这是 Google 推荐的生产级参考架构。
A2A 在各行业的真实落地场景 — 每个案例都包含具体的 Agent 角色和协作方式。
场景:智能信贷审批
客户提交贷款申请后,征信 Agent 拉取信用报告,风控 Agent 进行风险评估,定价 Agent 计算利率,合规 Agent 检查监管要求,最终审批 Agent 做出放款决策。全流程通过 A2A 异步协调,支持 Human-in-the-Loop 人工复核。
场景:辅助诊断协作
患者描述症状后,问诊 Agent 采集病史,影像 Agent 分析 CT/MRI,化验 Agent 解读检验报告,药物 Agent 检查用药禁忌。各 Agent 在隐私合规前提下通过 A2A 共享分析结果,不暴露内部模型和数据。
场景:智能补货与物流
库存 Agent 检测到商品即将缺货,通知采购 Agent 生成订单,采购 Agent 通过 A2A 联系外部供应商 Agent 询价下单,物流 Agent 协调运输和入库。跨越企业边界的协作正是 A2A 的核心优势。
场景:端到端招聘流程
招聘 Agent 解析 JD 需求,人才搜索 Agent 从多个渠道匹配候选人(这是 Google 官方博客的经典示例),面试 Agent 协调时间安排,背调 Agent 执行背景调查,Offer Agent 生成 offer 并跟踪接受状态。
场景:个性化购物助手
用户对话 Agent 理解购物意图,推荐 Agent 结合行为数据推荐商品,库存 Agent 确认可用性,促销 Agent 匹配优惠券,支付 Agent 处理交易,物流 Agent 安排配送。多个 Agent 实时协作提供流畅购物体验。
场景:AI DevOps 流水线
开发者提交需求后,编码 Agent 生成代码,Review Agent 审查质量,测试 Agent 运行测试,安全 Agent 扫描漏洞,部署 Agent 执行发布。参考 InfoQ 的 MLOps 多 Agent 架构实践。
Google 推荐的生产级参考架构 — Orchestrator 通过 A2A 编排专业 Agent,每个 Agent 内部通过 MCP 调用工具。
50+ 家科技公司和咨询公司已加入 A2A 生态。以下是部分典型实践:
Adobe 使用 A2A 让旗下 Agent 协作创建数字体验 — 内容生成 Agent、设计 Agent、数据分析 Agent 协同优化内容创作流程,自动化多系统数据集成。
作为 A2A 创始合作伙伴,ServiceNow 推出 AI Agent Fabric — 连接 ServiceNow、客户和合作伙伴构建的 Agent 的多 Agent 通信层,提供企业级灵活性。
Salesforce 通过 A2A 扩展 Agentforce 平台,使 AI Agent 跨 Salesforce 和其他生态系统无缝协作,将分散的能力编排为统一解决方案。
Twilio 利用 A2A 实现 Latency Aware Agent Selection — 各 Agent 广播自身延迟指标,系统智能路由任务到响应最快的 Agent,优化实时通信体验。
Gartner 预测:到 2026 年,40% 的企业应用将集成任务专用 AI Agent(2025 年仅 5%)。
通过 .well-known/agent.json 发布 Agent 能力,让 Orchestrator 在运行时动态发现和选择 Agent。新增 Agent 只需发布 Agent Card,无需修改 Orchestrator 代码。
Orchestrator 只负责任务拆解和路由,Specialist Agent 负责具体执行。两层规划:Orchestrator 做任务级规划(委托哪个 Agent),Specialist 做工具级规划(调用哪个 MCP Tool)。防止单点瓶颈。
对长时间运行的任务使用 tasks/sendSubscribe (SSE) 或 Push Notification,而非同步等待。避免级联阻塞导致整个 Agent 链超时。用 returnImmediately: true 立即获取 Task ID 后轮询。
传输层用 HTTPS/mTLS,认证层用 OAuth 2.0 或 Bearer Token,授权层基于 Agent Card 的 securitySchemes 声明。对敏感操作使用 auth-required 状态请求额外授权。审计日志记录所有跨 Agent 调用。
使用 Task ID 和 Context ID 实现分布式追踪。监控 Agent 健康度(通过 Agent Card 端点)、任务成功率、延迟和错误分布。使用 OpenTelemetry (a2a-sdk[telemetry]) 集成企业监控平台。
Agent 本身设计为无状态,支持水平扩展。任务状态持久化到外部存储 (a2a-sdk[sql])。通过 Artifact 传递结果,而非共享可变状态。缓存热门 Agent 的 Agent Card 以减少发现开销。
对失败的任务实现指数退避重试。当远端 Agent 不可用时优雅降级。设置合理的超时时间,避免无限等待。用 contextId 关联重试请求,让 Agent 能恢复上下文。
在代码中写死 Agent 的 URL 会导致脆弱系统。应该通过 Agent Card 发现机制动态路由,这样新增或替换 Agent 无需改动调用方。
把 A2A 当作普通 RPC 同步调用会导致级联故障 — 一个 Agent 慢了整条链路都卡住。应该使用异步模式 + 流式更新。
Agent 直接读写共享数据库破坏了 Opaque 原则。应该通过 Artifact 和 Message 传递数据,保持 Agent 之间的隔离。
为每个微小操作创建独立 Agent 会增加通信开销和复杂度。一个 Agent 应该封装一组相关的能力(多个 Skills),而非单一操作。
假设 Agent 永远在线不会宕机。必须实现超时、降级和回退机制,特别是跨组织调用外部 Agent 时。
不验证 Agent Card 签名就信任对方声明的能力。在生产环境中应验证 AgentCardSignature 并校验 TLS 证书。
不是所有多 Agent 场景都需要 A2A。以下帮你快速判断:
| 场景特征 | 推荐方案 | 原因 |
|---|---|---|
| Agent 调用确定性工具/API | MCP | 无状态、确定性 I/O,MCP 更轻量 |
| Agent 之间需要多轮对话协商 | A2A | 有状态交互,需要 Task 生命周期管理 |
| 单一框架内的 Agent 通信 | 框架原生 | LangGraph/CrewAI 内置的通信机制更简单 |
| 跨框架/跨组织的 Agent 协作 | A2A | 这是 A2A 的核心价值 — 互操作性 |
| 需要隐藏 Agent 内部实现 | A2A | Opaque 原则保护知识产权和隐私 |
| 简单的函数调用 / 数据查询 | MCP | A2A 过重,直接用 MCP Tool 调用 |
| 长时间异步任务 + 推送通知 | A2A | 内置 Task 状态机和 Push Notification |
单 Agent 对外提供 A2A 服务,内部通信,简单任务路由。1-2 周即可上线。
3-5 个 Agent 协作,集成外部服务,需要认证和监控。1-2 个月。
10+ Agent 跨组织协作,实时 SLA 要求,合规行业(金融/医疗)。3+ 个月。
# 安装 Python SDK(推荐 Python 3.10+) pip install "a2a-sdk[http-server]" # 或使用 uv uv add "a2a-sdk[http-server]"
| Extra | 用途 |
|---|---|
| http-server | FastAPI / Starlette HTTP 服务 |
| grpc | gRPC 传输支持 |
| telemetry | OpenTelemetry 可观测性 |
| sql | 数据库持久化 (PG/MySQL/SQLite) |
| all | 全部安装 |
from a2a.types import ( AgentCard, AgentSkill, AgentCapabilities, AgentInterface, ) AGENT_CARD = AgentCard( name="translator-agent", displayName="翻译助手", description="支持中英文互译的翻译 Agent", version="1.0.0", endpoints=[ AgentInterface( url="http://localhost:9000/a2a", protocol="jsonrpc", ) ], skills=[ AgentSkill( id="translate", name="文本翻译", description="将中文翻译为英文,或将英文翻译为中文", ) ], capabilities=AgentCapabilities( streaming=True, pushNotifications=False, multiTurn=False, ), )
from a2a.server.agent_execution import AgentExecutor from a2a.server.events import EventQueue from a2a.types import TaskState, TaskStatus, Artifact, TextPart import uuid class TranslatorAgentExecutor(AgentExecutor): async def execute(self, context, event_queue: EventQueue): # 1. 提取用户消息 user_message = context.get_user_message() input_text = user_message.parts[0].text # 2. 更新状态 → working await event_queue.enqueue_event( TaskStatusUpdateEvent( taskId=context.task_id, status=TaskStatus(state=TaskState.working), ) ) # 3. 执行翻译(实际中调用 LLM / API) translated = await self._translate(input_text) # 4. 生成 Artifact await event_queue.enqueue_event( TaskArtifactUpdateEvent( taskId=context.task_id, artifact=Artifact( id=str(uuid.uuid4()), parts=[TextPart(text=translated)], ), ) ) # 5. 完成 await event_queue.enqueue_event( TaskStatusUpdateEvent( taskId=context.task_id, status=TaskStatus(state=TaskState.completed), ) )
from a2a.server.apps import A2AStarletteApplication from a2a.server.request_handlers import DefaultRequestHandler from agent_card import AGENT_CARD from agent_executor import TranslatorAgentExecutor import uvicorn def main(): agent_executor = TranslatorAgentExecutor() request_handler = DefaultRequestHandler( agent_executor=agent_executor, agent_card=AGENT_CARD, ) app = A2AStarletteApplication( agent_card=AGENT_CARD, http_handler=request_handler, ) uvicorn.run(app.build(), host="0.0.0.0", port=9000) if __name__ == "__main__": main()
from a2a.client import A2AClient async def main(): # 自动获取 Agent Card client = await A2AClient.create( base_url="http://localhost:9000" ) # 发送消息 response = await client.send_message( message={ "role": "user", "parts": [{"text": "Hello, how are you?"}] } ) print(response)
my-a2a-agent/ ├── pyproject.toml # 项目配置 & 依赖 ├── agent_card.py # Agent Card 定义 ├── agent_executor.py # Agent 核心逻辑 ├── server.py # A2A Server 启动入口 ├── client.py # 测试用 Client └── tests/ └── test_agent.py # 单元测试
pip install a2a-sdk
最成熟的 SDK,支持 HTTP / gRPC / REST 三种传输
Python 3.10+go get github.com/a2aproject/a2a-go
高性能 Go 实现
Gonpm install @a2a-js/sdk
Node.js & 浏览器支持
JavaScriptMaven 依赖集成
Javadotnet add package A2A
.NET官方示例仓库提供 30+ 个 Agent 示例,覆盖所有主流框架。
| 资源 | 链接 |
|---|---|
| 协议官网 | a2a-protocol.org |
| 完整规范 | a2a-protocol.org/latest/specification/ |
| GitHub | github.com/google/A2A |
| Python SDK | github.com/a2aproject/a2a-python |
| 示例代码 | github.com/a2aproject/a2a-samples |
| 要点 | 说明 |
|---|---|
| A2A 是什么 | Agent 之间通信与协作的开放标准协议 |
| 解决什么问题 | 打破不同框架 Agent 之间的互操作壁垒 |
| 与 MCP 的关系 | 互补 — MCP 连接工具,A2A 连接 Agent |
| 核心机制 | Agent Card → Message → Task → Artifact |
| 开发方式 | AgentCard → AgentExecutor → A2A Server |
| 生态 | 多语言 SDK、30+ 示例、主流框架全覆盖 |