Spring AI A2A 协议实战:构建跨平台的 AI Agent 协作系统
这段时间在研究 Spring AI 的最新动向,发现了一个非常有意思的方向:A2A 协议(Agent2Agent Protocol)。这是 Google 牵头搞的一个开放协议,专门解决不同 AI Agent 之间的通信问题。Spring AI 也在积极跟进,已经有了 Spring AI A2A 项目。
这篇文章,我将从实际开发的角度,聊聊 A2A 协议是什么、怎么用,以及为什么它可能是未来 AI 应用架构的关键。
为什么需要 A2A 协议
先说说背景。现在市面上各种 AI Agent 越来越多,但一个问题浮现出来:每个 Agent 都是孤岛。
你用 OpenAI 的 Agent,写了一套工具和工作流,想跟 Anthropic 的 Agent 交互?对不起,没门。你用 LangChain 做的 Agent,想调用 Spring AI 做的 Agent?也不行。
这就跟早期的 HTTP 协议出现之前一样------各种私有网络各自为政,无法互联互通。A2A 协议的出现就是为了解决这个问题。
A2A 协议的核心特性
-
Agent Discovery(Agent 发现):通过 AgentCard 机制,每个 Agent 可以公布自己的能力。其他 Agent 可以像查名片一样,发现并了解对方能做什么。
-
跨平台通信:基于 HTTP + JSON-RPC + SSE 标准,不依赖特定框架或云服务商。
-
任务协作:支持多轮对话、任务状态追踪、流式响应等企业级特性。
-
安全认证:内置认证机制,保证 Agent 之间的通信安全。
Spring AI A2A 项目快速入门
Spring AI A2A 是 Spring 官方出品的 A2A 协议集成项目,已经支持把 Spring AI 应用暴露为 A2A Server。
添加依赖
在 pom.xml 中添加:
groupId: org.springaicommunity
artifactId: spring-ai-a2a-server-autoconfigure
version: 0.2.0
配置 AgentCard
AgentCard 是 A2A 协议的核心,每个 Agent 都需要暴露自己的 AgentCard。
实现 AgentExecutor
AgentExecutor 是实际处理请求的核心。需要把 Spring AI 的 ChatClient 和工具整合进来。
@Bean
public AgentExecutor agentExecutor(ChatClient.Builder chatClientBuilder, WeatherTools weatherTools) {
ChatClient chatClient = chatClientBuilder.clone()
.defaultSystem("你是一个天气助手。使用工具来回答用户问题。")
.defaultTools(weatherTools)
.build();
return new DefaultAgentExecutor(chatClient, (chat, requestContext) -> {
String userMessage = DefaultAgentExecutor.extractTextFromMessage(requestContext.getMessage());
return chat.prompt().user(userMessage).call().content();
});
}
这样配置完成后,你的 Spring AI 应用就变成了一个标准的 A2A Server:
- POST / - 处理 JSON-RPC sendMessage 请求
- GET /.well-known/agent-card.json - AgentCard(标准 A2A 路径)
- GET /card - AgentCard(备用路径)
其他 Agent 可以通过这些端点发现你的能力并发送任务。
Agent Client:调用远程 Agent
A2A 协议是双向的。你可以作为 Client 调用其他 Agent。典型的场景是:一个主机 Agent 协调多个专业 Agent。
1. 配置远程 Agent 地址
在配置文件中指定远程 Agent 的地址:
remote.agents.urls=http://localhost:10001/weather/,http://localhost:10002/travel/
2. 实现远程调用
@Service
public class RemoteAgentService {
private final Map<String, AgentCard> agentCards = new HashMap<>();
public RemoteAgentService(@Value("${remote.agents.urls}") List<String> agentUrls) {
for (String url : agentUrls) {
String path = new URI(url).getPath();
AgentCard card = A2A.getAgentCard(url, path + ".well-known/agent-card.json", null);
this.agentCards.put(card.name(), card);
}
}
@Tool(description = "发送任务到远程 Agent")
public String sendMessage(String agentName, String task) {
AgentCard agentCard = this.agentCards.get(agentName);
Message message = new Message.Builder()
.role(Message.Role.USER)
.parts(List.of(new TextPart(task, null)))
.build();
Client client = Client.builder(agentCard)
.clientConfig(new ClientConfig.Builder()
.setAcceptedOutputModes(List.of("text"))
.build())
.withTransport(JSONRPCTransport.class, new JSONRPCTransportConfig())
.build();
return client.sendMessage(message).get(60, TimeUnit.SECONDS);
}
}
这样就实现了 Agent 之间的互相调用。
实际应用场景
场景一:多 Agent 协作
一个主 Agent 协调多个专业 Agent:
- 旅行助手 Agent:协调酒店、天气、交通三个子 Agent
- 客服机器人:路由到不同领域的专业 Agent
- 代码审查助手:调用代码分析、漏洞扫描、性能检测等多个 Agent
场景二:企业级工作流
不同部门部署的 Agent 可以互相协作:
- HR 系统的 Agent 与财务系统的 Agent 交互
- 订单系统的 Agent 与物流系统的 Agent 交互
- 每个部门可以独立开发和部署自己的 Agent,通过 A2A 协议互联
场景三:跨平台集成
不限制技术栈:
- Spring AI 开发的 Agent 可以调用 LangChain 开发的 Agent
- 本地部署的 Agent 可以调用云端的 Agent
- 私有 Agent 可以与公开的 Agent 市场对接
写在最后
A2A 协议目前还在快速发展中,Spring AI A2A 项目也还在早期版本。但这个方向值得重点关注。
有几个建议:
-
从小处着手:先用一个简单的场景体验 A2A 协议,比如两个 Agent 之间的简单对话
-
关注协议演进:A2A 协议更新很快,建议关注官方 GitHub 和 Spring AI 的更新
-
安全第一:生产环境使用时要做好认证和授权,目前版本支持基本的认证机制
-
保持简单:不要过度设计 Agent 协作,工作流能解决的问题不要用 A2A
相关资源: