Flask应用中Google GenerativeAI无法加载视频文件的问题排查
解决Gemini API处理视频时的"File not in ACTIVE state"错误
在Flask应用中使用Gemini 1.5 Flash处理上传的视频文件时,出现google.api_core.exceptions.FailedPrecondition: 400 The File xxx is not in an ACTIVE state and usage is not allowed错误,但图片文件处理正常,且相同逻辑在Jupyter Notebook中可以正常运行。
核心原因
视频文件体积通常远大于图片,上传到Google Gemini服务器后,需要额外的转码、预处理流程才能完成就绪(进入ACTIVE状态)。Flask中同步执行的代码会在上传完成后立刻调用generate_content,此时服务器还未完成视频处理;而Jupyter Notebook的交互式环境中,上传到调用之间的人工操作间隔足够服务器完成预处理,因此不会触发错误。
具体解决方案
1. 轮询等待文件状态变为ACTIVE
上传视频后,循环检查文件状态,直到其变为ACTIVE再调用生成内容接口:
genai.configure(api_key=os.environ["GEMINI_API_KEY"]) model = genai.GenerativeModel('gemini-1.5-flash') gen_file = genai.upload_file(path=file_path) # 等待视频文件处理完成 import time max_wait_time = 60 # 设置最大等待时间(秒),避免无限循环 start_time = time.time() while gen_file.state.name != "ACTIVE": if time.time() - start_time > max_wait_time: raise TimeoutError("视频文件处理超时,请尝试上传更小的文件") time.sleep(2) # 每2秒检查一次状态 gen_file = genai.get_file(gen_file.name) # 文件就绪后调用生成接口 response = model.generate_content([llm_prompt, gen_file]).text
2. 确保本地视频文件完全写入
在上传到Gemini之前,确认本地视频文件已经完全保存完毕:
- 如果是从URL下载文件到本地,确保下载流已经关闭,文件写入完成
- 可以通过检查文件大小是否稳定来验证:
import os import time # 等待文件大小稳定 def wait_for_file_ready(file_path, check_interval=1, max_wait=10): prev_size = -1 start_time = time.time() while time.time() - start_time < max_wait: current_size = os.path.getsize(file_path) if current_size == prev_size: return True prev_size = current_size time.sleep(check_interval) return False # 在上传前调用 if not wait_for_file_ready(file_path): raise Exception("本地视频文件未完全写入") gen_file = genai.upload_file(path=file_path)
3. 检查文件兼容性
确认上传的视频文件符合Gemini API的要求:
- 支持的视频格式:MP4、MOV等常见格式
- 文件大小限制:Gemini 1.5 Flash支持最大2小时的视频,文件大小不超过10GB
- 如果视频格式不兼容,先转换为支持的格式再上传
内容的提问来源于stack exchange,提问作者Shubhankar Agrawal
相关产品推荐
相关产品推荐

