内容纲要
一、核心定义
A2A(Agent-to-Agent)协议:Google推出的开放标准,使不同框架(LangGraph/CrewAI/ADK)构建的智能体能够跨平台通信与协作。
核心类比:
无A2A → 各说各话的方言,无法沟通
有A2A → 统一的普通话,畅通交流
支持厂商:
- Atlassian, Box, LangChain, MongoDB
- Salesforce, SAP, ServiceNow
- Microsoft (Azure AI Foundry, Copilot Studio)
- Auth0
二、为什么需要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", // 端点URL
"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)
- 网络限制
四、通信机制
1. 四种交互模式
| 模式 | 适用场景 | 工作原理 |
|---|---|---|
| 同步请求/响应 | 快速简单操作 | 发送→等待→接收完整响应 |
| 异步轮询 | 长时间任务 | 发送→获取任务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汇率?"}]
}
}
}
// 持续接收增量更新
2. 核心通信概念
| 概念 | 定义 | 作用 |
|---|---|---|
| Task(任务) | 工作的基本单元 | 携带唯一ID和状态(submitted/working/completed) |
| Message(消息) | 通信载体 | 包含attributes(元数据)和parts(实际内容) |
| Artifacts(产出物) | 任务结果 | 可增量流式传输 |
| contextId(上下文ID) | 会话标识 | 关联多次交互,保持上下文 |
技术协议:
- 传输:HTTP(S)
- 负载:JSON-RPC 2.0
- 模态无关:支持文本、音频、视频等多种数据类型
五、A2A vs MCP

图1:A2A与MCP的互补关系
| 维度 | A2A | MCP |
|---|---|---|
| 核心目标 | 智能体间通信与协作 | 智能体与外部数据/工具交互 |
| 关注点 | 任务委派、协调、信息交换 | 结构化上下文、工具调用 |
| 适用场景 | 多智能体系统编排 | 单智能体能力扩展 |
| 开发者 | Anthropic | |
| 关系 | 互补,非竞争 | 互补,非竞争 |
实际应用:
场景:企业智能客服系统
MCP层:
- 查询知识库(RAG)
- 调用CRM API
- 访问工单系统
A2A层:
- 客服智能体 ←→ 技术支持智能体
- 客服智能体 ←→ 订单处理智能体
- 客服智能体 ←→ 数据分析智能体
六、安全机制
| 机制 | 作用 | 实现方式 |
|---|---|---|
| 双向TLS(mTLS) | 加密通信、防拦截 | 加密连接+双向认证 |
| 审计日志 | 追踪与问责 | 记录所有通信细节 |
| 智能体卡片声明 | 集中管理认证 | 在Agent Card中明确声明 |
| 安全凭证 | 身份验证 | OAuth 2.0 / API Key (通过Header传递) |
最佳实践:
- ✅ 使用HTTPS
- ✅ 定期轮换API密钥
- ✅ 实施最小权限原则
- ✅ 监控异常通信模式
- ✅ 加密敏感数据
七、典型应用场景
1. 多框架协作
场景:跨框架智能体团队
实现:ADK智能体 + LangChain智能体 + CrewAI智能体协作
价值:充分利用各框架优势
2. 自动化工作流编排
场景:企业报告生成
流程:
数据收集智能体
↓ (A2A)
数据分析智能体
↓ (A2A)
报告生成智能体
价值:专业化分工,提高效率
3. 动态信息检索
场景:金融分析系统
实现:主智能体 ←(A2A)→ 市场数据智能体
主智能体 ←(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端点
九、优势与挑战
✅ 核心优势
| 优势 | 说明 |
|---|---|
| 互操作性 | 不同框架智能体无缝协作 |
| 模块化 | 智能体独立开发和部署 |
| 可扩展性 | 轻松添加新智能体 |
| 专业化 | 每个智能体专注特定领域 |
| 开放标准 | 社区驱动,厂商支持 |
⚠️ 挑战
| 挑战 | 影响 | 缓解方案 |
|---|---|---|
| 网络延迟 | 跨服务通信增加耗时 | 异步设计+缓存 |
| 复杂性 | 多智能体协调复杂 | 清晰的编排逻辑 |
| 调试困难 | 分布式系统难排查 | 完善的日志和追踪 |
| 版本兼容 | 协议演进可能不兼容 | 语义化版本控制 |
| 安全风险 | 多端点增加攻击面 | mTLS+审计+最小权限 |
十、常见问题
Q1:A2A与MCP如何选择?
- A2A: 多智能体协作、任务委派、跨框架通信
- MCP: 单智能体扩展、外部工具接入、数据源集成
- 通常一起使用:MCP扩展单个智能体能力,A2A编排多个智能体
Q2:如何处理A2A通信失败?
1) 重试机制;2) 超时设置;3) 降级策略;4) 错误日志;5) 熔断器模式。
Q3:A2A支持哪些数据类型?
模态无关,支持文本、JSON、音频、视频、图像等。
Q4:如何管理智能体版本?
在Agent Card中声明版本号,客户端根据兼容性选择。
Q5:A2A性能如何优化?
1) 使用流式传输;2) 实施缓存;3) 异步处理;4) 批量请求;5) 负载均衡。
Q6:如何监控A2A系统?
- 追踪每个任务的状态转换
- 记录通信延迟
- 监控失败率
- 分析审计日志
十一、参考资源
官方文档
图片资源
A2A vs MCP
原文章节
- <code>21-Chapter-15-Inter-Agent-Communication.md</code>
相关章节
- 第 7 章:多智能体协作 - A2A的应用基础
- 第 10 章:模型上下文协议(MCP) - A2A的互补协议