From 4e56c64e39f618ddf498127f6a43dc09871e54c1 Mon Sep 17 00:00:00 2001 From: Ivan Lopez Hernandez Date: Thu, 14 Aug 2025 14:01:00 -0700 Subject: [PATCH] chore: Refactored the _fromResponse method on GenerateVideosOperation to use the autogenerated code. PiperOrigin-RevId: 795187934 --- google/genai/_base_transformers.py | 26 ++++++++ google/genai/_operations_converters.py | 7 +-- google/genai/_transformers.py | 10 ---- google/genai/models.py | 15 ++--- google/genai/tests/transformers/test_bytes.py | 2 +- google/genai/types.py | 59 +++---------------- 6 files changed, 47 insertions(+), 72 deletions(-) create mode 100644 google/genai/_base_transformers.py diff --git a/google/genai/_base_transformers.py b/google/genai/_base_transformers.py new file mode 100644 index 000000000..cc61877a2 --- /dev/null +++ b/google/genai/_base_transformers.py @@ -0,0 +1,26 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +"""Base transformers for Google GenAI SDK.""" +import base64 + +# Some fields don't accept url safe base64 encoding. +# We shouldn't use this transformer if the backend adhere to Cloud Type +# format https://cloud.google.com/docs/discovery/type-format. +# TODO(b/389133914,b/390320301): Remove the hack after backend fix the issue. +def t_bytes(data: bytes) -> str: + if not isinstance(data, bytes): + return data + return base64.b64encode(data).decode('ascii') diff --git a/google/genai/_operations_converters.py b/google/genai/_operations_converters.py index 2a9d7b150..fb3985d49 100644 --- a/google/genai/_operations_converters.py +++ b/google/genai/_operations_converters.py @@ -16,8 +16,7 @@ # Code generated by the Google Gen AI SDK generator DO NOT EDIT. from typing import Any, Optional, Union - -from . import _transformers as t +from . import _base_transformers as base_t from ._common import get_value_by_path as getv from ._common import set_value_by_path as setv @@ -108,7 +107,7 @@ def _Video_from_mldev( setv( to_object, ['video_bytes'], - t.t_bytes(getv(from_object, ['video', 'encodedVideo'])), + base_t.t_bytes(getv(from_object, ['video', 'encodedVideo'])), ) if getv(from_object, ['encoding']) is not None: @@ -214,7 +213,7 @@ def _Video_from_vertex( setv( to_object, ['video_bytes'], - t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), + base_t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), ) if getv(from_object, ['mimeType']) is not None: diff --git a/google/genai/_transformers.py b/google/genai/_transformers.py index 7cc85ef1d..dbc0fe1d4 100644 --- a/google/genai/_transformers.py +++ b/google/genai/_transformers.py @@ -1156,16 +1156,6 @@ def t_tuning_job_status(status: str) -> Union[types.JobState, str]: return status -# Some fields don't accept url safe base64 encoding. -# We shouldn't use this transformer if the backend adhere to Cloud Type -# format https://cloud.google.com/docs/discovery/type-format. -# TODO(b/389133914,b/390320301): Remove the hack after backend fix the issue. -def t_bytes(data: bytes) -> str: - if not isinstance(data, bytes): - return data - return base64.b64encode(data).decode('ascii') - - def t_content_strict(content: types.ContentOrDict) -> types.Content: if isinstance(content, dict): return types.Content.model_validate(content) diff --git a/google/genai/models.py b/google/genai/models.py index bfc974e19..ba6c99816 100644 --- a/google/genai/models.py +++ b/google/genai/models.py @@ -21,6 +21,7 @@ from urllib.parse import urlencode from . import _api_module +from . import _base_transformers as base_t from . import _common from . import _extra_utils from . import _mcp_utils @@ -1260,7 +1261,7 @@ def _Image_to_mldev( setv( to_object, ['bytesBase64Encoded'], - t.t_bytes(getv(from_object, ['image_bytes'])), + base_t.t_bytes(getv(from_object, ['image_bytes'])), ) if getv(from_object, ['mime_type']) is not None: @@ -2502,7 +2503,7 @@ def _Image_to_vertex( setv( to_object, ['bytesBase64Encoded'], - t.t_bytes(getv(from_object, ['image_bytes'])), + base_t.t_bytes(getv(from_object, ['image_bytes'])), ) if getv(from_object, ['mime_type']) is not None: @@ -3394,7 +3395,7 @@ def _Video_to_vertex( setv( to_object, ['bytesBase64Encoded'], - t.t_bytes(getv(from_object, ['video_bytes'])), + base_t.t_bytes(getv(from_object, ['video_bytes'])), ) if getv(from_object, ['mime_type']) is not None: @@ -3921,7 +3922,7 @@ def _Image_from_mldev( setv( to_object, ['image_bytes'], - t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), + base_t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), ) if getv(from_object, ['mimeType']) is not None: @@ -4147,7 +4148,7 @@ def _Video_from_mldev( setv( to_object, ['video_bytes'], - t.t_bytes(getv(from_object, ['video', 'encodedVideo'])), + base_t.t_bytes(getv(from_object, ['video', 'encodedVideo'])), ) if getv(from_object, ['encoding']) is not None: @@ -4613,7 +4614,7 @@ def _Image_from_vertex( setv( to_object, ['image_bytes'], - t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), + base_t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), ) if getv(from_object, ['mimeType']) is not None: @@ -5023,7 +5024,7 @@ def _Video_from_vertex( setv( to_object, ['video_bytes'], - t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), + base_t.t_bytes(getv(from_object, ['bytesBase64Encoded'])), ) if getv(from_object, ['mimeType']) is not None: diff --git a/google/genai/tests/transformers/test_bytes.py b/google/genai/tests/transformers/test_bytes.py index 08bd9ab36..369452b57 100644 --- a/google/genai/tests/transformers/test_bytes.py +++ b/google/genai/tests/transformers/test_bytes.py @@ -2,7 +2,7 @@ import base64 -from ... import _transformers as t +from ... import _base_transformers as t _RAW_BYTES = ( b'\xfb\xf6\x9bq\xd7\x9f\x82\x18\xa3\x92Y\xa7\xa2\x9a\xab\xb2\xdb\xaf\xc3\x1c\xb3\x00\x10\x83\x10Q\x87' diff --git a/google/genai/types.py b/google/genai/types.py index 561205e84..73fce3a21 100644 --- a/google/genai/types.py +++ b/google/genai/types.py @@ -29,6 +29,11 @@ from pydantic import ConfigDict, Field, PrivateAttr, model_validator from typing_extensions import Self, TypedDict from . import _common +from ._operations_converters import ( + _GenerateVideosOperation_from_mldev, + _GenerateVideosOperation_from_vertex, +) + if sys.version_info >= (3, 10): # Supports both Union[t1, t2] and t1 | t2 @@ -8674,58 +8679,12 @@ def from_api_response( cls, api_response: Any, is_vertex_ai: bool = False ) -> Self: """Instantiates a GenerateVideosOperation from an API response.""" - new_operation = cls() - new_operation.name = api_response.get('name', None) - new_operation.metadata = api_response.get('metadata', None) - new_operation.done = api_response.get('done', None) - new_operation.error = api_response.get('error', None) - if is_vertex_ai: - if api_response.get('response', None) is not None: - new_operation.response = GenerateVideosResponse( - generated_videos=[ - GeneratedVideo( - video=Video( - uri=video.get('gcsUri', None), - video_bytes=video.get('bytesBase64Encoded', None), - mime_type=video.get('mimeType', None), - ) - ) - for video in api_response.get('response', {}).get('videos', []) - ], - rai_media_filtered_count=api_response.get('response', {}).get( - 'raiMediaFilteredCount', None - ), - rai_media_filtered_reasons=api_response.get('response', {}).get( - 'raiMediaFilteredReasons', None - ), - ) + response_dict = _GenerateVideosOperation_from_vertex(api_response) else: - if api_response.get('response', None) is not None: - new_operation.response = GenerateVideosResponse( - generated_videos=[ - GeneratedVideo( - video=Video( - uri=video.get('video', {}).get('uri', None), - video_bytes=video.get('video', {}).get( - 'encodedVideo', None - ), - mime_type=video.get('encoding', None), - ) - ) - for video in api_response.get('response', {}) - .get('generateVideoResponse', {}) - .get('generatedSamples', []) - ], - rai_media_filtered_count=api_response.get('response', {}) - .get('generateVideoResponse', {}) - .get('raiMediaFilteredCount', None), - rai_media_filtered_reasons=api_response.get('response', {}) - .get('generateVideoResponse', {}) - .get('raiMediaFilteredReasons', None), - ) - new_operation.result = new_operation.response - return new_operation + response_dict = _GenerateVideosOperation_from_mldev(api_response) + + return cls._from_response(response=response_dict, kwargs={}) class GetTuningJobConfig(_common.BaseModel):