Vertex Veo Text to Video
Google's best video model, sitting in your ComfyUI graph (bring a credit card)
- videos
- video_path_list
Vertex Veo Text to Video is the flagship node of Adforge, a Google Vertex AI toolkit built by the Brazilian fintech Creditas for generating ad creative. Give it a sentence, and it returns a video - up to 8 seconds, up to 1080p, with native audio - generated by Veo 3.1 in Google's cloud. No GPU, no local checkpoint, no VRAM math. It's the most literal "type prompt, get video" experience you can bolt onto ComfyUI.
The honest framing: Veo is the current king of closed video generation, and its native audio is the one capability no open model matches yet - that's a genuine gap, not marketing. But this is a paid API, billed per second of generated video, and every generation round-trips through a GCS bucket. If you're iterating on a cheap idea, local Wan 2.2 or LTX is where you do that. This node is for the take where quality actually matters: a product spot, a hero clip, the version you show a client. One light aside: it's also a great demo of how weird it feels to watch a node in your graph block for a minute while a datacenter somewhere else renders your pixels.
How it works
Under the hood it uses Google's Gen AI SDK in Vertex AI mode. The node calls models.generate_videos() with your prompt plus a pile of config, which kicks off a long-running operation - the node polls it every five seconds until it's done. Veo writes the finished clip to GCS (output_gcs_uri), and then the node downloads it back into your ComfyUI output folder. Two outputs come out: videos, a VIDEO-type list you can feed preview or save nodes, and video_path_list, a list of local file paths. Both are lists because you can ask for up to four variations per run.
The inputs that matter
prompt- required, and withenhance_prompt(on by default) Gemini rewrites it before Veo sees it. Leave it on; Veo rewards detailed prompts, and Gemini is decent at expanding a sentence into a shot list.duration_seconds- 2 to 8. Veo 3 tops out at 8; that's a model limit, not a node one.resolution- 1080p or 720p, and it only applies to Veo 3+ models. Pick 2.0 and it's ignored.generate_audio- defaults to off here. Veo 3.1's native sound is genuinely good; flip it on when the clip needs ambience or dialogue.seedandnumber_of_videos- seed for deterministic reruns, variations to gamble on a range of takes in one paid call.model,aspect_ratio,person_generation(whether people/faces are allowed),negative_prompt,fps- the usual dropdowns; the defaults are sane.
Installing and authenticating
cd ComfyUI/custom_nodes
git clone https://github.com/Creditas-labs/ComfyUI-Adforge
cd ComfyUI-Adforge
pip install -r requirements.txt # or: uv sync
Restart ComfyUI, or just search adforge in ComfyUI Manager. Python 3.12+ required. Then the auth dance: copy .env.example to custom_nodes/comfyui_adforge/.env and set GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_STORAGE_BUCKET, GOOGLE_CLOUD_LOCATION, and API_KEY - or export them as env vars. A bucket is non-negotiable: Veo writes its output to GCS and this node downloads it back. A service-account JSON via GOOGLE_APPLICATION_CREDENTIALS works too.
Common issues
- "Why is my 1080p request coming back 720p?" Known Veo 3.1 complaint - the API's effective output resolution can be lower than what you ask for. Annoying, but it's the model side, not the node.
- Auth errors. If a
.envin the custom_nodes folder isn't being picked up (it's found relative to where ComfyUI is launched), export the variables in the shell that starts ComfyUI. That always works. - Cost. Per-second pricing on a model that generates 8 seconds at a time adds up fast, especially with
number_of_videosturned up. Watch a couple of test runs in your billing console before you build a workflow around it.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The text prompt used to guide video generation. | |
| negative_promptopt | STRING | Optional. A text string that describes anything you want to discourage the model from generating. | |
| output_gcs_uriopt | STRING | None/videos/text-to-video-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. |
| duration_secondsopt | INT | 82–8 | 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. |
| seedopt | INT | 00–294967295 | 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. |
| 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. |
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) |