Veo Image to Video
Google's best video model, fed from your canvas
- image
- client
- last_frame_image
- reference_images
- video_path
What it is
This node sends an image from your ComfyUI canvas to Google's Veo and gets a video back. Veo 3.x is the model the community grudgingly admits is ahead of open-source video right now - and it's the only one that generates native synchronized audio along with the picture. If you want your still frame turned into a moving, talking, sound-emitting clip without leaving ComfyUI, this is the node.
It's under ERPK/Gemini/Veo, which tells you the important thing: this is a Gemini API node, not a WaveSpeed one. Different key (Google's, free tier available from aistudio.google.com/app/apikey), different billing, and separate Veo-via-WaveSpeed nodes exist elsewhere in the pack if you'd rather be billed through WaveSpeed instead.
How it works
Your image becomes the first frame. The node uploads it, kicks off a generation, and polls until it's done - expect minutes, not seconds. The finished video is saved to disk (ComfyUI's output folder by default) and returned as a video_path string that wires into PreviewVideo or Preview Anything. Temp upload files are cleaned up automatically. If the safety filter blocks the request, you get an error and - per the source - Veo doesn't charge for blocked generations. That's a small mercy.
The inputs that matter
image- required first frame. Everything starts here.prompt- optional, and it's where the magic hides: Veo 3.x understands audio cues, so you can write "she speaks, wind rustling, soft music in background" and get real sound.model- defaultveo-3.1-generate-preview; also-lite-(cheapest, but no 4K and no reference images) and-fast-.last_frame_image- optional last frame for first-to-last interpolation. This is the killer feature, and it's a trap: it requiresduration_seconds=8, or the API rejects it with an opaque "use case not supported" 400 after burning several minutes of generation.reference_images- up to 3 images for style/content guidance, Veo 3.1 / 3.1 Fast only. Requires 8s and 16:9, and is mutually exclusive withlast_frame_image.duration_seconds,resolution,aspect_ratio- the node auto-clamps invalid combos. 8s output demands 1080p or reference images (720p gets bumped automatically); Lite caps at 1080p; Veo 2 ignores resolution entirely.person_generation- safety. Image-to-video rejectsallow_all; useallow_adultordont_allow.
One honest quirk: the seed widget is for ComfyUI cache invalidation only - the Gemini Developer API doesn't accept a seed for video, so it's never forwarded. Changing it just forces a fresh run.
Installing the pack
- ComfyUI Manager → Install Custom Nodes → search
erpk→ ERPK Custom Nodes → install → restart. - Or:
cd /path/to/ComfyUI/custom_nodes/
git clone https://github.com/eRepublik-Labs/comfyui-nodes-erpk.git erpk
cd erpk
pip install -r requirements.txt
Then set your Google API key (not a WaveSpeed key) in right-click canvas → ERPK Settings → API Keys, or grab an API key from aistudio.google.com. The Gemini nodes run standalone when the key is in Settings - the optional client input just pulls in a Gemini API Config node if you want explicit control.
Gotchas, condensed
- Interpolation needs 8s. The single most common failure: connect a last frame at 4s or 6s and watch it fail after a long generation. Set 8s.
- Reference images are picky: 8s, 16:9, Veo 3.1+, and never together with a last frame.
- It's slow by nature. Multi-minute polling is normal; don't assume it hung.
- Prompt maxes at 2500 characters; the node truncates with a warning.
- EU/UK/CH/MENA users get
person_generationlocked toallow_adulton Veo 3.x.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | First frame of the video (required) | |
| clientopt | GEMINI_API_CLIENT | Gemini API client from Gemini API Config node. Optional: when unconnected, the key is resolved from ComfyUI Settings or config.ini. | |
| last_frame_imageopt | IMAGE | Optional last frame for first-to-last interpolation. Supported on all Veo 3.x models including Lite, and Veo 2. REQUIRES duration_seconds=8 — the API rejects 4s/6s interpolation with an opaque 'use case not supported' 400 after running generation. | |
| reference_imagesopt | IMAGE | Up to 3 reference images (batched IMAGE) for style/content guidance. Only supported on Veo 3.1 and Veo 3.1 Fast. REQUIRES duration_seconds=8 and aspect_ratio=16:9. Mutually exclusive with last_frame_image. | |
| promptopt | STRING | Optional text description to guide the video. Supports audio cues for Veo 3.x. | |
| modelopt | COMBO | veo-3.1-generate-preview | Veo model. Lite is cheapest (no 4k, no reference images). Veo 3.1 / 3.1 Fast support reference images. Veo 2 has no resolution control. |
| aspect_ratioopt | COMBO | 16:9 | Video aspect ratio (16:9 landscape, 9:16 portrait) |
| resolutionopt | COMBO | 720p | Output resolution. 1080p and 4k require duration=8s. Lite caps at 1080p. Veo 2 ignores this parameter. |
| duration_secondsopt | COMBO | 8 | Video duration. Veo 3.x (all variants): 4/6/8s. Veo 2: 5/6/8s. 8s output requires 1080p (or 4k where supported) or reference_images. Mismatched values are auto-clamped to the nearest valid choice. |
| person_generationopt | COMBO | allow_adult | Person generation safety. EU/UK/CH/MENA: Veo 3.x limited to allow_adult. Veo 3.x image-to-video rejects allow_all; use allow_adult or dont_allow. |
| seedopt | INT | -1-1–4294967295 | Seed for ComfyUI cache invalidation. The Gemini Developer API does not accept a seed for video generation (only Vertex/Enterprise mode does), so this value is not forwarded — but changing it still forces a fresh run. -1 for random. |
| output_directoryopt | STRING | Directory to save video. Empty uses ComfyUI output folder. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |