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,241 @@
|
|
|
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
|
+
|
|
17
|
+
"""Test invoke_function_from_dict_args."""
|
|
18
|
+
|
|
19
|
+
from typing import Union
|
|
20
|
+
import pydantic
|
|
21
|
+
import pytest
|
|
22
|
+
import sys
|
|
23
|
+
from ... import errors
|
|
24
|
+
from ..._extra_utils import invoke_function_from_dict_args
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_builtin_primitive_types():
|
|
28
|
+
def func_under_test(x: int, y: float, z: str, w: bool):
|
|
29
|
+
return {
|
|
30
|
+
'x': x + 1,
|
|
31
|
+
'y': y + 1.0,
|
|
32
|
+
'z': z + '1.0',
|
|
33
|
+
'w': not w,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
original_args = {
|
|
37
|
+
'x': 1,
|
|
38
|
+
'y': 1.0,
|
|
39
|
+
'z': '1.0',
|
|
40
|
+
'w': True,
|
|
41
|
+
}
|
|
42
|
+
expected_response = {
|
|
43
|
+
'x': 2,
|
|
44
|
+
'y': 2.0,
|
|
45
|
+
'z': '1.01.0',
|
|
46
|
+
'w': False,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
actual_response = invoke_function_from_dict_args(
|
|
50
|
+
original_args, func_under_test
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
assert actual_response == expected_response
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@pytest.mark.skipif(
|
|
57
|
+
sys.version_info < (3, 10),
|
|
58
|
+
reason='| is only supported in Python 3.9 and above.',
|
|
59
|
+
)
|
|
60
|
+
def test_builtin_compound_types():
|
|
61
|
+
def func_under_test(x: list[int], y: dict[str, float]):
|
|
62
|
+
return {
|
|
63
|
+
'new_x': x + [3],
|
|
64
|
+
'new_y': y | {'key3': 3.0},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
original_args = {
|
|
68
|
+
'x': [1, 2],
|
|
69
|
+
'y': {'key1': 1.0, 'key2': 2.0},
|
|
70
|
+
}
|
|
71
|
+
expected_response = {
|
|
72
|
+
'new_x': [1, 2, 3],
|
|
73
|
+
'new_y': {'key1': 1.0, 'key2': 2.0, 'key3': 3.0},
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
actual_response = invoke_function_from_dict_args(
|
|
77
|
+
original_args, func_under_test
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
assert actual_response == expected_response
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_nested_pydantic_model():
|
|
84
|
+
class SimpleModel(pydantic.BaseModel):
|
|
85
|
+
key1_simple: int
|
|
86
|
+
key2_simple: float
|
|
87
|
+
|
|
88
|
+
class ComplexModel(pydantic.BaseModel):
|
|
89
|
+
key1_complex: SimpleModel
|
|
90
|
+
key2_complex: list[SimpleModel]
|
|
91
|
+
key3_complex: dict[str, SimpleModel]
|
|
92
|
+
|
|
93
|
+
def func_under_test(x: ComplexModel):
|
|
94
|
+
y = x.model_copy()
|
|
95
|
+
y.key1_complex.key1_simple += 1
|
|
96
|
+
y.key1_complex.key2_simple += 1.0
|
|
97
|
+
for simple_model in y.key2_complex:
|
|
98
|
+
simple_model.key1_simple += 1
|
|
99
|
+
simple_model.key2_simple += 1.0
|
|
100
|
+
for simple_model in y.key3_complex.values():
|
|
101
|
+
simple_model.key1_simple += 1
|
|
102
|
+
simple_model.key2_simple += 1.0
|
|
103
|
+
return y
|
|
104
|
+
|
|
105
|
+
original_args = {
|
|
106
|
+
'x': {
|
|
107
|
+
'key1_complex': {'key1_simple': 1, 'key2_simple': 1.0},
|
|
108
|
+
'key2_complex': [
|
|
109
|
+
{'key1_simple': 2, 'key2_simple': 2.0},
|
|
110
|
+
{'key1_simple': 3, 'key2_simple': 3.0},
|
|
111
|
+
],
|
|
112
|
+
'key3_complex': {
|
|
113
|
+
'key1_simple': {'key1_simple': 4, 'key2_simple': 4.0},
|
|
114
|
+
'key2_simple': {'key1_simple': 5, 'key2_simple': 5.0},
|
|
115
|
+
},
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
expected_response = {
|
|
119
|
+
'key1_complex': {'key1_simple': 2, 'key2_simple': 2.0},
|
|
120
|
+
'key2_complex': [
|
|
121
|
+
{'key1_simple': 3, 'key2_simple': 3.0},
|
|
122
|
+
{'key1_simple': 4, 'key2_simple': 4.0},
|
|
123
|
+
],
|
|
124
|
+
'key3_complex': {
|
|
125
|
+
'key1_simple': {'key1_simple': 5, 'key2_simple': 5.0},
|
|
126
|
+
'key2_simple': {'key1_simple': 6, 'key2_simple': 6.0},
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
actual_response = invoke_function_from_dict_args(
|
|
131
|
+
original_args, func_under_test
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
assert isinstance(actual_response, ComplexModel)
|
|
135
|
+
assert isinstance(actual_response.key1_complex, SimpleModel)
|
|
136
|
+
assert isinstance(actual_response.key2_complex[0], SimpleModel)
|
|
137
|
+
assert isinstance(actual_response.key2_complex[1], SimpleModel)
|
|
138
|
+
assert isinstance(actual_response.key3_complex['key1_simple'], SimpleModel)
|
|
139
|
+
assert isinstance(actual_response.key3_complex['key2_simple'], SimpleModel)
|
|
140
|
+
assert actual_response.model_dump() == expected_response
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def test_pydantic_model_in_list_union_type():
|
|
144
|
+
class SimpleModel(pydantic.BaseModel):
|
|
145
|
+
key1_simple: int
|
|
146
|
+
key2_simple: float
|
|
147
|
+
|
|
148
|
+
def func_under_test(x: list[Union[int, SimpleModel]]):
|
|
149
|
+
result = []
|
|
150
|
+
for item in x:
|
|
151
|
+
if isinstance(item, int):
|
|
152
|
+
result.append(item + 1)
|
|
153
|
+
elif isinstance(item, SimpleModel):
|
|
154
|
+
result.append(item.model_copy())
|
|
155
|
+
result[-1].key1_simple += 1
|
|
156
|
+
result[-1].key2_simple += 1.0
|
|
157
|
+
else:
|
|
158
|
+
raise ValueError('Unsupported type: %s' % type(item))
|
|
159
|
+
return result
|
|
160
|
+
|
|
161
|
+
expected_response = [2, {'key1_simple': 2, 'key2_simple': 2.0}]
|
|
162
|
+
original_args = {'x': [1, {'key1_simple': 1, 'key2_simple': 1.0}]}
|
|
163
|
+
actual_response = invoke_function_from_dict_args(
|
|
164
|
+
original_args, func_under_test
|
|
165
|
+
)
|
|
166
|
+
assert isinstance(actual_response, list)
|
|
167
|
+
assert len(actual_response) == 2
|
|
168
|
+
assert isinstance(actual_response[0], int)
|
|
169
|
+
assert isinstance(actual_response[1], SimpleModel)
|
|
170
|
+
assert actual_response[0] == expected_response[0]
|
|
171
|
+
assert actual_response[1].model_dump() == expected_response[1]
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def test_unknown_pydantic_model_argument():
|
|
175
|
+
class SimpleModel(pydantic.BaseModel):
|
|
176
|
+
key1_simple: int
|
|
177
|
+
key2_simple: float
|
|
178
|
+
|
|
179
|
+
def func_under_test(x: SimpleModel):
|
|
180
|
+
return x.model_copy()
|
|
181
|
+
|
|
182
|
+
original_args = {'x': {'key3_simple': 1, 'key2_simple': 1.0}}
|
|
183
|
+
|
|
184
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
185
|
+
invoke_function_from_dict_args(original_args, func_under_test)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def test_unknown_pydantic_model_argument_with_union_type():
|
|
189
|
+
class SimpleModel1(pydantic.BaseModel):
|
|
190
|
+
key1_simple: int
|
|
191
|
+
key2_simple: float
|
|
192
|
+
|
|
193
|
+
class SimpleModel2(pydantic.BaseModel):
|
|
194
|
+
key3_simple: str
|
|
195
|
+
key4_simple: float
|
|
196
|
+
|
|
197
|
+
def func_under_test(x: Union[SimpleModel1, SimpleModel2]):
|
|
198
|
+
return x.model_copy()
|
|
199
|
+
|
|
200
|
+
original_args = {'x': {'key5_simple': 1, 'key4_simple': 1.0}}
|
|
201
|
+
|
|
202
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
203
|
+
invoke_function_from_dict_args(original_args, func_under_test)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def test_unknown_pydantic_model_argument_with_union_type_and_builtin_type():
|
|
207
|
+
class SimpleModel1(pydantic.BaseModel):
|
|
208
|
+
key1_simple: int
|
|
209
|
+
key2_simple: float
|
|
210
|
+
|
|
211
|
+
def func_under_test(x: Union[SimpleModel1, int]):
|
|
212
|
+
return x.model_copy()
|
|
213
|
+
|
|
214
|
+
original_args = {'x': {'key5_simple': 1, 'key4_simple': 1.0}}
|
|
215
|
+
|
|
216
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
217
|
+
invoke_function_from_dict_args(original_args, func_under_test)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def test_incompatible_value_and_annotation():
|
|
221
|
+
def func_under_test(x: int):
|
|
222
|
+
return x + 1
|
|
223
|
+
|
|
224
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
225
|
+
invoke_function_from_dict_args({'x': {'k': 'v'}}, func_under_test)
|
|
226
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
227
|
+
invoke_function_from_dict_args({'x': 'a'}, func_under_test)
|
|
228
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
229
|
+
invoke_function_from_dict_args({'x': []}, func_under_test)
|
|
230
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
231
|
+
invoke_function_from_dict_args({'x': 1.0}, func_under_test)
|
|
232
|
+
with pytest.raises(errors.UnknownFunctionCallArgumentError):
|
|
233
|
+
invoke_function_from_dict_args({'x': {}}, func_under_test)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def test_function_invocation_error():
|
|
237
|
+
def func_under_test(x: int):
|
|
238
|
+
return x / 0
|
|
239
|
+
|
|
240
|
+
with pytest.raises(errors.FunctionInvocationError):
|
|
241
|
+
invoke_function_from_dict_args({'x': 1}, func_under_test)
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
|
|
17
|
+
"""Tests for raise_error_for_afc_incompatible_config."""
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
from ... import types
|
|
21
|
+
from ..._extra_utils import raise_error_for_afc_incompatible_config
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_config_is_none():
|
|
25
|
+
assert raise_error_for_afc_incompatible_config(None) is None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_tool_config_config_unset():
|
|
29
|
+
assert (
|
|
30
|
+
raise_error_for_afc_incompatible_config(types.GenerateContentConfig(
|
|
31
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
32
|
+
disable=False,
|
|
33
|
+
maximum_remote_calls=1,
|
|
34
|
+
),
|
|
35
|
+
))
|
|
36
|
+
is None
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_function_calling_config_unset():
|
|
41
|
+
assert (
|
|
42
|
+
raise_error_for_afc_incompatible_config(types.GenerateContentConfig(
|
|
43
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
44
|
+
disable=False,
|
|
45
|
+
maximum_remote_calls=1,
|
|
46
|
+
),
|
|
47
|
+
tool_config=types.ToolConfig(),
|
|
48
|
+
))
|
|
49
|
+
is None
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_compatible_config_afc_disabled():
|
|
55
|
+
assert (
|
|
56
|
+
raise_error_for_afc_incompatible_config(
|
|
57
|
+
types.GenerateContentConfig(
|
|
58
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
59
|
+
disable=True,
|
|
60
|
+
),
|
|
61
|
+
tool_config=types.ToolConfig(
|
|
62
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
63
|
+
stream_function_call_arguments=False,
|
|
64
|
+
),
|
|
65
|
+
),
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
is None
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_compatible_config_stream_function_call_arguments_unset_afc_unset():
|
|
73
|
+
assert (
|
|
74
|
+
raise_error_for_afc_incompatible_config(
|
|
75
|
+
types.GenerateContentConfig(
|
|
76
|
+
tool_config=types.ToolConfig(
|
|
77
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
78
|
+
),
|
|
79
|
+
),
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
is None
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_compatible_config_stream_function_call_arguments_unset_no_disable_afc():
|
|
87
|
+
assert (
|
|
88
|
+
raise_error_for_afc_incompatible_config(
|
|
89
|
+
types.GenerateContentConfig(
|
|
90
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
91
|
+
),
|
|
92
|
+
tool_config=types.ToolConfig(
|
|
93
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
94
|
+
),
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
is None
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def test_compatible_config_stream_function_call_arguments_unset_disable_afc_true():
|
|
103
|
+
assert (
|
|
104
|
+
raise_error_for_afc_incompatible_config(
|
|
105
|
+
types.GenerateContentConfig(
|
|
106
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
107
|
+
disable=True,
|
|
108
|
+
),
|
|
109
|
+
tool_config=types.ToolConfig(
|
|
110
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
111
|
+
),
|
|
112
|
+
),
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
is None
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_incompatible_config_stream_function_call_arguments_set_enable_afc():
|
|
120
|
+
with pytest.raises(ValueError):
|
|
121
|
+
raise_error_for_afc_incompatible_config(
|
|
122
|
+
types.GenerateContentConfig(
|
|
123
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
124
|
+
disable=False,
|
|
125
|
+
),
|
|
126
|
+
tool_config=types.ToolConfig(
|
|
127
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
128
|
+
stream_function_call_arguments=True,
|
|
129
|
+
),
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_incompatible_config_stream_function_call_arguments_set_no_afc_config():
|
|
136
|
+
with pytest.raises(ValueError):
|
|
137
|
+
raise_error_for_afc_incompatible_config(
|
|
138
|
+
types.GenerateContentConfig(
|
|
139
|
+
tool_config=types.ToolConfig(
|
|
140
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
141
|
+
stream_function_call_arguments=True,
|
|
142
|
+
),
|
|
143
|
+
),
|
|
144
|
+
)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def test_incompatible_config_stream_function_call_arguments_set_no_disable_afc():
|
|
149
|
+
with pytest.raises(ValueError):
|
|
150
|
+
raise_error_for_afc_incompatible_config(
|
|
151
|
+
types.GenerateContentConfig(
|
|
152
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(),
|
|
153
|
+
tool_config=types.ToolConfig(
|
|
154
|
+
function_calling_config=types.FunctionCallingConfig(
|
|
155
|
+
stream_function_call_arguments=True,
|
|
156
|
+
),
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
"""Tests for _extra_utils.should_append_afc_history."""
|
|
17
|
+
|
|
18
|
+
from ... import types
|
|
19
|
+
from ..._extra_utils import should_append_afc_history
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_should_append_afc_history_with_default_config():
|
|
23
|
+
config = types.GenerateContentConfig()
|
|
24
|
+
|
|
25
|
+
assert should_append_afc_history(config) == True
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_should_append_afc_history_with_empty_afc_config():
|
|
29
|
+
config = types.GenerateContentConfig(
|
|
30
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig()
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
assert should_append_afc_history(config) == True
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_should_append_afc_history_with_ignore_call_history_true():
|
|
37
|
+
config = types.GenerateContentConfig(
|
|
38
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
39
|
+
ignore_call_history=True
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
assert should_append_afc_history(config) == False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_should_append_afc_history_with_ignore_call_history_false():
|
|
47
|
+
config = types.GenerateContentConfig(
|
|
48
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
49
|
+
ignore_call_history=False
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
assert should_append_afc_history(config) == True
|
|
@@ -0,0 +1,214 @@
|
|
|
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
|
+
|
|
17
|
+
"""Tests for should_disable_afc."""
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
from ... import types
|
|
21
|
+
from ..._extra_utils import should_disable_afc
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_config_is_none():
|
|
25
|
+
assert should_disable_afc(None) is False
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_afc_config_unset():
|
|
29
|
+
assert should_disable_afc(types.GenerateContentConfig()) is False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_afc_enable_unset_max_0():
|
|
33
|
+
assert (
|
|
34
|
+
should_disable_afc(
|
|
35
|
+
types.GenerateContentConfig(
|
|
36
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
37
|
+
maximum_remote_calls=0,
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
is True
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_afc_enable_unset_max_negative():
|
|
46
|
+
assert (
|
|
47
|
+
should_disable_afc(
|
|
48
|
+
types.GenerateContentConfig(
|
|
49
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
50
|
+
maximum_remote_calls=-1,
|
|
51
|
+
),
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
is True
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_afc_enable_unset_max_0_0():
|
|
59
|
+
assert (
|
|
60
|
+
should_disable_afc(
|
|
61
|
+
{'automatic_function_calling': {'maximum_remote_calls': 0.0}}
|
|
62
|
+
)
|
|
63
|
+
is True
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_afc_enable_unset_max_1():
|
|
68
|
+
assert (
|
|
69
|
+
should_disable_afc(
|
|
70
|
+
types.GenerateContentConfig(
|
|
71
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
72
|
+
maximum_remote_calls=1,
|
|
73
|
+
),
|
|
74
|
+
)
|
|
75
|
+
)
|
|
76
|
+
is False
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_afc_enable_unset_max_1_0():
|
|
81
|
+
assert (
|
|
82
|
+
should_disable_afc(
|
|
83
|
+
{'automatic_function_calling': {'maximum_remote_calls': 1.0}}
|
|
84
|
+
)
|
|
85
|
+
is False
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_afc_enable_false_max_unset():
|
|
90
|
+
assert (
|
|
91
|
+
should_disable_afc(
|
|
92
|
+
types.GenerateContentConfig(
|
|
93
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
94
|
+
disable=True,
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
is True
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def test_afc_enable_false_max_0():
|
|
103
|
+
assert (
|
|
104
|
+
should_disable_afc(
|
|
105
|
+
types.GenerateContentConfig(
|
|
106
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
107
|
+
disable=True,
|
|
108
|
+
maximum_remote_calls=0,
|
|
109
|
+
),
|
|
110
|
+
)
|
|
111
|
+
)
|
|
112
|
+
is True
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def test_afc_enable_false_max_negative():
|
|
117
|
+
assert (
|
|
118
|
+
should_disable_afc(
|
|
119
|
+
types.GenerateContentConfig(
|
|
120
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
121
|
+
disable=True,
|
|
122
|
+
maximum_remote_calls=-1,
|
|
123
|
+
),
|
|
124
|
+
)
|
|
125
|
+
)
|
|
126
|
+
is True
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_afc_enable_false_max_0_0():
|
|
131
|
+
assert (
|
|
132
|
+
should_disable_afc(
|
|
133
|
+
{'automatic_function_calling': {'maximum_remote_calls': 0.0}}
|
|
134
|
+
)
|
|
135
|
+
is True
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_afc_enable_false_max_1():
|
|
140
|
+
assert (
|
|
141
|
+
should_disable_afc(
|
|
142
|
+
types.GenerateContentConfig(
|
|
143
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
144
|
+
disable=True,
|
|
145
|
+
maximum_remote_calls=1,
|
|
146
|
+
),
|
|
147
|
+
)
|
|
148
|
+
)
|
|
149
|
+
is True
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def test_afc_enable_true_max_unset():
|
|
154
|
+
assert (
|
|
155
|
+
should_disable_afc(
|
|
156
|
+
types.GenerateContentConfig(
|
|
157
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
158
|
+
disable=False,
|
|
159
|
+
),
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
is False
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def test_afc_enable_true_max_0():
|
|
167
|
+
assert (
|
|
168
|
+
should_disable_afc(
|
|
169
|
+
types.GenerateContentConfig(
|
|
170
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
171
|
+
disable=False,
|
|
172
|
+
maximum_remote_calls=0,
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
is True
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def test_afc_enable_true_max_negative():
|
|
181
|
+
assert (
|
|
182
|
+
should_disable_afc(
|
|
183
|
+
types.GenerateContentConfig(
|
|
184
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
185
|
+
disable=False,
|
|
186
|
+
maximum_remote_calls=-1,
|
|
187
|
+
),
|
|
188
|
+
)
|
|
189
|
+
)
|
|
190
|
+
is True
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def test_afc_enable_true_max_0_0():
|
|
195
|
+
assert (
|
|
196
|
+
should_disable_afc(
|
|
197
|
+
{'automatic_function_calling': {'maximum_remote_calls': 0.0}}
|
|
198
|
+
)
|
|
199
|
+
is True
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def test_afc_enable_true_max_1():
|
|
204
|
+
assert (
|
|
205
|
+
should_disable_afc(
|
|
206
|
+
types.GenerateContentConfig(
|
|
207
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
208
|
+
disable=False,
|
|
209
|
+
maximum_remote_calls=1,
|
|
210
|
+
),
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
is False
|
|
214
|
+
)
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
|
|
17
|
+
"""Tests for the Google GenAI SDK's batches module."""
|