Veo Prompt Writer
Stop writing video prompts by hand
- prompt
Veo Prompt Writer is the boring-but-essential node in the Vertex AI pack: it writes the prompt that the Veo video nodes actually use. You type what's happening in plain terms - subject, action, scene - pick from dropdowns for camera work, style, and sound, and it hands back a polished, cinematic prompt string that you feed straight into Veo 2 or Veo 3. Video prompting is its own skill, and this node is a cheat code for it.
What it is
A Gemini-powered prompt synthesizer. It uses gemini-2.5-flash to take your keywords and stitch them into one effective instruction for Veo, with the explicit rule that every keyword must be included and nothing new invented. It's not a freeform assistant - it's a structured prompt builder for people who know what they want but don't want to write the 200-word cinematic description by hand.
How it works
You fill in the three required fields - subject ("a detective"), action ("interrogating a rubber duck"), scene ("in a dark interview room") - and any optional picks. The node collects everything that isn't "None", builds a template instructing Gemini to synthesize a cohesive prompt, calls the Gemini API, and returns the text on a single STRING output. Wire that straight into the prompt input of the Veo 2 or Veo 3 node and you have a one-shot pipeline from idea to video.
Inputs that matter
- subject, action, scene - the three required pieces. These are the actual content; everything else is flavor.
- camera_angle (18 choices) - from Eye-Level to POV and Worm's-Eye. This is where video prompting diverges from image prompting, and the dropdown makes it discoverable.
- camera_movement (21 choices) - Pan, Tilt, Dolly, Zoom, Handheld, and more.
- lens_effects (10), style (17), temporal_elements (7), sound_effects (8) - lighting, mood, timing, and audio cues. Remember Veo 3 can generate audio natively, so a
sound_effectspick like "Waves crashing" isn't decoration. - dialogue - freeform text, appended when set.
Everything defaults to None, so a bare-minimum run is just subject + action + scene. The output is prompt (STRING) - there's no preview node needed, it's just text.
Installing
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 setup - gcloud auth application-default login, GOOGLE_CLOUD_PROJECT / GOOGLE_CLOUD_LOCATION. It calls the Gemini API, so your project needs Gemini access and billing like every other node here. Notably, it does not need any video model access; the prompt-writing and video-generation steps can live in different projects if you like.
Where people get burned
- It's a text call with a cost. Every run is a Gemini API call. It's cheap, but if you're tuning a workflow and re-running constantly, it adds up - and the "same input, same output" assumption doesn't fully hold.
- It's a crutch, not a mind reader. Gemini assembles what you give it; it won't invent the brilliant camera move you forgot to pick. The dropdowns are the feature - use them.
- No local option. If you want prompt building that never touches the network, you'd grab something local like KJNodes' prompt helpers instead. This node's whole identity is "already inside the Vertex AI pack."
Honestly, this is the node that saves you from yourself. Veo rewards detailed prompts, and nobody wants to type "slow dolly in, golden hour, volumetric lighting, shallow depth of field" from memory on every clip. Click the dropdowns, wire it to Veo 2, and go.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| project_id | STRING | — | |
| location | STRING | us-central1 | — |
| subject | STRING | a detective | — |
| action | STRING | interrogating a rubber duck | — |
| scene | STRING | in a dark interview room | — |
| camera_angleopt | COMBO | 18 options: None, Eye-Level Shot, Low-Angle Shot, High-Angle Shot, Bird's-Eye View, Top-Down Shot, +12 | |
| camera_movementopt | COMBO | 21 options: None, Static Shot (or fixed), Pan (left), Pan (right), Tilt (up), Tilt (down), +15 | |
| lens_effectsopt | COMBO | 10 options: None, Wide-Angle Lens (e.g., 24mm), Telephoto Lens (e.g., 85mm), Shallow Depth of Field, Bokeh, Deep Depth of Field, +4 | |
| styleopt | COMBO | 17 options: None, Photorealistic, Cinematic, Vintage, Japanese anime style, Claymation style, +11 | |
| temporal_elementsopt | COMBO | 7 options: None, Slow-motion, Fast-paced action, Time-lapse, Hyperlapse, Pulsating light, +1 | |
| sound_effectsopt | COMBO | 8 options: None, Sound of a phone ringing, Water splashing, Soft house sounds, Ticking clock, City traffic and sirens, +2 | |
| dialogueopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |