diff --git a/README.md b/README.md index 6cca3cd0a..4eb7f7bd3 100644 --- a/README.md +++ b/README.md @@ -1408,14 +1408,19 @@ response3.generated_images[0].image.show() ### Veo +Currently, only Gemini Enterprise Agent Platform supports video generation. + #### Generate Videos (Text to Video) ```python +from google import genai from google.genai import types +client = genai.Client(vertexai=True) + # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( prompt='A neon hologram of a cat driving at top speed', ), @@ -1438,14 +1443,17 @@ video.show() #### Generate Videos (Image to Video) ```python +from google import genai from google.genai import types +client = genai.Client(vertexai=True) + # Read local image (uses mimetypes.guess_type to infer mime type) image = types.Image.from_file(location="local/path/file.png") # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( # Prompt is optional if image is provided prompt='Night sky', @@ -1470,18 +1478,20 @@ video.show() #### Generate Videos (Video to Video) -Currently, only Gemini Developer API supports video extension on Veo 3.1 for -previously generated videos. Gemini Enterprise Agent Platform supports video extension on Veo 2.0. +Currently, only Gemini Enterprise Agent Platform supports Video to Video generation (Video extension). ```python +from google import genai from google.genai import types +client = genai.Client(vertexai=True) + # Read local video (uses mimetypes.guess_type to infer mime type) video = types.Video.from_file("local/path/video.mp4") # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( # Prompt is optional if Video is provided prompt='Night sky', diff --git a/docs/source/index.rst b/docs/source/index.rst index a285fcf80..01dee579e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1391,18 +1391,21 @@ Edit image is only supported in Gemini Enterprise Agent Platform. Veo ------ -Support for generating videos is considered public preview +Currently, only Gemini Enterprise Agent Platform supports video generation. Generate Videos (Text to Video) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code:: python + from google import genai from google.genai import types + client = genai.Client(vertexai=True) + # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( prompt='A neon hologram of a cat driving at top speed', ), @@ -1427,14 +1430,17 @@ Generate Videos (Image to Video) .. code:: python + from google import genai from google.genai import types + client = genai.Client(vertexai=True) + # Read local image (uses mimetypes.guess_type to infer mime type) image = types.Image.from_file(location="local/path/file.png") # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( # Prompt is optional if image is provided prompt='Night sky', @@ -1465,14 +1471,17 @@ Currently, only Gemini Enterprise Agent Platform supports Video to Video generat .. code:: python + from google import genai from google.genai import types + client = genai.Client(vertexai=True) + # Read local video (uses mimetypes.guess_type to infer mime type) video = types.Video.from_file("local/path/video.mp4") # Create operation operation = client.models.generate_videos( - model='veo-3.1-generate-preview', + model='veo-3.1-generate-001', source=types.GenerateVideosSource( # Prompt is optional if Video is provided prompt='Night sky', diff --git a/google/genai/models.py b/google/genai/models.py index 8aa3eeed9..47e862e95 100644 --- a/google/genai/models.py +++ b/google/genai/models.py @@ -39,16 +39,6 @@ logger = logging.getLogger('google_genai.models') -def _VideoGenerationReferenceType_to_mldev_enum_validate( - enum_value: Any, -) -> None: - if enum_value in set(['STYLE']): - raise ValueError( - f'{enum_value} enum value is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - def _AuthConfig_to_mldev( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -1964,145 +1954,6 @@ def _GenerateImagesResponse_from_vertex( return to_object -def _GenerateVideosConfig_to_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - - if getv(from_object, ['number_of_videos']) is not None: - setv( - parent_object, - ['parameters', 'sampleCount'], - getv(from_object, ['number_of_videos']), - ) - - if getv(from_object, ['output_gcs_uri']) is not None: - raise ValueError( - 'output_gcs_uri parameter is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['fps']) is not None: - raise ValueError( - 'fps parameter is only supported in Gemini Enterprise Agent Platform' - ' mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['duration_seconds']) is not None: - setv( - parent_object, - ['parameters', 'durationSeconds'], - getv(from_object, ['duration_seconds']), - ) - - if getv(from_object, ['seed']) is not None: - raise ValueError( - 'seed parameter is only supported in Gemini Enterprise Agent Platform' - ' mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['aspect_ratio']) is not None: - setv( - parent_object, - ['parameters', 'aspectRatio'], - getv(from_object, ['aspect_ratio']), - ) - - if getv(from_object, ['resolution']) is not None: - setv( - parent_object, - ['parameters', 'resolution'], - getv(from_object, ['resolution']), - ) - - if getv(from_object, ['person_generation']) is not None: - setv( - parent_object, - ['parameters', 'personGeneration'], - getv(from_object, ['person_generation']), - ) - - if getv(from_object, ['pubsub_topic']) is not None: - raise ValueError( - 'pubsub_topic parameter is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['negative_prompt']) is not None: - setv( - parent_object, - ['parameters', 'negativePrompt'], - getv(from_object, ['negative_prompt']), - ) - - if getv(from_object, ['enhance_prompt']) is not None: - setv( - parent_object, - ['parameters', 'enhancePrompt'], - getv(from_object, ['enhance_prompt']), - ) - - if getv(from_object, ['generate_audio']) is not None: - raise ValueError( - 'generate_audio parameter is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['last_frame']) is not None: - setv( - parent_object, - ['instances[0]', 'lastFrame'], - _Image_to_mldev( - getv(from_object, ['last_frame']), to_object, root_object - ), - ) - - if getv(from_object, ['reference_images']) is not None: - setv( - parent_object, - ['instances[0]', 'referenceImages'], - [ - _VideoGenerationReferenceImage_to_mldev( - item, to_object, root_object - ) - for item in getv(from_object, ['reference_images']) - ], - ) - - if getv(from_object, ['mask']) is not None: - raise ValueError( - 'mask parameter is only supported in Gemini Enterprise Agent Platform' - ' mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['compression_quality']) is not None: - raise ValueError( - 'compression_quality parameter is only supported in Gemini Enterprise' - ' Agent Platform mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['labels']) is not None: - raise ValueError( - 'labels parameter is only supported in Gemini Enterprise Agent Platform' - ' mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['webhook_config']) is not None: - setv( - parent_object, ['webhookConfig'], getv(from_object, ['webhook_config']) - ) - - if getv(from_object, ['resize_mode']) is not None: - raise ValueError( - 'resize_mode parameter is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - return to_object - - def _GenerateVideosConfig_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -2242,49 +2093,6 @@ def _GenerateVideosConfig_to_vertex( return to_object -def _GenerateVideosOperation_from_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['name']) is not None: - setv(to_object, ['name'], getv(from_object, ['name'])) - - if getv(from_object, ['metadata']) is not None: - setv(to_object, ['metadata'], getv(from_object, ['metadata'])) - - if getv(from_object, ['done']) is not None: - setv(to_object, ['done'], getv(from_object, ['done'])) - - if getv(from_object, ['error']) is not None: - setv(to_object, ['error'], getv(from_object, ['error'])) - - if getv(from_object, ['response', 'generateVideoResponse']) is not None: - setv( - to_object, - ['response'], - _GenerateVideosResponse_from_mldev( - getv(from_object, ['response', 'generateVideoResponse']), - to_object, - root_object, - ), - ) - - if getv(from_object, ['response', 'generateVideoResponse']) is not None: - setv( - to_object, - ['result'], - _GenerateVideosResponse_from_mldev( - getv(from_object, ['response', 'generateVideoResponse']), - to_object, - root_object, - ), - ) - - return to_object - - def _GenerateVideosOperation_from_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -2324,50 +2132,6 @@ def _GenerateVideosOperation_from_vertex( return to_object -def _GenerateVideosParameters_to_mldev( - api_client: BaseApiClient, - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['model']) is not None: - setv( - to_object, - ['_url', 'model'], - t.t_model(api_client, getv(from_object, ['model'])), - ) - - if getv(from_object, ['prompt']) is not None: - setv(to_object, ['instances[0]', 'prompt'], getv(from_object, ['prompt'])) - - if getv(from_object, ['image']) is not None: - setv( - to_object, - ['instances[0]', 'image'], - _Image_to_mldev(getv(from_object, ['image']), to_object, root_object), - ) - - if getv(from_object, ['video']) is not None: - setv( - to_object, - ['instances[0]', 'video'], - _Video_to_mldev(getv(from_object, ['video']), to_object, root_object), - ) - - if getv(from_object, ['source']) is not None: - _GenerateVideosSource_to_mldev( - getv(from_object, ['source']), to_object, root_object - ) - - if getv(from_object, ['config']) is not None: - _GenerateVideosConfig_to_mldev( - getv(from_object, ['config']), to_object, root_object - ) - - return to_object - - def _GenerateVideosParameters_to_vertex( api_client: BaseApiClient, from_object: Union[dict[str, Any], object], @@ -2412,39 +2176,6 @@ def _GenerateVideosParameters_to_vertex( return to_object -def _GenerateVideosResponse_from_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['generatedSamples']) is not None: - setv( - to_object, - ['generated_videos'], - [ - _GeneratedVideo_from_mldev(item, to_object, root_object) - for item in getv(from_object, ['generatedSamples']) - ], - ) - - if getv(from_object, ['raiMediaFilteredCount']) is not None: - setv( - to_object, - ['rai_media_filtered_count'], - getv(from_object, ['raiMediaFilteredCount']), - ) - - if getv(from_object, ['raiMediaFilteredReasons']) is not None: - setv( - to_object, - ['rai_media_filtered_reasons'], - getv(from_object, ['raiMediaFilteredReasons']), - ) - - return to_object - - def _GenerateVideosResponse_from_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -2478,34 +2209,6 @@ def _GenerateVideosResponse_from_vertex( return to_object -def _GenerateVideosSource_to_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['prompt']) is not None: - setv( - parent_object, ['instances[0]', 'prompt'], getv(from_object, ['prompt']) - ) - - if getv(from_object, ['image']) is not None: - setv( - parent_object, - ['instances[0]', 'image'], - _Image_to_mldev(getv(from_object, ['image']), to_object, root_object), - ) - - if getv(from_object, ['video']) is not None: - setv( - parent_object, - ['instances[0]', 'video'], - _Video_to_mldev(getv(from_object, ['video']), to_object, root_object), - ) - - return to_object - - def _GenerateVideosSource_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -2594,22 +2297,6 @@ def _GeneratedImage_from_vertex( return to_object -def _GeneratedVideo_from_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['video']) is not None: - setv( - to_object, - ['video'], - _Video_from_mldev(getv(from_object, ['video']), to_object, root_object), - ) - - return to_object - - def _GeneratedVideo_from_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -2977,31 +2664,6 @@ def _Image_from_vertex( return to_object -def _Image_to_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['gcs_uri']) is not None: - raise ValueError( - 'gcs_uri parameter is only supported in Gemini Enterprise Agent' - ' Platform mode, not in Gemini Developer API mode.' - ) - - if getv(from_object, ['image_bytes']) is not None: - setv( - to_object, - ['bytesBase64Encoded'], - base_t.t_bytes(getv(from_object, ['image_bytes'])), - ) - - if getv(from_object, ['mime_type']) is not None: - setv(to_object, ['mimeType'], getv(from_object, ['mime_type'])) - - return to_object - - def _Image_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -4537,28 +4199,6 @@ def _VideoGenerationMask_to_vertex( return to_object -def _VideoGenerationReferenceImage_to_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['image']) is not None: - setv( - to_object, - ['image'], - _Image_to_mldev(getv(from_object, ['image']), to_object, root_object), - ) - - if getv(from_object, ['reference_type']) is not None: - _VideoGenerationReferenceType_to_mldev_enum_validate( - getv(from_object, ['reference_type']) - ) - setv(to_object, ['referenceType'], getv(from_object, ['reference_type'])) - - return to_object - - def _VideoGenerationReferenceImage_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -4578,28 +4218,6 @@ def _VideoGenerationReferenceImage_to_vertex( return to_object -def _Video_from_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['uri']) is not None: - setv(to_object, ['uri'], getv(from_object, ['uri'])) - - if getv(from_object, ['encodedVideo']) is not None: - setv( - to_object, - ['video_bytes'], - base_t.t_bytes(getv(from_object, ['encodedVideo'])), - ) - - if getv(from_object, ['encoding']) is not None: - setv(to_object, ['mime_type'], getv(from_object, ['encoding'])) - - return to_object - - def _Video_from_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -4622,28 +4240,6 @@ def _Video_from_vertex( return to_object -def _Video_to_mldev( - from_object: Union[dict[str, Any], object], - parent_object: Optional[dict[str, Any]] = None, - root_object: Optional[Union[dict[str, Any], object]] = None, -) -> dict[str, Any]: - to_object: dict[str, Any] = {} - if getv(from_object, ['uri']) is not None: - setv(to_object, ['uri'], getv(from_object, ['uri'])) - - if getv(from_object, ['video_bytes']) is not None: - setv( - to_object, - ['encodedVideo'], - base_t.t_bytes(getv(from_object, ['video_bytes'])), - ) - - if getv(from_object, ['mime_type']) is not None: - setv(to_object, ['encoding'], getv(from_object, ['mime_type'])) - - return to_object - - def _Video_to_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -6044,18 +5640,13 @@ def _generate_videos( ) request_url_dict: Optional[dict[str, str]] - - if self._api_client.vertexai: - request_dict = _GenerateVideosParameters_to_vertex( - self._api_client, parameter_model, None, parameter_model + if not self._api_client.vertexai: + raise ValueError( + 'This method is only supported in Gemini Enterprise Agent Platform' + ' mode, not in Gemini Developer API mode.' ) - request_url_dict = request_dict.get('_url') - if request_url_dict: - path = '{model}:predictLongRunning'.format_map(request_url_dict) - else: - path = '{model}:predictLongRunning' else: - request_dict = _GenerateVideosParameters_to_mldev( + request_dict = _GenerateVideosParameters_to_vertex( self._api_client, parameter_model, None, parameter_model ) request_url_dict = request_dict.get('_url') @@ -6063,6 +5654,7 @@ def _generate_videos( path = '{model}:predictLongRunning'.format_map(request_url_dict) else: path = '{model}:predictLongRunning' + query_params = request_dict.get('_query') if query_params: path = f'{path}?{urlencode(query_params)}' @@ -6090,11 +5682,6 @@ def _generate_videos( response_dict, None, parameter_model ) - if not self._api_client.vertexai: - response_dict = _GenerateVideosOperation_from_mldev( - response_dict, None, parameter_model - ) - return_value = types.GenerateVideosOperation._from_response( response=response_dict, kwargs={ @@ -8331,18 +7918,13 @@ async def _generate_videos( ) request_url_dict: Optional[dict[str, str]] - - if self._api_client.vertexai: - request_dict = _GenerateVideosParameters_to_vertex( - self._api_client, parameter_model, None, parameter_model + if not self._api_client.vertexai: + raise ValueError( + 'This method is only supported in Gemini Enterprise Agent Platform' + ' mode, not in Gemini Developer API mode.' ) - request_url_dict = request_dict.get('_url') - if request_url_dict: - path = '{model}:predictLongRunning'.format_map(request_url_dict) - else: - path = '{model}:predictLongRunning' else: - request_dict = _GenerateVideosParameters_to_mldev( + request_dict = _GenerateVideosParameters_to_vertex( self._api_client, parameter_model, None, parameter_model ) request_url_dict = request_dict.get('_url') @@ -8350,6 +7932,7 @@ async def _generate_videos( path = '{model}:predictLongRunning'.format_map(request_url_dict) else: path = '{model}:predictLongRunning' + query_params = request_dict.get('_query') if query_params: path = f'{path}?{urlencode(query_params)}' @@ -8377,11 +7960,6 @@ async def _generate_videos( response_dict, None, parameter_model ) - if not self._api_client.vertexai: - response_dict = _GenerateVideosOperation_from_mldev( - response_dict, None, parameter_model - ) - return_value = types.GenerateVideosOperation._from_response( response=response_dict, kwargs={ diff --git a/google/genai/tests/models/test_generate_videos.py b/google/genai/tests/models/test_generate_videos.py index aa8a9b647..e99abeae2 100644 --- a/google/genai/tests/models/test_generate_videos.py +++ b/google/genai/tests/models/test_generate_videos.py @@ -78,6 +78,7 @@ test_table: list[pytest_helper.TestTableItem] = [ pytest_helper.TestTableItem( name="test_simple_prompt", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="Man with a dog", @@ -85,6 +86,7 @@ ), pytest_helper.TestTableItem( name="test_all_parameters_vertex", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="A neon hologram of a cat driving at top speed", @@ -104,10 +106,10 @@ labels={"veo_label_key": "generate_videos"}, ), ), - exception_if_mldev="only supported in Gemini Enterprise Agent Platform mode", ), pytest_helper.TestTableItem( name="test_from_text_source", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, source=types.GenerateVideosSource(prompt="Man with a dog"), @@ -118,6 +120,7 @@ ), pytest_helper.TestTableItem( name="test_from_image_source", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, source=types.GenerateVideosSource( @@ -130,6 +133,7 @@ ), pytest_helper.TestTableItem( name="test_from_text_and_image_source", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, source=types.GenerateVideosSource( @@ -143,6 +147,7 @@ ), pytest_helper.TestTableItem( name="test_from_video_source", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, source=types.GenerateVideosSource( @@ -156,12 +161,10 @@ output_gcs_uri=OUTPUT_GCS_URI, ), ), - exception_if_mldev=( - "parameter is only supported in Gemini Enterprise Agent Platform mode" - ), ), pytest_helper.TestTableItem( name="test_from_text_and_video_source", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, source=types.GenerateVideosSource( @@ -176,12 +179,10 @@ output_gcs_uri=OUTPUT_GCS_URI, ), ), - exception_if_mldev=( - "parameter is only supported in Gemini Enterprise Agent Platform mode" - ), ), pytest_helper.TestTableItem( name="test_video_edit_outpaint", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_2_EXP, source=types.GenerateVideosSource( @@ -200,10 +201,10 @@ ), ), ), - exception_if_mldev="only supported in Gemini Enterprise Agent Platform mode", ), pytest_helper.TestTableItem( name="test_all_parameters_mldev", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_2, prompt="A neon hologram of a cat driving at top speed", @@ -219,6 +220,7 @@ ), pytest_helper.TestTableItem( name="test_all_parameters_veo3_mldev", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="A neon hologram of a cat driving at top speed", @@ -232,6 +234,7 @@ ), pytest_helper.TestTableItem( name="test_reference_to_video", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="Rain", @@ -245,12 +248,10 @@ ], ), ), - exception_if_mldev=( - "only supported in Gemini Enterprise Agent Platform mode" - ), ), pytest_helper.TestTableItem( name="test_with_webhook_config", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="Man with a dog", @@ -268,6 +269,7 @@ ), pytest_helper.TestTableItem( name="test_with_webhook_config_dict", + exception_if_mldev="only supported in Gemini Enterprise Agent Platform", parameters=types._GenerateVideosParameters( model=VEO_MODEL_LATEST, prompt="Man with a dog", @@ -293,57 +295,61 @@ def test_text_to_video_poll(client): - operation = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="A neon hologram of a cat driving at top speed", - config=types.GenerateVideosConfig( - output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, - ), - ) - 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) + with pytest_helper.exception_if_mldev(client, ValueError): + operation = client.models.generate_videos( + model=VEO_MODEL_LATEST, + prompt="A neon hologram of a cat driving at top speed", + config=types.GenerateVideosConfig( + output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, + ), + ) + 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 + assert operation.result.generated_videos[0].video.uri def test_image_to_video_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, - ), - ) - 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) + with pytest_helper.exception_if_mldev(client, ValueError): + 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, + ), + ) + 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 + assert operation.result.generated_videos[0].video.uri def test_text_and_image_to_video_poll(client): - operation = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Lightning storm", - 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=(types.ImageResizeMode.CROP - if client.vertexai else None), - ), - ) - 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) + with pytest_helper.exception_if_mldev(client, ValueError): + operation = client.models.generate_videos( + model=VEO_MODEL_LATEST, + prompt="Lightning storm", + 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=( + types.ImageResizeMode.CROP if client.vertexai else None + ), + ), + ) + 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 + assert operation.result.generated_videos[0].video.uri def test_video_to_video_poll(client): @@ -395,179 +401,48 @@ def test_text_and_video_to_video_poll(client): assert operation.result.generated_videos[0].video.uri -def test_generated_video_extension_poll(client): - # Gemini API only supports video extension on generated videos. - if client.vertexai: - return - - operation1 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Rain", - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation1.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation1 = client.operations.get(operation=operation1) - - video1 = operation1.result.generated_videos[0].video - assert video1.uri - client.files.download(file=video1) - assert video1.video_bytes - - operation2 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Sun", - video=video1, - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation2.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation2 = client.operations.get(operation=operation2) - - video2 = operation2.result.generated_videos[0].video - assert video2.uri - client.files.download(file=video2) - assert video2.video_bytes - - -def test_generated_video_extension_from_source_poll(client): - # Gemini API only supports video extension on generated videos. - if client.vertexai: - return - - operation1 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Rain", - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation1.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation1 = client.operations.get(operation=operation1) - - video1 = operation1.result.generated_videos[0].video - assert video1.uri - client.files.download(file=video1) - assert video1.video_bytes - - operation2 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - source=types.GenerateVideosSource( - prompt="Sun", - video=video1 - ), - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation2.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation2 = client.operations.get(operation=operation2) - - video2 = operation2.result.generated_videos[0].video - assert video2.uri - client.files.download(file=video2) - assert video2.video_bytes - - -def test_generated_video_extension_from_source_dict_poll(client): - # Gemini API only supports video extension on generated videos. - if client.vertexai: - return - - operation1 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Rain", - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation1.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation1 = client.operations.get(operation=operation1) - - video1 = operation1.result.generated_videos[0].video - assert video1.uri - client.files.download(file=video1) - assert video1.video_bytes - - operation2 = client.models.generate_videos( - model=VEO_MODEL_LATEST, - source={ - "prompt": "Sun", - "video": video1, - }, - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation2.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation2 = client.operations.get(operation=operation2) - - video2 = operation2.result.generated_videos[0].video - assert video2.uri - client.files.download(file=video2) - assert video2.video_bytes - - def test_image_to_video_frame_interpolation_poll(client): - operation = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Rain", - image=GCS_IMAGE if client.vertexai else LOCAL_IMAGE_MAN, - config=types.GenerateVideosConfig( - output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, - last_frame=GCS_IMAGE2 if client.vertexai else LOCAL_IMAGE_DOG, - ), - ) - 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) + with pytest_helper.exception_if_mldev(client, ValueError): + operation = client.models.generate_videos( + model=VEO_MODEL_LATEST, + prompt="Rain", + image=GCS_IMAGE if client.vertexai else LOCAL_IMAGE_MAN, + config=types.GenerateVideosConfig( + output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, + last_frame=GCS_IMAGE2 if client.vertexai else LOCAL_IMAGE_DOG, + ), + ) + 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 + assert operation.result.generated_videos[0].video.uri def test_reference_images_to_video_poll(client): - operation = client.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Chirping birds in a colorful forest", - config=types.GenerateVideosConfig( - output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, - reference_images=[ - types.VideoGenerationReferenceImage( - image=GCS_IMAGE if client.vertexai else LOCAL_IMAGE_MAN, - reference_type=types.VideoGenerationReferenceType.ASSET, - ), - ], - ), - ) - 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) + with pytest_helper.exception_if_mldev(client, ValueError): + operation = client.models.generate_videos( + model=VEO_MODEL_LATEST, + prompt="Chirping birds in a colorful forest", + config=types.GenerateVideosConfig( + output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, + reference_images=[ + types.VideoGenerationReferenceImage( + image=GCS_IMAGE if client.vertexai else LOCAL_IMAGE_MAN, + reference_type=types.VideoGenerationReferenceType.ASSET, + ), + ], + ), + ) + 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 + assert operation.result.generated_videos[0].video.uri def test_video_edit_outpaint_poll(client): @@ -730,61 +605,18 @@ def test_source_and_prompt_raises(client): @pytest.mark.asyncio async def test_text_to_video_poll_async(client): - operation = await client.aio.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="A neon hologram of a cat driving at top speed", - config=types.GenerateVideosConfig( - output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, - ), - ) - while not operation.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation = await client.aio.operations.get(operation=operation) - - assert operation.result.generated_videos[0].video.uri - - -@pytest.mark.asyncio -async def test_generated_video_extension_from_source_poll_async(client): - # Gemini API only supports video extension on generated videos. - if client.vertexai: - return - - operation1 = await client.aio.models.generate_videos( - model=VEO_MODEL_LATEST, - prompt="Rain", - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation1.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation1 = await client.aio.operations.get(operation=operation1) - - video1 = operation1.result.generated_videos[0].video - assert video1.uri - assert await client.aio.files.download(file=video1) - - operation2 = await client.aio.models.generate_videos( - model=VEO_MODEL_LATEST, - source=types.GenerateVideosSource( - prompt="Sun", - video=video1 - ), - config=types.GenerateVideosConfig( - number_of_videos=1, - ), - ) - while not operation2.done: - # Skip the sleep when in replay mode. - if client._api_client._mode not in ("replay", "auto"): - time.sleep(20) - operation2 = await client.aio.operations.get(operation=operation2) + with pytest_helper.exception_if_mldev(client, ValueError): + operation = await client.aio.models.generate_videos( + model=VEO_MODEL_LATEST, + prompt="A neon hologram of a cat driving at top speed", + config=types.GenerateVideosConfig( + output_gcs_uri=OUTPUT_GCS_URI if client.vertexai else None, + ), + ) + while not operation.done: + # Skip the sleep when in replay mode. + if client._api_client._mode not in ("replay", "auto"): + time.sleep(20) + operation = await client.aio.operations.get(operation=operation) - video2 = operation2.result.generated_videos[0].video - assert video2.uri - assert await client.aio.files.download(file=video2) + assert operation.result.generated_videos[0].video.uri diff --git a/google/genai/tests/shared/models/test_generate_videos.py b/google/genai/tests/shared/models/test_generate_videos.py index 96c4bb9c9..d89af59c6 100644 --- a/google/genai/tests/shared/models/test_generate_videos.py +++ b/google/genai/tests/shared/models/test_generate_videos.py @@ -38,7 +38,7 @@ ), ), exception_if_mldev=( - "models/veo-3.1-lite-generate-001 is not found for API version v1beta" + "only supported in Gemini Enterprise Agent Platform" ), ), ]