Vertex Veo Video with Reference
Same product, same character, every shot — Veo's reference images do the consistency work
- reference_image
- videos
- video_path_list
The recurring nightmare with video generation is consistency: your hero product looks right in take one and like a different object in take two. Veo's answer is reference images - you hand it a picture of the thing, and the model keeps that subject's appearance across the clip instead of inventing its own. That's what this node does, and for anyone generating branded or character-driven content it's probably the most useful of the Adforge Veo family. You feed it a prompt plus one image, and Google's Veo produces a video that stays faithful to it.
It's one of seven Veo nodes in Adforge, the ad-creation toolkit from Creditas (yes, the Brazilian fintech - this whole pack is aimed squarely at campaign work, and it shows). Where its sibling nodes handle extending or animating existing video, this one is for generating fresh footage about something specific: a product, a mascot, a character whose face has to stay the same. The generation runs on Google's Vertex AI, so your GPU sits this one out.
How it works
The node uses Google's Gen AI SDK (google-genai). Your image becomes an Image object - sent as bytes from the reference_image socket or referenced via GCS URI - and gets attached to the generation call as a reference image. Veo uses it as a guide for content or style while your prompt drives the action. The node polls the long-running operation every five seconds, then downloads the finished clips from GCS into your local ComfyUI output folder and returns them as VIDEO values.
The inputs that matter
- prompt (required) - what happens in the video.
- reference_image - the IMAGE socket; wire in any image. The string input reference_image_gcs_uri is the alternative if the image already lives in your bucket.
- reference_type - the one that changes behavior, and easy to get wrong. ASSET (default): you provide up to three images of a single person, character, or product, and Veo preserves the subject's appearance in the output. STYLE: one style image, and Veo applies its aesthetic to the output. The style option is only supported by
veo-2.0-generate-expin preview - worth knowing before you set it and wonder why nothing matches. - model - defaults to
veo-3.1-generate-preview, with the 3.1 fast variant, Veo 3, and Veo 2 options in the dropdown. - mime_type -
image/pngby default; matches what the IMAGE socket produces. - duration_seconds (1–10, default 8), fps (24), seed (0 = random), number_of_videos (1–4), generate_audio, enhance_prompt (on by default; routes your prompt through Gemini first).
Outputs
videos - a list of VIDEO clips you can preview or pass to the next node - and video_path_list, the local file paths to the same clips.
Installing and setting it up
Install through ComfyUI Manager by searching adforge, or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Creditas-labs/ComfyUI_Adforge
cd ComfyUI_Adforge
pip install -r requirements.txt # or: uv pip install -r requirements.txt
Restart ComfyUI, then add Google Cloud credentials to a .env under ComfyUI/custom_nodes/comfyui_adforge (the repo's .env.example is your template) or export them: GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_STORAGE_BUCKET, GOOGLE_CLOUD_LOCATION, API_KEY - or use a service account via GOOGLE_APPLICATION_CREDENTIALS. As with the rest of this pack, you need Python 3.12+ and a recent ComfyUI build, since it's written against the new comfy_api node API.
Where people get burned
The node raises a ValueError if it gets neither an image socket nor a GCS URI - you must provide a reference one way or the other. Beyond that, the usual Adforge suspects apply: the output needs a writable, billed GCS bucket (output_gcs_uri must look like gs://BUCKET_NAME/SUBDIRECTORY), and if enhance_prompt is on, Gemini gets called too, which shows up on the bill. And if you pick STYLE reference type, double-check the model - only the Veo 2 experimental build supports it, so a 3.x model with STYLE is a silent no-op waiting to happen. Set a seed for reproducible runs; Veo honors it when nothing else changes.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The text prompt used to guide video generation. | |
| reference_imageopt | IMAGE | The image to use as a reference for content or style. | |
| reference_image_gcs_uriopt | STRING | No documentation available | |
| reference_typeopt | COMBO | ASSET | Asset image: You provide up to three images of a single person, character, or product. Veo preserves the subject's appearance in the output video. Style image: You provide a single style image. Veo applies the style from your uploaded image in the output video. This feature is only supported by veo-2.0-generate-exp in Preview. |
| negative_promptopt | STRING | Optional. A text string that describes anything you want to discourage the model from generating. | |
| output_gcs_uriopt | STRING | None/videos/video-with-reference-20260720-202149.mp4 | GCS URI where the generated videos will be stored, in the format 'gs://BUCKET_NAME/SUBDIRECTORY'. |
| modelopt | COMBO | veo-3.1-generate-preview | The Veo model to use for video generation. |
| aspect_ratioopt | COMBO | 16:9 | Optional. Specifies the aspect ratio of generated videos. |
| mime_typeopt | COMBO | image/png | No documentation available |
| duration_secondsopt | INT | 81–10 | Required. The length in seconds of video files that you want to generate. |
| resolutionopt | COMBO | 1080p | Optional. Veo 3 models only. The resolution of the generated video. |
| fpsopt | INT | 241–60 | Optional. Frames per second for the generated video. |
| number_of_videosopt | INT | 11–4 | Optional. Number of video variations to generate. |
| enhance_promptopt | BOOLEAN | true | Optional. Use Gemini to enhance your prompts. |
| generate_audioopt | BOOLEAN | false | Generate audio for the video. |
| person_generationopt | COMBO | allow_adult | Optional. The safety setting that controls whether people or face generation is allowed. |
| seedopt | INT | 00–2147483647 | Optional. A number to request to make generated videos deterministic. Adding a seed number with your request without changing other parameters will cause the model to produce the same videos. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| videos | VIDEO | A list of generated videos (VIDEO type). |
| video_path_list | STRING | A list of local paths to the generated videos (when output_format=local_file) |