用途
A2A Protocol 用于智能体与智能体之间的横向消息传递,依据 Linux Foundation AAIF 2026 标准。MCP 向智能体暴露工具,A2A 则连接智能体与智能体。该规范标准化了能力卡片、任务信封和协商握手,使一个 Claude 智能体可以把工作交给一个 Codex 智能体(或第三方厂商智能体),而无需定制化的粘合代码。
适用场景
- 两个智能体需要跨运行时/厂商边界协作
- 厌倦了在智能体系统之间编写自定义 HTTP 包装器
- 跨组织智能体协作(例如你的计费智能体 ↔ 厂商支持智能体)
- 网状/联邦式智能体系统
不适用场景
- 两个智能体共享同一运行时(直接调用函数或使用编排器即可)
- 单向工具调用 → 使用 MCP(mcp-builder)
核心概念
- Agent Card:公开清单——能力、端点、认证、SLA
- Task Envelope:任务描述 + 输入 + 预算 + 截止时间
- Artifact:任务产生的带类型输出
- Stream:长时间运行任务的进度通道(SSE)
- Negotiation:发送前可选的能力/SLA 协商
Agent Card 示例
{
"name": "acme-research-agent",
"version": "0.4.1",
"endpoint": "https://agents.acme.com/research/a2a",
"auth": {"type": "oauth2", "scopes": ["a2a:invoke"]},
"skills": [
{
"name": "summarize_url",
"input_schema": {"type": "object", "properties": {"url": {"type": "string"}}},
"output_schema": {"type": "object", "properties": {"summary": {"type": "string"}}},
"max_cost_usd": 0.5,
"max_latency_s": 30
}
],
"transports": ["streamable-http", "websocket"]
}
发送任务
from a2a.client import A2AClient
client = A2AClient(card_url="https://agents.acme.com/research/.well-known/agent-card.json")
task = await client.send_task(
skill="summarize_url",
inputs={"url": "https://example.com/paper"},
budget={"max_cost_usd": 0.3, "deadline_s": 20},
)
async for event in task.stream():
if event.type == "artifact":
print(event.artifact.summary)
elif event.type == "status":
print(event.status)
服务端
from a2a.server import A2AServer, skill
class ResearchAgent(A2AServer):
@skill(name="summarize_url", max_cost_usd=0.5, max_latency_s=30)
async def summarize(self, url: str) -> dict:
page = await fetch(url)
return {"summary": await llm.summarize(page)}
ResearchAgent().serve(port=8080)
协商握手
在发送重任务之前进行协商:
- 客户端 → 服务端:能力询问 + 预算
- 服务端 → 客户端:接受 | 还价 | 拒绝(附原因)
- 客户端 → 服务端:发送任务(若被接受)
当 SLA 重要或定价可变时使用。
发现机制
- 众所周知路径:
/.well-known/agent-card.json - 联邦注册表(2026 规范):
registry.a2aproject.io - 本地网状网络:mDNS 服务
_a2a._tcp
安全
- 所有传输基于 TLS,建议双向认证
- 按技能划分作用域(不要授予笼统的“调用任意技能”权限)
- 使用发布者密钥验证 Agent Card 签名
- 预算上限在服务端强制执行,而不仅依赖客户端声明
- 将收到的 artifact 视为不可信输入 → 通过 agent-guardrails 处理
常见陷阱
- 不要通过 A2A 隧道传输任意 MCP——它们属于不同层
- 不要跨 A2A 边界共享会话/记忆;传递显式上下文
- 不要跳过截止时间——长时间运行需要流式传输,而非阻塞
延伸阅读
- Linux Foundation AAIF 2026 规范
- Google A2A Project 参考实现
- A2A 与 MCP 对比——A2A 连接智能体,MCP 暴露工具