22title : 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"
2828from 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 )
0 commit comments