A2A 简介¶
何时使用 A2A vs. 本地子智能体¶
-
本地子智能体:这些智能体与你的主智能体在同一个应用程序进程中运行。它们就像内部模块或库,用于将你的代码组织成逻辑的、可重用的组件。主智能体与其本地子智能体之间的通信非常快,因为它直接在内存中发生,没有网络开销。
-
远程智能体(A2A):这些是作为独立服务运行的智能体,通过网络进行通信。A2A 定义了这种通信的标准协议。
考虑在以下情况使用 A2A:
何时使用 A2A:具体示例¶
何时不使用 A2A:具体示例(首选本地子智能体)¶
ADK 中的 A2A 工作流:简化视图¶
- 使智能体可访问(暴露):你从一个现有的 ADK 智能体开始,你希望其他智能体能够与之交互。ADK 提供了一种简单的方法来"暴露"这个智能体,将其转换为 A2AServer。这个服务器充当公共接口,允许其他智能体 通过网络向你的智能体发送请求。将其想象为为你的智能体设置一个网络服务器。
从你作为开发者的角度来看,一旦你设置好了这种连接,与远程智能体的交互就像与本地工具或函数交互一样。ADK 抽象了网络层,使分布式智能体系统与本地系统一样易于使用。
A2A 支持的能力¶
ADK 的 A2A 集成为复杂的智能体系统提供了三个核心能力:
- 推理:当消息通过 A2A 在智能体之间传递时,保留模型的推理/思考痕迹。
- 长时间运行的工具:跟踪运行时间超过标准响应的工具调用,这样长时间运行的操作不会超时。
- 制品:通过 A2A 在智能体之间传递文件制品(如生成的文件)。
可视化 A2A 工作流¶
暴露智能体¶
暴露前: 你的智能体代码作为独立组件运行,但在这种情况下,你想要暴露它,以便其他远程智能体可以与你的智能体交互。
暴露后:
你的智能体代码与 A2AServer(ADK 组件)集成,使其可以通过网络被其他远程智能体访问。
+-----------------+
| A2A 服务器 |
| (ADK 组件) |<--------+
+-----------------+ |
| |
v |
+-------------------+ |
| 你的智能体代码 | |
| (现在可访问) | |
+-------------------+ |
|
| (网络通信)
v
+-----------------------------+
| 远程智能体 |
| (现在可以通信了) |
+-----------------------------+
消费智能体¶
消费前: 你的智能体(在此上下文中称为"根智能体")是你正在开发的应用程序,需要与远程智能体交互。在消费之前,它缺乏这样做的直接机制。
+----------------------+ +-------------------------------------------------------------+
| 根智能体 | | 远程智能体 |
| (你现有的代码) | | (你希望根智能体与之通信的外部服务) |
+----------------------+ +-------------------------------------------------------------+
消费后:
你的根智能体使用 RemoteA2aAgent(一个充当远程智能体客户端代理的 ADK 组件)与远程智能体建立通信。
+----------------------+ +-----------------------------------+
| 根智能体 | | RemoteA2aAgent |
| (你现有的代码) |<------->| (ADK 客户端代理) |
+----------------------+ | |
| +-----------------------------+ |
| | 远程智能体 | |
| | (外部服务) | |
| +-----------------------------+ |
+-----------------------------------+
(现在通过 RemoteA2aAgent 与远程智能体通信)
最终系统(组合视图)¶
此图显示了消费和暴露部分如何连接以形成完整的 A2A 系统。
消费侧:
+----------------------+ +-----------------------------------+
| 根智能体 | | RemoteA2aAgent |
| (你现有的代码) |<------->| (ADK 客户端代理) |
+----------------------+ | |
| +-----------------------------+ |
| | 远程智能体 | |
| | (外部服务) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (网络通信)
v
暴露侧:
+-----------------+
| A2A 服务器 |
| (ADK 组件) |
+-----------------+
|
v
+-------------------+
| 你的智能体代码 |
| (暴露的服务) |
+-------------------+
具体用例:客户服务和产品目录智能体¶
让我们考虑一个实际示例:一个客户服务智能体需要从单独的产品目录智能体检索产品信息。
A2A 之前¶
最初,你的客户服务智能体可能没有直接、标准化的方式来查询产品目录智能体,特别是如果它是一个单独的服务或由不同的团队管理的情况下。
+-------------------------+ +--------------------------+
| 客户服务智能体 | | 产品目录智能体 |
| (需要产品信息) | | (包含产品数据) |
+-------------------------+ +--------------------------+
(没有直接、标准化的通信)
A2A 之后¶
通过使用 A2A 协议,产品目录智能体可以将其功能暴露为 A2A 服务。你的客户服务智能体然后可以使用 ADK 的 RemoteA2aAgent 轻松消费此服务。
+-------------------------+ +-----------------------------------+
| 客户服务智能体 | | RemoteA2aAgent |
| (你的根智能体) |<------->| (ADK 客户端代理) |
+-------------------------+ | |
| +-----------------------------+ |
| | 产品目录智能体 | |
| | (外部服务) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (网络通信)
v
+-----------------+
| A2A 服务器 |
| (ADK 组件) |
+-----------------+
|
v
+------------------------+
| 产品目录智能体 |
| (暴露的服务) |
+------------------------+
在此设置中,首先,产品目录智能体需要通过 A2A 服务器暴露。然后,客户服务智能体可以简单地调用 RemoteA2aAgent 上的方法,就像它是一个工具一样,ADK 处理与产品目录智能体的所有底层通信。这允许清晰的关注点分离和专门智能体的轻松集成。
下一步¶
现在你了解了 A2A 的"为什么",让我们深入探讨"如何"。