ADK A2A协议深度剖析:从零搭建分布式智能体
【免费下载链接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.项目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs
Agent Development Kit(ADK)是用于构建、评估和部署 AI 智能体的开源代码优先工具包,其 A2A(Agent2Agent)协议让部署在不同机器、用不同语言编写的智能体,也能像调用本地函数一样互相协作。下面把 A2A 在 ADK 中的核心原理、适用边界和上手方法一次讲透。
核心概念与定位:A2A 协议在 ADK 智能体体系中的位置
它是什么:A2A 协议是智能体间通信的标准协议,定义了如何发现并调用以独立服务形式运行的另一个智能体。在 ADK 中,暴露端用to_a2a()或adk api_server --a2a把智能体变成 A2AServer;消费端用RemoteA2aAgent把远端智能体包装成普通子智能体。
它解决什么问题:单一智能体往往覆盖不了所有需求。当所需能力位于独立服务中、由其他团队维护、或用不同语言(Python/Go/Java)编写时,你需要一个统一的、带正式契约的通信层,而不是各团队私定一套 HTTP 接口。
它处于什么位置:A2A 是 ADK 多智能体编排的"网络边界"能力。下图是 ADK 的组件全景,本地子智能体、工作流智能体都留在进程内,只有跨越进程和机器边界时才轮到 A2A 登场。
本地子智能体与 A2A 远程智能体的核心差异,可以浓缩成三个维度:
| 维度 | 本地子智能体 | A2A 远程智能体 |
|---|---|---|
| 部署形态 | 同一应用进程 | 独立服务,可跨机器 |
| 通信方式 | 内存直接调用,无网络开销 | 走网络,A2A 协议序列化 |
| 维护边界 | 同一代码库、同一团队 | 跨团队、跨语言、跨框架 |
内部机制拆解:A2A 协议的完整暴露与消费流程
ADK 中的 A2A 工作流可以拆成六步:
定义智能体:用 ADK 的
Agent正常编写root_agent,可挂载本地子智能体,此步骤与 A2A 完全解耦。用
to_a2a()暴露:一行函数把现有智能体包成 A2A 应用,背后自动生成 AgentCard(智能体名片,描述能力与地址)。选择暴露路径:
- 条件A:要完全掌控服务化过程 →
to_a2a()+uvicorn托管 - 条件B:想配合
adk web调试 →adk api_server --a2a,含agent.json的目录会被自动暴露
- 条件A:要完全掌控服务化过程 →
名片发现:远端智能体在
/.well-known/agent-card.json路径提供名片,消费方无需读源码即可了解其技能。消费远程智能体:
RemoteA2aAgent填入名片 URL,客户端代理负责网络通信、鉴权与数据转换。透明调用:
root_agent按指令委派任务,请求经网络抵达远端 A2A 服务器,开发者视角与调用本地工具无异。
选型决策:什么时候该用 A2A,什么时候别用
官方文档对适用条件有明确界定,直接引用:
✅ 适合场景
- 独立服务协作:目标智能体是单独的服务,跨进程、跨机器部署。
- 多团队共同维护:智能体由其他团队管理,协议充当正式契约。
- 跨语言集成:需要连接 Python、Go、Java 等不同框架的智能体。
- 平台化能力开放:把内部专业能力作为 A2A 服务对外输出。
⚠️ 不适用场景
- 智能体内部拆解:拆分单个智能体的内部模块,用本地子智能体。
- 高频低延迟操作:高频调用下网络与序列化开销不可接受。
- 共享内存/状态:需直接读写主智能体内部状态时。
- 简单辅助函数:小而可复用的逻辑,一个函数就够了。
🔧 动手实操:从零跑通第一个 A2A 智能服务
准备环境:执行pip install google-adk[a2a]安装 A2A 扩展依赖,并准备好 Gemini 模型 API Key。ADK 会自动探测已安装的 a2a-sdk 版本(0.3.x 与 1.x 均兼容),无需手动锁定。
核心配置:下面的代码定义一个最小智能体,并用to_a2a()将其包装为 A2A 应用,智能体卡片会在后台自动生成。
from google.adk.agents import Agent from google.adk.a2a.utils.agent_to_a2a import to_a2a root_agent = Agent( model='gemini-flash-latest', name='hello_world_agent', instruction='You can roll dice and check prime numbers.', ) # 包装为 A2A 应用,port 必须与实际服务端口一致 a2a_app = to_a2a(root_agent, port=8001)也可以通过agent_card参数传入自己的AgentCard对象或 JSON 文件路径,替代自动生成的卡片。
运行验证:启动 A2A 服务器与开发界面,再请求卡片地址确认暴露成功。
# 终端1:启动 A2A 服务器 uvicorn my_agent.agent:a2a_app --host localhost --port 8001 # 终端2:启动开发界面(注意端口与 8001 错开) adk web . # 验证自动生成的智能体卡片 curl http://localhost:8001/.well-known/agent-card.json服务器就绪后,adk web界面里就能直接调试该智能体,左侧面板可在 Trace、Events、State 等视图间切换,观察调用的完整过程。
实战场景:客服智能体与产品目录智能体端到端协作
看一个典型业务链路:客服智能体(support_agent)要回答产品咨询,但商品数据在另一个团队维护的产品目录智能体(catalog_agent)手里。调用链路为:support_agent →(委派)→ RemoteA2aAgent → A2A Server → catalog_agent。
之前怎么做(痛点):没有标准接口时,客服端只能硬编码目录服务的私有 API;目录服务改一次字段,客服端就得跟着改,若是跨语言服务(比如目录是 Java 写的),耦合只会更难受。
现在怎么做(解法):目录智能体以 A2A 服务暴露,附带描述其能力的agent.json;客服智能体用RemoteA2aAgent消费,代码只有几行:
from google.adk.agents import Agent from google.adk.agents.remote_a2a_agent import RemoteA2aAgent catalog_agent = RemoteA2aAgent( name="catalog_agent", description="Handles product catalog lookups", agent_card="http://catalog-svc:8001/.well-known/agent-card.json", ) root_agent = Agent( model="gemini-flash-latest", name="support_agent", sub_agents=[catalog_agent], )效果:客服智能体只面向 A2A 契约编程,不关心目录服务的实现细节。目录智能体可以独立升级、扩容甚至换语言重写,客服侧零改动。整个分布式智能体系统的拓扑如下:
避坑指南与最佳实践
- 端口不一致:to_a2a() 的 port 必须与实际服务端口一致,否则名片地址不可达。
- 名片文件命名:api_server --a2a 只暴露含 agent.json 的目录,文件名写错会被跳过。
- SDK 版本选择:新集成面向 a2a-sdk 1.x,0.3.x 仅兼容模式。
- 新旧路径切换:RemoteA2aAgent 默认 use_legacy=True,新集成需显式置 False。
- 实验特性告警:A2A 仍属实验功能,可设环境变量 ADK_SUPPRESS_A2A_EXPERIMENTAL_FEATURE_WARNINGS=true 静音。
总结与延伸
A2A 协议把"智能体调用智能体"从私定接口的猜谜游戏变成了标准契约:to_a2a()暴露、RemoteA2aAgent消费,网络层全部被 ADK 隐藏。对跨团队、跨语言的分布式智能体协作,它是 ADK 体系里目前最直接的选择;而进程内的子智能体拆分,依然应该优先用本地子智能体,选对工具比堆技术更重要。
- A2A 协议简介(何时用、何时不用)
- Python 暴露智能体快速入门(to_a2a 详解)
- Go 语言 A2A 示例代码
试着把 A2A 集成进你的智能体项目吧。
【免费下载链接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.项目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考