如何用Python的requests向Gemini传递base64字节而非UTF-8字符串?
问题解答
核心结论
Gemini 的 streamGenerateContent REST API 不支持直接传递 base64 字节对象,必须将其转换为 UTF-8 编码的字符串后嵌入 JSON 请求体中,你的初始可行流程是符合 API 要求的标准做法。
具体原因与解释
JSON 序列化限制
JSON 规范中没有「字节对象」这一数据类型,Python 的json.dumps()无法直接序列化bytes类型数据,这是语言层面的固有限制,和 Gemini API 无关。API 请求格式要求
Gemini 的streamGenerateContent仅接受 JSON 格式的请求体,不支持multipart/form-data等直接上传二进制文件的格式。所有多媒体内容必须以 base64 编码的字符串形式嵌入 JSON 的inline_data.data字段中。MIME 类型的限制
application/octet-stream不在 Gemini 官方支持的 MIME 类型列表中,必须使用对应文件的标准类型:- 图片:
image/jpeg、image/png、image/gif等 - PDF:
application/pdf - 音频:
audio/wav、audio/mp3等(仅部分模型支持)
- 图片:
优化建议
- 无需跳过 base64 解码步骤:base64 字节转 UTF-8 字符串的性能开销可以忽略,且是 API 强制要求的格式,不会导致数据丢失。
- 确保使用正确的 MIME 类型:严格匹配文件格式,否则会返回「无效负载」错误。
- 标准代码示例(基于你的流程优化):
import base64 import json import requests # 读取本地文件 with open("local_file.pdf", "rb") as f: file_bytes = f.read() # 编码为base64并转为UTF-8字符串(必须步骤) base64_str = base64.b64encode(file_bytes).decode("utf-8") # 构造符合API要求的请求体 request_body = { "contents": [ { "parts": [ {"text": "请分析这个PDF的核心内容"}, {"inline_data": { "mime_type": "application/pdf", "data": base64_str }} ] } ] } # 发送请求 api_key = "YOUR_API_KEY" url = f"https://generativelanguage.googleapis.com/v1/models/gemini-pro-vision:streamGenerateContent?key={api_key}" response = requests.put( url, headers={"Content-Type": "application/json"}, json=request_body ) # 处理流式响应 for chunk in response.iter_lines(): if chunk: print(chunk.decode("utf-8"))
内容的提问来源于stack exchange,提问作者geotolky
相关产品推荐
相关产品推荐

