需用tenacity实现带退避的自动重试,并区分瞬态错误(如timeout、serviceunavailable)与永久错误(如429、safety拦截),对前者重试,后者降级或休眠;同时导出失败请求快照用于精准复现。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Notebook中调用Gemini API时,一旦遇到500 Internal Server Error或429 Rate Limited就直接中断执行、堆栈炸开、变量全丢——这不是代码写错了,是异常没兜住。你需要让Notebook在报错时不崩溃,还能区分瞬态错误和永久错误,自动重试或降级处理。
用tenacity实现带退避的自动重试
方法一:安装并配置tenacity(比google.api_core.retry更灵活)
运行:!pip install tenacity
方法二:定义重试策略,只对可恢复错误重试
导入后写装饰器:from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type@retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10), retry=retry_if_exception_type(( requests.exceptions.Timeout, requests.exceptions.ConnectionError, google.api_core.exceptions.ServiceUnavailable, google.api_core.exceptions.InternalServerError )))
这一步必须显式列出异常类型,【若只写Exception会把ValueError也重试,导致逻辑错误被掩盖】。
方法三:包裹生成函数
把genai.GenerativeModel.generate_content调用包进装饰函数里,确保每次失败都触发退避等待。
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
手动捕获并分类错误码
第一步:检查响应状态而非仅依赖异常类
调用response = model.generate_content(prompt)后,不要直接取response.text,先判断if hasattr(response, 'prompt_feedback') and response.prompt_feedback.block_reason:
第二步:识别三类关键错误信号
① response.prompt_feedback.block_reason == "SAFETY" → 内容被安全策略拦截,需改写提示词或调整safety_settings
② response.candidates[0].finish_reason == "STOP" → 正常结束;若为"MAX_TOKENS"或"RECITATION",说明输出被截断或模型拒绝生成,要缩短输入或换模型
③ len(response.candidates) == 0 → 没有候选结果,大概率是输入含非法字符或格式错误,需检查parts结构
第三步:对429做配额兜底
捕获google.api_core.exceptions.ResourceExhausted后,立即触发time.sleep(60),而不是重试——因为配额耗尽再重试只会连续失败。
导出失败请求原始数据用于复现
当异常反复出现却无法定位时,保留完整请求快照比看堆栈更有用。
在try块内添加日志记录:import json; with open("failed_request_20260807.json", "w") as f: json.dump({"prompt": prompt, "model": model_name, "config": config_dict}, f, indent=2)
注意:不要用print(prompt)代替序列化,中文、emoji、特殊控制字符在console里会被转义或截断,导致复现失败。
导出后,用cat failed_request_*.json | python3 -m json.tool验证JSON合法性,避免因编码问题导致后续调试走偏。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










