Video Input (File Upload)
Upload a video to Gemini's Files API, poll until it's ready, and pass it to an agent.
Code
import time
from pathlib import Path
from agno.agent import Agent
from agno.media import File
from agno.models.google import Gemini
def main() -> None:
video_path = Path(__file__).with_name("GreatRedSpot.mp4")
if not video_path.is_file():
raise FileNotFoundError(f"Download the sample video to {video_path}")
model = Gemini(id="gemini-3.5-flash")
client = model.get_client()
video_file = client.files.upload(file=video_path)
deadline = time.monotonic() + 300
while video_file.state and video_file.state.name == "PROCESSING":
if time.monotonic() >= deadline:
raise TimeoutError("Video processing exceeded five minutes")
if not video_file.name:
raise RuntimeError("Uploaded file has no identifier")
time.sleep(2)
video_file = client.files.get(name=video_file.name)
if not video_file.state or video_file.state.name != "ACTIVE" or not video_file.uri:
raise RuntimeError(f"Video is not ready: {video_file.state}")
agent = Agent(model=model, markdown=True)
agent.print_response(
"Tell me about this video",
files=[File(external=video_file)],
stream=True,
)
if __name__ == "__main__":
main()Usage
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateSet your API key
export GOOGLE_API_KEY=xxxInstall dependencies
uv pip install -U google-genai agnoDownload the video
In the directory where you save the script:
curl -L --fail -o GreatRedSpot.mp4 https://storage.googleapis.com/generativeai-downloads/images/GreatRedSpot.mp4Run Agent
Save the code above as video_input_file_upload.py, then run:
python video_input_file_upload.pyHistorical cookbook example
The original below passes a Google SDK object to a bytes-only Video.content field, supplies an invalid mixed-case upload identifier, and can continue after an upload failure. Use the corrected example above, which preserves the server-assigned identifier, requires an active file, and passes it through File(external=...).
import time
from pathlib import Path
from agno.agent import Agent
from agno.media import Video
from agno.models.google import Gemini
from agno.utils.log import logger
from google.genai.types import UploadFileConfig
model = Gemini(id="gemini-3.5-flash")
agent = Agent(
model=model,
markdown=True,
)
# Please download a sample video file to test this Agent
# Run: `wget https://storage.googleapis.com/generativeai-downloads/images/GreatRedSpot.mp4` to download a sample video
video_path = Path(__file__).parent.joinpath("GreatRedSpot.mp4")
video_file = None
remote_file_name = f"files/{video_path.stem.lower().replace('_', '')}"
try:
video_file = model.get_client().files.get(name=remote_file_name)
except Exception as e:
logger.info(f"Error getting file {video_path.stem}: {e}")
pass
# Upload the video file if it doesn't exist
if not video_file:
try:
logger.info(f"Uploading video: {video_path}")
video_file = model.get_client().files.upload(
file=video_path,
config=UploadFileConfig(name=video_path.stem, display_name=video_path.stem),
)
# Check whether the file is ready to be used.
while video_file and video_file.state and video_file.state.name == "PROCESSING":
time.sleep(2)
if video_file and video_file.name:
video_file = model.get_client().files.get(name=video_file.name)
else:
video_file = None
logger.info(f"Uploaded video: {video_file}")
except Exception as e:
logger.error(f"Error uploading video: {e}")
if __name__ == "__main__":
agent.print_response(
"Tell me about this video",
videos=[Video(content=video_file)],
stream=True,
)