google-genai 1.53.0__py3-none-any.whl → 1.55.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- google/genai/__init__.py +1 -0
- google/genai/_api_client.py +6 -6
- google/genai/_interactions/__init__.py +117 -0
- google/genai/_interactions/_base_client.py +2019 -0
- google/genai/_interactions/_client.py +511 -0
- google/genai/_interactions/_compat.py +234 -0
- google/genai/_interactions/_constants.py +29 -0
- google/genai/_interactions/_exceptions.py +122 -0
- google/genai/_interactions/_files.py +139 -0
- google/genai/_interactions/_models.py +873 -0
- google/genai/_interactions/_qs.py +165 -0
- google/genai/_interactions/_resource.py +58 -0
- google/genai/_interactions/_response.py +847 -0
- google/genai/_interactions/_streaming.py +354 -0
- google/genai/_interactions/_types.py +276 -0
- google/genai/_interactions/_utils/__init__.py +79 -0
- google/genai/_interactions/_utils/_compat.py +61 -0
- google/genai/_interactions/_utils/_datetime_parse.py +151 -0
- google/genai/_interactions/_utils/_logs.py +40 -0
- google/genai/_interactions/_utils/_proxy.py +80 -0
- google/genai/_interactions/_utils/_reflection.py +57 -0
- google/genai/_interactions/_utils/_resources_proxy.py +39 -0
- google/genai/_interactions/_utils/_streams.py +27 -0
- google/genai/_interactions/_utils/_sync.py +73 -0
- google/genai/_interactions/_utils/_transform.py +472 -0
- google/genai/_interactions/_utils/_typing.py +172 -0
- google/genai/_interactions/_utils/_utils.py +437 -0
- google/genai/_interactions/_version.py +18 -0
- google/genai/_interactions/resources/__init__.py +34 -0
- google/genai/_interactions/resources/interactions.py +1350 -0
- google/genai/_interactions/types/__init__.py +107 -0
- google/genai/_interactions/types/allowed_tools.py +33 -0
- google/genai/_interactions/types/allowed_tools_param.py +35 -0
- google/genai/_interactions/types/annotation.py +42 -0
- google/genai/_interactions/types/annotation_param.py +42 -0
- google/genai/_interactions/types/audio_content.py +38 -0
- google/genai/_interactions/types/audio_content_param.py +45 -0
- google/genai/_interactions/types/audio_mime_type.py +25 -0
- google/genai/_interactions/types/audio_mime_type_param.py +27 -0
- google/genai/_interactions/types/code_execution_call_arguments.py +33 -0
- google/genai/_interactions/types/code_execution_call_arguments_param.py +32 -0
- google/genai/_interactions/types/code_execution_call_content.py +37 -0
- google/genai/_interactions/types/code_execution_call_content_param.py +37 -0
- google/genai/_interactions/types/code_execution_result_content.py +42 -0
- google/genai/_interactions/types/code_execution_result_content_param.py +41 -0
- google/genai/_interactions/types/content_delta.py +358 -0
- google/genai/_interactions/types/content_start.py +79 -0
- google/genai/_interactions/types/content_stop.py +35 -0
- google/genai/_interactions/types/deep_research_agent_config.py +33 -0
- google/genai/_interactions/types/deep_research_agent_config_param.py +32 -0
- google/genai/_interactions/types/document_content.py +36 -0
- google/genai/_interactions/types/document_content_param.py +43 -0
- google/genai/_interactions/types/dynamic_agent_config.py +44 -0
- google/genai/_interactions/types/dynamic_agent_config_param.py +33 -0
- google/genai/_interactions/types/error_event.py +46 -0
- google/genai/_interactions/types/file_search_result_content.py +46 -0
- google/genai/_interactions/types/file_search_result_content_param.py +46 -0
- google/genai/_interactions/types/function.py +38 -0
- google/genai/_interactions/types/function_call_content.py +39 -0
- google/genai/_interactions/types/function_call_content_param.py +39 -0
- google/genai/_interactions/types/function_param.py +37 -0
- google/genai/_interactions/types/function_result_content.py +52 -0
- google/genai/_interactions/types/function_result_content_param.py +54 -0
- google/genai/_interactions/types/generation_config.py +57 -0
- google/genai/_interactions/types/generation_config_param.py +59 -0
- google/genai/_interactions/types/google_search_call_arguments.py +29 -0
- google/genai/_interactions/types/google_search_call_arguments_param.py +31 -0
- google/genai/_interactions/types/google_search_call_content.py +37 -0
- google/genai/_interactions/types/google_search_call_content_param.py +37 -0
- google/genai/_interactions/types/google_search_result.py +35 -0
- google/genai/_interactions/types/google_search_result_content.py +43 -0
- google/genai/_interactions/types/google_search_result_content_param.py +44 -0
- google/genai/_interactions/types/google_search_result_param.py +35 -0
- google/genai/_interactions/types/image_content.py +41 -0
- google/genai/_interactions/types/image_content_param.py +48 -0
- google/genai/_interactions/types/image_mime_type.py +23 -0
- google/genai/_interactions/types/image_mime_type_param.py +25 -0
- google/genai/_interactions/types/interaction.py +165 -0
- google/genai/_interactions/types/interaction_create_params.py +212 -0
- google/genai/_interactions/types/interaction_event.py +37 -0
- google/genai/_interactions/types/interaction_get_params.py +46 -0
- google/genai/_interactions/types/interaction_sse_event.py +32 -0
- google/genai/_interactions/types/interaction_status_update.py +37 -0
- google/genai/_interactions/types/mcp_server_tool_call_content.py +42 -0
- google/genai/_interactions/types/mcp_server_tool_call_content_param.py +42 -0
- google/genai/_interactions/types/mcp_server_tool_result_content.py +52 -0
- google/genai/_interactions/types/mcp_server_tool_result_content_param.py +54 -0
- google/genai/_interactions/types/model.py +36 -0
- google/genai/_interactions/types/model_param.py +38 -0
- google/genai/_interactions/types/speech_config.py +35 -0
- google/genai/_interactions/types/speech_config_param.py +35 -0
- google/genai/_interactions/types/text_content.py +37 -0
- google/genai/_interactions/types/text_content_param.py +38 -0
- google/genai/_interactions/types/thinking_level.py +22 -0
- google/genai/_interactions/types/thought_content.py +41 -0
- google/genai/_interactions/types/thought_content_param.py +47 -0
- google/genai/_interactions/types/tool.py +100 -0
- google/genai/_interactions/types/tool_choice.py +26 -0
- google/genai/_interactions/types/tool_choice_config.py +28 -0
- google/genai/_interactions/types/tool_choice_config_param.py +29 -0
- google/genai/_interactions/types/tool_choice_param.py +28 -0
- google/genai/_interactions/types/tool_choice_type.py +22 -0
- google/genai/_interactions/types/tool_param.py +97 -0
- google/genai/_interactions/types/turn.py +76 -0
- google/genai/_interactions/types/turn_param.py +73 -0
- google/genai/_interactions/types/url_context_call_arguments.py +29 -0
- google/genai/_interactions/types/url_context_call_arguments_param.py +31 -0
- google/genai/_interactions/types/url_context_call_content.py +37 -0
- google/genai/_interactions/types/url_context_call_content_param.py +37 -0
- google/genai/_interactions/types/url_context_result.py +33 -0
- google/genai/_interactions/types/url_context_result_content.py +43 -0
- google/genai/_interactions/types/url_context_result_content_param.py +44 -0
- google/genai/_interactions/types/url_context_result_param.py +32 -0
- google/genai/_interactions/types/usage.py +106 -0
- google/genai/_interactions/types/usage_param.py +106 -0
- google/genai/_interactions/types/video_content.py +41 -0
- google/genai/_interactions/types/video_content_param.py +48 -0
- google/genai/_interactions/types/video_mime_type.py +36 -0
- google/genai/_interactions/types/video_mime_type_param.py +38 -0
- google/genai/_live_converters.py +34 -3
- google/genai/_tokens_converters.py +5 -0
- google/genai/batches.py +62 -55
- google/genai/client.py +223 -0
- google/genai/errors.py +16 -1
- google/genai/file_search_stores.py +60 -60
- google/genai/files.py +56 -56
- google/genai/interactions.py +17 -0
- google/genai/live.py +4 -3
- google/genai/models.py +15 -3
- google/genai/tests/__init__.py +21 -0
- google/genai/tests/afc/__init__.py +21 -0
- google/genai/tests/afc/test_convert_if_exist_pydantic_model.py +309 -0
- google/genai/tests/afc/test_convert_number_values_for_function_call_args.py +63 -0
- google/genai/tests/afc/test_find_afc_incompatible_tool_indexes.py +240 -0
- google/genai/tests/afc/test_generate_content_stream_afc.py +530 -0
- google/genai/tests/afc/test_generate_content_stream_afc_thoughts.py +77 -0
- google/genai/tests/afc/test_get_function_map.py +176 -0
- google/genai/tests/afc/test_get_function_response_parts.py +277 -0
- google/genai/tests/afc/test_get_max_remote_calls_for_afc.py +130 -0
- google/genai/tests/afc/test_invoke_function_from_dict_args.py +241 -0
- google/genai/tests/afc/test_raise_error_for_afc_incompatible_config.py +159 -0
- google/genai/tests/afc/test_should_append_afc_history.py +53 -0
- google/genai/tests/afc/test_should_disable_afc.py +214 -0
- google/genai/tests/batches/__init__.py +17 -0
- google/genai/tests/batches/test_cancel.py +77 -0
- google/genai/tests/batches/test_create.py +78 -0
- google/genai/tests/batches/test_create_with_bigquery.py +113 -0
- google/genai/tests/batches/test_create_with_file.py +82 -0
- google/genai/tests/batches/test_create_with_gcs.py +125 -0
- google/genai/tests/batches/test_create_with_inlined_requests.py +255 -0
- google/genai/tests/batches/test_delete.py +86 -0
- google/genai/tests/batches/test_embedding.py +157 -0
- google/genai/tests/batches/test_get.py +78 -0
- google/genai/tests/batches/test_list.py +79 -0
- google/genai/tests/caches/__init__.py +17 -0
- google/genai/tests/caches/constants.py +29 -0
- google/genai/tests/caches/test_create.py +210 -0
- google/genai/tests/caches/test_create_custom_url.py +105 -0
- google/genai/tests/caches/test_delete.py +54 -0
- google/genai/tests/caches/test_delete_custom_url.py +52 -0
- google/genai/tests/caches/test_get.py +94 -0
- google/genai/tests/caches/test_get_custom_url.py +52 -0
- google/genai/tests/caches/test_list.py +68 -0
- google/genai/tests/caches/test_update.py +70 -0
- google/genai/tests/caches/test_update_custom_url.py +58 -0
- google/genai/tests/chats/__init__.py +1 -0
- google/genai/tests/chats/test_get_history.py +597 -0
- google/genai/tests/chats/test_send_message.py +844 -0
- google/genai/tests/chats/test_validate_response.py +90 -0
- google/genai/tests/client/__init__.py +17 -0
- google/genai/tests/client/test_async_stream.py +427 -0
- google/genai/tests/client/test_client_close.py +197 -0
- google/genai/tests/client/test_client_initialization.py +1687 -0
- google/genai/tests/client/test_client_requests.py +355 -0
- google/genai/tests/client/test_custom_client.py +77 -0
- google/genai/tests/client/test_http_options.py +178 -0
- google/genai/tests/client/test_replay_client_equality.py +168 -0
- google/genai/tests/client/test_retries.py +846 -0
- google/genai/tests/client/test_upload_errors.py +136 -0
- google/genai/tests/common/__init__.py +17 -0
- google/genai/tests/common/test_common.py +954 -0
- google/genai/tests/conftest.py +162 -0
- google/genai/tests/documents/__init__.py +17 -0
- google/genai/tests/documents/test_delete.py +51 -0
- google/genai/tests/documents/test_get.py +85 -0
- google/genai/tests/documents/test_list.py +72 -0
- google/genai/tests/errors/__init__.py +1 -0
- google/genai/tests/errors/test_api_error.py +417 -0
- google/genai/tests/file_search_stores/__init__.py +17 -0
- google/genai/tests/file_search_stores/test_create.py +66 -0
- google/genai/tests/file_search_stores/test_delete.py +64 -0
- google/genai/tests/file_search_stores/test_get.py +94 -0
- google/genai/tests/file_search_stores/test_import_file.py +112 -0
- google/genai/tests/file_search_stores/test_list.py +57 -0
- google/genai/tests/file_search_stores/test_upload_to_file_search_store.py +141 -0
- google/genai/tests/files/__init__.py +17 -0
- google/genai/tests/files/test_delete.py +46 -0
- google/genai/tests/files/test_download.py +85 -0
- google/genai/tests/files/test_get.py +46 -0
- google/genai/tests/files/test_list.py +72 -0
- google/genai/tests/files/test_upload.py +255 -0
- google/genai/tests/imports/test_no_optional_imports.py +28 -0
- google/genai/tests/interactions/__init__.py +0 -0
- google/genai/tests/interactions/test_integration.py +80 -0
- google/genai/tests/live/__init__.py +16 -0
- google/genai/tests/live/test_live.py +2177 -0
- google/genai/tests/live/test_live_music.py +362 -0
- google/genai/tests/live/test_live_response.py +163 -0
- google/genai/tests/live/test_send_client_content.py +147 -0
- google/genai/tests/live/test_send_realtime_input.py +268 -0
- google/genai/tests/live/test_send_tool_response.py +222 -0
- google/genai/tests/local_tokenizer/__init__.py +17 -0
- google/genai/tests/local_tokenizer/test_local_tokenizer.py +343 -0
- google/genai/tests/local_tokenizer/test_local_tokenizer_loader.py +235 -0
- google/genai/tests/mcp/__init__.py +17 -0
- google/genai/tests/mcp/test_has_mcp_tool_usage.py +89 -0
- google/genai/tests/mcp/test_mcp_to_gemini_tools.py +191 -0
- google/genai/tests/mcp/test_parse_config_for_mcp_sessions.py +201 -0
- google/genai/tests/mcp/test_parse_config_for_mcp_usage.py +130 -0
- google/genai/tests/mcp/test_set_mcp_usage_header.py +72 -0
- google/genai/tests/models/__init__.py +17 -0
- google/genai/tests/models/constants.py +8 -0
- google/genai/tests/models/test_compute_tokens.py +120 -0
- google/genai/tests/models/test_count_tokens.py +159 -0
- google/genai/tests/models/test_delete.py +107 -0
- google/genai/tests/models/test_edit_image.py +264 -0
- google/genai/tests/models/test_embed_content.py +94 -0
- google/genai/tests/models/test_function_call_streaming.py +442 -0
- google/genai/tests/models/test_generate_content.py +2502 -0
- google/genai/tests/models/test_generate_content_cached_content.py +132 -0
- google/genai/tests/models/test_generate_content_config_zero_value.py +103 -0
- google/genai/tests/models/test_generate_content_from_apikey.py +44 -0
- google/genai/tests/models/test_generate_content_http_options.py +40 -0
- google/genai/tests/models/test_generate_content_image_generation.py +143 -0
- google/genai/tests/models/test_generate_content_mcp.py +343 -0
- google/genai/tests/models/test_generate_content_media_resolution.py +97 -0
- google/genai/tests/models/test_generate_content_model.py +139 -0
- google/genai/tests/models/test_generate_content_part.py +821 -0
- google/genai/tests/models/test_generate_content_thought.py +76 -0
- google/genai/tests/models/test_generate_content_tools.py +1761 -0
- google/genai/tests/models/test_generate_images.py +191 -0
- google/genai/tests/models/test_generate_videos.py +759 -0
- google/genai/tests/models/test_get.py +104 -0
- google/genai/tests/models/test_list.py +233 -0
- google/genai/tests/models/test_recontext_image.py +189 -0
- google/genai/tests/models/test_segment_image.py +148 -0
- google/genai/tests/models/test_update.py +95 -0
- google/genai/tests/models/test_upscale_image.py +157 -0
- google/genai/tests/operations/__init__.py +17 -0
- google/genai/tests/operations/test_get.py +38 -0
- google/genai/tests/public_samples/__init__.py +17 -0
- google/genai/tests/public_samples/test_gemini_text_only.py +34 -0
- google/genai/tests/pytest_helper.py +229 -0
- google/genai/tests/shared/__init__.py +16 -0
- google/genai/tests/shared/batches/__init__.py +14 -0
- google/genai/tests/shared/batches/test_create_delete.py +57 -0
- google/genai/tests/shared/batches/test_create_get_cancel.py +56 -0
- google/genai/tests/shared/batches/test_list.py +40 -0
- google/genai/tests/shared/caches/__init__.py +14 -0
- google/genai/tests/shared/caches/test_create_get_delete.py +67 -0
- google/genai/tests/shared/caches/test_create_update_get.py +71 -0
- google/genai/tests/shared/caches/test_list.py +40 -0
- google/genai/tests/shared/chats/__init__.py +14 -0
- google/genai/tests/shared/chats/test_send_message.py +48 -0
- google/genai/tests/shared/chats/test_send_message_stream.py +50 -0
- google/genai/tests/shared/files/__init__.py +14 -0
- google/genai/tests/shared/files/test_list.py +41 -0
- google/genai/tests/shared/files/test_upload_get_delete.py +54 -0
- google/genai/tests/shared/models/__init__.py +14 -0
- google/genai/tests/shared/models/test_compute_tokens.py +41 -0
- google/genai/tests/shared/models/test_count_tokens.py +40 -0
- google/genai/tests/shared/models/test_edit_image.py +67 -0
- google/genai/tests/shared/models/test_embed.py +40 -0
- google/genai/tests/shared/models/test_generate_content.py +39 -0
- google/genai/tests/shared/models/test_generate_content_stream.py +54 -0
- google/genai/tests/shared/models/test_generate_images.py +40 -0
- google/genai/tests/shared/models/test_generate_videos.py +38 -0
- google/genai/tests/shared/models/test_list.py +37 -0
- google/genai/tests/shared/models/test_recontext_image.py +55 -0
- google/genai/tests/shared/models/test_segment_image.py +52 -0
- google/genai/tests/shared/models/test_upscale_image.py +52 -0
- google/genai/tests/shared/tunings/__init__.py +16 -0
- google/genai/tests/shared/tunings/test_create.py +46 -0
- google/genai/tests/shared/tunings/test_create_get_cancel.py +56 -0
- google/genai/tests/shared/tunings/test_list.py +39 -0
- google/genai/tests/tokens/__init__.py +16 -0
- google/genai/tests/tokens/test_create.py +154 -0
- google/genai/tests/transformers/__init__.py +17 -0
- google/genai/tests/transformers/test_blobs.py +71 -0
- google/genai/tests/transformers/test_bytes.py +15 -0
- google/genai/tests/transformers/test_duck_type.py +96 -0
- google/genai/tests/transformers/test_function_responses.py +72 -0
- google/genai/tests/transformers/test_schema.py +653 -0
- google/genai/tests/transformers/test_t_batch.py +286 -0
- google/genai/tests/transformers/test_t_content.py +160 -0
- google/genai/tests/transformers/test_t_contents.py +398 -0
- google/genai/tests/transformers/test_t_part.py +85 -0
- google/genai/tests/transformers/test_t_parts.py +87 -0
- google/genai/tests/transformers/test_t_tool.py +157 -0
- google/genai/tests/transformers/test_t_tools.py +195 -0
- google/genai/tests/tunings/__init__.py +16 -0
- google/genai/tests/tunings/test_cancel.py +39 -0
- google/genai/tests/tunings/test_end_to_end.py +106 -0
- google/genai/tests/tunings/test_get.py +67 -0
- google/genai/tests/tunings/test_list.py +75 -0
- google/genai/tests/tunings/test_tune.py +268 -0
- google/genai/tests/types/__init__.py +16 -0
- google/genai/tests/types/test_bytes_internal.py +271 -0
- google/genai/tests/types/test_bytes_type.py +152 -0
- google/genai/tests/types/test_future.py +101 -0
- google/genai/tests/types/test_optional_types.py +36 -0
- google/genai/tests/types/test_part_type.py +616 -0
- google/genai/tests/types/test_schema_from_json_schema.py +417 -0
- google/genai/tests/types/test_schema_json_schema.py +468 -0
- google/genai/tests/types/test_types.py +2903 -0
- google/genai/tunings.py +57 -57
- google/genai/types.py +229 -121
- google/genai/version.py +1 -1
- {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/METADATA +4 -2
- google_genai-1.55.0.dist-info/RECORD +345 -0
- google_genai-1.53.0.dist-info/RECORD +0 -41
- {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/WHEEL +0 -0
- {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/licenses/LICENSE +0 -0
- {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copyright 2025 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
17
|
+
|
|
18
|
+
from typing import Union
|
|
19
|
+
from typing_extensions import Literal, TypeAlias
|
|
20
|
+
|
|
21
|
+
__all__ = ["VideoMimeType"]
|
|
22
|
+
|
|
23
|
+
VideoMimeType: TypeAlias = Union[
|
|
24
|
+
Literal[
|
|
25
|
+
"video/mp4",
|
|
26
|
+
"video/mpeg",
|
|
27
|
+
"video/mov",
|
|
28
|
+
"video/avi",
|
|
29
|
+
"video/x-flv",
|
|
30
|
+
"video/mpg",
|
|
31
|
+
"video/webm",
|
|
32
|
+
"video/wmv",
|
|
33
|
+
"video/3gpp",
|
|
34
|
+
],
|
|
35
|
+
str,
|
|
36
|
+
]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Copyright 2025 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from typing import Union
|
|
21
|
+
from typing_extensions import Literal, TypeAlias
|
|
22
|
+
|
|
23
|
+
__all__ = ["VideoMimeTypeParam"]
|
|
24
|
+
|
|
25
|
+
VideoMimeTypeParam: TypeAlias = Union[
|
|
26
|
+
Literal[
|
|
27
|
+
"video/mp4",
|
|
28
|
+
"video/mpeg",
|
|
29
|
+
"video/mov",
|
|
30
|
+
"video/avi",
|
|
31
|
+
"video/x-flv",
|
|
32
|
+
"video/mpg",
|
|
33
|
+
"video/webm",
|
|
34
|
+
"video/wmv",
|
|
35
|
+
"video/3gpp",
|
|
36
|
+
],
|
|
37
|
+
str,
|
|
38
|
+
]
|
google/genai/_live_converters.py
CHANGED
|
@@ -534,6 +534,11 @@ def _LiveClientSetup_to_mldev(
|
|
|
534
534
|
if getv(from_object, ['proactivity']) is not None:
|
|
535
535
|
setv(to_object, ['proactivity'], getv(from_object, ['proactivity']))
|
|
536
536
|
|
|
537
|
+
if getv(from_object, ['explicit_vad_signal']) is not None:
|
|
538
|
+
raise ValueError(
|
|
539
|
+
'explicit_vad_signal parameter is not supported in Gemini API.'
|
|
540
|
+
)
|
|
541
|
+
|
|
537
542
|
return to_object
|
|
538
543
|
|
|
539
544
|
|
|
@@ -603,6 +608,13 @@ def _LiveClientSetup_to_vertex(
|
|
|
603
608
|
if getv(from_object, ['proactivity']) is not None:
|
|
604
609
|
setv(to_object, ['proactivity'], getv(from_object, ['proactivity']))
|
|
605
610
|
|
|
611
|
+
if getv(from_object, ['explicit_vad_signal']) is not None:
|
|
612
|
+
setv(
|
|
613
|
+
to_object,
|
|
614
|
+
['explicitVadSignal'],
|
|
615
|
+
getv(from_object, ['explicit_vad_signal']),
|
|
616
|
+
)
|
|
617
|
+
|
|
606
618
|
return to_object
|
|
607
619
|
|
|
608
620
|
|
|
@@ -753,6 +765,11 @@ def _LiveConnectConfig_to_mldev(
|
|
|
753
765
|
getv(from_object, ['proactivity']),
|
|
754
766
|
)
|
|
755
767
|
|
|
768
|
+
if getv(from_object, ['explicit_vad_signal']) is not None:
|
|
769
|
+
raise ValueError(
|
|
770
|
+
'explicit_vad_signal parameter is not supported in Gemini API.'
|
|
771
|
+
)
|
|
772
|
+
|
|
756
773
|
return to_object
|
|
757
774
|
|
|
758
775
|
|
|
@@ -904,6 +921,13 @@ def _LiveConnectConfig_to_vertex(
|
|
|
904
921
|
getv(from_object, ['proactivity']),
|
|
905
922
|
)
|
|
906
923
|
|
|
924
|
+
if getv(from_object, ['explicit_vad_signal']) is not None:
|
|
925
|
+
setv(
|
|
926
|
+
parent_object,
|
|
927
|
+
['setup', 'explicitVadSignal'],
|
|
928
|
+
getv(from_object, ['explicit_vad_signal']),
|
|
929
|
+
)
|
|
930
|
+
|
|
907
931
|
return to_object
|
|
908
932
|
|
|
909
933
|
|
|
@@ -1176,6 +1200,13 @@ def _LiveServerMessage_from_vertex(
|
|
|
1176
1200
|
getv(from_object, ['sessionResumptionUpdate']),
|
|
1177
1201
|
)
|
|
1178
1202
|
|
|
1203
|
+
if getv(from_object, ['voiceActivityDetectionSignal']) is not None:
|
|
1204
|
+
setv(
|
|
1205
|
+
to_object,
|
|
1206
|
+
['voice_activity_detection_signal'],
|
|
1207
|
+
getv(from_object, ['voiceActivityDetectionSignal']),
|
|
1208
|
+
)
|
|
1209
|
+
|
|
1179
1210
|
return to_object
|
|
1180
1211
|
|
|
1181
1212
|
|
|
@@ -1265,12 +1296,12 @@ def _SpeechConfig_to_vertex(
|
|
|
1265
1296
|
parent_object: Optional[dict[str, Any]] = None,
|
|
1266
1297
|
) -> dict[str, Any]:
|
|
1267
1298
|
to_object: dict[str, Any] = {}
|
|
1268
|
-
if getv(from_object, ['language_code']) is not None:
|
|
1269
|
-
setv(to_object, ['languageCode'], getv(from_object, ['language_code']))
|
|
1270
|
-
|
|
1271
1299
|
if getv(from_object, ['voice_config']) is not None:
|
|
1272
1300
|
setv(to_object, ['voiceConfig'], getv(from_object, ['voice_config']))
|
|
1273
1301
|
|
|
1302
|
+
if getv(from_object, ['language_code']) is not None:
|
|
1303
|
+
setv(to_object, ['languageCode'], getv(from_object, ['language_code']))
|
|
1304
|
+
|
|
1274
1305
|
if getv(from_object, ['multi_speaker_voice_config']) is not None:
|
|
1275
1306
|
raise ValueError(
|
|
1276
1307
|
'multi_speaker_voice_config parameter is not supported in Vertex AI.'
|
|
@@ -355,6 +355,11 @@ def _LiveConnectConfig_to_mldev(
|
|
|
355
355
|
getv(from_object, ['proactivity']),
|
|
356
356
|
)
|
|
357
357
|
|
|
358
|
+
if getv(from_object, ['explicit_vad_signal']) is not None:
|
|
359
|
+
raise ValueError(
|
|
360
|
+
'explicit_vad_signal parameter is not supported in Gemini API.'
|
|
361
|
+
)
|
|
362
|
+
|
|
358
363
|
return to_object
|
|
359
364
|
|
|
360
365
|
|
google/genai/batches.py
CHANGED
|
@@ -1006,6 +1006,13 @@ def _GenerateContentConfig_to_mldev(
|
|
|
1006
1006
|
_ImageConfig_to_mldev(getv(from_object, ['image_config']), to_object),
|
|
1007
1007
|
)
|
|
1008
1008
|
|
|
1009
|
+
if getv(from_object, ['enable_enhanced_civic_answers']) is not None:
|
|
1010
|
+
setv(
|
|
1011
|
+
to_object,
|
|
1012
|
+
['enableEnhancedCivicAnswers'],
|
|
1013
|
+
getv(from_object, ['enable_enhanced_civic_answers']),
|
|
1014
|
+
)
|
|
1015
|
+
|
|
1009
1016
|
return to_object
|
|
1010
1017
|
|
|
1011
1018
|
|
|
@@ -1902,34 +1909,6 @@ class Batches(_api_module.BaseModule):
|
|
|
1902
1909
|
self._api_client._verify_response(return_value)
|
|
1903
1910
|
return return_value
|
|
1904
1911
|
|
|
1905
|
-
def list(
|
|
1906
|
-
self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
|
|
1907
|
-
) -> Pager[types.BatchJob]:
|
|
1908
|
-
"""Lists batch jobs.
|
|
1909
|
-
|
|
1910
|
-
Args:
|
|
1911
|
-
config (ListBatchJobsConfig): Optional configuration for the list request.
|
|
1912
|
-
|
|
1913
|
-
Returns:
|
|
1914
|
-
A Pager object that contains one page of batch jobs. When iterating over
|
|
1915
|
-
the pager, it automatically fetches the next page if there are more.
|
|
1916
|
-
|
|
1917
|
-
Usage:
|
|
1918
|
-
|
|
1919
|
-
.. code-block:: python
|
|
1920
|
-
config = {'page_size': 10}
|
|
1921
|
-
for batch_job in client.batches.list(config):
|
|
1922
|
-
print(batch_job.name)
|
|
1923
|
-
"""
|
|
1924
|
-
|
|
1925
|
-
list_request = self._list
|
|
1926
|
-
return Pager(
|
|
1927
|
-
'batch_jobs',
|
|
1928
|
-
list_request,
|
|
1929
|
-
self._list(config=config),
|
|
1930
|
-
config,
|
|
1931
|
-
)
|
|
1932
|
-
|
|
1933
1912
|
def create(
|
|
1934
1913
|
self,
|
|
1935
1914
|
*,
|
|
@@ -2025,6 +2004,34 @@ class Batches(_api_module.BaseModule):
|
|
|
2025
2004
|
else:
|
|
2026
2005
|
return self._create_embeddings(model=model, src=src, config=config)
|
|
2027
2006
|
|
|
2007
|
+
def list(
|
|
2008
|
+
self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
|
|
2009
|
+
) -> Pager[types.BatchJob]:
|
|
2010
|
+
"""Lists batch jobs.
|
|
2011
|
+
|
|
2012
|
+
Args:
|
|
2013
|
+
config (ListBatchJobsConfig): Optional configuration for the list request.
|
|
2014
|
+
|
|
2015
|
+
Returns:
|
|
2016
|
+
A Pager object that contains one page of batch jobs. When iterating over
|
|
2017
|
+
the pager, it automatically fetches the next page if there are more.
|
|
2018
|
+
|
|
2019
|
+
Usage:
|
|
2020
|
+
|
|
2021
|
+
.. code-block:: python
|
|
2022
|
+
config = {'page_size': 10}
|
|
2023
|
+
for batch_job in client.batches.list(config):
|
|
2024
|
+
print(batch_job.name)
|
|
2025
|
+
"""
|
|
2026
|
+
|
|
2027
|
+
list_request = self._list
|
|
2028
|
+
return Pager(
|
|
2029
|
+
'batch_jobs',
|
|
2030
|
+
list_request,
|
|
2031
|
+
self._list(config=config),
|
|
2032
|
+
config,
|
|
2033
|
+
)
|
|
2034
|
+
|
|
2028
2035
|
|
|
2029
2036
|
class AsyncBatches(_api_module.BaseModule):
|
|
2030
2037
|
|
|
@@ -2451,33 +2458,6 @@ class AsyncBatches(_api_module.BaseModule):
|
|
|
2451
2458
|
self._api_client._verify_response(return_value)
|
|
2452
2459
|
return return_value
|
|
2453
2460
|
|
|
2454
|
-
async def list(
|
|
2455
|
-
self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
|
|
2456
|
-
) -> AsyncPager[types.BatchJob]:
|
|
2457
|
-
"""Lists batch jobs asynchronously.
|
|
2458
|
-
|
|
2459
|
-
Args:
|
|
2460
|
-
config (ListBatchJobsConfig): Optional configuration for the list request.
|
|
2461
|
-
|
|
2462
|
-
Returns:
|
|
2463
|
-
A Pager object that contains one page of batch jobs. When iterating over
|
|
2464
|
-
the pager, it automatically fetches the next page if there are more.
|
|
2465
|
-
|
|
2466
|
-
Usage:
|
|
2467
|
-
|
|
2468
|
-
.. code-block:: python
|
|
2469
|
-
async for batch_job in await client.aio.batches.list():
|
|
2470
|
-
print(batch_job.name)
|
|
2471
|
-
"""
|
|
2472
|
-
|
|
2473
|
-
list_request = self._list
|
|
2474
|
-
return AsyncPager(
|
|
2475
|
-
'batch_jobs',
|
|
2476
|
-
list_request,
|
|
2477
|
-
await self._list(config=config),
|
|
2478
|
-
config,
|
|
2479
|
-
)
|
|
2480
|
-
|
|
2481
2461
|
async def create(
|
|
2482
2462
|
self,
|
|
2483
2463
|
*,
|
|
@@ -2578,3 +2558,30 @@ class AsyncBatches(_api_module.BaseModule):
|
|
|
2578
2558
|
raise ValueError('Vertex AI does not support batches.create_embeddings.')
|
|
2579
2559
|
else:
|
|
2580
2560
|
return await self._create_embeddings(model=model, src=src, config=config)
|
|
2561
|
+
|
|
2562
|
+
async def list(
|
|
2563
|
+
self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
|
|
2564
|
+
) -> AsyncPager[types.BatchJob]:
|
|
2565
|
+
"""Lists batch jobs asynchronously.
|
|
2566
|
+
|
|
2567
|
+
Args:
|
|
2568
|
+
config (ListBatchJobsConfig): Optional configuration for the list request.
|
|
2569
|
+
|
|
2570
|
+
Returns:
|
|
2571
|
+
A Pager object that contains one page of batch jobs. When iterating over
|
|
2572
|
+
the pager, it automatically fetches the next page if there are more.
|
|
2573
|
+
|
|
2574
|
+
Usage:
|
|
2575
|
+
|
|
2576
|
+
.. code-block:: python
|
|
2577
|
+
async for batch_job in await client.aio.batches.list():
|
|
2578
|
+
print(batch_job.name)
|
|
2579
|
+
"""
|
|
2580
|
+
|
|
2581
|
+
list_request = self._list
|
|
2582
|
+
return AsyncPager(
|
|
2583
|
+
'batch_jobs',
|
|
2584
|
+
list_request,
|
|
2585
|
+
await self._list(config=config),
|
|
2586
|
+
config,
|
|
2587
|
+
)
|
google/genai/client.py
CHANGED
|
@@ -36,6 +36,20 @@ from .tokens import AsyncTokens, Tokens
|
|
|
36
36
|
from .tunings import AsyncTunings, Tunings
|
|
37
37
|
from .types import HttpOptions, HttpOptionsDict, HttpRetryOptions
|
|
38
38
|
|
|
39
|
+
import warnings
|
|
40
|
+
import httpx
|
|
41
|
+
|
|
42
|
+
from ._api_client import has_aiohttp
|
|
43
|
+
|
|
44
|
+
from . import _common
|
|
45
|
+
|
|
46
|
+
from ._interactions import AsyncGeminiNextGenAPIClient, DEFAULT_MAX_RETRIES, DefaultAioHttpClient, GeminiNextGenAPIClient
|
|
47
|
+
from ._interactions._models import FinalRequestOptions
|
|
48
|
+
from ._interactions._types import Headers
|
|
49
|
+
from ._interactions._utils import is_given
|
|
50
|
+
from ._interactions.resources import AsyncInteractionsResource as AsyncNextGenInteractionsResource, InteractionsResource as NextGenInteractionsResource
|
|
51
|
+
_interactions_experimental_warned = False
|
|
52
|
+
|
|
39
53
|
|
|
40
54
|
class AsyncClient:
|
|
41
55
|
"""Client for making asynchronous (non-blocking) requests."""
|
|
@@ -52,6 +66,113 @@ class AsyncClient:
|
|
|
52
66
|
self._live = AsyncLive(self._api_client)
|
|
53
67
|
self._tokens = AsyncTokens(self._api_client)
|
|
54
68
|
self._operations = AsyncOperations(self._api_client)
|
|
69
|
+
self._nextgen_client_instance: Optional[AsyncGeminiNextGenAPIClient] = None
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def _nextgen_client(self) -> AsyncGeminiNextGenAPIClient:
|
|
73
|
+
if self._nextgen_client_instance is not None:
|
|
74
|
+
return self._nextgen_client_instance
|
|
75
|
+
|
|
76
|
+
http_opts = self._api_client._http_options
|
|
77
|
+
|
|
78
|
+
if http_opts.extra_body:
|
|
79
|
+
warnings.warn(
|
|
80
|
+
'extra_body properties are not supported in `.interactions` yet',
|
|
81
|
+
category=UserWarning,
|
|
82
|
+
stacklevel=5,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
retry_opts = http_opts.retry_options
|
|
86
|
+
if retry_opts is not None and (
|
|
87
|
+
retry_opts.initial_delay is not None
|
|
88
|
+
or retry_opts.max_delay is not None
|
|
89
|
+
or retry_opts.exp_base is not None
|
|
90
|
+
or retry_opts.jitter is not None
|
|
91
|
+
or retry_opts.http_status_codes is not None
|
|
92
|
+
):
|
|
93
|
+
warnings.warn(
|
|
94
|
+
'Granular retry options are not supported in `.interactions` yet',
|
|
95
|
+
category=UserWarning,
|
|
96
|
+
stacklevel=5,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
http_client: httpx.AsyncClient = self._api_client._async_httpx_client
|
|
100
|
+
|
|
101
|
+
async_client_args = self._api_client._http_options.async_client_args or {}
|
|
102
|
+
has_custom_transport = 'transport' in async_client_args
|
|
103
|
+
|
|
104
|
+
if has_aiohttp and not has_custom_transport:
|
|
105
|
+
warnings.warn(
|
|
106
|
+
'Async interactions client cannot use aiohttp, fallingback to httpx.',
|
|
107
|
+
category=UserWarning,
|
|
108
|
+
stacklevel=5,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
if retry_opts is not None and retry_opts.attempts is not None:
|
|
112
|
+
max_retries = retry_opts.attempts
|
|
113
|
+
else:
|
|
114
|
+
max_retries = DEFAULT_MAX_RETRIES + 1
|
|
115
|
+
|
|
116
|
+
self._nextgen_client_instance = AsyncGeminiNextGenAPIClient(
|
|
117
|
+
base_url=http_opts.base_url,
|
|
118
|
+
api_key=self._api_client.api_key,
|
|
119
|
+
default_headers=http_opts.headers,
|
|
120
|
+
http_client=http_client,
|
|
121
|
+
# uSDk expects ms, nextgen uses a httpx Timeout -> expects seconds.
|
|
122
|
+
timeout=http_opts.timeout / 1000 if http_opts.timeout else None,
|
|
123
|
+
max_retries=max_retries,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
client = self._nextgen_client_instance
|
|
127
|
+
if self._api_client.vertexai:
|
|
128
|
+
client._is_vertex = True
|
|
129
|
+
client._vertex_project = self._api_client.project
|
|
130
|
+
client._vertex_location = self._api_client.location
|
|
131
|
+
|
|
132
|
+
async def prepare_options(options: FinalRequestOptions) -> FinalRequestOptions:
|
|
133
|
+
headers = {}
|
|
134
|
+
if is_given(options.headers):
|
|
135
|
+
headers = {**options.headers}
|
|
136
|
+
|
|
137
|
+
headers['Authorization'] = f'Bearer {await self._api_client._async_access_token()}'
|
|
138
|
+
if (
|
|
139
|
+
self._api_client._credentials
|
|
140
|
+
and self._api_client._credentials.quota_project_id
|
|
141
|
+
):
|
|
142
|
+
headers['x-goog-user-project'] = (
|
|
143
|
+
self._api_client._credentials.quota_project_id
|
|
144
|
+
)
|
|
145
|
+
options.headers = headers
|
|
146
|
+
|
|
147
|
+
return options
|
|
148
|
+
|
|
149
|
+
if self._api_client.project or self._api_client.location:
|
|
150
|
+
client._prepare_options = prepare_options # type: ignore[method-assign]
|
|
151
|
+
|
|
152
|
+
def validate_headers(headers: Headers, custom_headers: Headers) -> None:
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
client._validate_headers = validate_headers # type: ignore[method-assign]
|
|
156
|
+
return self._nextgen_client_instance
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def interactions(self) -> AsyncNextGenInteractionsResource:
|
|
160
|
+
global _interactions_experimental_warned
|
|
161
|
+
if not _interactions_experimental_warned:
|
|
162
|
+
_interactions_experimental_warned = True
|
|
163
|
+
warnings.warn(
|
|
164
|
+
'Interactions usage is experimental and may change in future versions.',
|
|
165
|
+
category=UserWarning,
|
|
166
|
+
stacklevel=1,
|
|
167
|
+
)
|
|
168
|
+
return self._nextgen_client.interactions
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def _has_nextgen_client(self) -> bool:
|
|
172
|
+
return (
|
|
173
|
+
hasattr(self, '_nextgen_client_instance') and
|
|
174
|
+
self._nextgen_client_instance is not None
|
|
175
|
+
)
|
|
55
176
|
|
|
56
177
|
@property
|
|
57
178
|
def models(self) -> AsyncModels:
|
|
@@ -120,6 +241,9 @@ class AsyncClient:
|
|
|
120
241
|
"""
|
|
121
242
|
await self._api_client.aclose()
|
|
122
243
|
|
|
244
|
+
if self._has_nextgen_client:
|
|
245
|
+
await self._nextgen_client.close()
|
|
246
|
+
|
|
123
247
|
async def __aenter__(self) -> 'AsyncClient':
|
|
124
248
|
return self
|
|
125
249
|
|
|
@@ -287,6 +411,7 @@ class Client:
|
|
|
287
411
|
self._files = Files(self._api_client)
|
|
288
412
|
self._tokens = Tokens(self._api_client)
|
|
289
413
|
self._operations = Operations(self._api_client)
|
|
414
|
+
self._nextgen_client_instance: Optional[GeminiNextGenAPIClient] = None
|
|
290
415
|
|
|
291
416
|
@staticmethod
|
|
292
417
|
def _get_api_client(
|
|
@@ -324,6 +449,101 @@ class Client:
|
|
|
324
449
|
http_options=http_options,
|
|
325
450
|
)
|
|
326
451
|
|
|
452
|
+
@property
|
|
453
|
+
def _nextgen_client(self) -> GeminiNextGenAPIClient:
|
|
454
|
+
if self._nextgen_client_instance is not None:
|
|
455
|
+
return self._nextgen_client_instance
|
|
456
|
+
|
|
457
|
+
http_opts = self._api_client._http_options
|
|
458
|
+
|
|
459
|
+
if http_opts.extra_body:
|
|
460
|
+
warnings.warn(
|
|
461
|
+
'extra_body properties are not supported in `.interactions` yet',
|
|
462
|
+
category=UserWarning,
|
|
463
|
+
stacklevel=5,
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
retry_opts = http_opts.retry_options
|
|
467
|
+
if retry_opts is not None and (
|
|
468
|
+
retry_opts.initial_delay is not None
|
|
469
|
+
or retry_opts.max_delay is not None
|
|
470
|
+
or retry_opts.exp_base is not None
|
|
471
|
+
or retry_opts.jitter is not None
|
|
472
|
+
or retry_opts.http_status_codes is not None
|
|
473
|
+
):
|
|
474
|
+
warnings.warn(
|
|
475
|
+
'Granular retry options are not supported in `.interactions` yet',
|
|
476
|
+
category=UserWarning,
|
|
477
|
+
stacklevel=5,
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
if retry_opts is not None and retry_opts.attempts is not None:
|
|
481
|
+
max_retries = retry_opts.attempts
|
|
482
|
+
else:
|
|
483
|
+
max_retries = DEFAULT_MAX_RETRIES + 1
|
|
484
|
+
|
|
485
|
+
self._nextgen_client_instance = GeminiNextGenAPIClient(
|
|
486
|
+
base_url=http_opts.base_url,
|
|
487
|
+
api_key=self._api_client.api_key,
|
|
488
|
+
default_headers=http_opts.headers,
|
|
489
|
+
http_client=self._api_client._httpx_client,
|
|
490
|
+
# uSDk expects ms, nextgen uses a httpx Timeout -> expects seconds.
|
|
491
|
+
timeout=http_opts.timeout / 1000 if http_opts.timeout else None,
|
|
492
|
+
max_retries=max_retries,
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
client = self._nextgen_client_instance
|
|
496
|
+
if self.vertexai:
|
|
497
|
+
client._is_vertex = True
|
|
498
|
+
client._vertex_project = self._api_client.project
|
|
499
|
+
client._vertex_location = self._api_client.location
|
|
500
|
+
|
|
501
|
+
def prepare_options(options: FinalRequestOptions) -> FinalRequestOptions:
|
|
502
|
+
headers = {}
|
|
503
|
+
if is_given(options.headers):
|
|
504
|
+
headers = {**options.headers}
|
|
505
|
+
options.headers = headers
|
|
506
|
+
|
|
507
|
+
headers['Authorization'] = f'Bearer {self._api_client._access_token()}'
|
|
508
|
+
if (
|
|
509
|
+
self._api_client._credentials
|
|
510
|
+
and self._api_client._credentials.quota_project_id
|
|
511
|
+
):
|
|
512
|
+
headers['x-goog-user-project'] = (
|
|
513
|
+
self._api_client._credentials.quota_project_id
|
|
514
|
+
)
|
|
515
|
+
|
|
516
|
+
return options
|
|
517
|
+
|
|
518
|
+
if self._api_client.project or self._api_client.location:
|
|
519
|
+
client._prepare_options = prepare_options # type: ignore[method-assign]
|
|
520
|
+
|
|
521
|
+
def validate_headers(headers: Headers, custom_headers: Headers) -> None:
|
|
522
|
+
return
|
|
523
|
+
|
|
524
|
+
client._validate_headers = validate_headers # type: ignore[method-assign]
|
|
525
|
+
|
|
526
|
+
return self._nextgen_client_instance
|
|
527
|
+
|
|
528
|
+
@property
|
|
529
|
+
def interactions(self) -> NextGenInteractionsResource:
|
|
530
|
+
global _interactions_experimental_warned
|
|
531
|
+
if not _interactions_experimental_warned:
|
|
532
|
+
_interactions_experimental_warned = True
|
|
533
|
+
warnings.warn(
|
|
534
|
+
'Interactions usage is experimental and may change in future versions.',
|
|
535
|
+
category=UserWarning,
|
|
536
|
+
stacklevel=2,
|
|
537
|
+
)
|
|
538
|
+
return self._nextgen_client.interactions
|
|
539
|
+
|
|
540
|
+
@property
|
|
541
|
+
def _has_nextgen_client(self) -> bool:
|
|
542
|
+
return (
|
|
543
|
+
hasattr(self, '_nextgen_client_instance') and
|
|
544
|
+
self._nextgen_client_instance is not None
|
|
545
|
+
)
|
|
546
|
+
|
|
327
547
|
@property
|
|
328
548
|
def chats(self) -> Chats:
|
|
329
549
|
return Chats(modules=self.models)
|
|
@@ -396,6 +616,9 @@ class Client:
|
|
|
396
616
|
"""
|
|
397
617
|
self._api_client.close()
|
|
398
618
|
|
|
619
|
+
if self._has_nextgen_client:
|
|
620
|
+
self._nextgen_client.close()
|
|
621
|
+
|
|
399
622
|
def __enter__(self) -> 'Client':
|
|
400
623
|
return self
|
|
401
624
|
|
google/genai/errors.py
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
"""Error classes for the GenAI SDK."""
|
|
17
17
|
|
|
18
|
-
from typing import Any, Optional, TYPE_CHECKING, Union
|
|
18
|
+
from typing import Any, Callable, Optional, TYPE_CHECKING, Union
|
|
19
19
|
import httpx
|
|
20
20
|
import json
|
|
21
21
|
from . import _common
|
|
@@ -53,6 +53,21 @@ class APIError(Exception):
|
|
|
53
53
|
|
|
54
54
|
super().__init__(f'{self.code} {self.status}. {self.details}')
|
|
55
55
|
|
|
56
|
+
def __reduce__(
|
|
57
|
+
self,
|
|
58
|
+
) -> tuple[Callable[..., 'APIError'], tuple[dict[str, Any]]]:
|
|
59
|
+
"""Returns a tuple that can be used to reconstruct the error for pickling."""
|
|
60
|
+
state = self.__dict__.copy()
|
|
61
|
+
return (self.__class__._rebuild, (state,))
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def _rebuild(state: dict[str, Any]) -> 'APIError':
|
|
65
|
+
"""Rebuilds the error from the state."""
|
|
66
|
+
obj = APIError.__new__(APIError)
|
|
67
|
+
obj.__dict__.update(state)
|
|
68
|
+
Exception.__init__(obj, f'{obj.code} {obj.status}. {obj.details}')
|
|
69
|
+
return obj
|
|
70
|
+
|
|
56
71
|
def _get_status(self, response_json: Any) -> Any:
|
|
57
72
|
return response_json.get(
|
|
58
73
|
'status', response_json.get('error', {}).get('status', None)
|