导语
不同框架构建的智能体无法协作,每个系统独立开发集成,添加新智能体需大量改造。A2A(Agent-to-Agent)协议是Google推出的开放标准,使不同框架(LangGraph/CrewAI/ADK)构建的智能体能够跨平台通信与协作。本文介绍A2A核心概念、通信机制、与MCP的互补关系、ADK实战示例与安全机制,适合需要构建跨框架智能体系统的架构师。
TL;DR
- 核心:A2A协议使不同框架构建的智能体能够跨平台通信与协作,包含User、A2A Client、A2A Server三大核心参与者。
- 价值:跨框架互操作性、降低集成成本、促进智能体专业化、支持复杂工作流编排、开源生态。
- 机制:智能体卡片(Agent Card)声明能力和技能,通过发现、请求构建、客户端通信、服务器执行、响应返回五步流程。
- 通信:同步请求/响应、异步轮询、流式更新(SSE)、推送通知(Webhook)四种交互模式。
- 关系:A2A与MCP互补,A2A用于多智能体协作,MCP用于单智能体能力扩展。
- 延伸:与多智能体协作、模型上下文协议配合使用,见《./07-多智能体协作.md》《./10-模型上下文协议.md》。
是什么:A2A的核心定义
A2A(Agent-to-Agent)协议:Google推出的开放标准,使不同框架(LangGraph/CrewAI/ADK)构建的智能体能够跨平台通信与协作。
核心类比:
无A2A → 各说各话的方言,无法沟通
有A2A → 统一的普通话,畅通交流
支持厂商:
- Atlassian, Box, LangChain, MongoDB
- Salesforce, SAP, ServiceNow
- Microsoft (Azure AI Foundry, Copilot Studio)
- Auth0
可视化示意图:

