A2A,实际跑起来是什么样? 作者:小傅哥
博客: https://bugstack.cn (opens new window) 沉淀、分享、成长,让自己和他人都能有所收获!😄 大家好,我是技术UP主小傅哥。 chatgpt(22年)-> LLM 进阶(23年)-> MCP 协议(24年)-> Skils 技能(25年)-> A2A 标准(25年),这几年 AI 发展的非常迅速,定义了协议,开发了组件,发布了产品。每个阶段,都有非常牛皮的代表性的内容,车速非常快🚌,不知道在坐的各位有没有掉队。
针对这些 LLM 大模型的相关知识,小傅哥也分别提供了相关实战类项目,包括; AI 问答助手(23年) 、 OpenAi(ChatGPT/ChatGLM) 微服务应用体系构(23年) 、 OpenAI 代码自动评审组件(24年) 、 AI Agent 智能体 - 拖拉拽(25年) 、 AI MCP Gateway 网关服务系统(25年) 、 AI Agent 脚手架 + 场景应用(26年) ,通过这些实战项目,实践各类标准协议和技术组件(spring ai、google adk...)的使用,以及提供非常出色的解决方案。 因为后续的 ai agent 智能体项目,还会涉及到 a2a 协议,所以先给大家做个相关技术的使用方便大家快速实践理解。 🧧 文末提供了20个实战项目(6个AI、5个业务、8个组件、1套源码),以及各类编程技术小册等。欢迎一起加入学习。 # 一、A2A 是什么? A2A (Agent2Agent) 协议是 Google于2025年4月推出、并由 Linux基金会托管的开源开放标准。它作为AI智能体之间的“通用语言”,旨在实现不同框架、不同厂商构建的智能体(Agent)间跨平台发现、通信与协作。 随后25年底,Google 发布了 a2a adk (opens new window) 组件(迭代速度很快)。之后借助代理开发工具包 (Google ADK),我们可以构建复杂的多代理系统,其中不同的代理需要使用代理对代理 (A2A) 协议进行协作和交互!本节提供了一个全面的指南,指导您构建强大的多代理系统,使代理能够安全高效地进行通信和协作。 框架: https://google.github.io/adk-docs/a2a/ (opens new window) 源码: https://github.com/google/adk-java (opens new window) 资料: https://www.ibm.com/cn-zh/think/topics/agent2agent-protocol (opens new window) 文档: https://a2aprotocol.ai/docs/ (opens new window) 如图,整套智能体架构(含A2A);
左侧,是 LLM 模型智能体构建,基于 Spring AI 框架实现。这部分包括,AiApi 使用、RAG、MCP、Skills 的组合构建。 右侧,是 AI Agent 智能体编排,基于 Google ADK 框架实现。这套框架,提供了智能体工作流组装,插件回调钩子等各项基于 Google 发布的协议进行构建的。 之后,右上方,是 Google ADK 26年基于 A2A 协议实现的框架组件,方便我们设计出远程的 A2A 服务对接,把远程服务,转换为本地功能组件,编排进智能体中。因此 A2A 协议的作用,就是让一个远程的智能体,可以像构建本地智能体一样,连接起来进行使用。 基于 a2a 的协议,也有很多三方框架,但我们需要的是一个整体的解决方案,单一一个功能,还不能解决所有问题。所以这里优先选择 google adk 框架。 # 二、实践案例 # 1. 编程环境 jdk 17 google adk 0.8 spring ai 1.1.0-M3 相关的版本包,已经在测试工程中的 pom 里引入了。可以打开工程查看。 # 2. 工程结构
工程: https://github.com/fuzhengwei/xfg-dev-tech-google-adk-a2a-server (opens new window) 说明:基于 Google ADK 框架,构建 A2A 服务端和客户端。注意,服务端的启动方式为 quarkus.sh 方式启动服务,之后使用客户端连接。 注意:这部分还有一些关于关于 Spring AI + Google ADK 的基础使用知识,是在 ApiTest 中有案例。也可以学习项目 《AI Agent 脚手架 + 场景应用》 (opens new window) # 3. 测试案例
public class ApiTest {
public static void main(String[] args) throws Exception {
OpenAiApi openAiApi = OpenAiApi.builder()
.baseUrl("https://apis.****.cn")
.apiKey("sk-tIYdEUUnMqKX3bRf756a31449a4942***需要配置你的key")
.completionsPath("v1/chat/completions")
.embeddingsPath("v1/embeddings")
.build();
ChatModel chatModel = OpenAiChatModel.builder()
.openAiApi(openAiApi)
.defaultOptions(OpenAiChatOptions.builder()
.model("gpt-4o")
.build())
.build();
// agent 测试
LlmAgent agent = LlmAgent.builder()
.name("test")
.description("Chess coach agent")
.model(new SpringAI(chatModel))
.instruction("""
You are a knowledgeable chess coach
who helps chess players train and sharpen their chess skills.
""")
.build();
InMemoryRunner runner = new InMemoryRunner(agent);
Session session = runner
.sessionService()
.createSession("test", "fzw")
.blockingGet();
Flowable<Event> events = runner.runAsync("fzw", session.id(),
Content.fromParts(Part.fromText("1+1")));
System.out.print("\nAgent > ");
events.blockingForEach(event -> System.out.println(event.stringifyContent()));
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43