# A2A 简介

## 何时使用 A2A vs. 本地子智能体

- \*\*本地子智能体：\*\*这些智能体与你的主智能体*在同一个应用程序进程中*运行。它们就像内部模块或库，用于将你的代码组织成逻辑的、可重用的组件。主智能体与其本地子智能体之间的通信非常快，因为它直接在内存中发生，没有网络开销。
- \*\*远程智能体（A2A）：\*\*这些是作为独立服务运行的智能体，通过网络进行通信。A2A 定义了这种通信的标准协议。

考虑在以下情况使用 **A2A**：

### 何时使用 A2A：具体示例

### 何时不使用 A2A：具体示例（首选本地子智能体）

## ADK 中的 A2A 工作流：简化视图

1. \*\*使智能体可访问（暴露）：\*\*你从一个现有的 ADK 智能体开始，你希望其他智能体能够与之交互。ADK 提供了一种简单的方法来"暴露"这个智能体，将其转换为 **A2AServer**。这个服务器充当公共接口，允许其他智能体 通过网络向你的智能体发送请求。将其想象为为你的智能体设置一个网络服务器。

从你作为开发者的角度来看，一旦你设置好了这种连接，与远程智能体的交互就像与本地工具或函数交互一样。ADK 抽象了网络层，使分布式智能体系统与本地系统一样易于使用。

## A2A 支持的能力

ADK 的 A2A 集成为复杂的智能体系统提供了三个核心能力：

- \*\*推理：\*\*当消息通过 A2A 在智能体之间传递时，保留模型的推理/思考痕迹。
- \*\*长时间运行的工具：\*\*跟踪运行时间超过标准响应的工具调用，这样长时间运行的操作不会超时。
- \*\*制品：\*\*通过 A2A 在智能体之间传递文件制品（如生成的文件）。

## 可视化 A2A 工作流

### 暴露智能体

**暴露前：** 你的智能体代码作为独立组件运行，但在这种情况下，你想要暴露它，以便其他远程智能体可以与你的智能体交互。

```text
+-------------------+
|   你的智能体代码   |
|    （独立运行）    |
+-------------------+
```

**暴露后：** 你的智能体代码与 `A2AServer`（ADK 组件）集成，使其可以通过网络被其他远程智能体访问。

```text
+-----------------+
|   A2A 服务器     |
| （ADK 组件）     |<--------+
+-----------------+         |
        |                   |
        v                   |
+-------------------+       |
|   你的智能体代码   |       |
|  （现在可访问）    |       |
+-------------------+       |
                            |
                            | （网络通信）
                            v
+-----------------------------+
|       远程智能体             |
|    （现在可以通信了）        |
+-----------------------------+
```

### 消费智能体

**消费前：** 你的智能体（在此上下文中称为"根智能体"）是你正在开发的应用程序，需要与远程智能体交互。在消费之前，它缺乏这样做的直接机制。

```text
+----------------------+         +-------------------------------------------------------------+
|       根智能体        |         |                        远程智能体                           |
| （你现有的代码）      |         | （你希望根智能体与之通信的外部服务）                          |
+----------------------+         +-------------------------------------------------------------+
```

**消费后：** 你的根智能体使用 `RemoteA2aAgent`（一个充当远程智能体客户端代理的 ADK 组件）与远程智能体建立通信。

```text
+----------------------+         +-----------------------------------+
|       根智能体        |         |         RemoteA2aAgent            |
| （你现有的代码）      |<------->|       （ADK 客户端代理）           |
+----------------------+         |                                   |
                                 |  +-----------------------------+  |
                                 |  |         远程智能体           |  |
                                 |  |       （外部服务）            |  |
                                 |  +-----------------------------+  |
                                 +-----------------------------------+
      （现在通过 RemoteA2aAgent 与远程智能体通信）
```

### 最终系统（组合视图）

此图显示了消费和暴露部分如何连接以形成完整的 A2A 系统。

```text
消费侧：
+----------------------+         +-----------------------------------+
|       根智能体        |         |         RemoteA2aAgent            |
| （你现有的代码）      |<------->|       （ADK 客户端代理）           |
+----------------------+         |                                   |
                                 |  +-----------------------------+  |
                                 |  |         远程智能体           |  |
                                 |  |       （外部服务）            |  |
                                 |  +-----------------------------+  |
                                 +-----------------------------------+
                                                 |
                                                 | （网络通信）
                                                 v
暴露侧：
                                               +-----------------+
                                               |   A2A 服务器     |
                                               | （ADK 组件）     |
                                               +-----------------+
                                                       |
                                                       v
                                               +-------------------+
                                               |   你的智能体代码   |
                                               |  （暴露的服务）    |
                                               +-------------------+
```

## 具体用例：客户服务和产品目录智能体

让我们考虑一个实际示例：一个**客户服务智能体**需要从单独的**产品目录智能体**检索产品信息。

### A2A 之前

最初，你的客户服务智能体可能没有直接、标准化的方式来查询产品目录智能体，特别是如果它是一个单独的服务或由不同的团队管理的情况下。

```text
+-------------------------+         +--------------------------+
|     客户服务智能体       |         |     产品目录智能体        |
|  （需要产品信息）        |         |  （包含产品数据）         |
+-------------------------+         +--------------------------+
      （没有直接、标准化的通信）
```

### A2A 之后

通过使用 A2A 协议，产品目录智能体可以将其功能暴露为 A2A 服务。你的客户服务智能体然后可以使用 ADK 的 `RemoteA2aAgent` 轻松消费此服务。

```text
+-------------------------+         +-----------------------------------+
|     客户服务智能体       |         |         RemoteA2aAgent            |
|  （你的根智能体）        |<------->|       （ADK 客户端代理）           |
+-------------------------+         |                                   |
                                    |  +-----------------------------+  |
                                    |  |      产品目录智能体          |  |
                                    |  |       （外部服务）            |  |
                                    |  +-----------------------------+  |
                                    +-----------------------------------+
                                                 |
                                                 | （网络通信）
                                                 v
                                               +-----------------+
                                               |   A2A 服务器     |
                                               | （ADK 组件）     |
                                               +-----------------+
                                                       |
                                                       v
                                               +------------------------+
                                               |    产品目录智能体       |
                                               |    （暴露的服务）       |
                                               +------------------------+
```

在此设置中，首先，产品目录智能体需要通过 A2A 服务器暴露。然后，客户服务智能体可以简单地调用 `RemoteA2aAgent` 上的方法，就像它是一个工具一样，ADK 处理与产品目录智能体的所有底层通信。这允许清晰的关注点分离和专门智能体的轻松集成。

## 下一步

现在你了解了 A2A 的"为什么"，让我们深入探讨"如何"。

- **继续下一个指南：** 快速入门：暴露你的智能体：[Python](https://adk.wiki/a2a/quickstart-exposing/index.md)、[Go](https://adk.wiki/a2a/quickstart-exposing-go/index.md)、[Java](https://adk.wiki/a2a/quickstart-exposing-java/index.md)
