Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions api-report/genai-node.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@ export interface GenerateVideosConfig {
generateAudio?: boolean;
httpOptions?: HttpOptions;
lastFrame?: Image_2;
mask?: VideoGenerationMask;
negativePrompt?: string;
numberOfVideos?: number;
outputGcsUri?: string;
Expand Down Expand Up @@ -3194,6 +3195,12 @@ export enum VideoCompressionQuality {
OPTIMIZED = "OPTIMIZED"
}

// @public
export interface VideoGenerationMask {
image?: Image_2;
maskMode?: string;
}

// @public
export interface VideoGenerationReferenceImage {
image?: Image_2;
Expand Down
7 changes: 7 additions & 0 deletions api-report/genai-web.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@ export interface GenerateVideosConfig {
generateAudio?: boolean;
httpOptions?: HttpOptions;
lastFrame?: Image_2;
mask?: VideoGenerationMask;
negativePrompt?: string;
numberOfVideos?: number;
outputGcsUri?: string;
Expand Down Expand Up @@ -3194,6 +3195,12 @@ export enum VideoCompressionQuality {
OPTIMIZED = "OPTIMIZED"
}

// @public
export interface VideoGenerationMask {
image?: Image_2;
maskMode?: string;
}

// @public
export interface VideoGenerationReferenceImage {
image?: Image_2;
Expand Down
7 changes: 7 additions & 0 deletions api-report/genai.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,7 @@ export interface GenerateVideosConfig {
generateAudio?: boolean;
httpOptions?: HttpOptions;
lastFrame?: Image_2;
mask?: VideoGenerationMask;
negativePrompt?: string;
numberOfVideos?: number;
outputGcsUri?: string;
Expand Down Expand Up @@ -3194,6 +3195,12 @@ export enum VideoCompressionQuality {
OPTIMIZED = "OPTIMIZED"
}

// @public
export interface VideoGenerationMask {
image?: Image_2;
maskMode?: string;
}

// @public
export interface VideoGenerationReferenceImage {
image?: Image_2;
Expand Down
10 changes: 4 additions & 6 deletions sdk-samples/generate_videos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ async function delay(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}

async function generateContentFromMLDev() {
async function generateVideosFromMLDev() {
const ai = new GoogleGenAI({vertexai: false, apiKey: GEMINI_API_KEY});
let operation = await ai.models.generateVideos({
model: 'veo-2.0-generate-001',
Expand Down Expand Up @@ -44,7 +44,7 @@ async function generateContentFromMLDev() {
});
}

async function generateContentFromVertexAI() {
async function generateVideosFromVertexAI() {
const ai = new GoogleGenAI({
vertexai: true,
project: GOOGLE_CLOUD_PROJECT,
Expand Down Expand Up @@ -77,13 +77,11 @@ async function generateContentFromVertexAI() {

async function main() {
if (GOOGLE_GENAI_USE_VERTEXAI) {
await generateContentFromVertexAI().catch((e) =>
await generateVideosFromVertexAI().catch((e) =>
console.error('got error', e),
);
} else {
await generateContentFromMLDev().catch((e) =>
console.error('got error', e),
);
await generateVideosFromMLDev().catch((e) => console.error('got error', e));
}
}

Expand Down
65 changes: 65 additions & 0 deletions sdk-samples/generate_videos_edit_outpaint.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {GoogleGenAI} from '@google/genai';

const GOOGLE_CLOUD_PROJECT = process.env.GOOGLE_CLOUD_PROJECT;
const GOOGLE_CLOUD_LOCATION = process.env.GOOGLE_CLOUD_LOCATION;
const GOOGLE_GENAI_USE_VERTEXAI = process.env.GOOGLE_GENAI_USE_VERTEXAI;

async function delay(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}

async function generateVideosEditOutpaintFromVertexAI() {
const ai = new GoogleGenAI({
vertexai: true,
project: GOOGLE_CLOUD_PROJECT,
location: GOOGLE_CLOUD_LOCATION,
});
let operation = await ai.models.generateVideos({
model: 'veo-2.0-generate-exp',
source: {
prompt: 'A mountain landscape',
video: {
uri: 'gs://genai-sdk-tests/inputs/videos/editing_demo.mp4',
},
},
config: {
outputGcsUri: 'gs://genai-sdk-tests/outputs/videos',
aspectRatio: '16:9',
mask: {
image: {
gcsUri: 'gs://genai-sdk-tests/inputs/videos/video_outpaint_mask.png',
mimeType: 'image/png',
},
maskMode: 'OUTPAINT',
},
},
});

while (!operation.done) {
console.log('Waiting for completion');
await delay(10000);
operation = await ai.operations.get({operation: operation});
}

const videos = operation.response?.generatedVideos;
if (videos === undefined || videos.length === 0) {
throw new Error('No videos generated');
}
}

async function main() {
if (GOOGLE_GENAI_USE_VERTEXAI) {
await generateVideosEditOutpaintFromVertexAI().catch((e) =>
console.error('got error', e),
);
} else {
console.error('Editing a video is not supported for Gemini Developer API.');
}
}

main();
31 changes: 31 additions & 0 deletions src/converters/_models_converters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1703,6 +1703,10 @@ export function generateVideosConfigToMldev(
);
}

if (common.getValueByPath(fromObject, ['mask']) !== undefined) {
throw new Error('mask parameter is not supported in Gemini API.');
}

if (common.getValueByPath(fromObject, ['compressionQuality']) !== undefined) {
throw new Error(
'compressionQuality parameter is not supported in Gemini API.',
Expand Down Expand Up @@ -4426,6 +4430,24 @@ export function videoGenerationReferenceImageToVertex(
return toObject;
}

export function videoGenerationMaskToVertex(
fromObject: types.VideoGenerationMask,
): Record<string, unknown> {
const toObject: Record<string, unknown> = {};

const fromImage = common.getValueByPath(fromObject, ['image']);
if (fromImage != null) {
common.setValueByPath(toObject, ['_self'], imageToVertex(fromImage));
}

const fromMaskMode = common.getValueByPath(fromObject, ['maskMode']);
if (fromMaskMode != null) {
common.setValueByPath(toObject, ['maskMode'], fromMaskMode);
}

return toObject;
}

export function generateVideosConfigToVertex(
fromObject: types.GenerateVideosConfig,
parentObject: Record<string, unknown>,
Expand Down Expand Up @@ -4570,6 +4592,15 @@ export function generateVideosConfigToVertex(
);
}

const fromMask = common.getValueByPath(fromObject, ['mask']);
if (parentObject !== undefined && fromMask != null) {
common.setValueByPath(
parentObject,
['instances[0]', 'mask'],
videoGenerationMaskToVertex(fromMask),
);
}

const fromCompressionQuality = common.getValueByPath(fromObject, [
'compressionQuality',
]);
Expand Down
12 changes: 12 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3407,6 +3407,16 @@ export declare interface VideoGenerationReferenceImage {
referenceType?: VideoGenerationReferenceType;
}

/** A mask for video generation. */
export declare interface VideoGenerationMask {
/** The image mask to use for generating videos. */
image?: Image;
/** Describes how the mask will be used. Inpainting masks must
match the aspect ratio of the input video. Outpainting masks can be
either 9:16 or 16:9. */
maskMode?: string;
}

/** Configuration for generating videos. */
export declare interface GenerateVideosConfig {
/** Used to override HTTP request options. */
Expand Down Expand Up @@ -3459,6 +3469,8 @@ export declare interface GenerateVideosConfig {
be associated with a type. Veo 2 supports up to 3 asset images *or* 1
style image. */
referenceImages?: VideoGenerationReferenceImage[];
/** The mask to use for generating videos. */
mask?: VideoGenerationMask;
/** Compression quality of the generated videos. */
compressionQuality?: VideoCompressionQuality;
}
Expand Down