向gemini-1.5-pro-latest发送PDF触发500错误,求技术排查
Gemini-1.5-Pro-Latest接口500错误排查与解决
可能的错误原因
- Base64编码异常:代码中对PDF字节的base64编码可能存在不完整或多余字符(如换行),导致API无法解析Blob数据。
- Content结构不符合API要求:传入的content数组中,文本提示未封装为Part对象,Gemini多模态接口要求所有内容必须是Part实例的列表。
- PDF文件本身问题:文件损坏、加密,或大小超出API处理上限(单文件最大2GB,过大需分块),导致服务端解析失败。
- 缺少响应异常处理:直接调用
response.text会忽略API返回的错误状态,无法获取500错误的具体原因,甚至引发二次报错。 - API配置或环境问题:未正确设置API密钥、请求超时过短,或触发服务端临时限流。
对应解决方法
1. 修复Base64编码逻辑
确保PDF字节流完整读取,且base64编码无多余格式:
# 正确读取PDF文件字节(替代原pdf_file.getvalue(),确保完整读取) with open("target.pdf", "rb") as f: pdf_bytes = f.read() base64_data = base64.b64encode(pdf_bytes).decode("utf-8") blob = genai.Blob(mime_type="application/pdf", data=base64_data) document = genai.Part(inline_data=blob)
2. 修正Content结构
将文本提示也封装为Part对象,符合API多模态内容格式要求:
def runGemini(prompt, model, document=None): genai_model = genai.GenerativeModel(model) content_list = [] if document: content_list.append(document) # 文本提示必须封装为Part对象 content_list.append(genai.Part.from_text(prompt)) try: response = genai_model.generate_content(content_list) response.resolve() # 确保获取完整响应(处理流式返回) # 检查是否存在提示词拦截 if response.prompt_feedback.block_reason: print(f"提示词被拦截: {response.prompt_feedback.block_reason}") return None return response.text except genai.APIError as api_err: print(f"API错误(状态码 {api_err.status_code}): {api_err.message}") return None except Exception as err: print(f"未知错误: {str(err)}") return None
3. 校验并处理PDF文件
- 手动打开PDF确认文件未损坏、未加密;
- 若文件超过2GB,拆分后分块调用API;
- 避免上传空文件或零字节文件。
4. 完善API请求配置
- 确保已正确配置API密钥:
import google.generativeai as genai genai.configure(api_key="YOUR_GEMINI_API_KEY")
- 设置合理的请求超时时间(大文件需更长超时):
response = genai_model.generate_content(content_list, request_options={"timeout": 600})
- 登录Google Cloud控制台,检查API调用配额是否充足。
内容的提问来源于stack exchange,提问作者Walucas
相关产品推荐
相关产品推荐

