ComfyUI Node

Veo3.1 Image To Video

Animate any image with Veo 3.1, straight from the tensor

By GoogleCloudPlatform·Created 8 months ago·Updated about a month ago· 47
Veo3.1 Image To Video
  • image
  • last_frame
  • video_paths
modelVEO_3_1
image_formatPNG
prompt
aspect_ratio16:9
output_resolution720p
compression_qualityoptimized
person_generationallow_adult
duration_seconds8
generate_audiotrue
sample_count1
output_gcs_uri
negative_prompt
seed0
gcp_project_id
gcp_region

The most useful way to use Veo 3.1, honestly, is image-to-video. Text-to-video leaves you guessing what the model thinks your prompt means; image-to-video pins the composition, the subject, and the style to something you already approved. This node takes a ComfyUI IMAGE tensor - from a Nano Banana node, a Load Image, an img2img result, anything - and hands it to Google's Veo 3.1 as the first frame, with your prompt dictating the motion.

How it works

The node encodes your image tensor into the right format, attaches it to a Veo 3.1 generation request on Vertex AI, and starts a long-running video operation that it polls until completion. The result downloads back to ComfyUI's temp folder and comes out the other side as a VEO_VIDEO path list. Optional nicety: the last_frame input accepts a second image tensor, which Veo uses as the end frame - giving you a guided interpolation between two fixed points instead of an open-ended animation.

Inputs that matter

  • image - the required starting frame. Any IMAGE tensor.
  • last_frame - optional ending frame for interpolation. This is the one beginners don't expect and end up loving.
  • prompt - what moves and how. Empty prompts are tolerated (Veo falls back to interpreting the image), but you'll get better motion with a real description.
  • model - VEO_3_1, VEO_3_1_FAST, or VEO_3_1_LITE. The lite and fast variants are cheaper and quicker at the cost of quality - useful when you're iterating.
  • output_resolution - 720p (default), 1080p, or 4k. The 720p default is the pack's most-voiced complaint; set this before a paid run.
  • duration_seconds - 4, 6, or 8 seconds only.
  • generate_audio - on by default; Veo 3.1's native audio is a genuine differentiator, leave it unless you're replacing the soundtrack yourself.
  • image_format - PNG, JPEG, or MP4, the format hint for the API.

Optional: negative_prompt, seed, output_gcs_uri (mandatory if compression_quality is lossless), and the pack-standard gcp_project_id / gcp_region.

Gotchas

The seed story is worth knowing before you chase reproducibility: the tooltip claims seed works with enhance-prompt disabled, but Veo 3.1 doesn't expose that toggle - prompt enhancement is always on, so treat seed as effectively inert here. And "lossless" mode has a hard requirement: no output_gcs_uri, no generation, with an interactive error telling you to provide a gs:// bucket.

Installing and wiring it

Part of the Google GenMedia pack:

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

Or ComfyUI Manager → search comfyui-google-genmedia-custom-nodes. Restart, find it under Google AI/Veo3.1. Set gcp_project_id and gcp_region on the node (this is a billed Vertex AI call, not local inference). The video_paths output goes to VeoVideoSaveAndPreview for playback or VeoVideoToVHSNode if you want the frames back as images for post-processing. A solid loop: Nano Banana for the still → this node for the motion → VHS node for upscaling.

CategoryGoogle AI/Veo3.1

Inputs (17)

NameTypeDefaultDescription
modelCOMBOVEO_3_13 options: VEO_3_1, VEO_3_1_FAST, VEO_3_1_LITE
imageIMAGE
image_formatCOMBOPNGmime type of the image
promptSTRING
aspect_ratioCOMBO16:92 options: 16:9, 9:16
output_resolutionCOMBO720p3 options: 720p, 1080p, 4k
compression_qualityCOMBOoptimized2 options: optimized, lossless
person_generationCOMBOallow_adult2 options: dont_allow, allow_adult
duration_secondsINT84–8
generate_audioBOOLEANtrue
sample_countINT11–4
last_frameoptIMAGE
output_gcs_urioptSTRING
negative_promptoptSTRING
seedoptINT00–42949672950 seed let's Veo API handle randomness. Seed works with enhance_prompt disabled
gcp_project_idoptSTRINGGCP project id where Vertex AI API will query Veo
gcp_regionoptSTRINGGCP region for Vertex AI API

Outputs (1)

NameTypeDescription
video_pathsVEO_VIDEO