【万文超详A2A 协议】从个体赋能到群体智能,智能体间的“TCP/IP协议“
A2A协议:智能体协作的"TCP/IP"标准 A2A协议旨在解决智能体协作中的关键痛点,包括框架不兼容、厂商壁垒和数据隔离等问题。作为智能体间的"TCP/IP协议",A2A基于Apache2.0开源许可,定义了统一的通信、协作与协商规则。 核心架构包含四大组件(Client、Server、Executor、Agent)和三层协议栈(应用层、表示层、传输层)。
一、核心认知:A2A 协议到底解决什么问题?˚𝜗𝜚🍒ᝰ.ᐟ
在 A2A 出现前,智能体协作面临三大核心痛点:
🔴框架不兼容:LangGraph、CrewAI、Google ADK 等框架各自为战,智能体间缺乏统一通信接口;
🟡框架锁定:LangChain 开发的 Agent 无法与 LlamaIndex 开发的 Agent 直接对话。
🟢 厂商壁垒:Salesforce 的 Agent 无法直接指挥Workday 的 Agent 工作。
🔵数据隔离:Agent 难以跨越企业内部 CRM、ERP 、HRM 等多个系统。
🟣协作无标准:不同厂商的智能体(如 Salesforce 销售智能体、SAP 财务智能体)无法直接委托任务;
🔴隐私难保障:协作时需暴露内部逻辑或数据,存在商业机密泄露风险。
因此,A2A 协议的本质的是智能体间的 “TCP/IP 协议”—— 它基于 Apache 2.0 开源许可,定义了统一的通信、协作与协商规则,让任何智能体无论出身(厂商、框架),都能像人类团队一样分工协作,且无需暴露内部实现细节。
二、架构解密:A2A 的核心组件与通信模型˚𝜗𝜚🍒ᝰ.ᐟ
A2A 的架构设计遵循 “简单高效、兼容现有技术栈” 的原则,核心由 “四大组件 + 三层协议栈” 构成
2.1 四大核心组件˚𝜗𝜚🍒ᝰ.ᐟ
🔴A2A Client:任务发起方,可为任意框架开发的智能体(如 LangChain 构建的代码分析智能体);
🟡A2A Server:提供服务的智能体服务端,通常基于 uvicorn/FastAPI 搭建;
🔵AgentExecutor:核心 “任务执行器”,负责接收 HTTP 请求、解析任务,是连接 Server 与实际 Agent 的中间枢纽;
🟣Agent:任务实际执行者,可通过 LangGraph、Vertex AI ADK、CrewAI 等任意框架实现。
这一架构的关键优势是解耦——Client 无需关心 Server 端 Agent 的实现框架,只需通过标准接口通信,极大降低了集成成本。
2.2 A2A架构˚𝜗𝜚🍒ᝰ.ᐟ
2.3 关键组件:Agent Card(智能体的 “数字名片”)˚𝜗𝜚🍒ᝰ.ᐟ
示例:Agent Card JSON 结构
{
"name": "CalendarAgent",
"description": "管理用户日历的智能体",
"url": "http://localhost:8000/a2a",
"version": "1.0.0",
"capabilities": {"streaming": true, "pushNotifications": false},
"authentication": {"schemes": ["apiKey"]},
"skills": [
{
"id": "check_availability",
"name": "检查时间段空闲状态",
"examples": ["我明天上午10点有空吗?"]
}
]
}
三、实战核心:A2A 协议的交互流程与代码实现˚𝜗𝜚🍒ᝰ.ᐟ
A2A 的交互围绕 “任务(Task)” 展开,核心流程分为 “发现 - 发送任务 - 推送通知 - 响应” 四步,下面结合 Python 实战代码拆解关键环节。
3.1 核心交互四要素˚𝜗𝜚🍒ᝰ.ᐟ
3.2 A2A 交互流程详解:˚𝜗𝜚🍒ᝰ.ᐟ
1.Discovery (发现阶段)˚𝜗𝜚🍒ᝰ.ᐟ
3.3.2 Send Task (发送任务)˚𝜗𝜚🍒ᝰ.ᐟ
3.3.3 Push Notifications (推送通知)˚𝜗𝜚🍒ᝰ.ᐟ
3.2.4 Response (响应/成果交付)˚𝜗𝜚🍒ᝰ.ᐟ

