一、引言:协议层是智能体规模化的"最后一公里"
2025 年 4 月,Google 发布 A2A(Agent-to-Agent)协议;2025 年 5 月,CopilotKit 团队推出 AG-UI(Agent-User Interaction Protocol)。AI Agent 生态正在经历从"各自为政"到"协议互通"的关键转变。
但在实际落地中,企业面临的挑战更加复杂:
- 语言栈多样化:核心业务团队用 Java/Go,算法团队用 Python,跨语言协同困难
- 框架碎片化:LangChain、AutoGen、CrewAI、AgentScope 各有各的接口规范
- 前端适配重复造轮子:每个团队都在自定义 SSE 事件格式,无法复用前端组件
AgentScope Java 2.0 在 extensions-protocol 模块中提供了四大协议适配器,以独立 Maven 模块的形式实现"即插即用"的模块化集成:
| A2A(客户端 + 服务端) | agentscope-extensions-protocol-a2a | Agent 间标准化通信与任务协作 |
| AG-UI | agentscope-extensions-protocol-agui | Agent 与前端 UI 的事件驱动双向交互 |
| Agent Protocol | agentscope-extensions-protocol-agent-protocol | 将 Agent 暴露为标准 REST API |
| Chat Completions Web | agentscope-extensions-protocol-chat-completions-web | 兼容 OpenAI Chat Completions API |
这四大协议覆盖了智能体系统的三个交互维度:
┌─────────────────────────────────────────────────────────┐
│ 用户 / 前端应用 │
│ ↕ AG-UI(Agent ↔ User Interface) │
├─────────────────────────────────────────────────────────┤
│ 编排层 / 业务服务 │
│ ↕ Agent Protocol(Agent ↔ REST Client) │
├─────────────────────────────────────────────────────────┤
│ Agent 集群 │
│ ↕ A2A(Agent ↔ Agent) │
└─────────────────────────────────────────────────────────┘
二、A2A 协议集成:跨框架、跨语言的智能体互操作
2.1 协议背景
A2A(Agent-to-Agent Protocol)由 Google 于 2025 年 4 月发布,同年 6 月捐赠给 Linux Foundation,由 AWS、Cisco、Google、Microsoft、Salesforce、SAP 等共同维护。截至 2026 年,已有超过 150 家组织支持该协议。
其核心设计目标:
- 异构互操作:不同框架、不同厂商的 Agent 可以互相发现、通信和协作
- 不共享内存:Agent 之间无需共享工具、上下文或内部状态
- 基于现有标准:构建在 HTTP、JSON、SSE 之上,易于与现有技术栈集成
2.2 核心概念
| Agent Card | Agent 的机器可读能力名片(名称、描述、技能、安全要求等),类似微服务的 API 文档 |
| Task | A2A 中的核心工作单元,具有完整生命周期(Submitted → Working → Completed/Failed/Canceled) |
| Message | Client 与 Server 之间交换的对话消息 |
| Artifact | Task 执行过程中产生的输出物(文件、数据等) |
| Skill | Agent Card 中声明的能力单元,描述 Agent 能做什么 |
💡 MCP 与 A2A 的关系:MCP 标准化了 Agent 如何调用工具(手和脚),A2A 标准化了 Agent 之间如何通信(嘴巴和耳朵)。两者互补,不是替代关系。
2.3 AgentScope Java 的 A2A 实现
AgentScope Java 提供了完整的 A2A Server + A2A Client 双端实现。
添加依赖
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-extensions-protocol-a2a</artifactId>
<version>${agentscope.version}</version>
</dependency>
A2A Server:将 Agent 包装为 A2A 服务端点
import io.agentscope.a2a.server.A2aServer;
import io.agentscope.agent.ReActAgent;
// 1. 构建 Agent
ReActAgent agent = ReActAgent.builder()
.name("TravelAssistant")
.description("帮助用户规划旅行行程")
.model(model)
.toolkit(toolkit)
.build();
// 2. 创建 A2A Server(Spring Boot 自动配置或编程式)
A2aServer a2aServer = A2aServer.builder()
.agent(agent)
.port(8080)
.build();
a2aServer.start();
启动后,Server 会自动暴露:
- GET /.well-known/agent.json → Agent Card(能力发现)
- POST / → A2A JSON-RPC 端点(Task 提交、消息发送)
- GET /events → SSE 流(流式事件推送)
A2A Client:调用远端 A2A Agent
AgentScope 支持两种客户端发现模式:
模式一:Well-Known URI 直连
import io.agentscope.a2a.client.A2aClient;
A2aClient client = A2aClient.builder()
.baseUrl("http://travel-agent:8080")
.build();
// 发送任务
Task task = client.sendTask(MessageSendParams.builder()
.message(Message.of("帮我规划一个东京五日游"))
.build());
// 订阅流式事件
client.subscribeEvents(task.getId(), event -> {
System.out.println(event.getType() + ": " + event.getData());
});
模式二:Nacos 注册中心发现
import io.agentscope.a2a.client.NacosAgentCardResolver;
// 通过 Nacos 自动发现可用的 A2A Agent
NacosAgentCardResolver resolver = NacosAgentCardResolver.builder()
.serverAddr("nacos-server:8848")
.namespace("agent-registry")
.build();
List<AgentCard> cards = resolver.resolve("travel");
A2aClient client = A2aClient.fromAgentCard(cards.get(0));
💡 Nacos 集成的价值:在企业级场景中,Agent 数量可能达到数十甚至上百个。通过 Nacos Agent Registry 实现统一注册与发现,让"调 Agent 像调微服务一样自然"。
2.4 协议栈四层模型
AgentScope 的 A2A 实现遵循协议栈四层设计:
| 传输层 | HTTP / SSE / WebSocket / RocketMQ | 默认 HTTP + SSE,可扩展 RocketMQ |
| 协议层 | JSON-RPC 2.0 请求/响应格式 | 内置解析与序列化 |
| 语义层 | Task、Message、Artifact 状态机 | 完整生命周期管理 |
| 发现层 | Agent Card 注册与检索 | Well-Known URI / Nacos |
2.5 生产实践要点
- 安全:Agent Card 中的 securitySchemes 字段声明认证要求(OAuth2、API Key 等)
- 超时控制:Task 执行可能耗时较长,建议配置合理的 timeout 与心跳机制
- 幂等性:taskId 作为唯一标识,重复提交同一 taskId 应返回已有 Task 而非重复创建
- 背压处理:流式事件订阅需考虑消费端处理能力,避免 SSE 缓冲区溢出
三、AG-UI 协议集成:Agent 与前端的标准化事件通信
3.1 协议背景
AG-UI(Agent-User Interaction Protocol)由 CopilotKit 团队于 2025 年 5 月推出,是一个开源、轻量、事件驱动的通信协议。其核心定位:
标准化 AI Agent 与前端 UI 的双向交互。
如果说 MCP 解决了"Agent 如何调用工具",A2A 解决了"Agent 之间如何通信",那么 AG-UI 补上了协议栈上缺失的最后一环:Agent 如何与人交互。
截至 2026 年 7 月,GitHub 上 ag-ui-protocol/ag-ui 仓库已有约 15.1k 星标、1.4k Fork。
3.2 核心设计原则
| 事件驱动 | 所有通信天然是异步的,适配流式输出 |
| 传输无关 | 不绑定具体传输层,当前主流实现基于 SSE,但支持 WebSocket、WebTransport |
| 框架无关 | 一次构建,可连接 React、Vue、原生 JS 或任何前端框架 |
| 状态同步 | 快照 + 增量(Snapshot + Delta)模型,支持断线恢复 |
3.3 五类事件模型
AG-UI 将 Agent 运行过程拆分为五大类事件:
| 生命周期 | RUN_STARTED / RUN_FINISHED / RUN_ERROR | 标记一次 Agent 执行的开始与结束 |
| 文本消息 | TEXT_MESSAGE_START / TEXT_MESSAGE_CONTENT / TEXT_MESSAGE_END | 流式文本输出 |
| 工具调用 | TOOL_CALL_START / TOOL_CALL_ARGS / TOOL_CALL_END / TOOL_CALL_RESULT | 工具调用的参数流与结果回传 |
| 状态管理 | STATE_SNAPSHOT / STATE_DELTA / MESSAGES_SNAPSHOT | 全量快照 / 增量补丁 / 对话历史快照 |
| 推理过程 | THINKING_START / THINKING_CONTENT / THINKING_END | 展示 Agent 的思考/推理过程 |
3.4 SSE 事件流示例
一次典型的 AG-UI 交互,前端收到的 SSE 事件流如下:
data:{"type":"RUN_STARTED","threadId":"thread-001","runId":"run-001"}
data:{"type":"TEXT_MESSAGE_START","messageId":"msg-001","role":"assistant"}
data:{"type":"TEXT_MESSAGE_CONTENT","messageId":"msg-001","delta":"你好,"}
data:{"type":"TEXT_MESSAGE_CONTENT","messageId":"msg-001","delta":"我是你的旅行助手。"}
data:{"type":"TEXT_MESSAGE_END","messageId":"msg-001"}
data:{"type":"TOOL_CALL_START","toolCallId":"tc-001","toolName":"search_flights"}
data:{"type":"TOOL_CALL_ARGS","toolCallId":"tc-001","delta":"{\\"from\\":\\"北京\\",\\"to\\":\\"东京\\"}"}
data:{"type":"TOOL_CALL_END","toolCallId":"tc-001"}
data:{"type":"TOOL_CALL_RESULT","toolCallId":"tc-001","result":"找到3个航班…"}
data:{"type":"STATE_DELTA","delta":[{"op":"add","path":"/flights","value":[…]}]}
data:{"type":"RUN_FINISHED","threadId":"thread-001","runId":"run-001"}
每条事件格式为 data:\\n\\n,两个换行符表示事件边界。
3.5 AgentScope Java 的 AG-UI 实现
添加依赖
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-extensions-protocol-agui</artifactId>
<version>${agentscope.version}</version>
</dependency>
核心机制
AgentScope 框架在流式调用过程中产生 28 种类型化事件,AG-UI 适配器负责将这些内部事件映射为 AG-UI 标准事件格式,并通过 SSE 推送给前端:
AgentScope 内部事件 → AG-UI Event Mapper → SSE Stream → 前端
关键特性
- 多 Agent 路由:支持在一次会话中路由到不同的 Agent 处理
- 中断与恢复:支持用户主动中断(RUN_CANCELED),以及断线重连后- 通过 STATE_SNAPSHOT 恢复
- 快照 + 增量:首次连接发送全量快照,后续仅推送增量变更,降低带宽消耗
3.6 前端接入示例
const eventSource = new EventSource('/ag-ui/run');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
switch (data.type) {
case 'TEXT_MESSAGE_CONTENT':
appendToChat(data.messageId, data.delta);
break;
case 'TOOL_CALL_START':
showToolCallUI(data.toolName);
break;
case 'STATE_DELTA':
applyStatePatch(data.delta);
break;
case 'RUN_FINISHED':
hideLoadingIndicator();
break;
}
};
四、Agent Protocol 集成:将 Agent 暴露为标准 REST API
4.1 协议定位
Agent Protocol 是一种通用的 Agent 服务化协议,核心目标是:
将 Agent 暴露为标准 REST API,便于与现有微服务架构集成。
与 A2A 面向"Agent 间协作"不同,Agent Protocol 更偏向"Agent 作为服务被调用"的场景——即传统的 HTTP Client → Agent Server 模式。
4.2 核心 API 端点
| /ap/tasks | POST | 创建新任务 |
| /ap/tasks/{taskId} | GET | 查询任务状态 |
| /ap/tasks/{taskId}/steps | GET | 获取任务执行步骤 |
| /ap/tasks/{taskId}/steps | POST | 执行下一步 |
| /ap/tasks/{taskId}/artifacts | GET | 获取任务产出物 |
| /ap/agents | GET | 列出可用 Agent |
4.3 AgentScope Java 实现
添加依赖
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-extensions-protocol-agent-protocol</artifactId>
<version>${agentscope.version}</version>
</dependency>
快速接入
import io.agentscope.protocol.AgentProtocolServer;
AgentProtocolServer server = AgentProtocolServer.builder()
.agent(agent)
.port(9090)
.build();
server.start();
启动后即可通过标准 HTTP 调用:
# 创建任务
curl -X POST http://localhost:9090/ap/tasks \\
-H "Content-Type: application/json" \\
-d '{"input": "帮我分析上周的销售数据"}'
# 查询任务状态
curl http://localhost:9090/ap/tasks/task-001
4.4 适用场景
- 已有微服务网关(如 Higress、Kong),需要将 Agent 纳入统一流量管控
- 非 AI 原生的业务系统需要通过 HTTP 调用 Agent 能力
- 需要与 CI/CD、监控系统等运维工具链集成
- 多语言客户端(Python、Go、Rust)需要统一调用入口
五、四大协议对比与选型指南
5.1 协议定位对比
| 交互对象 | Agent ↔ Agent | Agent ↔ 前端 UI | Client ↔ Agent | Client ↔ Agent |
| 通信模式 | 任务委托 + 事件流 | 事件驱动流式 | 请求-响应 | 请求-响应 / 流式 |
| 核心抽象 | Task, Agent Card | Event, State | Task, Step, Artifact | Message, Choice |
| 传输层 | HTTP + SSE | SSE / WebSocket | REST API | REST API |
| 发现机制 | Agent Card / Nacos无(直连)无(直连)无(直连) | |||
| 典型用户 | 编排 Agent / 多 Agent 系统前端开发者后端集成 / 微服务LLM 应用开发者 |
5.2 选型决策树
你的场景是什么?
│
├─ 多个 Agent 需要互相委托任务?
│ └─ ✅ A2A
│
├─ 需要前端实时展示 Agent 执行过程(流式文本、工具调用可视化)?
│ └─ ✅ AG-UI
│
├─ 需要将 Agent 纳入现有微服务体系(REST 调用、网关管控)?
│ └─ ✅ Agent Protocol
│
├─ 需要兼容 OpenAI SDK / 已有 Chat Completions 客户端?
│ └─ ✅ Chat Completions Web
│
└─ 以上都需要?
└─ ✅ 组合使用,同一 Agent 可同时暴露多种协议端点
5.3 组合使用示例
// 同一个 Agent,同时暴露三种协议
ReActAgent agent = ReActAgent.builder()
.name("SmartAssistant")
.model(model)
.toolkit(toolkit)
.build();
// A2A Server:供其他 Agent 调用
A2aServer a2a = A2aServer.builder().agent(agent).port(8080).build();
// AG-UI:供前端实时交互
AgUiServer agui = AgUiServer.builder().agent(agent).port(8081).build();
// Agent Protocol:供微服务网关调用
AgentProtocolServer ap = AgentProtocolServer.builder().agent(agent).port(8082).build();
a2a.start();
agui.start();
ap.start();
六、架构全景:协议层在 AgentScope 中的位置
┌─────────────────────────────────────────────────────────────┐
│ extensions-protocol │
├──────────┬──────────┬──────────────┬────────────────────────┤
│ A2A │ AG-UI │Agent Protocol│ Chat Completions │
│(C+S) │ │ │ (OpenAI 兼容) │
├──────────┴──────────┴──────────────┴────────────────────────┤
│ agentscope-core │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ReActAgent│ │HarnessAgt│ │ Toolkit │ │ Event System │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 基础设施层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Nacos │ │ RocketMQ │ │ Higress │ │ AgentState │ │
│ │(注册发现) │ │(异步传输) │ │(AI网关) │ │ Store(状态) │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────┘
七、生产环境最佳实践
7.1 安全与鉴权
- A2A:通过 Agent Card 的 securitySchemes 声明认证方式;生产环境建议启用 mTLS
- AG-UI:SSE 连接需携带 Token;考虑使用 Higress 网关做统一鉴权与限流
- Agent Protocol:标准 HTTP Header 鉴权(Bearer Token / API Key)
7.2 可观测性
- 所有协议适配器均接入 AgentScope 的 28 种类型化事件系统
- 建议对接 OpenTelemetry,实现全链路 Trace
- 对 A2A Task 的 state 变迁做指标采集(Submitted/Working/Completed/Failed 计数)
7.3 容错与重试
| A2A | Task 级别重试;taskId 幂等保证;SSE 断线重连 + 事件回放 |
| AG-UI | STATE_SNAPSHOT 全量恢复;RUN_ERROR 事件通知前端 |
| Agent Protocol | HTTP 标准重试(429/503);Step 级别断点续传 |
7.4 性能建议
- A2A 高吞吐场景考虑使用 RocketMQ 传输(AgentScope 已有官方适配),避免 SSE 长连接的资源占用
- AG-UI 前端渲染建议使用 虚拟列表 + 事件批量合并,避免高频 TEXT_MESSAGE_CONTENT 导致 DOM 抖动
- Agent Protocol 的 Task 状态查询建议增加缓存层,避免频繁查询执行中任务
八、总结
AgentScope Java 2.0 的协议集成层,通过四大标准化适配器,完整覆盖了智能体系统的三个交互维度:
| Agent ↔ Agent | A2A | 跨框架、跨语言的任务委托与协作 |
| Agent ↔ User | AG-UI | 标准化的流式事件通信,前端一次适配多框架复用 |
| Agent ↔ Service | Agent Protocol / Chat Completions | 无缝融入现有微服务架构 |
这套协议体系的核心设计哲学是:让 Agent 像微服务一样被治理,像网页一样被交互,像 API 一样被调用。
对于正在构建多智能体系统的团队,建议按以下优先级逐步接入:
