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,120 @@
|
|
|
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
|
+
import pytest
|
|
18
|
+
from ... import _transformers as t
|
|
19
|
+
from ... import types
|
|
20
|
+
from .. import pytest_helper
|
|
21
|
+
from . import constants
|
|
22
|
+
|
|
23
|
+
_COMPUTE_TOKENS_PARAMS = types._ComputeTokensParameters(
|
|
24
|
+
model='gemini-2.5-flash',
|
|
25
|
+
contents=[t.t_content('Tell me a story in 300 words.')],
|
|
26
|
+
)
|
|
27
|
+
_COMPUTE_TOKENS_PARAMS_VERTEX_CUSTOM_URL = types._ComputeTokensParameters(
|
|
28
|
+
model='gemini-2.5-flash',
|
|
29
|
+
contents=[t.t_content('Tell me a story in 300 words.')],
|
|
30
|
+
config={'http_options': constants.VERTEX_HTTP_OPTIONS},
|
|
31
|
+
)
|
|
32
|
+
_COMPUTE_TOKENS_PARAMS_MLDEV_CUSTOM_URL = types._ComputeTokensParameters(
|
|
33
|
+
model='gemini-2.5-flash',
|
|
34
|
+
contents=[t.t_content('Tell me a story in 300 words.')],
|
|
35
|
+
config={'http_options': constants.MLDEV_HTTP_OPTIONS},
|
|
36
|
+
)
|
|
37
|
+
_UNICODE_STRING = '这是一条unicode测试🤪❤★'
|
|
38
|
+
|
|
39
|
+
test_table: list[pytest_helper.TestTableItem] = [
|
|
40
|
+
pytest_helper.TestTableItem(
|
|
41
|
+
name='test_compute_tokens',
|
|
42
|
+
exception_if_mldev='only supported in',
|
|
43
|
+
parameters=types._ComputeTokensParameters(
|
|
44
|
+
model='gemini-2.5-flash',
|
|
45
|
+
contents=[t.t_content('Tell me a story in 300 words.')],
|
|
46
|
+
),
|
|
47
|
+
),
|
|
48
|
+
pytest_helper.TestTableItem(
|
|
49
|
+
name='test_compute_tokens_vertex_custom_url',
|
|
50
|
+
parameters=_COMPUTE_TOKENS_PARAMS_VERTEX_CUSTOM_URL,
|
|
51
|
+
exception_if_mldev='only supported in',
|
|
52
|
+
),
|
|
53
|
+
pytest_helper.TestTableItem(
|
|
54
|
+
name='test_compute_tokens_mldev_custom_url',
|
|
55
|
+
parameters=_COMPUTE_TOKENS_PARAMS_MLDEV_CUSTOM_URL,
|
|
56
|
+
exception_if_vertex='404',
|
|
57
|
+
exception_if_mldev='only supported in',
|
|
58
|
+
),
|
|
59
|
+
pytest_helper.TestTableItem(
|
|
60
|
+
name='test_compute_tokens_unicode',
|
|
61
|
+
exception_if_mldev='only supported in',
|
|
62
|
+
parameters=types._ComputeTokensParameters(
|
|
63
|
+
model='gemini-2.5-flash', contents=[t.t_content(_UNICODE_STRING)]
|
|
64
|
+
),
|
|
65
|
+
),
|
|
66
|
+
]
|
|
67
|
+
pytestmark = pytest_helper.setup(
|
|
68
|
+
file=__file__,
|
|
69
|
+
globals_for_file=globals(),
|
|
70
|
+
test_method='models.compute_tokens',
|
|
71
|
+
test_table=test_table,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_token_bytes_deserialization(client):
|
|
76
|
+
if client._api_client.vertexai:
|
|
77
|
+
response = client.models.compute_tokens(
|
|
78
|
+
model=_COMPUTE_TOKENS_PARAMS.model,
|
|
79
|
+
contents=_UNICODE_STRING,
|
|
80
|
+
)
|
|
81
|
+
decoded_tokens = b''.join(response.tokens_info[0].tokens)
|
|
82
|
+
assert (
|
|
83
|
+
decoded_tokens
|
|
84
|
+
== b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe6\x9d\xa1unicode\xe6\xb5\x8b\xe8\xaf\x95\xf0\x9f\xa4\xaa\xe2\x9d\xa4\xe2\x98\x85'
|
|
85
|
+
)
|
|
86
|
+
assert decoded_tokens.decode('utf-8') == _UNICODE_STRING
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@pytest.mark.asyncio
|
|
90
|
+
async def test_async(client):
|
|
91
|
+
if client._api_client.vertexai:
|
|
92
|
+
response = await client.aio.models.compute_tokens(
|
|
93
|
+
model=_COMPUTE_TOKENS_PARAMS.model,
|
|
94
|
+
contents=_COMPUTE_TOKENS_PARAMS.contents,
|
|
95
|
+
)
|
|
96
|
+
assert response
|
|
97
|
+
else:
|
|
98
|
+
with pytest.raises(Exception):
|
|
99
|
+
await client.aio.models.compute_tokens(
|
|
100
|
+
model=_COMPUTE_TOKENS_PARAMS.model,
|
|
101
|
+
contents=_COMPUTE_TOKENS_PARAMS.contents,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_different_model_names(client):
|
|
106
|
+
if client._api_client.vertexai:
|
|
107
|
+
response1 = client.models.compute_tokens(
|
|
108
|
+
model='gemini-2.5-flash', contents=_COMPUTE_TOKENS_PARAMS.contents
|
|
109
|
+
)
|
|
110
|
+
assert response1
|
|
111
|
+
response3 = client.models.compute_tokens(
|
|
112
|
+
model='publishers/google/models/gemini-2.5-flash',
|
|
113
|
+
contents=_COMPUTE_TOKENS_PARAMS.contents,
|
|
114
|
+
)
|
|
115
|
+
assert response3
|
|
116
|
+
response4 = client.models.compute_tokens(
|
|
117
|
+
model='projects/vertexsdk/locations/us-central1/publishers/google/models/gemini-2.5-flash',
|
|
118
|
+
contents=_COMPUTE_TOKENS_PARAMS.contents,
|
|
119
|
+
)
|
|
120
|
+
assert response4
|
|
@@ -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
|
+
import copy
|
|
18
|
+
import pytest
|
|
19
|
+
from ... import _transformers as t
|
|
20
|
+
from ... import errors
|
|
21
|
+
from ... import types
|
|
22
|
+
from .. import pytest_helper
|
|
23
|
+
from . import constants
|
|
24
|
+
|
|
25
|
+
_COUNT_TOKENS_PARAMS = types._CountTokensParameters(
|
|
26
|
+
model='gemini-2.5-flash',
|
|
27
|
+
contents=[t.t_content('Tell me a story in 300 words.')],
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
_COUNT_TOKENS_PARAMS_WITH_SYSTEM_INSTRUCTION = copy.deepcopy(
|
|
31
|
+
_COUNT_TOKENS_PARAMS
|
|
32
|
+
)
|
|
33
|
+
_COUNT_TOKENS_PARAMS_WITH_SYSTEM_INSTRUCTION.config = {
|
|
34
|
+
'system_instruction': t.t_content('you are a chatbot.')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_COUNT_TOKENS_PARAMS_WITH_TOOLS = copy.deepcopy(_COUNT_TOKENS_PARAMS)
|
|
38
|
+
_COUNT_TOKENS_PARAMS_WITH_TOOLS.config = {
|
|
39
|
+
'tools': [{'google_search_retrieval': {}}]
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_COUNT_TOKENS_PARAMS_WITH_GENERATION_CONFIG = copy.deepcopy(
|
|
43
|
+
_COUNT_TOKENS_PARAMS
|
|
44
|
+
)
|
|
45
|
+
_COUNT_TOKENS_PARAMS_WITH_GENERATION_CONFIG.config = {
|
|
46
|
+
'generation_config': {'max_output_tokens': 50}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
_COUNT_TOKENS_PARAMS_VERTEX_CUSTOM_URL = copy.deepcopy(_COUNT_TOKENS_PARAMS)
|
|
50
|
+
_COUNT_TOKENS_PARAMS_VERTEX_CUSTOM_URL.config = {
|
|
51
|
+
'http_options': constants.VERTEX_HTTP_OPTIONS
|
|
52
|
+
}
|
|
53
|
+
_COUNT_TOKENS_PARAMS_MLDEV_CUSTOM_URL = copy.deepcopy(_COUNT_TOKENS_PARAMS)
|
|
54
|
+
_COUNT_TOKENS_PARAMS_MLDEV_CUSTOM_URL.config = {
|
|
55
|
+
'http_options': constants.MLDEV_HTTP_OPTIONS
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# TODO(b/378952792): MLDev count_tokens needs to merge contents and model
|
|
60
|
+
# param into generateContentRequest field.
|
|
61
|
+
test_table: list[pytest_helper.TestTableItem] = [
|
|
62
|
+
pytest_helper.TestTableItem(
|
|
63
|
+
name='test_count_tokens',
|
|
64
|
+
parameters=_COUNT_TOKENS_PARAMS,
|
|
65
|
+
),
|
|
66
|
+
pytest_helper.TestTableItem(
|
|
67
|
+
name='test_count_tokens_vertex_custom_url',
|
|
68
|
+
parameters=_COUNT_TOKENS_PARAMS_VERTEX_CUSTOM_URL,
|
|
69
|
+
exception_if_mldev='404',
|
|
70
|
+
),
|
|
71
|
+
pytest_helper.TestTableItem(
|
|
72
|
+
name='test_count_tokens_mldev_custom_url',
|
|
73
|
+
parameters=_COUNT_TOKENS_PARAMS_MLDEV_CUSTOM_URL,
|
|
74
|
+
exception_if_vertex='404',
|
|
75
|
+
),
|
|
76
|
+
pytest_helper.TestTableItem(
|
|
77
|
+
name='test_count_tokens_with_system_instruction',
|
|
78
|
+
exception_if_mldev='not supported',
|
|
79
|
+
parameters=_COUNT_TOKENS_PARAMS_WITH_SYSTEM_INSTRUCTION,
|
|
80
|
+
),
|
|
81
|
+
pytest_helper.TestTableItem(
|
|
82
|
+
name='test_count_tokens_with_tools',
|
|
83
|
+
exception_if_mldev='not supported',
|
|
84
|
+
parameters=_COUNT_TOKENS_PARAMS_WITH_TOOLS,
|
|
85
|
+
),
|
|
86
|
+
pytest_helper.TestTableItem(
|
|
87
|
+
name='test_count_tokens_with_generation_config',
|
|
88
|
+
exception_if_mldev='not supported',
|
|
89
|
+
parameters=_COUNT_TOKENS_PARAMS_WITH_GENERATION_CONFIG,
|
|
90
|
+
),
|
|
91
|
+
]
|
|
92
|
+
pytestmark = pytest_helper.setup(
|
|
93
|
+
file=__file__,
|
|
94
|
+
globals_for_file=globals(),
|
|
95
|
+
test_method='models.count_tokens',
|
|
96
|
+
test_table=test_table,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@pytest.mark.asyncio
|
|
101
|
+
async def test_async(client):
|
|
102
|
+
response = await client.aio.models.count_tokens(
|
|
103
|
+
model=_COUNT_TOKENS_PARAMS.model, contents=_COUNT_TOKENS_PARAMS.contents
|
|
104
|
+
)
|
|
105
|
+
assert response
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_different_model_names(client):
|
|
109
|
+
if client._api_client.vertexai:
|
|
110
|
+
response1 = client.models.count_tokens(
|
|
111
|
+
model='gemini-2.5-flash', contents=_COUNT_TOKENS_PARAMS.contents
|
|
112
|
+
)
|
|
113
|
+
assert response1
|
|
114
|
+
response3 = client.models.count_tokens(
|
|
115
|
+
model='publishers/google/models/gemini-2.5-flash',
|
|
116
|
+
contents=_COUNT_TOKENS_PARAMS.contents,
|
|
117
|
+
)
|
|
118
|
+
assert response3
|
|
119
|
+
response4 = client.models.count_tokens(
|
|
120
|
+
model='projects/vertexsdk/locations/us-central1/publishers/google/models/gemini-2.5-flash',
|
|
121
|
+
contents=_COUNT_TOKENS_PARAMS.contents,
|
|
122
|
+
)
|
|
123
|
+
assert response4
|
|
124
|
+
else:
|
|
125
|
+
response1 = client.models.count_tokens(
|
|
126
|
+
model='gemini-2.5-flash', contents=_COUNT_TOKENS_PARAMS.contents
|
|
127
|
+
)
|
|
128
|
+
assert response1
|
|
129
|
+
response2 = client.models.count_tokens(
|
|
130
|
+
model='models/gemini-2.5-flash', contents=_COUNT_TOKENS_PARAMS.contents
|
|
131
|
+
)
|
|
132
|
+
assert response2
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_extra_body(client):
|
|
136
|
+
config = {
|
|
137
|
+
'http_options': {
|
|
138
|
+
'extra_body': {
|
|
139
|
+
'systemInstruction': {
|
|
140
|
+
'parts': [{'text': 'you are a chatbot.'}],
|
|
141
|
+
'role': 'user',
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if client._api_client.vertexai:
|
|
147
|
+
response = client.models.count_tokens(
|
|
148
|
+
model=_COUNT_TOKENS_PARAMS.model,
|
|
149
|
+
contents=_COUNT_TOKENS_PARAMS.contents,
|
|
150
|
+
config=config,
|
|
151
|
+
)
|
|
152
|
+
assert response.total_tokens
|
|
153
|
+
else:
|
|
154
|
+
with pytest.raises(errors.ClientError):
|
|
155
|
+
client.models.count_tokens(
|
|
156
|
+
model=_COUNT_TOKENS_PARAMS.model,
|
|
157
|
+
contents=_COUNT_TOKENS_PARAMS.contents,
|
|
158
|
+
config=config,
|
|
159
|
+
)
|
|
@@ -0,0 +1,107 @@
|
|
|
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 models.get."""
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
from ... import errors
|
|
22
|
+
from ... import types
|
|
23
|
+
from .. import pytest_helper
|
|
24
|
+
|
|
25
|
+
TEST_API_VERSION = 'test_api_version'
|
|
26
|
+
test_table: list[pytest_helper.TestTableItem] = [
|
|
27
|
+
pytest_helper.TestTableItem(
|
|
28
|
+
name='test_delete_model',
|
|
29
|
+
parameters=types._DeleteModelParameters(
|
|
30
|
+
model='models/8533706666867163136'
|
|
31
|
+
),
|
|
32
|
+
exception_if_mldev='404',
|
|
33
|
+
skip_in_api_mode='cannot be deleted for multiple times',
|
|
34
|
+
),
|
|
35
|
+
pytest_helper.TestTableItem(
|
|
36
|
+
name='test_delete_model_with_http_options_in_method',
|
|
37
|
+
parameters=types._DeleteModelParameters(
|
|
38
|
+
model='tmodels/8533706666867163136',
|
|
39
|
+
config={
|
|
40
|
+
'http_options': {
|
|
41
|
+
'api_version': TEST_API_VERSION,
|
|
42
|
+
'headers': {'test': 'headers'},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
),
|
|
46
|
+
exception_if_vertex=TEST_API_VERSION,
|
|
47
|
+
exception_if_mldev='404',
|
|
48
|
+
skip_in_api_mode='cannot be deleted for multiple times',
|
|
49
|
+
),
|
|
50
|
+
pytest_helper.TestTableItem(
|
|
51
|
+
name='test_delete_tuned_model',
|
|
52
|
+
parameters=types._DeleteModelParameters(
|
|
53
|
+
model='tunedModels/generate-num-9598'
|
|
54
|
+
),
|
|
55
|
+
exception_if_vertex='404',
|
|
56
|
+
skip_in_api_mode='cannot be deleted for multiple times',
|
|
57
|
+
),
|
|
58
|
+
]
|
|
59
|
+
pytestmark = pytest_helper.setup(
|
|
60
|
+
file=__file__,
|
|
61
|
+
globals_for_file=globals(),
|
|
62
|
+
test_method='models.delete',
|
|
63
|
+
test_table=test_table,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.mark.asyncio
|
|
68
|
+
async def test_async_delete_model_with_http_options_in_method(client):
|
|
69
|
+
|
|
70
|
+
with pytest.raises(errors.ClientError) as e:
|
|
71
|
+
await client.aio.models.delete(
|
|
72
|
+
model='tunedModels/generate-num-888',
|
|
73
|
+
config={
|
|
74
|
+
'http_options': {
|
|
75
|
+
'api_version': TEST_API_VERSION,
|
|
76
|
+
'headers': {'test': 'headers'},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
)
|
|
80
|
+
if client._api_client.vertexai:
|
|
81
|
+
assert TEST_API_VERSION in e.value.args[0]
|
|
82
|
+
else:
|
|
83
|
+
assert '404' in str(e)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@pytest.mark.asyncio
|
|
87
|
+
async def test_async_delete_tuned_model(client):
|
|
88
|
+
if client._api_client.vertexai:
|
|
89
|
+
with pytest.raises(errors.ClientError) as e:
|
|
90
|
+
await client.aio.models.delete(model='tunedModels/generate-num-888')
|
|
91
|
+
assert '404' in str(e)
|
|
92
|
+
else:
|
|
93
|
+
response = await client.aio.models.delete(
|
|
94
|
+
model='tunedModels/generate-num-888'
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@pytest.mark.asyncio
|
|
99
|
+
async def test_async_delete_model(client):
|
|
100
|
+
if client._api_client.vertexai:
|
|
101
|
+
response = await client.aio.models.delete(
|
|
102
|
+
model='models/1071206899942162432'
|
|
103
|
+
)
|
|
104
|
+
else:
|
|
105
|
+
with pytest.raises(errors.ClientError) as e:
|
|
106
|
+
await client.aio.models.delete(model='models/1071206899942162432')
|
|
107
|
+
assert '404' in str(e)
|
|
@@ -0,0 +1,264 @@
|
|
|
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 edit_image."""
|
|
18
|
+
|
|
19
|
+
import os
|
|
20
|
+
|
|
21
|
+
import pydantic
|
|
22
|
+
import pytest
|
|
23
|
+
|
|
24
|
+
from ... import types
|
|
25
|
+
from .. import pytest_helper
|
|
26
|
+
|
|
27
|
+
CAPABILITY_MODEL_NAME = 'imagen-3.0-capability-001'
|
|
28
|
+
|
|
29
|
+
IMAGE_FILE_PATH = os.path.abspath(
|
|
30
|
+
os.path.join(os.path.dirname(__file__), '../data/google.png')
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
MASK_FILE_PATH = os.path.abspath(
|
|
34
|
+
os.path.join(os.path.dirname(__file__), '../data/checkerboard.png')
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
BRIDGE_IMAGE_FILE_PATH = os.path.abspath(
|
|
38
|
+
os.path.join(os.path.dirname(__file__), '../data/bridge1.png')
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
raw_ref_image = types.RawReferenceImage(
|
|
42
|
+
reference_id=1,
|
|
43
|
+
reference_image=types.Image.from_file(location=IMAGE_FILE_PATH),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
mask_ref_image = types.MaskReferenceImage(
|
|
47
|
+
reference_id=2,
|
|
48
|
+
config=types.MaskReferenceConfig(
|
|
49
|
+
mask_mode='MASK_MODE_BACKGROUND',
|
|
50
|
+
mask_dilation=0.06,
|
|
51
|
+
),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
mask_ref_image_user_provided = types.MaskReferenceImage(
|
|
55
|
+
reference_id=2,
|
|
56
|
+
reference_image=types.Image.from_file(location=MASK_FILE_PATH),
|
|
57
|
+
config=types.MaskReferenceConfig(
|
|
58
|
+
mask_mode='MASK_MODE_USER_PROVIDED',
|
|
59
|
+
mask_dilation=0.06,
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
control_ref_image = types.ControlReferenceImage(
|
|
64
|
+
reference_id=2,
|
|
65
|
+
reference_image=types.Image.from_file(location=MASK_FILE_PATH),
|
|
66
|
+
config=types.ControlReferenceConfig(
|
|
67
|
+
control_type='CONTROL_TYPE_SCRIBBLE',
|
|
68
|
+
# Backend creates the control image if this is set to True.
|
|
69
|
+
enable_control_image_computation=False,
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
style_ref_image_customization = types.StyleReferenceImage(
|
|
74
|
+
reference_id=1,
|
|
75
|
+
reference_image=types.Image.from_file(location=IMAGE_FILE_PATH),
|
|
76
|
+
config=types.StyleReferenceConfig(
|
|
77
|
+
style_description='glowing style',
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
subject_ref_image_customization = types.SubjectReferenceImage(
|
|
82
|
+
reference_id=1,
|
|
83
|
+
reference_image=types.Image.from_file(location=IMAGE_FILE_PATH),
|
|
84
|
+
config=types.SubjectReferenceConfig(
|
|
85
|
+
subject_type='SUBJECT_TYPE_PRODUCT',
|
|
86
|
+
subject_description='A product logo that is a multi-colored letter G',
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
dog_content_ref_image = types.ContentReferenceImage(
|
|
91
|
+
reference_id=1,
|
|
92
|
+
reference_image=types.Image(
|
|
93
|
+
gcs_uri='gs://genai-sdk-tests/inputs/images/dog.jpg'
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
cyberpunk_style_ref_image = types.StyleReferenceImage(
|
|
98
|
+
reference_id=2,
|
|
99
|
+
reference_image=types.Image(
|
|
100
|
+
gcs_uri='gs://genai-sdk-tests/inputs/images/cyberpunk.jpg'
|
|
101
|
+
),
|
|
102
|
+
config=types.StyleReferenceConfig(
|
|
103
|
+
style_description='cyberpunk style',
|
|
104
|
+
),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
test_table: list[pytest_helper.TestTableItem] = [
|
|
108
|
+
pytest_helper.TestTableItem(
|
|
109
|
+
name='test_edit_mask_inpaint_insert',
|
|
110
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
111
|
+
parameters=types._EditImageParameters(
|
|
112
|
+
model=CAPABILITY_MODEL_NAME,
|
|
113
|
+
prompt='Sunlight and clear weather',
|
|
114
|
+
reference_images=[raw_ref_image, mask_ref_image],
|
|
115
|
+
config=types.EditImageConfig(
|
|
116
|
+
edit_mode=types.EditMode.EDIT_MODE_INPAINT_INSERTION,
|
|
117
|
+
number_of_images=1,
|
|
118
|
+
# Test comprehensive configs
|
|
119
|
+
# aspect_ratio is not supported for mask editing
|
|
120
|
+
negative_prompt='human',
|
|
121
|
+
guidance_scale=15.0,
|
|
122
|
+
safety_filter_level=types.SafetyFilterLevel.BLOCK_MEDIUM_AND_ABOVE,
|
|
123
|
+
person_generation=types.PersonGeneration.DONT_ALLOW,
|
|
124
|
+
include_safety_attributes=False,
|
|
125
|
+
include_rai_reason=True,
|
|
126
|
+
output_mime_type='image/jpeg',
|
|
127
|
+
output_compression_quality=80,
|
|
128
|
+
base_steps=32,
|
|
129
|
+
add_watermark=False,
|
|
130
|
+
labels={'imagen_label_key': 'edit_image'}
|
|
131
|
+
),
|
|
132
|
+
),
|
|
133
|
+
),
|
|
134
|
+
pytest_helper.TestTableItem(
|
|
135
|
+
name='test_edit_mask_inpaint_insert_user_provided',
|
|
136
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
137
|
+
parameters=types._EditImageParameters(
|
|
138
|
+
model=CAPABILITY_MODEL_NAME,
|
|
139
|
+
prompt='Change the colors',
|
|
140
|
+
reference_images=[raw_ref_image, mask_ref_image_user_provided],
|
|
141
|
+
config=types.EditImageConfig(
|
|
142
|
+
edit_mode=types.EditMode.EDIT_MODE_INPAINT_INSERTION,
|
|
143
|
+
# aspect_ratio is not supported for mask editing
|
|
144
|
+
number_of_images=1,
|
|
145
|
+
include_rai_reason=True,
|
|
146
|
+
),
|
|
147
|
+
),
|
|
148
|
+
),
|
|
149
|
+
pytest_helper.TestTableItem(
|
|
150
|
+
name='test_edit_control_user_provided',
|
|
151
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
152
|
+
parameters=types._EditImageParameters(
|
|
153
|
+
model=CAPABILITY_MODEL_NAME,
|
|
154
|
+
prompt='Change the colors aligning with the scribble map [2]',
|
|
155
|
+
reference_images=[raw_ref_image, control_ref_image],
|
|
156
|
+
config=types.EditImageConfig(
|
|
157
|
+
number_of_images=1,
|
|
158
|
+
aspect_ratio='9:16',
|
|
159
|
+
include_rai_reason=True,
|
|
160
|
+
),
|
|
161
|
+
),
|
|
162
|
+
),
|
|
163
|
+
pytest_helper.TestTableItem(
|
|
164
|
+
name='test_edit_style_reference_image_customization',
|
|
165
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
166
|
+
parameters=types._EditImageParameters(
|
|
167
|
+
model=CAPABILITY_MODEL_NAME,
|
|
168
|
+
prompt=(
|
|
169
|
+
'Generate an image in glowing style [1] based on the following'
|
|
170
|
+
' caption: A church in the mountain.'
|
|
171
|
+
),
|
|
172
|
+
reference_images=[style_ref_image_customization],
|
|
173
|
+
config=types.EditImageConfig(
|
|
174
|
+
number_of_images=1,
|
|
175
|
+
aspect_ratio='9:16',
|
|
176
|
+
include_rai_reason=True,
|
|
177
|
+
),
|
|
178
|
+
),
|
|
179
|
+
),
|
|
180
|
+
pytest_helper.TestTableItem(
|
|
181
|
+
name='test_edit_subject_image_customization',
|
|
182
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
183
|
+
parameters=types._EditImageParameters(
|
|
184
|
+
model=CAPABILITY_MODEL_NAME,
|
|
185
|
+
prompt=(
|
|
186
|
+
'Generate an image containing a mug with the product logo [1]'
|
|
187
|
+
' visible on the side of the mug.'
|
|
188
|
+
),
|
|
189
|
+
reference_images=[subject_ref_image_customization],
|
|
190
|
+
config=types.EditImageConfig(
|
|
191
|
+
number_of_images=1,
|
|
192
|
+
aspect_ratio='9:16',
|
|
193
|
+
include_rai_reason=True,
|
|
194
|
+
),
|
|
195
|
+
),
|
|
196
|
+
),
|
|
197
|
+
pytest_helper.TestTableItem(
|
|
198
|
+
name='test_edit_content_image_ingredients',
|
|
199
|
+
exception_if_mldev='only supported in the Vertex AI client',
|
|
200
|
+
parameters=types._EditImageParameters(
|
|
201
|
+
model='imagen-4.0-ingredients-preview',
|
|
202
|
+
prompt=(
|
|
203
|
+
'Dog in [1] sleeping on the ground at the bottom of the image'
|
|
204
|
+
' with the cyberpunk city landscape in [2] in the background.'
|
|
205
|
+
),
|
|
206
|
+
reference_images=[dog_content_ref_image, cyberpunk_style_ref_image],
|
|
207
|
+
config=types.EditImageConfig(
|
|
208
|
+
number_of_images=1,
|
|
209
|
+
aspect_ratio='9:16',
|
|
210
|
+
include_rai_reason=True,
|
|
211
|
+
output_mime_type='image/jpeg',
|
|
212
|
+
),
|
|
213
|
+
),
|
|
214
|
+
),
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
pytestmark = pytest_helper.setup(
|
|
218
|
+
file=__file__,
|
|
219
|
+
globals_for_file=globals(),
|
|
220
|
+
test_method='models.edit_image',
|
|
221
|
+
test_table=test_table,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def test_setting_reference_type_raises(client):
|
|
226
|
+
with pytest.raises(pydantic.ValidationError):
|
|
227
|
+
types.SubjectReferenceImage(
|
|
228
|
+
reference_id=1,
|
|
229
|
+
# This test should fail because the user can't set reference_type.
|
|
230
|
+
reference_type='REFERENCE_TYPE_SUBJECT',
|
|
231
|
+
reference_image=types.Image.from_file(location=IMAGE_FILE_PATH),
|
|
232
|
+
config=types.SubjectReferenceConfig(
|
|
233
|
+
subject_type='SUBJECT_TYPE_PRODUCT',
|
|
234
|
+
subject_description=(
|
|
235
|
+
'A product logo that is a multi-colored letter G'
|
|
236
|
+
),
|
|
237
|
+
),
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
@pytest.mark.asyncio
|
|
242
|
+
async def test_edit_mask_inpaint_insert_async(client):
|
|
243
|
+
with pytest_helper.exception_if_mldev(client, ValueError):
|
|
244
|
+
response = await client.aio.models.edit_image(
|
|
245
|
+
model=CAPABILITY_MODEL_NAME,
|
|
246
|
+
prompt='Sunlight and clear weather',
|
|
247
|
+
reference_images=[raw_ref_image, mask_ref_image],
|
|
248
|
+
config=types.EditImageConfig(
|
|
249
|
+
edit_mode=types.EditMode.EDIT_MODE_INPAINT_INSERTION,
|
|
250
|
+
number_of_images=1,
|
|
251
|
+
# Test comprehensive configs
|
|
252
|
+
# aspect_ratio is not supported for mask editing
|
|
253
|
+
negative_prompt='human',
|
|
254
|
+
guidance_scale=15.0,
|
|
255
|
+
safety_filter_level=types.SafetyFilterLevel.BLOCK_MEDIUM_AND_ABOVE,
|
|
256
|
+
person_generation=types.PersonGeneration.DONT_ALLOW,
|
|
257
|
+
include_safety_attributes=False,
|
|
258
|
+
include_rai_reason=True,
|
|
259
|
+
output_mime_type='image/jpeg',
|
|
260
|
+
output_compression_quality=80,
|
|
261
|
+
add_watermark=False,
|
|
262
|
+
),
|
|
263
|
+
)
|
|
264
|
+
assert response.generated_images[0].image.image_bytes
|