3.3 实战代码:搭建 A2A Server(基于 FastAPI+uvicorn)˚𝜗𝜚🍒ᝰ.ᐟ
以 “日历智能体” 为例,实现接收任务、查询日历、返回结果的完整流程:
步骤 1:安装依赖
pip install fastapi uvicorn google-adk pydantic
实现 A2A Server 核心代码
import uvicorn
from fastapi import FastAPI, Request
from pydantic import BaseModel
from google.adk.agents import LlmAgent
from google.adk.tools.google_api_tool import CalendarToolset
# 1. 初始化日历工具集(对接Google Calendar API)
async def create_calendar_agent(client_id, client_secret):
toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
return LlmAgent(
model="gemini-2.0-flash",
name="CalendarAgent",
instruction="""你是日历管理智能体,使用工具查询用户空闲时间,
支持格式:"查询2025-08-01 10:00-11:00是否空闲" """,
tools=await toolset.get_tools()
)
# 2. 定义A2A任务请求模型(对应Task→Message→Part结构)
class Part(BaseModel):
type: str # text/file/data
content: str
class Message(BaseModel):
role: str # user/agent
parts: list[Part]
class TaskRequest(BaseModel):
taskId: str
message: Message
# 3. 搭建A2A Server
app = FastAPI()
agent = None # 全局智能体实例
@app.on_event("startup")
async def startup():
# 加载环境变量中的认证信息
import os
client_id = os.getenv("GOOGLE_CLIENT_ID")
client_secret = os.getenv("GOOGLE_CLIENT_SECRET")
global agent
agent = await create_calendar_agent(client_id, client_secret)
# 4. 提供Agent Card访问接口
@app.get("/.well-known/agent.json")
async def get_agent_card():
return {
"name": "CalendarAgent",
"description": "查询日历空闲状态的A2A服务",
"url": "http://localhost:8000",
"version": "1.0.0",
"capabilities": {"streaming": True},
"skills": [{"id": "check_availability", "name": "检查时间段空闲状态"}]
}
# 5. 处理任务请求(核心接口)
@app.post("/a2a/tasks/send")
async def handle_task(request: TaskRequest):
# 解析用户任务(从Message→Part中提取请求内容)
user_message = next(part.content for part in request.message.parts if part.type == "text")
print(f"收到任务:{user_message} | taskId:{request.taskId}")
# 调用智能体执行任务
result = await agent.run(user_message)
# 封装成果为Artifact返回
return {
"taskId": request.taskId,
"status": "completed",
"artifact": {
"parts": [{"type": "text", "content": result}]
}
}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
3.3 两种核心交互模式(代码示例)˚𝜗𝜚🍒ᝰ.ᐟ
A2A 支持同步和流式两种交互模式,适配不同场景需求:
模式 1:同步请求 - 响应(适用于短任务)
# A2A Client示例(同步调用)
import requests
def sync_call_calendar_agent():
task_request = {
"taskId": "task-001",
"message": {
"role": "user",
"parts": [{"type": "text", "content": "查询2025-08-01 10:00-11:00是否空闲"}]
}
}
# 发送同步请求
response = requests.post("http://localhost:8000/a2a/tasks/send", json=task_request)
print("同步响应结果:", response.json()["artifact"]["parts"][0]["content"])
sync_call_calendar_agent()
模式 2:流式协作(适用于长任务,基于 SSE)˚𝜗𝜚🍒ᝰ.ᐟ
# A2A Client示例(流式接收)
import requests
from sseclient import SSEClient
def streaming_call_agent():
# 发起流式任务请求
response = requests.post(
"http://localhost:8000/a2a/tasks/sendSubscribe",
json={"taskId": "task-002", "message": {"role": "user", "parts": [{"type": "text", "content": "查询未来7天空闲时段"}]}},
stream=True
)
# 解析SSE流
client = SSEClient(response)
for event in client.events():
data = json.loads(event.data)
if data["status"] == "working":
print("任务进度:", data["progress"])
elif data["status"] == "completed":
print("最终结果:", data["artifact"]["parts"][0]["content"])
streaming_call_agent()
示例:自动化招聘流程˚𝜗𝜚🍒ᝰ.ᐟ
# 招聘经理Agent(A2A Client)
def recruitment_agent():
# 1. 调用LinkedIn Agent获取候选人列表
linkedin_response = requests.post(
"http://linkedin-agent:8000/a2a/tasks/send",
json={"taskId": "recruit-001", "message": {"role": "user", "parts": [{"type": "text", "content": "查找AI工程师候选人"}]}}
)
candidates = linkedin_response.json()["artifact"]["parts"][0]["content"]
# 2. 调用日历Agent协调面试
calendar_response = requests.post(
"http://calendar-agent:8000/a2a/tasks/send",
json={"taskId": "recruit-002", "message": {"role": "user", "parts": [{"type": "text", "content": f"为候选人{ candidates[:2] }安排下周面试"}]}}
)
return "面试安排完成:" + calendar_response.json()["artifact"]["parts"][0]["content"]
致谢˚𝜗𝜚🍒ᝰ.ᐟ
谢谢大家的阅读,以上是我对近期文献阅读的总结,欢迎大家在评论区指出,如果我的内容对你有帮助,可以点赞 , 收藏 ,大家的支持就是我坚持下去的动力!
“请赐予我平静,去接受我无法改变的 ;赐予我勇气,去改变我能改变的。”

更多推荐



所有评论(0)