Spring AI A2A 协议实战:构建跨平台的 AI Agent 协作系统

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 协议的核心特性

  1. Agent Discovery(Agent 发现):通过 AgentCard 机制,每个 Agent 可以公布自己的能力。其他 Agent 可以像查名片一样,发现并了解对方能做什么。

  2. 跨平台通信:基于 HTTP + JSON-RPC + SSE 标准,不依赖特定框架或云服务商。

  3. 任务协作:支持多轮对话、任务状态追踪、流式响应等企业级特性。

  4. 安全认证:内置认证机制,保证 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 项目也还在早期版本。但这个方向值得重点关注。

有几个建议:

  1. 从小处着手:先用一个简单的场景体验 A2A 协议,比如两个 Agent 之间的简单对话

  2. 关注协议演进:A2A 协议更新很快,建议关注官方 GitHub 和 Spring AI 的更新

  3. 安全第一:生产环境使用时要做好认证和授权,目前版本支持基本的认证机制

  4. 保持简单:不要过度设计 Agent 协作,工作流能解决的问题不要用 A2A

相关资源:

相关推荐
亦暖筑序1 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
Bigfish_coding1 小时前
前端转agent-【python】-13 Ollama Python流式输出教程:stream=True 与 async 实践
人工智能
字节跳动数据库3 小时前
文章分享——相似函数处理方法
人工智能·后端·程序员
Bigfish_coding3 小时前
前端转agent-【python】-12 LangChain 入门实战:RAG + LCEL 链式调用
人工智能
程序员cxuan4 小时前
读懂 Claude Code 架构分析系列,第一篇,开始!
人工智能·后端·架构
用户298698530144 小时前
Java 实现 Word 文档加密与权限解除
java·后端
饼干哥哥4 小时前
扣子3.0测评:我让 Codex 和 Claude Code 住同一个桌面,结果它们打架了!
人工智能·开源·代码规范
Yeats_Liao5 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿5 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
Token炼金师5 小时前
IP-Adapter:解耦交叉注意力如何让扩散模型看见图像
人工智能