用 ADK 把智能体连成一张网:A2A 协议从暴露到调用的 3 步实战
【免费下载链接】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
你的客服智能体想查产品信息,但目录数据在另一个智能体手里,而且它由别的团队维护——这就是典型的智能体协作难题。ADK 用 A2A 协议(Agent2Agent)解决它:把你的智能体暴露出去、把远端智能体接进来,两边写法都很短。下面按"选型 → 暴露 → 消费 → 跑通示例"走一遍最小可行路径。
一、先选型:本地子智能体 vs 远程 A2A 智能体
同一个 ADK 工程里,协作有两种形态:sub_agents里的本地子智能体,和挂在独立服务上的远程 A2A 智能体。区别一张表说清:
| 维度 | 本地子智能体 | 远程 A2A 智能体 |
|---|---|---|
| 进程归属 | 和主智能体同进程 | 独立服务,跨进程/跨机器 |
| 调用开销 | 内存调用,无网络与序列化 | 网络请求 + 序列化,延迟更高 |
| 维护方 | 你自己 | 可以是别的团队/组织/第三方 |
| 语言与框架 | 与主智能体相同 | 任意语言、任意框架 |
判断标准,照着选就行:
- 对方是别的团队或组织维护的服务 → 用 A2A。
- 核心逻辑是 Python、要对接 Java 遗留系统 → 用 A2A 做标准化通信层。
- 要平台化、给多个团队的智能体定交互契约 → 用 A2A。
- 同进程内部拆模块、高频低延迟、需要直接共享主智能体状态 → 用本地子智能体。
二、暴露一个 A2A 智能体的两种方式 ⚙️
先认识一个概念:AgentCard ≈ 智能体的名片——写清"我是谁、会做什么、去哪找到我",其他智能体全靠它发现你。
to_a2a():两行代码的极简暴露
最省事的方式:把现有 Agent 包一层,卡片自动生成。下面的写法把 Agent 对象转成 A2A 应用:
from google.adk.a2a.utils.agent_to_a2a import to_a2a a2a_app = to_a2a(root_agent, port=8001)to_a2a()会从你的 Agent 配置里提取 skills、capabilities、描述,生成 well-known 端点可访问的卡片。想自己控制内容时,给它传agent_card参数,值可以是AgentCard对象,也可以直接指到一张卡片 JSON 文件的路径。拿到的a2a_app用 uvicorn 起服务即可。
adk api_server --a2a:可调试、可多智能体托管
需要adk web调试,或者一个目录里挂着多个智能体时,用内置的 CLI 暴露方式更合适。它只暴露子目录里带了agent.json(即 AgentCard)的智能体,卡片要手写。启动命令按下面的形式,指向含多个智能体子目录的父目录:
adk api_server --a2a --port 8001 contributing/samples/a2a/a2a_basic/remote_a2a这样一台服务器就能同时对外服务多个 A2A 智能体。
三、消费远程智能体:一个 RemoteA2aAgent 就够
接入远端智能体只需一个构造函数。agent_card指向远端服务的 well-known 卡片地址,这里示例是 8001 端口的素数检查智能体:
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent prime_agent = RemoteA2aAgent( name="prime_agent", description="判断数字是否为素数的远程智能体。", agent_card="http://localhost:8001/a2a/check_prime_agent/.well-known/agent-card.json", )之后把prime_agent塞进root_agent的sub_agents列表即可。注意一点:调用远端智能体的写法和调本地子智能体几乎一样,协议转换、请求路由、数据格式都由 ADK 兜底,你不用碰网络细节。
四、跑通 a2a_basic 示例:从安装到调通
最小验证环境三步走。第一步,装依赖:
pip install google-adk[a2a]第二步,起远端智能体服务。8001 端口必须和adk web的默认端口 8000 错开,否则本机自测会撞端口。a2a_root示例用to_a2a()暴露(本地起服务):
uvicorn contributing.samples.a2a.a2a_root.remote_a2a.hello_world.agent:a2a_app --host localhost --port 8001a2a_basic示例则走adk api_server --a2a托管check_prime_agent(其目录里带agent.json):
adk api_server --a2a --port 8001 contributing/samples/a2a/a2a_basic/remote_a2a第三步,打开消费端的调试界面并选中对应的 root agent:
adk web contributing/samples/a2a/在页面对 root agent 输入"掷一个 10 面骰子,判断结果是不是素数"。调用链是:root agent 先委托本地 roll agent 掷骰,拿到点数后经 A2A 协议交给远端的 prime agent 判断,最后汇总答复。两个 Python 示例都在 adk-python 仓库的contributing/samples/a2a_basic与contributing/samples/a2a_root目录下;Go 版本可直接看 examples/go/a2a_basic/。
A2A 在 ADK 中仍属实验特性(Python、Go、Java 可用)。别把它用于高频、低延迟、强共享内存的内部调用——那种场景留给你同进程的本地子智能体。细节看官方文档 docs/a2a/index.md,建议先本地跑通 a2a_basic,再考虑跨团队部署。
【免费下载链接】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),仅供参考