Veo 3.0
Veo 3.0 is the full-quality Veo 3.0 video generation model, the proven standard-tier option for production video workflows requiring native audio, image-to-video support, and stable Veo 3.0 generation quality at up to 1080p. Your use is subject to Google's Terms & Privacy Policies.
import { experimental_generateVideo as generateVideo } from 'ai';
const result = await generateVideo({ model: 'google/veo-3.0-generate-001', prompt: 'A serene mountain lake at sunrise.'});Getting started
Generate videos with Veo 3.0 using the experimental_generateVideo function from AI SDK 6 or later. AI Gateway handles routing and polls until the video is ready.
Install the AI SDK (pnpm add ai dotenv), create an API key from the API Keys page, and set it as AI_GATEWAY_API_KEY in your environment. Full setup is covered in the video generation quickstart.
import { experimental_generateVideo as generateVideo } from 'ai';import fs from 'node:fs';import 'dotenv/config';
async function main() { const result = await generateVideo({ model: 'google/veo-3.0-generate-001', prompt: 'A pangolin curled on a mossy stone in a glowing bioluminescent forest', generateAudio: true, });
// Save the generated video fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');}
main().catch(console.error);Top-level parameters
Load the supported top-level parameters: prompt, aspectRatio, duration, resolution, and generateAudio.
import { experimental_generateVideo as generateVideo } from 'ai';import fs from 'node:fs';import 'dotenv/config';
async function main() { const result = await generateVideo({ model: 'google/veo-3.0-generate-001', prompt: 'A pangolin curled on a mossy stone in a glowing bioluminescent forest', aspectRatio: '16:9', duration: 8, resolution: '1080p', generateAudio: true, });
// Save the generated video fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');}
main().catch(console.error);| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | No | Text description of the video to generate. |
duration | 4 | 6 | 8 | No | Video length in seconds. 4 or 6 or 8 seconds. |
resolution | string | No | Resolution ('1280x720', '1920x1080'). |
aspectRatio | string | No | Aspect ratio ('16:9', '9:16'). |
generateAudio | boolean | No | Generate synchronized audio with the video. |
frameImages | Array<{ image: string; frameType: 'first_frame' }> | No | Opening frame of the clip, as a single first_frame entry. Replaces prompt.image and wins when both are set. |
Input limits
| Input | Formats | Sources | Max count | Max size | Limits |
|---|---|---|---|---|---|
| Image | jpg, jpeg, png | url, base64 | 1 | 20 MB | — |
Provider options
Pass Veo-specific options under providerOptions.vertex. This call loads every text-to-video option that combines in a single request. resizeMode is image-to-video only (see below), while referenceImages and gcsOutputDirectory change the inputs/output destination and are omitted here.
import { experimental_generateVideo as generateVideo } from 'ai';import fs from 'node:fs';import 'dotenv/config';
async function main() { const result = await generateVideo({ model: 'google/veo-3.0-generate-001', prompt: 'A pangolin curled on a mossy stone in a glowing bioluminescent forest', generateAudio: true, providerOptions: { vertex: { enhancePrompt: true, negativePrompt: 'blurry, low quality, distorted', personGeneration: 'allow_adult', compressionQuality: 'optimized', sampleCount: 1, seed: 42, pollIntervalMs: 5000, pollTimeoutMs: 600000, }, }, });
// Save the generated video fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');}
main().catch(console.error);Pass Veo-specific options under providerOptions.vertex in your generateVideo call.
| Parameter | Type | Required | Description |
|---|---|---|---|
enhancePrompt | boolean | No | Use Gemini to enhance prompts. Defaults to true. |
negativePrompt | string | No | What to discourage in the generated video. |
personGeneration | 'dont_allow' | 'allow_adult' | 'allow_all' | No | Whether to allow person generation. Defaults to 'allow_adult'. |
compressionQuality | 'optimized' | 'lossless' | No | Compression quality. Defaults to 'optimized'. |
sampleCount | number | No | Number of output videos (1-4). |
seed | number | No | Seed for deterministic generation (0-4,294,967,295). |
gcsOutputDirectory | string | No | Cloud Storage URI to store the generated videos. |
referenceImages | array | No | Reference images for style or asset guidance. Legacy alternative to the top-level inputReferences, used only when inputReferences is omitted. |
resizeMode | 'pad' | 'crop' | No | Image-to-video only: how to resize the input image to fit video dimensions. Defaults to 'pad'. |
pollIntervalMs | number | No | How often to check task status. Defaults to 5000. |
pollTimeoutMs | number | No | Maximum wait time. Defaults to 600000 (10 minutes). |
Duration and resolution
1080p and 4K require duration: 8. At 720p, you can use 4, 6, or 8 seconds.
Image to video
Animate a starting image by passing prompt as an object with image and an optional text field.
import { experimental_generateVideo as generateVideo } from 'ai';import fs from 'node:fs';import 'dotenv/config';
async function main() { const result = await generateVideo({ model: 'google/veo-3.0-generate-001', prompt: { image: 'https://example.com/landscape.png', text: 'Camera slowly pans across the scene as clouds drift by', }, duration: 8, resolution: '1080p', generateAudio: true, providerOptions: { vertex: { resizeMode: 'crop', }, }, });
// Save the generated video fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');}
main().catch(console.error);