From 6821dd8e9146a8319dbb963001275a48863be2df Mon Sep 17 00:00:00 2001 From: buildingvibes Date: Tue, 10 Feb 2026 09:37:32 -0800 Subject: [PATCH] feat(server, templates): add Veo 3.1 model support Add support for Google's new Veo 3.1 video generation models (veo-3.1-generate-preview and veo-3.1-fast-generate-preview) across the Echo router, SDK, and video template. Router: - Add veo-3.1-fast-generate-preview and veo-3.1-generate-preview to VertexAI and Gemini supported video models with pricing - Add new models to VEO3_MODELS list in VertexAIProvider Template: - Add Veo 3.1 models to the video template UI dropdown - Set Veo 3.1 Fast as the default model - Update validation to accept the new model strings - Update vertex handler type signature for new models Fixes #595 --- .../app/server/src/clients/veo3-client.ts | 2 +- .../server/src/providers/VertexAIProvider.ts | 2 ++ .../ts/src/supported-models/video/gemini.ts | 14 ++++++++++++ .../src/supported-models/video/vertex-ai.ts | 22 ++++++++++++++++--- .../src/app/api/generate-video/validation.ts | 2 ++ .../src/app/api/generate-video/vertex.ts | 6 ++++- .../next-video-template/src/app/page.tsx | 4 ++-- .../src/components/video-generator.tsx | 4 +++- .../next-video-template/src/lib/types.ts | 2 ++ 9 files changed, 50 insertions(+), 8 deletions(-) diff --git a/packages/app/server/src/clients/veo3-client.ts b/packages/app/server/src/clients/veo3-client.ts index 46c8dbc28..44dc23c11 100644 --- a/packages/app/server/src/clients/veo3-client.ts +++ b/packages/app/server/src/clients/veo3-client.ts @@ -16,7 +16,7 @@ async function makeRequest() { const prompt = `An anime-style racing scene. A cool looking guy is racing away from villians in a japanese sports car.`; let operation = await ai.models.generateVideos({ - model: 'veo-3.0-fast-generate-001', + model: 'veo-3.1-fast-generate-001', prompt: prompt, config: { durationSeconds: 4, diff --git a/packages/app/server/src/providers/VertexAIProvider.ts b/packages/app/server/src/providers/VertexAIProvider.ts index f7165b341..e36579b98 100644 --- a/packages/app/server/src/providers/VertexAIProvider.ts +++ b/packages/app/server/src/providers/VertexAIProvider.ts @@ -19,6 +19,8 @@ import { env } from '../env'; // Constants export const PROXY_PASSTHROUGH_ONLY_MODEL = 'PROXY_PLACEHOLDER_VERTEX_AI'; const VEO3_MODELS = [ + 'veo-3.1-fast-generate-preview', + 'veo-3.1-generate-preview', 'veo-3.0-fast-generate-preview', 'veo-3.0-generate-preview', ]; diff --git a/packages/sdk/ts/src/supported-models/video/gemini.ts b/packages/sdk/ts/src/supported-models/video/gemini.ts index 90b150d77..672a15d69 100644 --- a/packages/sdk/ts/src/supported-models/video/gemini.ts +++ b/packages/sdk/ts/src/supported-models/video/gemini.ts @@ -1,10 +1,24 @@ import { SupportedVideoModel } from 'supported-models/types'; export type GeminiVideoModel = + | 'veo-3.1-generate-001' + | 'veo-3.1-fast-generate-001' | 'veo-3.0-generate-001' | 'veo-3.0-fast-generate-001'; // https://ai.google.dev/gemini-api/docs/pricing export const GeminiVideoModels: SupportedVideoModel[] = [ + { + model_id: 'veo-3.1-generate-001', + cost_per_second_with_audio: 0.4, + cost_per_second_without_audio: 0.2, + provider: 'Gemini', + }, + { + model_id: 'veo-3.1-fast-generate-001', + cost_per_second_with_audio: 0.15, + cost_per_second_without_audio: 0.1, + provider: 'Gemini', + }, { model_id: 'veo-3.0-generate-001', cost_per_second_with_audio: 0.4, 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..f5e621adb 100644 --- a/packages/sdk/ts/src/supported-models/video/vertex-ai.ts +++ b/packages/sdk/ts/src/supported-models/video/vertex-ai.ts @@ -1,26 +1,42 @@ import type { SupportedVideoModel } from '../types'; export type VertexAIVideoModel = + | 'veo-3.1-fast-generate-preview' + | 'veo-3.1-generate-preview' | 'veo-3.0-fast-generate-preview' | 'veo-3.0-generate-preview'; /** * Vertex AI video models with official pricing information * Based on: https://cloud.google.com/vertex-ai/generative-ai/pricing * + * Veo 3.1: $0.40/second with audio, $0.20/second video only (same as Veo 3 for 720p/1080p) + * Veo 3.1 Fast: $0.15/second with audio, $0.10/second video only (same as Veo 3 Fast for 720p/1080p) * 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 */ export const VertexAIVideoModels: SupportedVideoModel[] = [ + { + model_id: 'veo-3.1-fast-generate-preview', + cost_per_second_with_audio: 0.15, + cost_per_second_without_audio: 0.1, + 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.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', }, ]; 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..16639b8d6 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 @@ -35,6 +35,8 @@ export function validateGenerateVideoRequest(body: unknown): ValidationResult { } const validModels: VideoModelOption[] = [ + 'veo-3.1-fast-generate-preview', + 'veo-3.1-generate-preview', 'veo-3.0-fast-generate-preview', 'veo-3.0-generate-preview', ]; 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..5cc43be70 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,11 @@ import { */ export async function handleGeminiGenerate( prompt: string, - model: 'veo-3.0-fast-generate-preview' | 'veo-3.0-generate-preview', + model: + | 'veo-3.1-fast-generate-preview' + | 'veo-3.1-generate-preview' + | 'veo-3.0-fast-generate-preview' + | 'veo-3.0-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/app/page.tsx b/templates/next-video-template/src/app/page.tsx index 7e8164797..b8ae7603e 100644 --- a/templates/next-video-template/src/app/page.tsx +++ b/templates/next-video-template/src/app/page.tsx @@ -8,7 +8,7 @@ * * Key features: * 1. Authentication: Automatic login/logout with Echo SDK - * 2. Video Generation: Support for Veo 3 Fast model + * 2. Video Generation: Support for Veo 3.1 and Veo 3 models * 3. Duration Control: Adjustable video length (1-60 seconds) * 4. History: Persistent video gallery with download/copy actions * 5. Responsive Design: Works on desktop and mobile @@ -16,7 +16,7 @@ * Usage Examples: * - Text-to-Video: "A beautiful sunset over mountains with birds flying" * - Duration Control: Adjust slider for video length - * - Model Selection: Currently supports Veo 3 Fast + * - Model Selection: Supports Veo 3.1 Fast (default), Veo 3.1, Veo 3 Fast, and Veo 3 */ import { isSignedIn } from '@/echo'; diff --git a/templates/next-video-template/src/components/video-generator.tsx b/templates/next-video-template/src/components/video-generator.tsx index 1d942d1bb..e9f3a2b8c 100644 --- a/templates/next-video-template/src/components/video-generator.tsx +++ b/templates/next-video-template/src/components/video-generator.tsx @@ -42,6 +42,8 @@ import { FileInputManager } from './FileInputManager'; import { VideoHistory } from './video-history'; const models: VideoModelConfig[] = [ + { id: 'veo-3.1-fast-generate-preview', name: 'Veo 3.1 Fast' }, + { id: 'veo-3.1-generate-preview', name: 'Veo 3.1' }, { id: 'veo-3.0-fast-generate-preview', name: 'Veo 3 Fast' }, { id: 'veo-3.0-generate-preview', name: 'Veo 3' }, ]; @@ -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..63ff3cabe 100644 --- a/templates/next-video-template/src/lib/types.ts +++ b/templates/next-video-template/src/lib/types.ts @@ -14,6 +14,8 @@ export type ModelOption = 'openai' | 'gemini'; * Available AI models for video generation */ export type VideoModelOption = + | 'veo-3.1-fast-generate-preview' + | 'veo-3.1-generate-preview' | 'veo-3.0-fast-generate-preview' | 'veo-3.0-generate-preview';