Gemini Video Generator (Veo)
Real video generation, API-side
- initial_image
- video_path
- preview_frame
- generation_info
- api_request
- api_response
The node that makes video without a single local model
Google's Veo models are among the best text-to-video and image-to-video generators around - the KB's own notes single out Veo 3's native synchronized audio as a genuine capability gap nobody else covers. Veo runs entirely in Google's cloud, which is exactly why it slots into ComfyUI so awkwardly normally, and so neatly here: GeminiVideoGenerator wraps the whole Veo API dance - submit, poll, download - in one node. Prompt in, video file out.
The catch is up front: it's not local, it's not free, and it's not fast. You're trading your GPU for Google's, and the generation runs on their clock, not yours.
How it works
You submit a prompt (and optionally an initial_image for image-to-video), and the node polls the API at poll_interval_seconds until the video is done, up to max_wait_minutes. Output is a standard short clip: about 8 seconds, 720p, MP4 with native audio (Veo 3), carrying an automatic SynthID watermark. Google keeps the video on their servers for roughly two days, so save_path is there to pull it down locally before it evaporates - the node downloads and stores it for you.
model choices are veo-3.0-generate-preview (default, best quality), veo-3.0-fast-generate-preview (faster variant), and veo-2.0-generate-001. aspect_ratio covers 16:9, 9:16, 1:1, 4:3, 3:4.
Inputs that matter
- prompt - this is everything. The README suggests detailed, specific descriptions with style keywords; the default prompt ("A cinematic drone shot of a red convertible...") is a decent template to edit.
- api_key - needs a key with Veo access, which is not the same as basic Gemini access. Check Google AI Studio; Veo is often gated or region-limited.
- initial_image - the optional starting frame for image-to-video. "Bring this portrait to life" workflows live here.
- negative_prompt - what to exclude ("blurry, low quality, distorted").
- person_generation -
default,allow, ordont_allow; people generation can be restricted by region. - max_wait_minutes - default 10 (up to 60). The source logs a hint when it times out: Veo 3.0 can genuinely take 15β20 minutes, so don't set this low and go AFK.
- save_path - where the downloaded video lands. Set it; the 2-day server retention is not a suggestion.
Outputs: video_path (the local file path - hand it to a video loader or your editor), preview_frame (an IMAGE preview so you can see the result in-graph), generation_info (specs), and the usual api_request / api_response debug outputs.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/jqy-yo/comfyui-gemini-nodes
cd comfyui-gemini-nodes
pip install -r requirements.txt
Or ComfyUI Manager β "ComfyUI Gemini Nodes", restart. No extra model downloads - everything runs Google-side.
Where people get burned
The big ones: access and patience. If you get a 500, it's usually that your key/region doesn't have Veo access - verify in AI Studio before blaming anything else. Timeouts happen constantly on Veo 3 because people leave max_wait_minutes at the default and it's genuinely slow; the node tells you as much in its own logs. And remember the workflow cost - Veo generation is billed per video, so max_wait_minutes doesn't affect cost but a runaway retry does. If a prompt gets rejected, clean it up rather than resubmitting the same thing; Veo's content filters mirror Gemini's, and the KB notes the image/Video side tightened its safety filtering in 2026.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A cinematic drone shot of a red convertible driving along a coastal road at sunset | β |
| api_key | STRING | β | |
| model | COMBO | veo-3.0-generate-preview | 3 options: veo-3.0-generate-preview, veo-3.0-fast-generate-preview, veo-2.0-generate-001 |
| aspect_ratio | COMBO | 16:9 | 5 options: 16:9, 9:16, 1:1, 4:3, 3:4 |
| person_generation | COMBO | default | 3 options: default, allow, dont_allow |
| max_wait_minutes | FLOAT | 101β60 | β |
| poll_interval_seconds | INT | 155β60 | β |
| negative_promptopt | STRING | β | |
| initial_imageopt | IMAGE | Optional starting image for video generation | |
| save_pathopt | STRING | β |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | β |
| preview_frame | IMAGE | β |
| generation_info | STRING | β |
| api_request | STRING | β |
| api_response | STRING | β |