From a56c424d6259383c491fa97a360405d50669f92e Mon Sep 17 00:00:00 2001 From: Charles Wong Date: Wed, 11 Mar 2026 11:26:01 -0700 Subject: [PATCH] feat(veo): add Veo 3.1 model support (#595) - Add veo-3.1-generate-preview and veo-3.1-fast-generate-preview to VertexAI provider - Update VertexAIVideoModel type union to include new Veo 3.1 models - Add pricing entries for Veo 3.1 models (matching Veo 3.0 pricing) - Update video template: validation, component model list, and default model - Rename VEO3_MODELS -> VEO_MODELS and isVeo3Model -> isVeoModel for future-proofing - Set Veo 3.1 Fast as default model in the Next.js video template Pricing reference: https://cloud.google.com/vertex-ai/generative-ai/pricing --- .../server/src/providers/VertexAIProvider.ts | 8 ++++-- .../src/supported-models/video/vertex-ai.ts | 28 +++++++++++++++---- .../src/app/api/generate-video/validation.ts | 2 ++ .../src/app/api/generate-video/vertex.ts | 2 +- .../src/components/video-generator.tsx | 4 ++- .../next-video-template/src/lib/types.ts | 4 ++- 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/app/server/src/providers/VertexAIProvider.ts b/packages/app/server/src/providers/VertexAIProvider.ts index f7165b341..4b9bc7aff 100644 --- a/packages/app/server/src/providers/VertexAIProvider.ts +++ b/packages/app/server/src/providers/VertexAIProvider.ts @@ -18,9 +18,11 @@ import { env } from '../env'; // Constants export const PROXY_PASSTHROUGH_ONLY_MODEL = 'PROXY_PLACEHOLDER_VERTEX_AI'; -const VEO3_MODELS = [ +const VEO_MODELS = [ 'veo-3.0-fast-generate-preview', 'veo-3.0-generate-preview', + 'veo-3.1-generate-preview', + 'veo-3.1-fast-generate-preview', ]; const GCS_BUCKET_NAME = 'echo-veo3-videos'; const GCS_URI_PREFIX = 'gs://'; @@ -496,7 +498,7 @@ export class VertexAIProvider extends BaseProvider { } } - private isVeo3Model(): boolean { - return VEO3_MODELS.includes(this.getModel()); + private isVeoModel(): boolean { + return VEO_MODELS.includes(this.getModel()); } } diff --git a/packages/sdk/ts/src/supported-models/video/vertex-ai.ts b/packages/sdk/ts/src/supported-models/video/vertex-ai.ts index 82a9d6191..6434bd158 100644 --- a/packages/sdk/ts/src/supported-models/video/vertex-ai.ts +++ b/packages/sdk/ts/src/supported-models/video/vertex-ai.ts @@ -2,25 +2,41 @@ import type { SupportedVideoModel } from '../types'; export type VertexAIVideoModel = | 'veo-3.0-fast-generate-preview' - | 'veo-3.0-generate-preview'; + | 'veo-3.0-generate-preview' + | 'veo-3.1-generate-preview' + | 'veo-3.1-fast-generate-preview'; /** * Vertex AI video models with official pricing information * Based on: https://cloud.google.com/vertex-ai/generative-ai/pricing * - * Veo 3: $0.40/second with audio, $0.20/second video only - * Veo 3 Fast: $0.15/second with audio, $0.10/second video only + * Veo 3.0: $0.40/second with audio, $0.20/second video only + * Veo 3.0 Fast: $0.15/second with audio, $0.10/second video only + * Veo 3.1: $0.40/second with audio, $0.20/second video only + * Veo 3.1 Fast: $0.15/second with audio, $0.10/second video only */ export const VertexAIVideoModels: SupportedVideoModel[] = [ { model_id: 'veo-3.0-fast-generate-preview', cost_per_second_with_audio: 0.15, - cost_per_second_without_audio: 0.1, // Fixed: was 0.1, now 0.10 for clarity + cost_per_second_without_audio: 0.1, provider: 'VertexAI', }, { model_id: 'veo-3.0-generate-preview', - cost_per_second_with_audio: 0.4, // Fixed: was 0.4, now 0.40 for clarity - cost_per_second_without_audio: 0.2, // Fixed: was 0.2, now 0.20 for clarity + cost_per_second_with_audio: 0.4, + cost_per_second_without_audio: 0.2, + provider: 'VertexAI', + }, + { + model_id: 'veo-3.1-generate-preview', + cost_per_second_with_audio: 0.4, + cost_per_second_without_audio: 0.2, + provider: 'VertexAI', + }, + { + model_id: 'veo-3.1-fast-generate-preview', + cost_per_second_with_audio: 0.15, + cost_per_second_without_audio: 0.1, provider: 'VertexAI', }, ]; diff --git a/templates/next-video-template/src/app/api/generate-video/validation.ts b/templates/next-video-template/src/app/api/generate-video/validation.ts index 669dfd410..49eb96f4d 100644 --- a/templates/next-video-template/src/app/api/generate-video/validation.ts +++ b/templates/next-video-template/src/app/api/generate-video/validation.ts @@ -37,6 +37,8 @@ export function validateGenerateVideoRequest(body: unknown): ValidationResult { const validModels: VideoModelOption[] = [ 'veo-3.0-fast-generate-preview', 'veo-3.0-generate-preview', + 'veo-3.1-generate-preview', + 'veo-3.1-fast-generate-preview', ]; if (!model || !validModels.includes(model as VideoModelOption)) { return { diff --git a/templates/next-video-template/src/app/api/generate-video/vertex.ts b/templates/next-video-template/src/app/api/generate-video/vertex.ts index 66d1d4e8d..dd2a32b07 100644 --- a/templates/next-video-template/src/app/api/generate-video/vertex.ts +++ b/templates/next-video-template/src/app/api/generate-video/vertex.ts @@ -14,7 +14,7 @@ import { */ export async function handleGeminiGenerate( prompt: string, - model: 'veo-3.0-fast-generate-preview' | 'veo-3.0-generate-preview', + model: 'veo-3.0-fast-generate-preview' | 'veo-3.0-generate-preview' | 'veo-3.1-generate-preview' | 'veo-3.1-fast-generate-preview', durationSeconds: number = 4, generateAudio: boolean = false, image?: string, // Base64 encoded image or data URL (first frame) diff --git a/templates/next-video-template/src/components/video-generator.tsx b/templates/next-video-template/src/components/video-generator.tsx index 1d942d1bb..f52688ed5 100644 --- a/templates/next-video-template/src/components/video-generator.tsx +++ b/templates/next-video-template/src/components/video-generator.tsx @@ -44,6 +44,8 @@ import { VideoHistory } from './video-history'; const models: VideoModelConfig[] = [ { id: 'veo-3.0-fast-generate-preview', name: 'Veo 3 Fast' }, { id: 'veo-3.0-generate-preview', name: 'Veo 3' }, + { id: 'veo-3.1-generate-preview', name: 'Veo 3.1' }, + { id: 'veo-3.1-fast-generate-preview', name: 'Veo 3.1 Fast' }, ]; /** @@ -57,7 +59,7 @@ const models: VideoModelConfig[] = [ */ export default function VideoGenerator() { const [model, setModel] = useState( - 'veo-3.0-fast-generate-preview' + 'veo-3.1-fast-generate-preview' ); const [durationSeconds, setDurationSeconds] = useState<4 | 6 | 8>(4); const [generateAudio, setGenerateAudio] = useState(false); diff --git a/templates/next-video-template/src/lib/types.ts b/templates/next-video-template/src/lib/types.ts index d8e429c97..65464e271 100644 --- a/templates/next-video-template/src/lib/types.ts +++ b/templates/next-video-template/src/lib/types.ts @@ -15,7 +15,9 @@ export type ModelOption = 'openai' | 'gemini'; */ export type VideoModelOption = | 'veo-3.0-fast-generate-preview' - | 'veo-3.0-generate-preview'; + | 'veo-3.0-generate-preview' + | 'veo-3.1-generate-preview' + | 'veo-3.1-fast-generate-preview'; /** * Model configuration with display names