Agent 之间怎么对话?A2A 协议全景解析:从概念到 Java 落地
Agent 之间怎么对话?A2A 协议全景解析:从概念到 Java 落地
你公司 HR Agent 用 Google ADK 构建,销售 Agent 用 LangChain,财务 Agent 用 CrewAI——一个入职流程要横跨三个系统,靠人工串联?A2A 协议让它们自己对话、自己协作。
一、为什么需要 A2A?
先看一个真实场景:
新员工入职流程:
1. HR Agent 完成背调
2. 销售 Agent 创建客户关系
3. 财务 Agent 开通报销权限
没有 A2A:邮件 → 钉钉 → 手动填单 → 等审批
有了 A2A:HR Agent 完成 → 自动通知销售 Agent → 自动通知财务 Agent
当前 Agent 生态的痛点:
| 痛点 | 具体表现 |
|---|---|
| 框架孤岛 | LangChain、CrewAI、AutoGPT 各自闭环,跨框架无法直接通信 |
| 手动串联 | 多 Agent 流程靠人手动传递信息,效率低且易出错 |
| 能力不可见 | A Agent 不知道 B Agent 能干什么,无法动态发现和调度 |
| 安全失控 | Agent 之间直接调用 API,没有标准化的身份认证和权限管理 |
A2A(Agent-to-Agent)协议由 Google 于 2025 年 4 月发布,专门解决这些问题。2025 年 6 月捐赠给 Linux 基金会,已发布 V1.0 GA,150+ 组织生产部署。
二、A2A vs MCP vs 子 Agent:三个层次别搞混
聊 A2A 最大的误区是把它跟 MCP、子 Agent 混在一起——它们解决的根本不是同一层问题:
┌─────────────────────────────────────────────────────────────┐
│ 应用层(业务流程) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ A2A:Agent ↔ Agent 横向协作 │ │
│ │ "你做背调,我做报销审批,我们怎么对接?" │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────┐ ┌───────────────────────────┐ │
│ │ MCP:Agent ↔ 工具 │ │ 子Agent:Agent 内部派生 │ │
│ │ 纵向集成 │ │ 纵向编排 │ │
│ │ "连数据库、调API" │ │ "主Agent拆子任务" │ │
│ └───────────────────────┘ └───────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
| 维度 | A2A | MCP | 子 Agent |
|---|---|---|---|
| 解决什么 | Agent 间横向协作 | Agent 与工具/数据纵向集成 | 系统内任务拆分 |
| 一句话类比 | SMTP(邮件协议) | USB-C(设备接口) | 团队内部分工 |
| 通信方向 | 对等 | 主从 | 主从 |
| 跨框架 | 天然支持 | 不涉及 | 通常同框架内 |
| 部署边界 | 跨组织 | 单 Agent | 单 Agent |
MCP 是给 Agent 装手脚,A2A 是给 Agent 装社交网络。
三、A2A 四大核心对象
3.1 Agent Card——Agent 的"名片"
每个支持 A2A 的 Agent 发布一个 JSON 格式的 Agent Card,描述自己的能力、接口和认证方式:
{
"name": "HR Background Check Agent",
"description": "负责新员工背景调查,包括学历验证、工作经历核实",
"url": "https://hr-agent.example.com/a2a",
"capabilities": {
"streaming": true,
"pushNotifications": true
},
"skills": [
{
"id": "background-check",
"name": "背调执行",
"description": "执行候选人背景调查,返回验证结果",
"inputModes": ["text", "file"],
"outputModes": ["text"]
}
],
"authentication": {
"type": "oauth2",
"authorizationUrl": "https://hr-agent.example.com/auth"
}
}
关键设计:Agent Card 是声明式的,类似 WSDL/OpenAPI spec。调用方不需要提前硬编码对方接口,运行时读 Card 即可。
3.2 Task——任务生命周期
Task 是 A2A 协作的核心单元,有明确的生命周期:
┌──────────────────────────────────────────────────┐
│ Task 生命周期 │
│ │
│ submitted → working → completed │
│ │ │ │ │
│ │ │ └→ failed │
│ │ │ │
│ │ └→ input-required(需要人工输入) │
│ │ │
│ └→ canceled │
└──────────────────────────────────────────────────┘
| 状态 | 含义 |
|---|---|
submitted | 任务已提交,远端 Agent 已接收 |
working | 远端 Agent 正在处理 |
input-required | 需要调用方补充信息(人工介入点) |
completed | 任务完成,产出 Artifact |
failed | 任务失败 |
canceled | 任务取消 |
3.3 Message——对话消息
Agent 之间的对话通过 Message 传递:
{
"role": "user",
"parts": [
{
"type": "text",
"text": "请对候选人张三进行背调"
},
{
"type": "file",
"file": {
"name": "resume.pdf",
"url": "https://example.com/resume.pdf"
}
}
]
}
Part 的多种类型:text、file、data(结构化 JSON),确保不同类型内容都能在 Agent 间流转。
3.4 Artifact——任务产出
Task 完成后产出 Artifact:
{
"artifact": {
"parts": [
{
"type": "text",
"text": "背调结论:学历验证通过,工作经历核实通过"
},
{
"type": "data",
"data": {
"candidate": "张三",
"education_verified": true,
"experience_verified": true,
"risk_level": "low"
}
}
]
}
}
四、A2A 通信协议:JSON-RPC 2.0
A2A 基于 JSON-RPC 2.0,所有请求/响应都是标准 JSON:
4.1 核心方法
| 方法 | 用途 | 方向 |
|---|---|---|
tasks/send | 发送任务给远端 Agent | 调用方 → 远端 |
tasks/get | 查询任务状态 | 调用方 → 远端 |
tasks/cancel | 取消任务 | 调用方 → 远端 |
tasks/push-notification/set | 注册推送通知 | 调用方 → 远端 |
4.2 请求示例
{
"jsonrpc": "2.0",
"method": "tasks/send",
"id": "1",
"params": {
"id": "task-2026-001",
"message": {
"role": "user",
"parts": [
{
"type": "text",
"text": "请对候选人张三进行背景调查"
}
]
}
}
}
4.3 三种长任务状态获取模式
┌───────────────────────────────────────────────────────┐
│ 模式一:Polling(轮询) │
│ 调用方定期调 tasks/get 查状态 │
│ ✓ 简单 ✗ 浪费资源 ✗ 延迟高 │
├───────────────────────────────────────────────────────┤
│ 模式二:Streaming SSE(服务端推送事件) │
│ 远端 Agent 通过 SSE 流式返回状态更新 │
│ ✓ 实时 ✗ 需保持连接 ✓ 适合大模型流式输出 │
├───────────────────────────────────────────────────────┤
│ 模式三:Push Notification(Webhook 回调) │
│ 调用方注册回调 URL,远端状态变化时主动推送 │
│ ✓ 解耦 ✓ 适合跨组织 ✗ 需公网可达 │
└───────────────────────────────────────────────────────┘
| 模式 | 适用场景 | 实时性 | 复杂度 |
|---|---|---|---|
| Polling | 简单场景、内网 | 低 | 低 |
| Streaming SSE | 大模型流式输出 | 高 | 中 |
| Push Notification | 跨组织协作 | 中 | 高 |
五、Java 落地:Spring AI + A2A
5.1 引入依赖
Spring AI 已提供 A2A 支持:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-a2a</artifactId>
<version>1.0.0-GA</version>
</dependency>
5.2 发布 Agent Card
@Configuration
public class A2aConfig {
@Bean
public AgentCard hrAgentCard() {
return AgentCard.builder()
.name("HR Background Check Agent")
.description("负责新员工背景调查")
.url("https://hr-agent.example.com/a2a")
.capabilities(Capabilities.builder()
.streaming(true)
.pushNotifications(true)
.build())
.skills(List.of(
Skill.builder()
.id("background-check")
.name("背调执行")
.description("执行候选人背景调查")
.inputModes(List.of("text", "file"))
.outputModes(List.of("text"))
.build()
))
.build();
}
}
5.3 实现 A2A 端点
@RestController
@RequestMapping("/a2a")
public class A2aController {
private final HrBackgroundCheckService checkService;
@PostMapping
public ResponseEntity<JsonRpcResponse> handleRequest(
@RequestBody JsonRpcRequest request) {
switch (request.getMethod()) {
case "tasks/send":
Task task = checkService.startCheck(request.getParams());
return ResponseEntity.ok(JsonRpcResponse.success(task));
case "tasks/get":
Task current = checkService.getStatus(request.getParams().getId());
return ResponseEntity.ok(JsonRpcResponse.success(current));
case "tasks/cancel":
checkService.cancel(request.getParams().getId());
return ResponseEntity.ok(JsonRpcResponse.success(null));
default:
return ResponseEntity.ok(JsonRpcResponse.error(
"Method not found", -32601));
}
}
// Agent Card 端点
@GetMapping("/.well-known/agent-card")
public AgentCard getAgentCard() {
return hrAgentCard();
}
}
5.4 调用远端 Agent
@Service
public class OnboardingService {
private final A2aClient a2aClient;
public String startBackgroundCheck(String candidateName) {
// 1. 发现 Agent(读 Agent Card)
AgentCard hrCard = a2aClient.discover(
"https://hr-agent.example.com/a2a/.well-known/agent-card");
// 2. 发送任务
TaskRequest taskRequest = TaskRequest.builder()
.message(Message.builder()
.role("user")
.parts(List.of(
TextPart.of("请对候选人 " + candidateName + " 进行背调")
))
.build())
.build();
Task task = a2aClient.sendTask(hrCard.getUrl(), taskRequest);
// 3. 轮询等待完成(生产环境用 Push Notification)
while (task.getStatus().getState() == TaskState.WORKING) {
Thread.sleep(5000);
task = a2aClient.getTask(hrCard.getUrl(), task.getId());
}
// 4. 获取产出
if (task.getStatus().getState() == TaskState.COMPLETED) {
return task.getArtifacts().get(0).getParts().get(0).getText();
}
throw new RuntimeException("背调任务失败: " + task.getStatus());
}
}
5.5 注册 Push Notification
// 调用方注册回调
a2aClient.setPushNotification(
hrCard.getUrl(),
PushNotificationConfig.builder()
.url("https://my-agent.example.com/a2a/callback")
.authentication(AuthConfig.builder()
.type("oauth2")
.tokenUrl("https://auth.example.com/token")
.build())
.build()
);
六、A2A 与中国国标 GB/Z 185-2026
中国于 2026 年发布了 GB/Z 185-2026《智能体间协作通信协议》,与 A2A 高度对齐:
| 维度 | A2A (Google/Linux Foundation) | GB/Z 185-2026 (中国国标) |
|---|---|---|
| 核心模型 | Agent Card + Task + Message | 基本一致 |
| 传输协议 | JSON-RPC 2.0 over HTTP | JSON-RPC 2.0 over HTTP |
| 认证方式 | OAuth2 / API Key | 国密算法 + OAuth2 |
| 扩展点 | Skill、Part 类型 | 增加合规审计字段 |
| 互操作性 | 可互操作 | 可互操作 |
实践建议:国内项目优先适配国标,出海项目用 A2A 标准。两者核心模型一致,切换成本很低。
七、A2A 生产落地 Checklist
| 实践 | 原因 |
|---|---|
| Agent Card 必须 HTTPS + 认证 | 防止伪造 Agent 能力描述 |
| 长任务用 Push Notification | Polling 浪费资源,SSE 不适合跨组织 |
| Task 设置超时 | Agent 可能宕机,调用方不能无限等 |
| Artifact 做版本控制 | Agent 可能多次迭代产出 |
| 敏感数据用加密 Part | Agent 间传输的数据可能包含个人信息 |
| 加可观测性(Trace ID) | 多 Agent 链路追踪,出了问题能定位 |
| Agent Card 版本管理 | 能力变更需要版本控制,避免调用方缓存过期 |
八、A2A 生态现状
| 指标 | 数据 |
|---|---|
| 协议版本 | V1.0 GA |
| 管理方 | Linux Foundation |
| 生产部署组织 | 150+ |
| 主流框架支持 | Spring AI、LangChain4j、Google ADK、CrewAI |
| 中国国标 | GB/Z 185-2026 |
| 与 MCP 关系 | 互补(A2A 管横向,MCP 管纵向) |
九、总结
A2A 解决的是 Agent 世界的"社交问题"——不同框架、不同厂商的 Agent 怎么对话、怎么协作、怎么安全地交换任务:
- Agent Card 是入口:声明式能力描述,运行时发现
- Task 是核心:明确的生命周期,从提交到完成
- JSON-RPC 2.0 是骨架:简单、标准、语言无关
- 三种通知模式:Polling / SSE / Push Notification,按场景选
- MCP 互补不竞争:一个管工具集成,一个管 Agent 协作
一句话:MCP 给 Agent 装了手和脚,A2A 给 Agent 装了社交网络。两手都要硬,Agent 才能真正干活。
相关阅读:
更多推荐

所有评论(0)