Skip to content

Commit f5472a9

Browse files
committed
chore(docs): format markdown docs
1 parent 6b1d40a commit f5472a9

File tree

12 files changed

+203
-165
lines changed

12 files changed

+203
-165
lines changed

docs/docs/agent/agent-to-agent.md

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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 发送请求。
4045
2. **连接到开放访问的 Agent(Consuming):**在另一个 Agent 中(可能运行于同一台机器,也可能运行于不同机器),可使用名为 `RemoteVeAgent` 的 VeADK 组件,作为客户端访问上一步创建的 A2AServer,`RemoteVeAgent` 会在后台处理网络通信、鉴权和数据格式等复杂问题。
4146

4247
**VeADK** 对网络层进行了抽象封装,使分布式多 Agent 系统使用体验接近本地系统, 下图展示了一个完整的 **A2A 系统拓扑**
48+
4349
```mermaid
4450
flowchart 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+
6068
1. 定义 Agent 工具和功能
61-
2. 使用 to_a2a() 函数将 Agent 转换为 A2AServer
69+
2. 使用 `to_a2a(...)` 函数将 Agent 转换为 A2AServer
6270
3. 配置服务器参数(端口、主机等)
63-
=== "代码"
71+
72+
=== "Python"
6473

6574
```python title="server.py" linenums="1" hl_lines="1 11"
6675
from google.adk.a2a.utils.agent_to_a2a import to_a2a
@@ -75,13 +84,16 @@ agent = Agent(
7584

7685
app = to_a2a(agent=agent)
7786
```
87+
7888
### 客户端集成
79-
1. 导入 RemoteVeAgent 类
89+
90+
1. 导入 `RemoteVeAgent`
8091
2. 配置远程 Agent 连接参数
8192
3. 在 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"
8597
from veadk import Agent, Runner
8698
from 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
126141
sequenceDiagram
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-

docs/docs/agent/agent.md

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
}
9191
```
9292

93-
9493
=== "所需环境变量"
9594

9695
环境变量列表:
@@ -126,17 +125,16 @@
126125

127126
```golang title="agent.go" linenums="1" hl_lines="2-4"
128127
cfg := &veagent.Config{}
129-
cfg.Name = "life_assistant"
130-
cfg.Description = "生活助手"
131-
cfg.Instruction = "你是一个生活助手,你可以回答用户的问题。"
132-
133-
veAgent, err := veagent.New(cfg)
134-
if err != nil {
135-
fmt.Printf("NewVeAgent failed: %v", err)
136-
return
137-
}
138-
```
128+
cfg.Name = "life_assistant"
129+
cfg.Description = "生活助手"
130+
cfg.Instruction = "你是一个生活助手,你可以回答用户的问题。"
139131

132+
veAgent, err := veagent.New(cfg)
133+
if err != nil {
134+
fmt.Printf("NewVeAgent failed: %v", err)
135+
return
136+
}
137+
```
140138

141139
其中,`name` 代表 Agent 的名称,`description` 是对 Agent 功能的简单描述(在Agent Tree中唯一标识某个Agent),`instruction` 是 Agent 的系统提示词,用于定义其行为和响应风格。
142140

@@ -161,50 +159,56 @@
161159

162160
```golang title="agent.go" linenums="1" hl_lines="2-4"
163161
cfg := &veagent.Config{
164-
ModelName: "...",
165-
ModelAPIBase: "...",
166-
ModelAPIKey: "...",
167-
}
162+
ModelName: "...",
163+
ModelAPIBase: "...",
164+
ModelAPIKey: "...",
165+
}
168166

169167
veAgent, err := veagent.New(cfg)
170-
if err != nil {
171-
fmt.Printf("NewVeAgent failed: %v", err)
172-
return
173-
}
168+
if err != nil {
169+
fmt.Printf("NewVeAgent failed: %v", err)
170+
return
171+
}
174172
```
175173

176-
由于 python VeADK Agent 基于 [LiteLLM]() 实现,因此您可以使用 LiteLLM 支持的所有模型提供商。您可以查看 [LiteLLM 支持的模型提供商列表](https://docs.litellm.ai/docs/providers)来设置 `model_provider` 参数。
174+
VeADK Python 版本中的 Agent 推理模型基于 [LiteLLM](https://github.com/BerriAI/litellm) 实现,因此您可以使用 LiteLLM 支持的所有模型提供商。您可以查看 [LiteLLM 支持的模型提供商列表](https://docs.litellm.ai/docs/providers)来设置 `model_provider` 参数。
177175

178-
基于 LiteLLM 的 [Fallbacks](https://docs.litellm.ai/docs/completion/reliable_completions) 容错机制,VeADK 实现了智能的模型切换能力。当目标模型经多次重试仍调用失败时,系统将自动切换至备选模型继续执行任务:
176+
#### 模型容错
177+
178+
VeADK 为您提供了基于 LiteLLM 的 [Fallbacks](https://docs.litellm.ai/docs/completion/reliable_completions) 模型容错机制,能够在前序模型访问失败时进行模型自动切换。例如,当目标模型经多次重试仍调用失败时,系统将自动切换至备选模型来继续执行任务:
179179

180180
=== "Python"
181181

182-
```python title="agent.py" linenums="1" hl_lines="4"
182+
```python title="agent.py" linenums="1" hl_lines="4-8"
183183
from veadk import Agent
184-
184+
185185
agent = Agent(
186-
model_name=["doubao-seed-1-8-251215", "doubao-seed-1-6-251015", "doubao-seed-1.6-250615"]
186+
model_name=[
187+
"doubao-seed-1-8-251215",
188+
"doubao-seed-1-6-251015",
189+
"doubao-seed-1.6-250615",
190+
]
187191
)
188192
```
189193

190-
在上述配置中,VeADK 默认会首先尝试 doubao-seed-1-8-251215,如果失败再去尝试后续模型,直至成功。
191-
192-
golang 暂不支持 LiteLLM,因此 VeADK 的 Agent 基于 OpenAI 实现,因此您可以使用所有支持OpenAI协议的模型。
194+
在上述配置中,VeADK 默认会首先尝试 `doubao-seed-1-8-251215` 模型,如果失败后会尝试后续模型,直至成功。
193195

194-
#### 设置模型客户端
196+
#### 自定义您的模型客户端
195197

196198
VeADK 支持您直接定义 LiteLLM 的客户端,来实现高度自定义的模型配置:
197199

198-
```python title="agent.py" linenums="1" hl_lines="5 8"
199-
from google.adk.models.lite_llm import LiteLlm
200-
from veadk import Agent
200+
=== "Python"
201201

202-
# 自定义您的模型客户端
203-
llm = LiteLlm()
202+
```python title="agent.py" linenums="1" hl_lines="5 8"
203+
from google.adk.models.lite_llm import LiteLlm
204+
from veadk import Agent
204205

205-
# 直接将模型客户端传递给 Agent
206-
agent = Agent(model=llm)
207-
```
206+
# 自定义您的模型客户端
207+
llm = LiteLlm()
208+
209+
# 直接将模型客户端传递给 Agent
210+
agent = Agent(model=llm)
211+
```
208212

209213
#### 配置模型额外参数
210214

@@ -236,21 +240,20 @@ agent = Agent(model=llm)
236240
)
237241

238242
veAgent, err := veagent.New(&veagent.Config{
239-
ModelExtraConfig: map[string]any{
240-
"extra_body": map[string]any{
241-
"thinking": map[string]string{
242-
"type": "disabled",
243-
},
244-
},
245-
},
246-
})
247-
if err != nil {
248-
fmt.Printf("NewVeAgent failed: %v", err)
249-
return
250-
}
243+
ModelExtraConfig: map[string]any{
244+
"extra_body": map[string]any{
245+
"thinking": map[string]string{
246+
"type": "disabled",
247+
},
248+
},
249+
},
250+
})
251+
if err != nil {
252+
fmt.Printf("NewVeAgent failed: %v", err)
253+
return
254+
}
251255
```
252256

253-
254257
### 通过配置文件
255258

256259
在您构建 Agent 过程中,往往需要更加简洁的 Agent 定义方式与配置管理。为了方便这种场景,VeADK 提供了 YAML 文件定义方式。该方法以声明式语法描述智能体的全部元信息与行为结构。
@@ -265,7 +268,7 @@ root_agent:
265268
description: An intelligent_assistant which can provider weather information.
266269
instruction: Help user according to your tools.
267270
model_name: doubao-1-5-pro-32k-250115
268-
model_api_key: xxx # 您的模型API Key
271+
model_api_key: ... # 您的模型API Key
269272
tools:
270273
- name: veadk.tools.demo_tools.get_city_weather # tool 所在的模块及函数名称
271274
```
@@ -297,14 +300,14 @@ response = asyncio.run(runner.run("今天北京天气如何?"))
297300
print(response)
298301
```
299302

300-
### 构建 Agent 的方法对比
303+
## 构建 Agent 的方法对比
301304

302305
**对比总结**:
303306

304-
| 特性 | 代码方式 | YAML 方式 |
307+
| 特性 | 代码方式 | YAML 方式 |
305308
| ---- | ----- | ------- |
306-
| 灵活性 | 高 | 中 |
307-
| 可读性 | 中 | 高 |
308-
| 可维护性 | 中 | 高 |
309-
| 动态生成 | 支持 | 一般 |
310-
| 适用场景 | 开发、生产 | 实验、配置化、生产 |
309+
| 灵活性 | 高 | 中 |
310+
| 可读性 | 中 | 高 |
311+
| 可维护性 | 中 | 高 |
312+
| 动态生成 | 支持 | 一般 |
313+
| 适用场景 | 开发、生产 | 实验、配置化、生产 |

docs/docs/agent/responses-api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Responses API 是火山方舟最新推出的 API 接口,原生支持高效的
2828
from veadk import Agent
2929

3030
root_agent = Agent(
31-
enable_responses=True, # 开启 Responses API
31+
enable_responses=True, # 开启 Responses API
3232
)
3333

3434
```

0 commit comments

Comments
 (0)