google-genai 1.54.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/_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 +31 -0
- google/genai/_tokens_converters.py +5 -0
- google/genai/batches.py +7 -0
- google/genai/client.py +223 -0
- google/genai/interactions.py +17 -0
- google/genai/live.py +4 -3
- google/genai/models.py +12 -0
- 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/types.py +72 -0
- google/genai/version.py +1 -1
- {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/METADATA +3 -1
- google_genai-1.55.0.dist-info/RECORD +345 -0
- google_genai-1.54.0.dist-info/RECORD +0 -41
- {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/WHEEL +0 -0
- {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/licenses/LICENSE +0 -0
- {google_genai-1.54.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
|
|
|
@@ -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
|
|
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
|
|
|
@@ -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
|
+
"""Expose stainless types."""
|
|
16
|
+
|
|
17
|
+
from ._interactions.types import *
|
google/genai/live.py
CHANGED
|
@@ -975,8 +975,9 @@ class AsyncLive(_api_module.BaseModule):
|
|
|
975
975
|
).model_dump(exclude_none=True),
|
|
976
976
|
)
|
|
977
977
|
)
|
|
978
|
-
del request_dict['config']
|
|
979
978
|
|
|
979
|
+
del request_dict['config']
|
|
980
|
+
request_dict = _common.encode_unserializable_types(request_dict)
|
|
980
981
|
setv(request_dict, ['setup', 'model'], transformed_model)
|
|
981
982
|
|
|
982
983
|
request = json.dumps(request_dict)
|
|
@@ -998,7 +999,7 @@ class AsyncLive(_api_module.BaseModule):
|
|
|
998
999
|
)
|
|
999
1000
|
)
|
|
1000
1001
|
del request_dict['config']
|
|
1001
|
-
|
|
1002
|
+
request_dict = _common.encode_unserializable_types(request_dict)
|
|
1002
1003
|
setv(request_dict, ['setup', 'model'], transformed_model)
|
|
1003
1004
|
|
|
1004
1005
|
request = json.dumps(request_dict)
|
|
@@ -1061,7 +1062,7 @@ class AsyncLive(_api_module.BaseModule):
|
|
|
1061
1062
|
)
|
|
1062
1063
|
)
|
|
1063
1064
|
del request_dict['config']
|
|
1064
|
-
|
|
1065
|
+
request_dict = _common.encode_unserializable_types(request_dict)
|
|
1065
1066
|
if (
|
|
1066
1067
|
getv(
|
|
1067
1068
|
request_dict, ['setup', 'generationConfig', 'responseModalities']
|
google/genai/models.py
CHANGED
|
@@ -1110,6 +1110,13 @@ def _GenerateContentConfig_to_mldev(
|
|
|
1110
1110
|
_ImageConfig_to_mldev(getv(from_object, ['image_config']), to_object),
|
|
1111
1111
|
)
|
|
1112
1112
|
|
|
1113
|
+
if getv(from_object, ['enable_enhanced_civic_answers']) is not None:
|
|
1114
|
+
setv(
|
|
1115
|
+
to_object,
|
|
1116
|
+
['enableEnhancedCivicAnswers'],
|
|
1117
|
+
getv(from_object, ['enable_enhanced_civic_answers']),
|
|
1118
|
+
)
|
|
1119
|
+
|
|
1113
1120
|
return to_object
|
|
1114
1121
|
|
|
1115
1122
|
|
|
@@ -1269,6 +1276,11 @@ def _GenerateContentConfig_to_vertex(
|
|
|
1269
1276
|
_ImageConfig_to_vertex(getv(from_object, ['image_config']), to_object),
|
|
1270
1277
|
)
|
|
1271
1278
|
|
|
1279
|
+
if getv(from_object, ['enable_enhanced_civic_answers']) is not None:
|
|
1280
|
+
raise ValueError(
|
|
1281
|
+
'enable_enhanced_civic_answers parameter is not supported in Vertex AI.'
|
|
1282
|
+
)
|
|
1283
|
+
|
|
1272
1284
|
return to_object
|
|
1273
1285
|
|
|
1274
1286
|
|
|
@@ -0,0 +1,21 @@
|
|
|
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."""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
pytest.register_assert_rewrite('genai.replay_api_client')
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
"""AFC helper function unit tests.
|
|
18
|
+
|
|
19
|
+
For AFC end to end test, please write test cases in
|
|
20
|
+
test_generate_content_tools.py module
|
|
21
|
+
"""
|