Veo3.1 Reference To Video
Character consistency in Veo 3.1 without training a thing
- image1
- image2
- image3
- video_paths
Text-to-video gets you a video, but it's a lottery whether the character, the outfit, or the art style survives from shot to shot. That's the gap the reference-to-video mode in Veo 3.1 is built for: hand it up to three reference images and it uses them to anchor the style and content of the clip. No LoRA training, no fine-tuning, just images in, video out. If you've been fighting character drift in Veo, this is the node you want.
How it works
The node packages your prompt plus one to three reference image tensors and sends the whole bundle to Google's Veo 3.1 API on Vertex AI. image1 is required - that's your primary anchor. image2 and image3 are optional secondary references you can add for extra constraints, like a style sheet plus a character sheet. The model uses them to keep the output consistent with what you showed it. It runs the standard Veo 3.1 generation pipeline: polls the long-running operation, downloads the result, and hands back a list of local file paths in the temp folder.
Inputs that matter
The full generation toolkit is on show here, but the ones a beginner actually touches:
- image1, image2, image3 - your reference images.
image1is mandatory; the other two are optional. - prompt - what you want to happen in the video. The model still follows this on top of the references.
- model -
VEO_3_1by default, withVEO_3_1_FASTandVEO_3_1_LITEas cheaper, quicker variants. - output_resolution -
720p(default),1080p, or4k. The default is the one people complain about; bump it if your budget allows. - duration_seconds - 4, 6, or 8 seconds (the API only accepts those).
- generate_audio - Veo 3.1's native audio is one of the few genuinely unmatched capabilities in this space; leave it on unless you're scoring it yourself.
- sample_count - up to 4 variations of the same request, billed per video.
Optional extras: negative_prompt to steer away from things, seed for reproducibility, and output_gcs_uri, which is required if you set compression_quality to lossless - otherwise the node throws an interactive error telling you exactly that.
Gotchas
Two things to flag. The seed widget's tooltip says seed works with enhance-prompt disabled, but Veo 3.1 doesn't let you disable prompt enhancement at all - so in practice, treat the seed as mostly decorative on these nodes. And the 720p default is a recurring complaint: people pay for Veo and feel shortchanged by the default resolution, so set output_resolution before you burn an expensive run.
Installing and using
It's part of the Google GenMedia pack - ComfyUI Manager, search comfyui-google-genmedia-custom-nodes, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/GoogleCloudPlatform/comfyui-google-genmedia-custom-nodes
pip install -r comfyui-google-genmedia-custom-nodes/requirements.txt
You'll find it under Google AI/Veo3.1. Every node in the pack needs your gcp_project_id and gcp_region on the node itself (or GKE workload identity if you're running on GKE), and billing is per Vertex AI call - this is API, not local inference. The video_paths output feeds VeoVideoSaveAndPreview to watch the result, or VeoVideoToVHSNode if you want frames for post-processing.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | VEO_3_1 | 3 options: VEO_3_1, VEO_3_1_FAST, VEO_3_1_LITE |
| image1 | IMAGE | — | |
| image_format | COMBO | PNG | MIME type of the image |
| prompt | STRING | — | |
| aspect_ratio | COMBO | 16:9 | 2 options: 16:9, 9:16 |
| output_resolution | COMBO | 720p | 3 options: 720p, 1080p, 4k |
| compression_quality | COMBO | optimized | 2 options: optimized, lossless |
| person_generation | COMBO | allow_adult | 2 options: dont_allow, allow_adult |
| duration_seconds | INT | 84–8 | — |
| generate_audio | BOOLEAN | true | — |
| sample_count | INT | 11–4 | — |
| image2opt | IMAGE | — | |
| image3opt | IMAGE | — | |
| output_gcs_uriopt | STRING | — | |
| negative_promptopt | STRING | — | |
| seedopt | INT | 00–4294967295 | 0 seed let's Veo API handle randomness. |
| gcp_project_idopt | STRING | GCP project id where Vertex AI API will query Veo | |
| gcp_regionopt | STRING | GCP region for Vertex AI API |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_paths | VEO_VIDEO | — |