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,94 @@
|
|
|
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
|
+
# pylint: disable=protected-access
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
"""Tests for models.embedContent()."""
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from ... import _transformers as t
|
|
23
|
+
from ... import types
|
|
24
|
+
from .. import pytest_helper
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
test_table: list[pytest_helper.TestTableItem] = [
|
|
28
|
+
pytest_helper.TestTableItem(
|
|
29
|
+
name='test_single_text',
|
|
30
|
+
parameters=types._EmbedContentParameters(
|
|
31
|
+
model='text-embedding-004',
|
|
32
|
+
contents=t.t_contents('What is your name?'),
|
|
33
|
+
),
|
|
34
|
+
),
|
|
35
|
+
pytest_helper.TestTableItem(
|
|
36
|
+
name='test_multi_texts_with_config',
|
|
37
|
+
parameters=types._EmbedContentParameters(
|
|
38
|
+
model='text-embedding-004',
|
|
39
|
+
contents=[
|
|
40
|
+
t.t_content('What is your name?'),
|
|
41
|
+
t.t_content('I am a model.'),
|
|
42
|
+
],
|
|
43
|
+
config={
|
|
44
|
+
'output_dimensionality': 10,
|
|
45
|
+
'title': 'test_title',
|
|
46
|
+
'task_type': 'RETRIEVAL_DOCUMENT',
|
|
47
|
+
'http_options': {
|
|
48
|
+
'headers': {'test': 'headers'},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
),
|
|
52
|
+
),
|
|
53
|
+
pytest_helper.TestTableItem(
|
|
54
|
+
name='test_single_text_with_mime_type_not_supported_in_mldev',
|
|
55
|
+
parameters=types._EmbedContentParameters(
|
|
56
|
+
model='text-embedding-004',
|
|
57
|
+
contents=t.t_contents('What is your name?'),
|
|
58
|
+
config={
|
|
59
|
+
'output_dimensionality': 10,
|
|
60
|
+
'mime_type': 'text/plain',
|
|
61
|
+
},
|
|
62
|
+
),
|
|
63
|
+
exception_if_mldev='parameter is not supported',
|
|
64
|
+
),
|
|
65
|
+
pytest_helper.TestTableItem(
|
|
66
|
+
name='test_single_text_with_auto_truncate_not_supported_in_mldev',
|
|
67
|
+
parameters=types._EmbedContentParameters(
|
|
68
|
+
model='text-embedding-004',
|
|
69
|
+
contents=t.t_contents('What is your name?'),
|
|
70
|
+
config={
|
|
71
|
+
'output_dimensionality': 10,
|
|
72
|
+
'auto_truncate': True,
|
|
73
|
+
},
|
|
74
|
+
),
|
|
75
|
+
exception_if_mldev='parameter is not supported',
|
|
76
|
+
),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
pytestmark = pytest_helper.setup(
|
|
80
|
+
file=__file__,
|
|
81
|
+
globals_for_file=globals(),
|
|
82
|
+
test_method='models.embed_content',
|
|
83
|
+
test_table=test_table,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@pytest.mark.asyncio
|
|
88
|
+
async def test_async(client):
|
|
89
|
+
response = await client.aio.models.embed_content(
|
|
90
|
+
model='text-embedding-004',
|
|
91
|
+
contents='What is your name?',
|
|
92
|
+
config={'output_dimensionality': 10},
|
|
93
|
+
)
|
|
94
|
+
assert response
|
|
@@ -0,0 +1,442 @@
|
|
|
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 models.generate_content_stream() with stream_function_call_arguments enabled."""
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
from ... import types
|
|
20
|
+
from unittest import mock
|
|
21
|
+
from .. import pytest_helper
|
|
22
|
+
from . import test_generate_content_tools
|
|
23
|
+
|
|
24
|
+
json_function_declarations = [{
|
|
25
|
+
'name': 'get_current_weather',
|
|
26
|
+
'description': 'Get the current weather in a city',
|
|
27
|
+
'parameters_json_schema': {
|
|
28
|
+
'type': 'object',
|
|
29
|
+
'properties': {
|
|
30
|
+
'location': {
|
|
31
|
+
'type': 'string',
|
|
32
|
+
'description': 'The location to get the weather for',
|
|
33
|
+
},
|
|
34
|
+
'country': {
|
|
35
|
+
'anyOf': [
|
|
36
|
+
{
|
|
37
|
+
'type': 'string',
|
|
38
|
+
'description': 'The country to get the weather for',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
'type': 'null',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
'description': 'The country to get the weather for',
|
|
45
|
+
},
|
|
46
|
+
'unit': {
|
|
47
|
+
'type': 'string',
|
|
48
|
+
'enum': ['C', 'F'],
|
|
49
|
+
},
|
|
50
|
+
'purpose': {
|
|
51
|
+
'type': 'string',
|
|
52
|
+
'description': 'Discribes the purpose of asking the weather',
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
'required': ['location', 'unit', 'country'],
|
|
56
|
+
},
|
|
57
|
+
}]
|
|
58
|
+
|
|
59
|
+
gemini_function_declarations = [{
|
|
60
|
+
'name': 'get_current_weather',
|
|
61
|
+
'description': 'Get the current weather in a city',
|
|
62
|
+
'parameters': {
|
|
63
|
+
'type': 'OBJECT',
|
|
64
|
+
'properties': {
|
|
65
|
+
'location': {
|
|
66
|
+
'type': 'STRING',
|
|
67
|
+
'description': 'The location to get the weather for',
|
|
68
|
+
},
|
|
69
|
+
'country': {
|
|
70
|
+
'type': 'STRING',
|
|
71
|
+
'description': 'The country to get the weather for',
|
|
72
|
+
'nullable': True,
|
|
73
|
+
},
|
|
74
|
+
'unit': {
|
|
75
|
+
'type': 'STRING',
|
|
76
|
+
'enum': ['C', 'F'],
|
|
77
|
+
'description': 'The unit to return the weather in',
|
|
78
|
+
},
|
|
79
|
+
'purpose': {
|
|
80
|
+
'type': 'STRING',
|
|
81
|
+
'description': 'Discribes the purpose of asking the weather',
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
'required': ['location', 'unit', 'country'],
|
|
85
|
+
},
|
|
86
|
+
}]
|
|
87
|
+
|
|
88
|
+
generate_content_prompt = [
|
|
89
|
+
types.Content(
|
|
90
|
+
role='user',
|
|
91
|
+
parts=[
|
|
92
|
+
types.Part(
|
|
93
|
+
text=(
|
|
94
|
+
'get the current weather in boston in celsius, the'
|
|
95
|
+
' country should be US, the purpose is to know'
|
|
96
|
+
' what to wear today?'
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
],
|
|
100
|
+
),
|
|
101
|
+
]
|
|
102
|
+
previous_generate_content_history = [
|
|
103
|
+
types.Content(
|
|
104
|
+
role='user',
|
|
105
|
+
parts=[
|
|
106
|
+
types.Part(
|
|
107
|
+
text=(
|
|
108
|
+
' get the current weather in boston in celsius, the country'
|
|
109
|
+
' is U.S., the purpose is to'
|
|
110
|
+
' know what to wear today.'
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
],
|
|
114
|
+
),
|
|
115
|
+
types.Content(
|
|
116
|
+
role='model',
|
|
117
|
+
parts=[
|
|
118
|
+
types.Part(
|
|
119
|
+
function_call=types.FunctionCall(
|
|
120
|
+
name='get_current_weather',
|
|
121
|
+
will_continue=True,
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
],
|
|
125
|
+
),
|
|
126
|
+
types.Content(
|
|
127
|
+
role='model',
|
|
128
|
+
parts=[
|
|
129
|
+
types.Part(
|
|
130
|
+
function_call=types.FunctionCall(
|
|
131
|
+
name='get_current_weather',
|
|
132
|
+
partial_args=[
|
|
133
|
+
types.PartialArg(
|
|
134
|
+
json_path='$.country',
|
|
135
|
+
null_value="NULL_VALUE",
|
|
136
|
+
)
|
|
137
|
+
],
|
|
138
|
+
will_continue=False,
|
|
139
|
+
)
|
|
140
|
+
)
|
|
141
|
+
],
|
|
142
|
+
)
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
pytestmark = pytest_helper.setup(
|
|
146
|
+
file=__file__,
|
|
147
|
+
globals_for_file=globals(),
|
|
148
|
+
test_method='models.generate_content_stream',
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
def test_streaming_with_python_native_no_afc_config(client):
|
|
152
|
+
"""Tests streaming function calls with native python AFC without disabling AFC."""
|
|
153
|
+
if not client.vertexai:
|
|
154
|
+
return
|
|
155
|
+
with pytest.raises(ValueError) as e:
|
|
156
|
+
for chunk in client.models.generate_content_stream(
|
|
157
|
+
model='gemini-2.5-pro',
|
|
158
|
+
contents=generate_content_prompt,
|
|
159
|
+
config=types.GenerateContentConfig(
|
|
160
|
+
tools=[
|
|
161
|
+
test_generate_content_tools.get_weather,
|
|
162
|
+
test_generate_content_tools.get_stock_price,
|
|
163
|
+
],
|
|
164
|
+
tool_config=types.ToolConfig(
|
|
165
|
+
function_calling_config={
|
|
166
|
+
'stream_function_call_arguments': True,
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
),
|
|
170
|
+
):
|
|
171
|
+
pass
|
|
172
|
+
|
|
173
|
+
assert 'not compatible with automatic function calling (AFC)' in str(e.value)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def test_streaming_with_python_afc_disabled_false(client):
|
|
177
|
+
"""Tests streaming function calls with native python AFC without disabling AFC."""
|
|
178
|
+
if not client.vertexai:
|
|
179
|
+
return
|
|
180
|
+
with pytest.raises(ValueError) as e:
|
|
181
|
+
for chunk in client.models.generate_content_stream(
|
|
182
|
+
model='gemini-2.5-pro',
|
|
183
|
+
contents='What is the price of GOOG? And what is the weather in Boston?',
|
|
184
|
+
config=types.GenerateContentConfig(
|
|
185
|
+
tools=[
|
|
186
|
+
test_generate_content_tools.get_weather,
|
|
187
|
+
test_generate_content_tools.get_stock_price,
|
|
188
|
+
],
|
|
189
|
+
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
|
190
|
+
disable=False,
|
|
191
|
+
),
|
|
192
|
+
tool_config=types.ToolConfig(
|
|
193
|
+
function_calling_config={
|
|
194
|
+
'stream_function_call_arguments': True,
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
),
|
|
198
|
+
):
|
|
199
|
+
pass
|
|
200
|
+
assert 'not compatible with automatic function calling (AFC)' in str(e.value)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def test_streaming_with_json_parameters_without_history(client):
|
|
204
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
205
|
+
|
|
206
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
207
|
+
for chunk in client.models.generate_content_stream(
|
|
208
|
+
model='gemini-2.5-pro',
|
|
209
|
+
contents=generate_content_prompt,
|
|
210
|
+
config=types.GenerateContentConfig(
|
|
211
|
+
tools=[{'function_declarations': json_function_declarations}],
|
|
212
|
+
tool_config=types.ToolConfig(
|
|
213
|
+
function_calling_config={
|
|
214
|
+
'stream_function_call_arguments': True,
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
),
|
|
218
|
+
):
|
|
219
|
+
assert chunk is not None
|
|
220
|
+
assert chunk.candidates is not None
|
|
221
|
+
assert chunk.candidates[0].content is not None
|
|
222
|
+
assert chunk.candidates[0].content.parts is not None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def test_streaming_with_json_parameters_with_history(client):
|
|
226
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
227
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
228
|
+
for chunk in client.models.generate_content_stream(
|
|
229
|
+
model='gemini-2.5-pro',
|
|
230
|
+
contents=previous_generate_content_history,
|
|
231
|
+
config=types.GenerateContentConfig(
|
|
232
|
+
tools=[{'function_declarations': json_function_declarations}],
|
|
233
|
+
tool_config=types.ToolConfig(
|
|
234
|
+
function_calling_config={
|
|
235
|
+
'stream_function_call_arguments': True,
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
),
|
|
239
|
+
):
|
|
240
|
+
assert chunk is not None
|
|
241
|
+
assert chunk.candidates is not None
|
|
242
|
+
assert chunk.candidates[0].content is not None
|
|
243
|
+
assert chunk.candidates[0].content.parts is not None
|
|
244
|
+
|
|
245
|
+
@pytest.mark.asyncio
|
|
246
|
+
async def test_streaming_with_json_parameters_async(client):
|
|
247
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
248
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
249
|
+
async for chunk in await client.aio.models.generate_content_stream(
|
|
250
|
+
model='gemini-2.5-pro',
|
|
251
|
+
contents=generate_content_prompt,
|
|
252
|
+
config=types.GenerateContentConfig(
|
|
253
|
+
tools=[{'function_declarations': json_function_declarations}],
|
|
254
|
+
tool_config=types.ToolConfig(
|
|
255
|
+
function_calling_config={
|
|
256
|
+
'stream_function_call_arguments': True,
|
|
257
|
+
}
|
|
258
|
+
),
|
|
259
|
+
),
|
|
260
|
+
):
|
|
261
|
+
assert chunk is not None
|
|
262
|
+
assert chunk.candidates is not None
|
|
263
|
+
assert chunk.candidates[0].content is not None
|
|
264
|
+
assert chunk.candidates[0].content.parts is not None
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def test_streaming_with_gemini_parameters_without_history(client):
|
|
268
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
269
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
270
|
+
for chunk in client.models.generate_content_stream(
|
|
271
|
+
model='gemini-2.5-pro',
|
|
272
|
+
contents=generate_content_prompt,
|
|
273
|
+
config=types.GenerateContentConfig(
|
|
274
|
+
tools=[{
|
|
275
|
+
'function_declarations': gemini_function_declarations
|
|
276
|
+
}],
|
|
277
|
+
tool_config=types.ToolConfig(
|
|
278
|
+
function_calling_config={
|
|
279
|
+
'stream_function_call_arguments': True,
|
|
280
|
+
}
|
|
281
|
+
),
|
|
282
|
+
),
|
|
283
|
+
):
|
|
284
|
+
assert chunk is not None
|
|
285
|
+
assert chunk.candidates is not None
|
|
286
|
+
assert chunk.candidates[0].content is not None
|
|
287
|
+
assert chunk.candidates[0].content.parts is not None
|
|
288
|
+
|
|
289
|
+
def test_streaming_with_gemini_parameters_with_response(client):
|
|
290
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
291
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
292
|
+
streaming_function_call_content = []
|
|
293
|
+
for chunk in client.models.generate_content_stream(
|
|
294
|
+
model='gemini-2.5-pro',
|
|
295
|
+
contents=[
|
|
296
|
+
types.Content(
|
|
297
|
+
role='user',
|
|
298
|
+
parts=[
|
|
299
|
+
types.Part(
|
|
300
|
+
text=(
|
|
301
|
+
'get the current weather in boston in celsius, the'
|
|
302
|
+
' country should be US, the purpose is to know'
|
|
303
|
+
' what to wear today?'
|
|
304
|
+
)
|
|
305
|
+
)
|
|
306
|
+
],
|
|
307
|
+
),
|
|
308
|
+
],
|
|
309
|
+
config=types.GenerateContentConfig(
|
|
310
|
+
tools=[{
|
|
311
|
+
'function_declarations': gemini_function_declarations
|
|
312
|
+
}],
|
|
313
|
+
tool_config=types.ToolConfig(
|
|
314
|
+
function_calling_config={
|
|
315
|
+
'stream_function_call_arguments': True,
|
|
316
|
+
}
|
|
317
|
+
),
|
|
318
|
+
),
|
|
319
|
+
):
|
|
320
|
+
streaming_function_call_content.append(chunk.candidates[0].content)
|
|
321
|
+
|
|
322
|
+
streaming_function_call_content.append(
|
|
323
|
+
types.Content(
|
|
324
|
+
role='user',
|
|
325
|
+
parts=[
|
|
326
|
+
types.Part.from_function_response(
|
|
327
|
+
name='get_current_weather',
|
|
328
|
+
response={
|
|
329
|
+
'temperature': 21,
|
|
330
|
+
'unit': 'C',
|
|
331
|
+
},
|
|
332
|
+
)
|
|
333
|
+
],
|
|
334
|
+
),
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
for chunk in client.models.generate_content_stream(
|
|
338
|
+
model='gemini-2.5-pro',
|
|
339
|
+
contents=streaming_function_call_content,
|
|
340
|
+
config=types.GenerateContentConfig(
|
|
341
|
+
tools=[{'function_declarations': json_function_declarations}],
|
|
342
|
+
tool_config=types.ToolConfig(
|
|
343
|
+
function_calling_config={
|
|
344
|
+
'stream_function_call_arguments': True,
|
|
345
|
+
}
|
|
346
|
+
),
|
|
347
|
+
),
|
|
348
|
+
):
|
|
349
|
+
pass
|
|
350
|
+
|
|
351
|
+
def test_streaming_with_gemini_parameters_with_history(client):
|
|
352
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
353
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
354
|
+
for chunk in client.models.generate_content_stream(
|
|
355
|
+
model='gemini-2.5-pro',
|
|
356
|
+
contents=previous_generate_content_history,
|
|
357
|
+
config=types.GenerateContentConfig(
|
|
358
|
+
tools=[{
|
|
359
|
+
'function_declarations': gemini_function_declarations
|
|
360
|
+
}],
|
|
361
|
+
tool_config=types.ToolConfig(
|
|
362
|
+
function_calling_config={
|
|
363
|
+
'stream_function_call_arguments': True,
|
|
364
|
+
}
|
|
365
|
+
),
|
|
366
|
+
),
|
|
367
|
+
):
|
|
368
|
+
assert chunk is not None
|
|
369
|
+
assert chunk.candidates is not None
|
|
370
|
+
assert chunk.candidates[0].content is not None
|
|
371
|
+
assert chunk.candidates[0].content.parts is not None
|
|
372
|
+
|
|
373
|
+
def test_chat_streaming_with_json_parameters_with_history(client):
|
|
374
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
375
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
376
|
+
messages = [
|
|
377
|
+
"""
|
|
378
|
+
get the current weather in boston in celsius, the country is U.S., the purpose is to know what to wear today.
|
|
379
|
+
""",
|
|
380
|
+
"""
|
|
381
|
+
get the current weather in new brunswick in celsius, the country is U.S., the purpose is to know what to prepare an event today.
|
|
382
|
+
""",
|
|
383
|
+
]
|
|
384
|
+
chat = client.chats.create(
|
|
385
|
+
model='gemini-2.5-pro',
|
|
386
|
+
history=previous_generate_content_history,
|
|
387
|
+
config=types.GenerateContentConfig(
|
|
388
|
+
tools=[{
|
|
389
|
+
'function_declarations': gemini_function_declarations
|
|
390
|
+
}],
|
|
391
|
+
tool_config=types.ToolConfig(
|
|
392
|
+
function_calling_config={
|
|
393
|
+
'stream_function_call_arguments': True,
|
|
394
|
+
}
|
|
395
|
+
),
|
|
396
|
+
),
|
|
397
|
+
)
|
|
398
|
+
for message in messages:
|
|
399
|
+
result = chat.send_message_stream(message)
|
|
400
|
+
for chunk in result:
|
|
401
|
+
assert chunk is not None
|
|
402
|
+
assert chunk.candidates is not None
|
|
403
|
+
assert chunk.candidates[0].content is not None
|
|
404
|
+
assert chunk.candidates[0].content.parts is not None
|
|
405
|
+
|
|
406
|
+
assert chat.get_history() is not None
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
@pytest.mark.asyncio
|
|
410
|
+
async def test_chat_streaming_with_json_parameters_with_history_async(client):
|
|
411
|
+
"""Tests streaming function calls with FunctionDeclaration withJSON parameters."""
|
|
412
|
+
messages = [
|
|
413
|
+
"""
|
|
414
|
+
get the current weather in boston in celsius, the country is U.S., the purpose is to know what to wear today.
|
|
415
|
+
""",
|
|
416
|
+
"""
|
|
417
|
+
get the current weather in new brunswick in celsius, the country is U.S., the purpose is to know what to prepare an event today.
|
|
418
|
+
""",
|
|
419
|
+
]
|
|
420
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
421
|
+
chat = client.aio.chats.create(
|
|
422
|
+
model='gemini-2.5-pro',
|
|
423
|
+
history=previous_generate_content_history,
|
|
424
|
+
config=types.GenerateContentConfig(
|
|
425
|
+
tools=[{'function_declarations': gemini_function_declarations}],
|
|
426
|
+
tool_config=types.ToolConfig(
|
|
427
|
+
function_calling_config={
|
|
428
|
+
'stream_function_call_arguments': True,
|
|
429
|
+
}
|
|
430
|
+
),
|
|
431
|
+
),
|
|
432
|
+
)
|
|
433
|
+
async for chunk in await chat.send_message_stream(messages[0]):
|
|
434
|
+
assert chunk is not None
|
|
435
|
+
assert chunk.candidates is not None
|
|
436
|
+
assert chunk.candidates[0].content is not None
|
|
437
|
+
assert chunk.candidates[0].content.parts is not None
|
|
438
|
+
async for chunk in await chat.send_message_stream(messages[1]):
|
|
439
|
+
assert chunk is not None
|
|
440
|
+
assert chunk.candidates is not None
|
|
441
|
+
assert chunk.candidates[0].content is not None
|
|
442
|
+
assert chunk.candidates[0].content.parts is not None
|