news 2026/10/23 6:26:19

ADK A2A协议深度剖析:从零搭建分布式智能体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADK A2A协议深度剖析:从零搭建分布式智能体

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 工作流可以拆成六步:

  1. 定义智能体:用 ADK 的Agent正常编写root_agent,可挂载本地子智能体,此步骤与 A2A 完全解耦。

  2. 用to_a2a()暴露:一行函数把现有智能体包成 A2A 应用,背后自动生成 AgentCard(智能体名片,描述能力与地址)。

  3. 选择暴露路径:

    • 条件A:要完全掌控服务化过程 →to_a2a()+uvicorn托管
    • 条件B:想配合adk web调试 →adk api_server --a2a,含agent.json的目录会被自动暴露
  4. 名片发现:远端智能体在/.well-known/agent-card.json路径提供名片,消费方无需读源码即可了解其技能。

  5. 消费远程智能体:RemoteA2aAgent填入名片 URL,客户端代理负责网络通信、鉴权与数据转换。

  6. 透明调用: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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 6:26:05

TMS FMX UI Pack 3.7.3.0:Delphi 10.4跨平台UI开发核心基建

简介:TMS FMX UI Pack 3.7.3.0 是一套专为 Delphi 10.4 Sydney 及兼容版本(XE7 至 10.3)设计的跨平台 FireMonkey UI 组件库,面向 Delphi 桌面与移动应用开发者,解决原生 FMX 组件样式单一、交互体验不足、多语言适配困…

作者头像 李华
网站建设 2026/10/23 6:24:53

Kubernetes Pod 服务别名解析失败排查:从 no such host 到 CoreDNS 根因定位

1. 从一个诡异的通信故障说起集群里跑着一套微服务,订单服务要调库存服务,库存服务要调商品服务,彼此之间全靠 Service 别名互相访问。某天做灰度发布,新拉起来的一批 Pod 突然报错,日志里清一色是no such host或者连接…

作者头像 李华
网站建设 2026/10/23 6:21:28

agents-generator - platform

{{PLATFORM_NAME}} 规则 — 模板 仅在项目中检测到相应平台时生成。各平台的检测信号如下。 此文件被封装在受管理的块中。代理在更新时会在标记之间重新生成内容&#xff1b;标记外的人为编辑将被保留。 <!-- AGENTS-GENERATED-START --> # {{PLATFORM_RULES_HEADER}}{{…

作者头像 李华