图1:A2A与MCP的互补关系 - 展示两个协议如何协同工作
读图要点:A2A用于智能体间通信,MCP用于智能体与外部工具交互,两者互补而非竞争。
常见误解澄清:
- ❌ A2A与MCP是竞争关系:两者互补,A2A用于多智能体协作,MCP用于单智能体能力扩展。
- ❌ A2A会增加很多延迟:会增加网络通信延迟,但换来跨框架互操作性。
- ❌ 所有智能体都需要A2A:单框架内协作不需要A2A,跨框架协作才需要。
为什么:产生背景与适用场景
产生背景
无A2A的痛点:
- 框架孤岛:不同框架智能体无法协作
- 重复造轮子:每个系统独立开发集成
- 扩展困难:添加新智能体需大量改造
- 任务无法分解:单智能体处理复杂任务效率低
- 信息无法共享:智能体间无法交换信息
A2A解决方案:
- ✅ 跨框架互操作性
- ✅ 降低集成成本
- ✅ 促进智能体专业化
- ✅ 支持复杂工作流编排
- ✅ 开源生态
A2A核心概念
1. 核心参与者(Core Actors)
| 角色 | 定义 | 职责 |
|---|---|---|
| User(用户) | 发起请求的人 | 提出需求 |
| A2A Client(客户端智能体) | 代表用户请求 | 发送任务、接收结果 |
| A2A Server(远程智能体) | 提供服务的智能体 | 处理任务、返回结果 |
工作流程:
User发起请求
↓
Client智能体接收
↓
通过A2A协议调用Remote智能体
↓
Remote智能体处理
↓
返回结果给Client
↓
Client返回给User
2. 智能体卡片(Agent Card)
定义:智能体的"身份证",包含关键元信息,通常为JSON文件。
核心字段:
{
"name": "WeatherBot",
"description": "提供天气预报",
"url": "http://xxx.com/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": false,
"stateTransitionHistory": true
},
"authentication": {
"schemes": ["apiKey"]
},
"skills": [
{
"id": "get_current_weather",
"name": "获取当前天气",
"description": "实时天气查询",
"examples": ["巴黎天气如何?"]
}
]
}
作用:
- 自动发现智能体
- 了解智能体能力
- 确定调用方式
- 声明认证需求
3. 智能体发现(Agent Discovery)
| 发现方式 | 原理 | 适用场景 |
|---|---|---|
| Well-Known URI | 标准路径<code>/.well-known/agent.json</code> | 公共智能体、自动发现 |
| 托管注册中心 | 集中目录,可按条件查询 | 企业环境、集中管理 |
| 直接配置 | 硬编码或私下共享 | 私有系统、紧密耦合 |
安全考虑:
- 访问控制
- 双向TLS(mTLS)
- 网络限制
怎么做:通信机制与ADK实战
四种交互模式
| 模式 | 适用场景 | 工作原理 |
|---|---|---|
| 同步请求/响应 | 快速简单操作 | 发送→等待→接收完整响应 |
| 异步轮询 | 长时间任务 | 发送→获取任务ID→定期查询状态 |
| 流式更新(SSE) | 实时增量结果 | 建立持久连接→服务器持续推送更新 |
| 推送通知(Webhook) | 超长任务 | 注册webhook→任务完成时服务器推送 |
示例对比:
同步请求(使用<code>sendTask</code>):
{
"jsonrpc": "2.0",
"method": "sendTask",
"params": {
"message": {
"role": "user",
"parts": [{"type": "text", "text": "USD to EUR汇率?"}]
}
}
}
// 等待单一完整响应
流式请求(使用<code>sendTaskSubscribe</code>):
{
"jsonrpc": "2.0",
"method": "sendTaskSubscribe",
"params": {
"message": {
"role": "user",
"parts": [{"type": "text", "text": "JPY to GBP汇率?"}]
}
}
}
// 持续接收增量更新
核心通信概念
| 概念 | 定义 | 作用 |
|---|---|---|
| Task(任务) | 工作的基本单元 | 携带唯一ID和状态(submitted/working/completed) |
| Message(消息) | 通信载体 | 包含attributes(元数据)和parts(实际内容) |
| Artifacts(产出物) | 任务结果 | 可增量流式传输 |
| contextId(上下文ID) | 会话标识 | 关联多次交互,保持上下文 |
技术协议:
- 传输:HTTP(S)
- 负载:JSON-RPC 2.0
- 模态无关:支持文本、音频、视频等多种数据类型
A2A vs MCP
| 维度 | A2A | MCP |
|---|---|---|
| 核心目标 | 智能体间通信与协作 | 智能体与外部数据/工具交互 |
| 关注点 | 任务委派、协调、信息交换 | 结构化上下文、工具调用 |
| 适用场景 | 多智能体系统编排 | 单智能体能力扩展 |
| 开发者 | Anthropic | |
| 关系 | 互补,非竞争 | 互补,非竞争 |
实际应用:
场景:企业智能客服系统
MCP层:
- 查询知识库(RAG)
- 调用CRM API
- 访问工单系统
A2A层:
- 客服智能体 ←→ 技术支持智能体
- 客服智能体 ←→ 订单处理智能体
- 客服智能体 ←→ 数据分析智能体
实战示例 - ADK构建A2A Server
1. 创建ADK智能体
from google.adk.agents import LlmAgent
from google.adk.tools.google_api_tool import CalendarToolset
async def create_agent(client_id, client_secret) -> LlmAgent:
"""构建日历管理智能体"""
toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
return LlmAgent(
model='gemini-2.0-flash-001',
name='calendar_agent',
description="帮助管理用户日历的智能体",
instruction=f"""
你是日历管理智能体。
用户会询问日历状态或请求修改。
使用提供的工具与Calendar API交互。
默认日历为'primary'。
今天是 {datetime.datetime.now()}.
""",
tools=await toolset.get_tools(),
)
2. 定义智能体卡片和技能
from a2a import AgentSkill, AgentCard, AgentCapabilities
# 定义技能
skill = AgentSkill(
id='check_availability',
name='检查空闲时间',
description="使用Google Calendar检查用户空闲状态",
tags=['calendar'],
examples=['明天10点到11点我有空吗?'],
)
# 创建智能体卡片
agent_card = AgentCard(
name='Calendar Agent',
description="管理用户日历的智能体",
url=f'http://{host}:{port}/',
version='1.0.0',
defaultInputModes=['text'],
defaultOutputModes=['text'],
capabilities=AgentCapabilities(streaming=True),
skills=[skill],
)
3. 设置A2A服务器
from a2a.adk import ADKAgentExecutor
from a2a.starlette import A2AStarletteApplication, DefaultRequestHandler
from starlette.applications import Starlette
# 创建ADK运行器
adk_agent = asyncio.run(create_agent(
client_id=os.getenv('GOOGLE_CLIENT_ID'),
client_secret=os.getenv('GOOGLE_CLIENT_SECRET'),
))
runner = Runner(
app_name=agent_card.name,
agent=adk_agent,
artifact_service=InMemoryArtifactService(),
session_service=InMemorySessionService(),
)
# 包装为A2A执行器
agent_executor = ADKAgentExecutor(runner, agent_card)
# 创建请求处理器
request_handler = DefaultRequestHandler(
agent_executor=agent_executor,
task_store=InMemoryTaskStore()
)
# 创建A2A应用
a2a_app = A2AStarletteApplication(
agent_card=agent_card,
http_handler=request_handler
)
# 启动服务
app = Starlette(routes=a2a_app.routes())
uvicorn.run(app, host=host, port=port)
核心步骤:
- 创建ADK智能体(配置工具和指令)
- 定义智能体卡片(声明能力和技能)
- 包装为A2A执行器
- 暴露HTTP端点
对比与取舍:A2A的优势与挑战
✅ 核心优势
| 优势 | 说明 |
|---|---|
| 互操作性 | 不同框架智能体无缝协作 |
| 模块化 | 智能体独立开发和部署 |
| 可扩展性 | 轻松添加新智能体 |
| 专业化 | 每个智能体专注特定领域 |
| 开放标准 | 社区驱动,厂商支持 |
⚠️ 挑战
| 挑战 | 影响 | 缓解方案 |
|---|---|---|
| 网络延迟 | 跨服务通信增加耗时 | 异步设计+缓存 |
| 复杂性 | 多智能体协调复杂 | 清晰的编排逻辑 |
| 调试困难 | 分布式系统难排查 | 完善的日志和追踪 |
| 版本兼容 | 协议演进可能不兼容 | 语义化版本控制 |
| 安全风险 | 多端点增加攻击面 | mTLS+审计+最小权限 |
安全机制
| 机制 | 作用 | 实现方式 |
|---|---|---|
| 双向TLS(mTLS) | 加密通信、防拦截 | 加密连接+双向认证 |
| 审计日志 | 追踪与问责 | 记录所有通信细节 |
| 智能体卡片声明 | 集中管理认证 | 在Agent Card中明确声明 |
| 安全凭证 | 身份验证 | OAuth 2.0 / API Key (通过Header传递) |
最佳实践:
- ✅ 使用HTTPS
- ✅ 定期轮换API密钥
- ✅ 实施最小权限原则
- ✅ 监控异常通信模式
- ✅ 加密敏感数据
常见错误与排错
典型坑位
| 问题 | 症状 | 识别方法 | 修复建议 |
|---|---|---|---|
| 连接失败 | 无法连接到远程智能体 | 检查网络和认证 | 验证URL、认证信息、网络连接 |
| 版本不兼容 | 协议版本不匹配 | 检查Agent Card版本 | 使用语义化版本控制,确保兼容 |
| 通信超时 | 长时间任务超时 | 检查超时设置 | 使用异步轮询或流式更新 |
| 安全漏洞 | 未授权访问 | 检查认证机制 | 实施mTLS、API Key、访问控制 |
调试技巧
- 检查Agent Card配置:确保智能体卡片正确配置,包含所有必要信息。
- 验证通信协议:检查JSON-RPC 2.0格式是否正确。
- 查看日志:记录所有通信细节,便于调试和追踪。
- 测试独立运行:先单独测试智能体,再集成到A2A系统。
FAQ
Q1:A2A与MCP如何选择?
A:
- A2A: 多智能体协作、任务委派、跨框架通信
- MCP: 单智能体扩展、外部工具接入、数据源集成
- 通常一起使用:MCP扩展单个智能体能力,A2A编排多个智能体
Q2:如何处理A2A通信失败?
A:1) 重试机制;2) 超时设置;3) 降级策略;4) 错误日志;5) 熔断器模式。
Q3:A2A支持哪些数据类型?
A:模态无关,支持文本、JSON、音频、视频、图像等。
Q4:如何管理智能体版本?
A:在Agent Card中声明版本号,客户端根据兼容性选择。
Q5:A2A性能如何优化?
A:1) 使用流式传输;2) 实施缓存;3) 异步处理;4) 批量请求;5) 负载均衡。
Q6:如何监控A2A系统?
A:
- 追踪每个任务的状态转换
- 记录通信延迟
- 监控失败率
- 分析审计日志
延伸阅读与引用
官方文档
总结
智能体间通信(A2A)是突破单一框架限制、实现跨平台协作的核心协议。通过智能体卡片声明能力和技能,四种交互模式(同步、异步、流式、推送)支持不同场景,A2A实现了不同框架智能体的无缝协作。虽然A2A面临网络延迟、复杂性、调试困难等挑战,但通过异步设计、清晰编排、完善日志和安全机制可以显著缓解。A2A与MCP互补,MCP扩展单个智能体能力,A2A编排多个智能体,两者协同构建完整的智能体生态系统。