@@ -3,43 +3,49 @@ title: A2A Agent
33---
44
55## Agent-to-Agent 协议简介
6+
67对于复杂度较高的任务,往往无法依赖单个 Agent 独立完成,需要通过协同多个专用 Agent 共同解决。** Agent2Agent (A2A) 协议** 是用于在多个 Agent 之间进行通信的标准。
78!!! note 参考链接
89 - [ A2A 协议官方文档] ( https://a2a-protocol.org/latest/ )
910
1011## 多 Agent 系统
12+
1113多 Agent 系统架构通常有两种架构方式: ** Local Sub-Agents** 和 ** Remote Agents (A2A)**
1214
1315- ** Local Sub-Agents** :这类 Agent 与主 Agent 在同一个应用进程中。它们更像内部模块或库,用于将代码组织为逻辑、可复用的组件。主 Agent 与 Local Sub-Agents 之间的通信直接发生在内存中,无需网络开销,因此速度非常快。
1416- ** Remote Agents (A2A)** :这类 Agent 以独立服务形式运行,通过网络进行通信。A2A 为此类通信定义了标准协议。
15- ### 如何选择合适的 Agent 架构 <!-- 标题序号: 2 -->
17+
18+ ### 如何选择合适的 Agent 架构
19+
1620并不是所有场景都适合使用 A2A,需要您参考以下建议,结合实际使用场景和需求作出合适选择:
1721
1822#### 适合使用 A2A 的场景
19- | 场景名称 | 说明 |
20- | --------------- | ----------------------------------------- |
21- | ** 集成第三方服务** | 需要交互的 Agent 是一个独立的、可单独运行的第三方服务(例如需要从外部金融数据服务获取实时交易信息) |
22- | ** 微服务架构** | 不同的 Agent 由不同的团队或组织维护, A2A 用于些服务跨网络边界相互通信 |
23- | ** 跨语言通信** | 要连接使用不同编程语言或 Agent 框架实现的 Agent, A2A 提供了标准化的通信层 |
24- | ** 严格的 API 契约** | 为了保证兼容性与稳定性,需要为 Agent 之间的交互制定严格契约 |
25-
26- <!-- 标题序号: 2.1 -->
27-
28- #### 不适用 A2A 的场景(更适合 Local Sub-Agents): <!-- 标题序号: 2.2 -->
29- | 场景名称 | 说明 |
30- | ----------- | ----------------------------------------- |
31- | ** 内部代码组织** | 您在单个 Agent 内将复杂任务拆分为更小、可管理的函数或模块,这类场景出于性能与简洁考虑,更适合作为本地子 |
32- | ** 性能关键的内部操作** | 某个 Sub Agent 负责与主 Agent 执行紧密耦合的高频、低延迟操作,这类场景由于需要低延迟响应,更适合作为本地Local Sub-Agents。 |
33- | ** 共享内存或上下文** | 当 Sub Agent 需要直接访问主 Agent 的内部状态或共享内存以提高效率时,A2A 的网络开销与序列化/反序列化会适得其反 |
34- | ** 简单的辅助函数** | 对于无需独立部署或复杂状态管理的小型复用逻辑,直接在同一 Agent 中编写函数或类,通常比拆分为独立的 A2A Agent 更合适 |
35-
36- ## VeADK 中的 A2A 工作流: <!-- 标题序号: 3 -->
23+
24+ | 场景名称 | 说明 |
25+ | - | - |
26+ | ** 集成第三方服务** | 需要交互的 Agent 是一个独立的、可单独运行的第三方服务(例如需要从外部金融数据服务获取实时交易信息) |
27+ | ** 微服务架构** | 不同的 Agent 由不同的团队或组织维护, A2A 用于些服务跨网络边界相互通信 |
28+ | ** 跨语言通信** | 要连接使用不同编程语言或 Agent 框架实现的 Agent, A2A 提供了标准化的通信层 |
29+ | ** 严格的 API 契约** | 为了保证兼容性与稳定性,需要为 Agent 之间的交互制定严格契约 |
30+
31+ #### 不适用 A2A 的场景(更适合 Local Sub-Agents)
32+
33+ | 场景名称 | 说明 |
34+ | - | - |
35+ | ** 内部代码组织** | 您在单个 Agent 内将复杂任务拆分为更小、可管理的函数或模块,这类场景出于性能与简洁考虑,更适合作为本地子 |
36+ | ** 性能关键的内部操作** | 某个 Sub Agent 负责与主 Agent 执行紧密耦合的高频、低延迟操作,这类场景由于需要低延迟响应,更适合作为本地Local Sub-Agents |
37+ | ** 共享内存或上下文** | 当 Sub Agent 需要直接访问主 Agent 的内部状态或共享内存以提高效率时,A2A 的网络开销与序列化/反序列化会适得其反 |
38+ | ** 简单的辅助函数** | 对于无需独立部署或复杂状态管理的小型复用逻辑,直接在同一 Agent 中编写函数或类,通常比拆分为独立的 A2A Agent 更合适 |
39+
40+ ## VeADK 中的 A2A 工作流
41+
3742** VeADK** 简化了基于 A2A 协议构建并连接 Agent 的过程。下面是一个直观的工作流概览:
3843
39- 1 . ** 对 Agent 开放访问(Exposing):** 从现有的 VeADK Agent 入手,将其转化为一个 A2AServer, 把它变成能让其他 Agent 可访问的形式。A2AServer 可以视作为 Agent 搭建的一个 Web 服务,其他 Agent 可以通过它向您的 Agent 发送请求。
44+ 1 . ** 对 Agent 开放访问(Exposing):** 从现有的 VeADK Agent 入手,将其转化为一个 A2AServer, 把它变成能让其他 Agent 可访问的形式。A2AServer 可以视作为 Agent 搭建的一个 Web 服务,其他 Agent 可以通过它向您的 Agent 发送请求。
40452 . ** 连接到开放访问的 Agent(Consuming):** 在另一个 Agent 中(可能运行于同一台机器,也可能运行于不同机器),可使用名为 ` RemoteVeAgent ` 的 VeADK 组件,作为客户端访问上一步创建的 A2AServer,` RemoteVeAgent ` 会在后台处理网络通信、鉴权和数据格式等复杂问题。
4146
4247** VeADK** 对网络层进行了抽象封装,使分布式多 Agent 系统使用体验接近本地系统, 下图展示了一个完整的 ** A2A 系统拓扑** :
48+
4349``` mermaid
4450flowchart LR
4551 A[Root Agent<br/>(需要访问其它 Agent)<br/>]
@@ -54,13 +60,16 @@ flowchart LR
5460```
5561
5662## 构建一个本地 A2A 项目
63+
5764下面是一个利用 A2A 搭建的系统示例:
5865
5966### 创建 A2A 服务器
67+
60681 . 定义 Agent 工具和功能
61- 2 . 使用 to_a2a() 函数将 Agent 转换为 A2AServer
69+ 2 . 使用 ` to_a2a(...) ` 函数将 Agent 转换为 A2AServer
62703 . 配置服务器参数(端口、主机等)
63- === "代码"
71+
72+ === "Python"
6473
6574``` python title="server.py" linenums="1" hl_lines="1 11"
6675from google.adk.a2a.utils.agent_to_a2a import to_a2a
@@ -75,13 +84,16 @@ agent = Agent(
7584
7685app = to_a2a(agent = agent)
7786```
87+
7888### 客户端集成
79- 1 . 导入 RemoteVeAgent 类
89+
90+ 1 . 导入 ` RemoteVeAgent ` 类
80912 . 配置远程 Agent 连接参数
81923 . 在 Root Agent 中添加 Remote Agent 作为 Sub Agent
82- === "代码"
8393
84- ``` python title="client.py" linenums="1"
94+ === "Python"
95+
96+ ``` python title="client.py" linenums="1" hl_lines="15 24"
8597from veadk import Agent, Runner
8698from veadk.a2a.remote_ve_agent import RemoteVeAgent
8799
@@ -120,8 +132,11 @@ if __name__ == "__main__":
120132 response = asyncio.run(main(" What is the weather like of Beijing?" ))
121133 print (response)
122134```
135+
123136### 交互流程
137+
124138下图为示例对应的交互流程图
139+
125140``` mermaid
126141sequenceDiagram
127142 participant User as 用户
@@ -149,13 +164,18 @@ sequenceDiagram
149164 Client-->>User: 显示天气信息
150165```
151166
152- ## A2A Client 鉴权参数
153- VeADK 的 A2A 鉴权机制提供了灵活的认证选项,支持标准的 Bearer token 认证和查询参数认证两种常见模式,同时也支持无认证的公开服务场景,能够满足不同的安全需求
154- ### Querystring 方式
155- - 将认证令牌作为 URL 查询参数 token={auth_token} 传递
156- - 通过设置 auth_method 为 "querystring" 来启用
167+ ## 身份认证与鉴权
168+
169+ VeADK 的 A2A 鉴权机制提供了灵活的认证选项,支持标准的 Bearer token 认证和查询参数认证两种常见模式,同时也支持无认证的公开服务场景,能够满足不同的安全需求。
170+
171+ ### QueryString 方式
172+
173+ - 将认证令牌作为 URL 查询参数 ` ?token={auth_token} ` 传递
174+ - 通过设置 ` auth_method ` 为 ` querystring ` 来启用
157175- 适用于某些特定的 API 网关或服务配置
158- === "代码"
176+
177+ === "Python"
178+
159179 ```python title="client.py" linenums="1" hl_lines="5"
160180 remote_agent = RemoteVeAgent(
161181 name="a2a_agent",
@@ -166,10 +186,13 @@ VeADK 的 A2A 鉴权机制提供了灵活的认证选项,支持标准的 Beare
166186 ```
167187
168188### Header 方式
169- - 使用 Authorization: Bearer {auth_token} 格式的 HTTP header 进行鉴权
170- - 通过设置 auth_method="header" 来启用
189+
190+ - 使用 Authorization: Bearer {auth_token} 格式的 HTTP 请求头进行鉴权
191+ - 通过设置 ` auth_method="header" ` 来启用
171192- 适用于需要在 HTTP header 中传递认证信息的场景
172- === "代码"
193+
194+ === "Python"
195+
173196 ```python title="client.py" linenums="1" hl_lines="5"
174197 remote_agent = RemoteVeAgent(
175198 name="a2a_agent",
@@ -179,24 +202,28 @@ VeADK 的 A2A 鉴权机制提供了灵活的认证选项,支持标准的 Beare
179202 )
180203 ```
181204
182- ??? note "火山引擎 veFaaS 采用的默认鉴权方式"
205+ ??? note "火山引擎 VeFaaS 采用的默认鉴权方式"
183206 - 当您使用火山引擎 veFaaS 作为您的 Agent runtime 时,默认使用 Querystring 方式进行认证鉴权,请参考以下截图中的 “我的应用”中可以查看您创建的资源对应的访问地址信息中携带的 Querystring 认证鉴权信息
184207 ![ 火山 veFaaS 应用中的认证信息] ( ../assets/images/agents/a2a_querystring.png )
185208
186209### 自定义 HTTP 客户端
187- 在 VeADK中,主要通过 RemoteVeAgent 类来实现自定义 HTTP 客户端的配置,它提供了一个 httpx_client 参数,允许您传入预配置的 httpx.AsyncClient 实例。这使得您可以灵活地控制 HTTP 请求的各种参数,如代理设置、超时控制、连接池管理等,从而更好地适应不同的网络环境和需求。
188- #### 您可以通过运参考以下示例代码设置创建自定义的 HTTP 客户端,可配置各种 HTTP 客户端参数,如:
210+
211+ 在 VeADK中,主要通过 ` RemoteVeAgent ` 类来实现自定义 HTTP 客户端的配置,它提供了一个 ` httpx_client ` 参数,允许您传入预配置的 ` httpx.AsyncClient ` 实例。这使得您可以灵活地控制 HTTP 请求的各种参数,如代理设置、超时控制、连接池管理等,从而更好地适应不同的网络环境和需求。
212+
213+ 您可以通过运参考以下示例代码设置创建自定义的 HTTP 客户端,可配置各种 HTTP 客户端参数,如:
214+
189215- 超时设置
190216- 代理配置
191217- 连接池大小
192218- 重试策略
193219- 自定义请求头
194220- SSL 验证选项
195221
196- === "代码"
197- ```python title="client.py" linenums="1"
222+ === "Python"
223+
224+ ```python title="client.py" linenums="1" hl_lines="4 43"
198225 # <...code truncated...>
199-
226+
200227 # 创建自定义的 httpx.AsyncClient 实例
201228 custom_client = httpx.AsyncClient(
202229 # 基础 URL 设置
@@ -242,7 +269,3 @@ VeADK 的 A2A 鉴权机制提供了灵活的认证选项,支持标准的 Beare
242269
243270 # <...code truncated...>
244271 ```
245-
246-
247-
248-
0 commit comments