diff --git a/google/genai/models.py b/google/genai/models.py index e81925fa0..d2fb072f9 100644 --- a/google/genai/models.py +++ b/google/genai/models.py @@ -1854,6 +1854,13 @@ def _GenerateVideosConfig_to_mldev( 'compression_quality parameter is not supported in Gemini API.' ) + if getv(from_object, ['resize_mode']) is not None: + setv( + parent_object, + ['parameters', 'resizeMode'], + getv(from_object, ['resize_mode']), + ) + return to_object @@ -1970,6 +1977,13 @@ def _GenerateVideosConfig_to_vertex( getv(from_object, ['compression_quality']), ) + if getv(from_object, ['resize_mode']) is not None: + setv( + parent_object, + ['parameters', 'resizeMode'], + getv(from_object, ['resize_mode']), + ) + return to_object diff --git a/google/genai/tests/models/test_generate_videos.py b/google/genai/tests/models/test_generate_videos.py index a60c69a63..3d5216357 100644 --- a/google/genai/tests/models/test_generate_videos.py +++ b/google/genai/tests/models/test_generate_videos.py @@ -101,6 +101,7 @@ negative_prompt="ugly, low quality", enhance_prompt=True, compression_quality=types.VideoCompressionQuality.LOSSLESS, + resize_mode="pad", ), ), exception_if_mldev=( @@ -252,6 +253,28 @@ "output_gcs_uri parameter is not supported in Gemini API" ), ), + pytest_helper.TestTableItem( + name="test_image_to_video_with_resize_mode_pad", + parameters=types._GenerateVideosParameters( + model=VEO_MODEL_LATEST, + image=LOCAL_IMAGE, + config=types.GenerateVideosConfig( + number_of_videos=1, + resize_mode="pad", + ), + ), + ), + pytest_helper.TestTableItem( + name="test_image_to_video_with_resize_mode_crop", + parameters=types._GenerateVideosParameters( + model=VEO_MODEL_LATEST, + image=LOCAL_IMAGE, + config=types.GenerateVideosConfig( + number_of_videos=1, + resize_mode="crop", + ), + ), + ), ] pytestmark = pytest_helper.setup( @@ -538,6 +561,24 @@ def test_reference_images_to_video_poll(client): assert operation.result.generated_videos[0].video.uri +def test_image_to_video_resize_mode_poll(client): + operation = client.models.generate_videos( + model=VEO_MODEL_LATEST, + image=GCS_IMAGE if client.vertexai else LOCAL_IMAGE, + config=types.GenerateVideosConfig( + output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, + resize_mode="crop", + ), + ) + while not operation.done: + # Skip the sleep when in replay mode. + if client._api_client._mode not in ("replay", "auto"): + time.sleep(20) + operation = client.operations.get(operation=operation) + + assert operation.result.generated_videos[0].video.uri + + def test_video_edit_outpaint_poll(client): # Editing videos is only supported in Vertex AI. if not client.vertexai: diff --git a/google/genai/types.py b/google/genai/types.py index fc2c51692..1ee37aef0 100644 --- a/google/genai/types.py +++ b/google/genai/types.py @@ -9901,6 +9901,11 @@ class GenerateVideosConfig(_common.BaseModel): default=None, description="""Compression quality of the generated videos.""", ) + resize_mode: Optional[str] = Field( + default=None, + description="""The resize mode for image-to-video generation. Supported values + are: pad, crop. Default is pad when not specified.""", + ) class GenerateVideosConfigDict(TypedDict, total=False): @@ -9970,6 +9975,10 @@ class GenerateVideosConfigDict(TypedDict, total=False): compression_quality: Optional[VideoCompressionQuality] """Compression quality of the generated videos.""" + resize_mode: Optional[str] + """The resize mode for image-to-video generation. Supported values + are: pad, crop. Default is pad when not specified.""" + GenerateVideosConfigOrDict = Union[ GenerateVideosConfig, GenerateVideosConfigDict