Veo 2 Video Generation
The video node that makes you wait (and it's worth it)
- first_frame
- last_frame
- video
Veo 2 is the node most people install the Vertex AI pack for. It's Google's video generation model as a single ComfyUI node: text in, an 8-second clip out, with first-frame and last-frame conditioning so it plays nice with the rest of your graph. The catch is patience - you type a prompt, and then you wait minutes for the cloud to render it. The result is worth the wait in a way most local video models can't match, but "wait" is the operative word.
What it is
A text-to-video and image-to-video node running veo-2.0-generate-001. It produces 5–8 second clips at 16:9 or 9:16, and you can pin both the first and last frame - a rare capability that makes it genuinely useful for stitching a clip between two stills in a larger workflow. Veo 2 is the model the KB's closed-source essay calls "incredible vlog style AI video"; the physics, motion, and camera behavior are a clear step above most open-source video at the time of writing.
How it works
The node opens a google-genai client, builds a GenerateVideosConfig from your settings, and submits an async operation. Then it polls every 15 seconds until the clip is done - this is where your minutes go. The video comes back either as bytes or from a GCS URI you specify, gets saved to a temp file, and is returned as ComfyUI's VIDEO type (a VideoFromFile object). Wire that into the pack's own "Preview Video" node to watch it, or into any video-consuming node.
Inputs that matter
- prompt - multiline. Veo rewards descriptive, camera-aware prompts.
- first_frame / last_frame - optional images. Give it one and it animates from there; give it both and it animates between them.
- duration_seconds - 5 to 8.
- aspect_ratio -
16:9or9:16. - enhance_prompt - on by default; Veo rewrites your prompt internally and it helps.
- person_generation -
allow_adultordont_allow. Relevant if people are in frame. - output_gcs_uri - set it to keep a durable copy of the clip in your bucket; leave blank to get the video back directly.
- seed - reproducibility.
Output is one video in VIDEO format.
Installing
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/khanhlvg/vertex-ai-comfyui-nodes.git
cd vertex-ai-comfyui-nodes
pip install -r requirements.txt
Then the pack-wide auth: gcloud auth application-default login, GOOGLE_CLOUD_PROJECT / GOOGLE_CLOUD_LOCATION (defaults us-central1), billing-enabled project with the Vertex AI API on. The requirements install google-genai plus storage SDKs - no local weights, no VRAM.
Where people get burned
- The wait. Clips take minutes, not seconds, and the node looks frozen while it polls. It isn't broken - every 15 seconds it checks the operation. Leave the tab alone.
- Silent failure feels scary. If the request is blocked (person generation, safety), the API can come back empty. Check the console for the error, and check your
person_generationsetting first. - Cost. Veo 2 is priced per second of generated video. Batching 10 variations of a clip is a real line on your bill. Iterate on the prompt, not on volume.
- You need a GCS-adjacent setup only if you set
output_gcs_uri- otherwise the pack handles everything through temp files.
One honest comparison: ComfyUI's own cloud offering also serves Veo, and you can run open video models locally - but if you want Veo 2 specifically inside your graph, with first/last-frame control feeding the rest of your workflow, this node is the direct route. Just budget the minutes.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| project_id | STRING | — | |
| location | STRING | us-central1 | — |
| model | COMBO | 1 options: veo-2.0-generate-001 | |
| prompt | STRING | A cinematic shot of a panda eating bamboo. | — |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — | |
| output_gcs_uriopt | STRING | — | |
| duration_secondsopt | INT | 85–8 | — |
| aspect_ratioopt | COMBO | 2 options: 16:9, 9:16 | |
| enhance_promptopt | BOOLEAN | true | — |
| person_generationopt | COMBO | 2 options: allow_adult, dont_allow | |
| seedopt | INT | 25942968570–4294967295 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |