# Google Veo

<!-- meta: type=google-veo; location=Generative Video; category=AI; platforms=Joomla and WordPress (where applicable) -->

## Overview

Creates a short video from a written description using Google Veo, then saves the MP4 on your Joomla site.

When the flow reaches this step, JOrchestrator calls the configured model using credentials from **Node Configuration**, then exposes the response fields listed below to downstream steps.

## Why use this node

Google Veo is a **AI step** in the **Generative Video** group. AI steps call language or media models. Use them to generate text, classify content, or produce assets that later steps publish or send.

Typical reasons teams add **Google Veo** to a flow:

- Generate or transform content with Google Veo before publishing or sending
- Use upstream CMS or webhook fields as prompts or context
- Keep AI calls inside audited, repeatable flows rather than one-off scripts

## Example workflows

Common patterns on the canvas:

1. **Trigger or Webhook** → upstream steps → **Google Veo** → **Send Email** or CMS update
2. **Scheduled trigger** → **Google Veo** → **Debug** (while testing) → production action

## How to set it up

Write your prompt on the Design tab. Longer clips can be built by extending the first scene on supported models. You receive a web link to the saved video — not the raw video file itself unless you turn that option on.

## Good to know

Add your Gemini API key under Joomla → Node Configuration → AI LLMs. Use an Upload Media step afterward if the video must sit in a specific /images folder.

## Properties panel

The designer shows these tabs for this node:

| Tab | Purpose |
|-----|---------|
| **Info** | Plain-language description and output payload fields for downstream steps |
| **General** | Canvas label and read-only node ID |
| **AI** | Optional assistant to help draft settings from plain language |
| **Design** | Node-specific configuration fields |

### System (automatic — not edited by the user)

These fields are managed by the designer or runtime — you do not type into them directly:

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `_nodeId` | Node ID | `node-id` | No | — | — |
| `_payloadFields` | Available Fields | `payload-panel` | No | — | — |

### User-configured — General tab

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `label` | Label | `text` | No | — | Node label |

### User-configured — Design tab

| Property key | Label | Type | Required | Visible when | Notes |
|--------------|-------|------|----------|--------------|-------|
| `prompt` | Prompt | `textarea` | **Yes** | — | Describe the video to generate… Google Gemini API key is read from Joomla Node Configuration → AI LLM's → Google Gemini (same key as the Gemini LLM node). |
| `modelId` | Veo model | `select` (`veo-3.1-generate-preview` \| `veo-3.1-fast-generate-preview` \| `veo-3.1-lite-generate-preview` \| `veo-3.0-generate-001` \| `veo-3.0-fast-generate-001` \| `veo-2.0-generate-001`; default: `veo-3.1-generate-preview`) | No | — | Only models available on the Gemini API for video generation. Veo 3.1 variants use -preview ids (veo-3.1-generate-001 and veo-3.1-lite-generate-001 are not available on Gemini API). |
| `targetDurationSeconds` | Target duration (seconds) | `select` (`4` \| `6` \| `8` \| `15` \| `22` \| `29` \| `36` \| `43` \| `50` \| `60` \| `90` \| `120` \| `148`; default: `8`) | No | `googleVeoSupportsExtension` | Total desired clip length. Values above the initial segment use Veo scene extension (Veo 3.1 or 3.1 Fast only; 720p; ~148s max). Not supported on Veo 3.1 Lite. |
| `segmentDurationSeconds` | Initial segment (seconds) | `select` (`4` \| `6` \| `8`; default: `8`) | No | `googleVeoSupportsExtension` | Length of the first generated clip. Extension steps add ~7 seconds each until the target is reached. |
| `extensionPrompt` | Extension prompt (optional) | `payload-text` | No | `googleVeoSupportsExtension` | Optional: prompt for each extension step Used for each extension call after the initial clip. Leave blank to reuse the main prompt. |
| `savePath` | Save path (optional) | `payload-text` | No | — | images/flow-inline/my-video.mp4 Local path under the Joomla site root. Leave blank to auto-save under images/flow-inline/. After download, use {{NodeLabel.url}} or {{NodeLabel.videoUrl}} in downstream nodes. |
| `aspectRatio` | Aspect ratio | `select` (`` \| `16:9` \| `9:16`; default: ``) | No | — | Optional. Preview models (Gemini API) ignore extra settings and use the prompt only. |
| `sampleCount` | Number of videos | `select` (`1` \| `2` \| `3` \| `4`; default: `1`) | No | — | Ignored for preview models. |
| `resolution` | Resolution (Veo 3+) | `select` (`` \| `720p` \| `1080p` \| `4k`; default: ``) | No | — | Optional. Ignored for preview models. Lite models do not support 4K. |
| `negativePrompt` | Negative prompt | `payload-text` | No | — | Optional: what to avoid in the video Ignored for preview models. |
| `pollIntervalSeconds` | Poll interval (seconds) | `select` (`5` \| `10` \| `15` \| `30`; default: `10`) | No | — | — |
| `maxPollMinutes` | Max wait (minutes) | `select` (`5` \| `10` \| `15` \| `20` \| `30`; default: `15`) | No | — | — |

### CMS site configuration (not on this node's properties panel)

Credentials, API keys, mailers, SMTP, and integration defaults are configured in the CMS plugin under **Node Configuration**, not per step on this node. Link the flow to a domain before testing CMS-backed fields.

## Output payload fields

After this step runs, later nodes can reference these fields using placeholders such as
`{{google_veo.success}}`.

| Field key | Type | Description |
|-----------|------|-------------|
| `success` | boolean | Whether the operation completed successfully. |
| `modelId` | string | AI or video model identifier used. |
| `operationName` | string | Long-running API operation identifier. |
| `videoUri` | string | Google Gemini API file URI before local download. |
| `localPath` | string | Saved file path relative to the Joomla site root. |
| `path` | string | Relative path to the saved MP4 under the site root. |
| `url` | string | Public URL to the downloaded MP4 on your Joomla site. |
| `videoUrl` | string | Public URL to the downloaded video file. |
| `video` | string | Public URL to a video file. |
| `media` | string | Public URL to a media asset. |
| `filename` | string | File name without directory path. |
| `bytesWritten` | number | Size of the downloaded MP4 in bytes (not the raw bytes themselves). |
| `videoBase64` | string | Base64-encoded video bytes (when Include base64 is enabled on the node). |
| `targetDurationSeconds` | number | Target total video duration in seconds. |
| `segmentDurationSeconds` | number | Initial clip duration in seconds. |
| `extensionCount` | number | Number of scene extensions applied (Veo). |
| `estimatedDurationSeconds` | number | Estimated final video duration in seconds. |
| `videos` | array | Array of generated video metadata objects. |
| `videoCount` | number | Number of generated video samples. |
| `pollAttempts` | number | Number of times the node polled for completion. |
| `apiSource` | string | API host that served the response. |
| `message` | string | Human-readable status, error, or result summary. |

## Validation rules

- **Prompt** (`prompt`) must be filled before the flow can be saved.

## Related nodes

Other steps in the same area of the palette:

- **Amazon Nova Reel** (`aws-nova-reel`) — Generative Video
