Skip to content

Commit 197e948

Browse files
committed
docs: responses_api
1 parent 2ad2ee8 commit 197e948

File tree

2 files changed

+314
-9
lines changed

2 files changed

+314
-9
lines changed

docs/docs/agent/responses-api.md

Lines changed: 314 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22
title: Responses API 支持
33
---
44

5-
Responses API 是火山方舟最新推出的 API 接口,原生支持高效的上下文管理,支持更简洁的输入输出格式,并且工具调用方式也更加便捷,不仅延续了 Chat API 的易用性,还结合了更强的智能代理能力。
6-
随着大模型技术不断升级,Responses API 为开发各类面向实际行动的应用提供了更灵活的基础,并且支持工具调用多种扩展能力,非常适合搭建智能助手、自动化工具等场景。
5+
Responses API 是火山方舟最新推出的 API 接口,原生支持高效的上下文管理,具备更简洁的输入输出格式。其工具调用方式更加便捷,不仅延续了 Chat API 的易用性,还结合了更强的智能代理能力。
6+
随着大模型技术不断升级,Responses API 为开发各类面向实际行动的应用提供了更灵活的基础,并支持多种工具调用扩展能力,非常适合搭建智能助手、自动化工具等场景。
77

88
---
99

1010
## 使用教程
1111

12-
目前 VeADK Responses API 支持对 LiteLLM 版本依赖有限制,需要 `litellm>=1.79.3`,请确保您的 LiteLLM 版本符合要求
12+
目前仅 `veadk-python` 版本支持 Responses API,且对 `google-adk` 版本有特定要求(`google-adk>=1.21.0`)。请确保您的环境符合要求
1313

1414
=== "pip"
1515
```bash
16-
pip install "litellm>=1.79.3"
16+
pip install "google-adk>=1.21.0"
1717
```
1818
=== "uv"
1919
```bash
20-
uv pip install "litellm>=1.79.3"
20+
uv pip install "google-adk>=1.21.0"
2121
```
2222

2323
### 快速开始
2424

25-
只需要要配置enable_responses=True即可
25+
只需配置 `enable_responses=True` 即可。
2626

2727
```python hl_lines="4"
2828
from veadk import Agent
@@ -39,6 +39,311 @@ root_agent = Agent(
3939

4040
## 注意事项
4141

42-
- 必须提升litellm版本: `litellm>=1.79.3`,用于支撑responses_request转换
43-
- 必须保证adk版本: `google-adk>=1.15`
44-
- 请保证使用的模型支持ResponsesAPI
42+
1. **版本要求**:必须保证 `google-adk>=1.21.0`
43+
2. **模型支持**:请确保使用的模型支持 Responses API(注:Doubao 系列模型 0615 版本之后,除特殊说明外均支持)。
44+
3. **缓存机制**:VeADK 开启 Responses API 并使用火山方舟模型时默认开启上下文缓存(Session 缓存)。但若在 Agent 中设置了 `output_schema`,因该字段与缓存机制冲突,系统将自动关闭缓存。
45+
46+
## 上下文缓存
47+
48+
在 Responses API 模式下,VeADK 默认开启会话缓存(Session Caching)。该机制会自动存储初始上下文信息,并在每一轮对话中动态更新。在后续请求中,系统会将缓存内容与新输入合并后发送给模型推理。此功能特别适用于多轮对话、复杂工具调用等长上下文场景。
49+
50+
### 缓存信息查看
51+
52+
您可以通过返回的 `Event.usage_metadata` 字段查看 Token 使用及缓存命中情况。
53+
54+
以下是一次包含两轮对话的 `usage_metadata` 示例:
55+
56+
```json
57+
{"cached_content_token_count":0,"candidates_token_count":87,"prompt_token_count":210,"total_token_count":297}
58+
{"cached_content_token_count":297,"candidates_token_count":181,"prompt_token_count":314,"total_token_count":495}
59+
```
60+
61+
**字段说明:**
62+
63+
- `cached_content_token_count`:命中缓存的 Token 数量(即从缓存中读取的 Token 数)。
64+
- `candidates_token_count`:模型生成的 Token 数量(输出 Token)。
65+
- `prompt_token_count`:输入给模型的总 Token 数量(包含已缓存和未缓存部分)。
66+
- `total_token_count`:总消耗 Token 数量(输入 + 输出)。
67+
68+
**缓存机制说明:**
69+
70+
- 缓存仅影响输入(Prompt)Token,不影响输出(Completion)Token。
71+
- **缓存命中率**反映了缓存策略的有效性,命中率越高,Token 成本节省越多。
72+
- 计算公式:`缓存命中率 = (cached_content_token_count / prompt_token_count) × 100%`
73+
- 输入 Token 成本节约率:用于量化整个会话的缓存收益,是面向业务侧的核心指标,支持会话级汇总计算。
74+
75+
### 成本节省示例
76+
77+
基于上述样例数据,缓存命中率计算如下:
78+
79+
- **第一轮对话**:0%(初始状态,无缓存)
80+
- **第二轮对话**`297 / 314 * 100% ≈ 94.58%`
81+
82+
输入 Token 成本节约率:`(0 + 297) / (210 + 314) ≈ 56.68%`
83+
84+
这意味着在开启缓存后,该次会话的 **输入 Token 缓存命中率达到了 56.68%**,大幅减少了重复内容的计算开销。
85+
[火山方舟:缓存Token计费说明](https://www.volcengine.com/docs/82379/1544106?lang=zh)
86+
87+
注:第N轮的`cached_content_token_count`不一定等于第N-1轮的`total_token_count`,如果开启了thinking,二者不等。
88+
89+
90+
## 多模态能力支持
91+
92+
Responses API 除文本交互外,还具备图片、视频和文件等多模态理解能力。
93+
您可以使用 `google.genai.types.FileData` 字段传递多模态数据(如图片路径、视频 URL、Files API 生成的 file_id 等)。
94+
95+
`FileData` 支持以下数据传递方式:
96+
97+
1. **Files API 资源 (`file_id`)**
98+
- 通过 `file_data` 传递,需在 `file_uri` 中添加特定 Scheme 前缀以区分。
99+
- 格式:`file_uri="file_id://xxxxxxx"`,该值将被自动映射到 `file_id` 字段。
100+
101+
2. **通用资源标识符 (URI)**
102+
火山方舟支持的所有文件上传方式(包括 `image_url``video_url``file_url`)均可通过 `file_data` 统一处理。
103+
1. **网络 URL**
104+
- 系统根据 `mime_type` 自动识别资源类型(视频、图片、文件等)。
105+
- 格式:`file_uri="https://..."`
106+
2. **本地文件路径**
107+
- 直接使用本地文件路径作为 `file_uri`,底层会自动调用 Files API 完成上传。
108+
- 格式:`file_uri=f"file://{local_path}"`
109+
3. **Base64 Data URI**
110+
- 支持传入 Base64 编码的数据。
111+
- 参考:[火山方舟:图片理解-Base64编码](https://www.volcengine.com/docs/82379/1362931?lang=zh#477e51ce)
112+
113+
### 样例代码
114+
115+
****:以下所有示例代码均基于下述 `Agent` 配置与 `main` 函数:
116+
117+
```python
118+
import os
119+
import asyncio
120+
import uuid
121+
122+
from google.adk.events import Event
123+
from google.genai import types
124+
from google.genai.types import FileData
125+
126+
from veadk import Agent, Runner
127+
from veadk.memory.short_term_memory import ShortTermMemory
128+
129+
agent = Agent(
130+
enable_responses=True
131+
)
132+
short_term_memory = ShortTermMemory()
133+
runner = Runner(
134+
agent=agent,
135+
short_term_memory=short_term_memory,
136+
)
137+
138+
async def main(message: types.Content):
139+
session_id = uuid.uuid4().hex
140+
await short_term_memory.session_service.create_session(
141+
app_name=runner.app_name, user_id=runner.user_id, session_id=session_id
142+
)
143+
144+
async for event in runner.run_async(
145+
user_id=runner.user_id,
146+
session_id=session_id,
147+
new_message=message,
148+
):
149+
if isinstance(event, Event) and event.is_final_response():
150+
if event.content and event.content.parts:
151+
if not event.content.parts[0].thought:
152+
print(event.content.parts[0].text)
153+
elif len(event.content.parts) > 1:
154+
print(event.content.parts[1].text)
155+
```
156+
157+
158+
### 图片理解
159+
160+
=== "本地路径"
161+
162+
支持处理**最大 512MB** 的图片文件。
163+
164+
该方式直接传入本地文件路径,系统会自动调用 Files API 完成上传,随后调用 Responses API 进行分析。
165+
166+
```python hl_lines="7-8"
167+
local_path = os.path.abspath("example-data.png")
168+
message = types.UserContent(
169+
parts=[
170+
types.Part(text="描述一下这张图片"),
171+
types.Part(
172+
file_data=FileData(
173+
file_uri=f"file://{local_path}",
174+
mime_type="image/png"
175+
)
176+
)
177+
],
178+
)
179+
asyncio.run(
180+
main(message)
181+
)
182+
```
183+
184+
=== "Files API"
185+
186+
通过火山方舟 Files API 上传文件,支持处理**最大 512MB** 的图片文件。
187+
188+
```python hl_lines="9-10"
189+
from veadk.utils.misc import upload_to_files_api
190+
local_path = os.path.abspath("example-data.png")
191+
file_id = asyncio.run(upload_to_files_api(local_path))
192+
message = types.UserContent(
193+
parts=[
194+
types.Part(text="描述一下这张图片"),
195+
types.Part(
196+
file_data=FileData(
197+
file_uri=f"file_id://{file_id}",
198+
mime_type="image/png"
199+
)
200+
)
201+
],
202+
)
203+
asyncio.run(
204+
main(message)
205+
)
206+
```
207+
208+
=== "图片 URL"
209+
210+
支持处理**最大 10MB** 的图片文件。
211+
212+
```python hl_lines="7-8"
213+
image_url = "<your-url>"
214+
message = types.UserContent(
215+
parts=[
216+
types.Part(text="描述一下这张图片"),
217+
types.Part(
218+
file_data=FileData(
219+
file_uri=f"{image_url}",
220+
mime_type="image/png"
221+
)
222+
)
223+
],
224+
)
225+
asyncio.run(
226+
main(message)
227+
)
228+
```
229+
230+
231+
232+
### 视频理解
233+
234+
=== "Files API"
235+
236+
通过火山方舟 Files API 上传文件,支持处理**最大 512MB** 的视频文件。
237+
238+
在 `file_data` 中传递视频文件时,可选择添加 `video_metadata` 字段,指定视频的帧率(fps)。
239+
240+
您可以通过`fps`字段,控制从视频中抽取图像的频率,默认为1,即每秒从视频中抽取一帧图像,输入给模型进行视觉理解。可通过fps字段调整抽取频率,以平衡视频长度与模型处理效率。
241+
242+
- 当视频画面变化剧烈或需要关注画面变化,如计算视频中角色动作次数,可以跳高fps的设置(最高为5),防止抽帧频率过快导致模型无法准确理解视频内容。
243+
244+
- 当视频画面变化缓慢或不需要关注画面变化,如分析视频中人物行为,可适当降低fps的设置(最低为0.2),以平衡视频长度与模型处理效率。
245+
246+
```python hl_lines="9-10"
247+
from veadk.utils.misc import upload_to_files_api
248+
local_path = os.path.abspath("example-data.png")
249+
file_id = asyncio.run(upload_to_files_api(local_path, fps=0.3)) # optional `fps`
250+
message = types.UserContent(
251+
parts=[
252+
types.Part(text="描述一下这个视频"),
253+
types.Part(
254+
file_data=FileData(
255+
file_uri=f"file_id://{file_id}",
256+
mime_type="video/mp4"
257+
),
258+
video_metadata={ # optional
259+
"fps": 0.3
260+
}
261+
)
262+
],
263+
)
264+
asyncio.run(
265+
main(message)
266+
)
267+
```
268+
269+
=== "视频 URL"
270+
271+
支持处理**最大 50MB** 的视频文件。
272+
273+
```python hl_lines="7-8"
274+
video_url = "<your-video-url>"
275+
message = types.UserContent(
276+
parts=[
277+
types.Part(text="描述一下这个视频"),
278+
types.Part(
279+
file_data=FileData(
280+
file_uri=f"{video_url}",
281+
mime_type="video/mp4"
282+
)
283+
)
284+
],
285+
)
286+
asyncio.run(
287+
main(message)
288+
)
289+
```
290+
291+
292+
### 文档理解
293+
294+
部分模型支持处理 PDF 格式的文档,系统会通过视觉功能理解整个文档的上下文。
295+
当传入 PDF 文档时,大模型会将文件分页处理成多张图片,分析解读其中的文本与图片信息,并结合这些信息完成文档理解任务。
296+
297+
=== "Files API"
298+
299+
通过火山方舟 Files API 上传文件,支持处理**最大 512MB** 的文档。
300+
301+
```python hl_lines="9-10"
302+
from veadk.utils.misc import upload_to_files_api
303+
local_path = os.path.abspath("example-pdf.pdf")
304+
file_id = asyncio.run(upload_to_files_api(local_path))
305+
message = types.UserContent(
306+
parts=[
307+
types.Part(text="请概括总结文档的内容"),
308+
types.Part(
309+
file_data=FileData(
310+
file_uri=f"file_id://{file_id}",
311+
mime_type="application/pdf"
312+
)
313+
)
314+
],
315+
)
316+
asyncio.run(
317+
main(message)
318+
)
319+
```
320+
321+
=== "文档 URL"
322+
323+
支持处理**最大 50MB** 的文档。
324+
325+
```python hl_lines="7-8"
326+
message2 = types.UserContent(
327+
parts=[
328+
types.Part(text="请总结概括本文档"),
329+
types.Part(
330+
file_data=FileData(
331+
file_uri="<your-file-url>",
332+
mime_type="application/pdf"
333+
)
334+
)
335+
],
336+
)
337+
asyncio.run(
338+
main(message2)
339+
)
340+
```
341+
342+
343+
344+
## 参考文档
345+
346+
1. [火山方舟:ResponsesAPI迁移文档](https://www.volcengine.com/docs/82379/1585128?lang=zh)
347+
2. [火山方舟:上下文缓存](https://www.volcengine.com/docs/82379/1602228?lang=zh#3e69e743)
348+
3. [火山方舟:缓存Token计费说明](https://www.volcengine.com/docs/82379/1544106?lang=zh)
349+
4. [火山方舟:多模态理解](https://www.volcengine.com/docs/82379/1958521?lang=zh)
961 KB
Loading

0 commit comments

Comments
 (0)