google-genai 1.55.0__py3-none-any.whl → 1.56.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.
Files changed (241) hide show
  1. google/genai/_interactions/_base_client.py +8 -2
  2. google/genai/_interactions/resources/interactions.py +6 -6
  3. google/genai/_interactions/types/__init__.py +2 -0
  4. google/genai/_interactions/types/audio_content.py +0 -1
  5. google/genai/_interactions/types/audio_content_param.py +0 -1
  6. google/genai/_interactions/types/code_execution_call_content.py +0 -1
  7. google/genai/_interactions/types/code_execution_call_content_param.py +0 -1
  8. google/genai/_interactions/types/code_execution_result_content.py +0 -1
  9. google/genai/_interactions/types/code_execution_result_content_param.py +0 -1
  10. google/genai/_interactions/types/content_delta.py +7 -23
  11. google/genai/_interactions/types/deep_research_agent_config.py +0 -1
  12. google/genai/_interactions/types/deep_research_agent_config_param.py +0 -1
  13. google/genai/_interactions/types/document_content.py +3 -2
  14. google/genai/_interactions/types/document_content_param.py +3 -2
  15. google/genai/{tests/__init__.py → _interactions/types/document_mime_type.py} +5 -3
  16. google/genai/{tests/afc/__init__.py → _interactions/types/document_mime_type_param.py} +8 -4
  17. google/genai/_interactions/types/dynamic_agent_config.py +0 -1
  18. google/genai/_interactions/types/dynamic_agent_config_param.py +0 -1
  19. google/genai/_interactions/types/file_search_result_content.py +0 -1
  20. google/genai/_interactions/types/file_search_result_content_param.py +0 -1
  21. google/genai/_interactions/types/function_call_content.py +0 -1
  22. google/genai/_interactions/types/function_call_content_param.py +0 -1
  23. google/genai/_interactions/types/function_result_content.py +1 -2
  24. google/genai/_interactions/types/function_result_content_param.py +1 -2
  25. google/genai/_interactions/types/google_search_call_content.py +0 -1
  26. google/genai/_interactions/types/google_search_call_content_param.py +0 -1
  27. google/genai/_interactions/types/google_search_result_content.py +0 -1
  28. google/genai/_interactions/types/google_search_result_content_param.py +0 -1
  29. google/genai/_interactions/types/image_content.py +1 -2
  30. google/genai/_interactions/types/image_content_param.py +1 -2
  31. google/genai/_interactions/types/mcp_server_tool_call_content.py +0 -1
  32. google/genai/_interactions/types/mcp_server_tool_call_content_param.py +0 -1
  33. google/genai/_interactions/types/mcp_server_tool_result_content.py +1 -2
  34. google/genai/_interactions/types/mcp_server_tool_result_content_param.py +1 -2
  35. google/genai/_interactions/types/text_content.py +0 -1
  36. google/genai/_interactions/types/text_content_param.py +0 -1
  37. google/genai/_interactions/types/thinking_level.py +1 -1
  38. google/genai/_interactions/types/thought_content.py +0 -1
  39. google/genai/_interactions/types/thought_content_param.py +0 -1
  40. google/genai/_interactions/types/url_context_call_content.py +0 -1
  41. google/genai/_interactions/types/url_context_call_content_param.py +0 -1
  42. google/genai/_interactions/types/url_context_result_content.py +0 -1
  43. google/genai/_interactions/types/url_context_result_content_param.py +0 -1
  44. google/genai/_interactions/types/video_content.py +1 -2
  45. google/genai/_interactions/types/video_content_param.py +1 -2
  46. google/genai/_live_converters.py +2 -30
  47. google/genai/client.py +3 -1
  48. google/genai/models.py +2 -29
  49. google/genai/tunings.py +1 -27
  50. google/genai/types.py +20 -22
  51. google/genai/version.py +1 -1
  52. {google_genai-1.55.0.dist-info → google_genai-1.56.0.dist-info}/METADATA +224 -22
  53. google_genai-1.56.0.dist-info/RECORD +162 -0
  54. google/genai/tests/afc/test_convert_if_exist_pydantic_model.py +0 -309
  55. google/genai/tests/afc/test_convert_number_values_for_function_call_args.py +0 -63
  56. google/genai/tests/afc/test_find_afc_incompatible_tool_indexes.py +0 -240
  57. google/genai/tests/afc/test_generate_content_stream_afc.py +0 -530
  58. google/genai/tests/afc/test_generate_content_stream_afc_thoughts.py +0 -77
  59. google/genai/tests/afc/test_get_function_map.py +0 -176
  60. google/genai/tests/afc/test_get_function_response_parts.py +0 -277
  61. google/genai/tests/afc/test_get_max_remote_calls_for_afc.py +0 -130
  62. google/genai/tests/afc/test_invoke_function_from_dict_args.py +0 -241
  63. google/genai/tests/afc/test_raise_error_for_afc_incompatible_config.py +0 -159
  64. google/genai/tests/afc/test_should_append_afc_history.py +0 -53
  65. google/genai/tests/afc/test_should_disable_afc.py +0 -214
  66. google/genai/tests/batches/__init__.py +0 -17
  67. google/genai/tests/batches/test_cancel.py +0 -77
  68. google/genai/tests/batches/test_create.py +0 -78
  69. google/genai/tests/batches/test_create_with_bigquery.py +0 -113
  70. google/genai/tests/batches/test_create_with_file.py +0 -82
  71. google/genai/tests/batches/test_create_with_gcs.py +0 -125
  72. google/genai/tests/batches/test_create_with_inlined_requests.py +0 -255
  73. google/genai/tests/batches/test_delete.py +0 -86
  74. google/genai/tests/batches/test_embedding.py +0 -157
  75. google/genai/tests/batches/test_get.py +0 -78
  76. google/genai/tests/batches/test_list.py +0 -79
  77. google/genai/tests/caches/__init__.py +0 -17
  78. google/genai/tests/caches/constants.py +0 -29
  79. google/genai/tests/caches/test_create.py +0 -210
  80. google/genai/tests/caches/test_create_custom_url.py +0 -105
  81. google/genai/tests/caches/test_delete.py +0 -54
  82. google/genai/tests/caches/test_delete_custom_url.py +0 -52
  83. google/genai/tests/caches/test_get.py +0 -94
  84. google/genai/tests/caches/test_get_custom_url.py +0 -52
  85. google/genai/tests/caches/test_list.py +0 -68
  86. google/genai/tests/caches/test_update.py +0 -70
  87. google/genai/tests/caches/test_update_custom_url.py +0 -58
  88. google/genai/tests/chats/__init__.py +0 -1
  89. google/genai/tests/chats/test_get_history.py +0 -597
  90. google/genai/tests/chats/test_send_message.py +0 -844
  91. google/genai/tests/chats/test_validate_response.py +0 -90
  92. google/genai/tests/client/__init__.py +0 -17
  93. google/genai/tests/client/test_async_stream.py +0 -427
  94. google/genai/tests/client/test_client_close.py +0 -197
  95. google/genai/tests/client/test_client_initialization.py +0 -1687
  96. google/genai/tests/client/test_client_requests.py +0 -355
  97. google/genai/tests/client/test_custom_client.py +0 -77
  98. google/genai/tests/client/test_http_options.py +0 -178
  99. google/genai/tests/client/test_replay_client_equality.py +0 -168
  100. google/genai/tests/client/test_retries.py +0 -846
  101. google/genai/tests/client/test_upload_errors.py +0 -136
  102. google/genai/tests/common/__init__.py +0 -17
  103. google/genai/tests/common/test_common.py +0 -954
  104. google/genai/tests/conftest.py +0 -162
  105. google/genai/tests/documents/__init__.py +0 -17
  106. google/genai/tests/documents/test_delete.py +0 -51
  107. google/genai/tests/documents/test_get.py +0 -85
  108. google/genai/tests/documents/test_list.py +0 -72
  109. google/genai/tests/errors/__init__.py +0 -1
  110. google/genai/tests/errors/test_api_error.py +0 -417
  111. google/genai/tests/file_search_stores/__init__.py +0 -17
  112. google/genai/tests/file_search_stores/test_create.py +0 -66
  113. google/genai/tests/file_search_stores/test_delete.py +0 -64
  114. google/genai/tests/file_search_stores/test_get.py +0 -94
  115. google/genai/tests/file_search_stores/test_import_file.py +0 -112
  116. google/genai/tests/file_search_stores/test_list.py +0 -57
  117. google/genai/tests/file_search_stores/test_upload_to_file_search_store.py +0 -141
  118. google/genai/tests/files/__init__.py +0 -17
  119. google/genai/tests/files/test_delete.py +0 -46
  120. google/genai/tests/files/test_download.py +0 -85
  121. google/genai/tests/files/test_get.py +0 -46
  122. google/genai/tests/files/test_list.py +0 -72
  123. google/genai/tests/files/test_upload.py +0 -255
  124. google/genai/tests/imports/test_no_optional_imports.py +0 -28
  125. google/genai/tests/interactions/test_integration.py +0 -80
  126. google/genai/tests/live/__init__.py +0 -16
  127. google/genai/tests/live/test_live.py +0 -2177
  128. google/genai/tests/live/test_live_music.py +0 -362
  129. google/genai/tests/live/test_live_response.py +0 -163
  130. google/genai/tests/live/test_send_client_content.py +0 -147
  131. google/genai/tests/live/test_send_realtime_input.py +0 -268
  132. google/genai/tests/live/test_send_tool_response.py +0 -222
  133. google/genai/tests/local_tokenizer/__init__.py +0 -17
  134. google/genai/tests/local_tokenizer/test_local_tokenizer.py +0 -343
  135. google/genai/tests/local_tokenizer/test_local_tokenizer_loader.py +0 -235
  136. google/genai/tests/mcp/__init__.py +0 -17
  137. google/genai/tests/mcp/test_has_mcp_tool_usage.py +0 -89
  138. google/genai/tests/mcp/test_mcp_to_gemini_tools.py +0 -191
  139. google/genai/tests/mcp/test_parse_config_for_mcp_sessions.py +0 -201
  140. google/genai/tests/mcp/test_parse_config_for_mcp_usage.py +0 -130
  141. google/genai/tests/mcp/test_set_mcp_usage_header.py +0 -72
  142. google/genai/tests/models/__init__.py +0 -17
  143. google/genai/tests/models/constants.py +0 -8
  144. google/genai/tests/models/test_compute_tokens.py +0 -120
  145. google/genai/tests/models/test_count_tokens.py +0 -159
  146. google/genai/tests/models/test_delete.py +0 -107
  147. google/genai/tests/models/test_edit_image.py +0 -264
  148. google/genai/tests/models/test_embed_content.py +0 -94
  149. google/genai/tests/models/test_function_call_streaming.py +0 -442
  150. google/genai/tests/models/test_generate_content.py +0 -2502
  151. google/genai/tests/models/test_generate_content_cached_content.py +0 -132
  152. google/genai/tests/models/test_generate_content_config_zero_value.py +0 -103
  153. google/genai/tests/models/test_generate_content_from_apikey.py +0 -44
  154. google/genai/tests/models/test_generate_content_http_options.py +0 -40
  155. google/genai/tests/models/test_generate_content_image_generation.py +0 -143
  156. google/genai/tests/models/test_generate_content_mcp.py +0 -343
  157. google/genai/tests/models/test_generate_content_media_resolution.py +0 -97
  158. google/genai/tests/models/test_generate_content_model.py +0 -139
  159. google/genai/tests/models/test_generate_content_part.py +0 -821
  160. google/genai/tests/models/test_generate_content_thought.py +0 -76
  161. google/genai/tests/models/test_generate_content_tools.py +0 -1761
  162. google/genai/tests/models/test_generate_images.py +0 -191
  163. google/genai/tests/models/test_generate_videos.py +0 -759
  164. google/genai/tests/models/test_get.py +0 -104
  165. google/genai/tests/models/test_list.py +0 -233
  166. google/genai/tests/models/test_recontext_image.py +0 -189
  167. google/genai/tests/models/test_segment_image.py +0 -148
  168. google/genai/tests/models/test_update.py +0 -95
  169. google/genai/tests/models/test_upscale_image.py +0 -157
  170. google/genai/tests/operations/__init__.py +0 -17
  171. google/genai/tests/operations/test_get.py +0 -38
  172. google/genai/tests/public_samples/__init__.py +0 -17
  173. google/genai/tests/public_samples/test_gemini_text_only.py +0 -34
  174. google/genai/tests/pytest_helper.py +0 -229
  175. google/genai/tests/shared/__init__.py +0 -16
  176. google/genai/tests/shared/batches/__init__.py +0 -14
  177. google/genai/tests/shared/batches/test_create_delete.py +0 -57
  178. google/genai/tests/shared/batches/test_create_get_cancel.py +0 -56
  179. google/genai/tests/shared/batches/test_list.py +0 -40
  180. google/genai/tests/shared/caches/__init__.py +0 -14
  181. google/genai/tests/shared/caches/test_create_get_delete.py +0 -67
  182. google/genai/tests/shared/caches/test_create_update_get.py +0 -71
  183. google/genai/tests/shared/caches/test_list.py +0 -40
  184. google/genai/tests/shared/chats/__init__.py +0 -14
  185. google/genai/tests/shared/chats/test_send_message.py +0 -48
  186. google/genai/tests/shared/chats/test_send_message_stream.py +0 -50
  187. google/genai/tests/shared/files/__init__.py +0 -14
  188. google/genai/tests/shared/files/test_list.py +0 -41
  189. google/genai/tests/shared/files/test_upload_get_delete.py +0 -54
  190. google/genai/tests/shared/models/__init__.py +0 -14
  191. google/genai/tests/shared/models/test_compute_tokens.py +0 -41
  192. google/genai/tests/shared/models/test_count_tokens.py +0 -40
  193. google/genai/tests/shared/models/test_edit_image.py +0 -67
  194. google/genai/tests/shared/models/test_embed.py +0 -40
  195. google/genai/tests/shared/models/test_generate_content.py +0 -39
  196. google/genai/tests/shared/models/test_generate_content_stream.py +0 -54
  197. google/genai/tests/shared/models/test_generate_images.py +0 -40
  198. google/genai/tests/shared/models/test_generate_videos.py +0 -38
  199. google/genai/tests/shared/models/test_list.py +0 -37
  200. google/genai/tests/shared/models/test_recontext_image.py +0 -55
  201. google/genai/tests/shared/models/test_segment_image.py +0 -52
  202. google/genai/tests/shared/models/test_upscale_image.py +0 -52
  203. google/genai/tests/shared/tunings/__init__.py +0 -16
  204. google/genai/tests/shared/tunings/test_create.py +0 -46
  205. google/genai/tests/shared/tunings/test_create_get_cancel.py +0 -56
  206. google/genai/tests/shared/tunings/test_list.py +0 -39
  207. google/genai/tests/tokens/__init__.py +0 -16
  208. google/genai/tests/tokens/test_create.py +0 -154
  209. google/genai/tests/transformers/__init__.py +0 -17
  210. google/genai/tests/transformers/test_blobs.py +0 -71
  211. google/genai/tests/transformers/test_bytes.py +0 -15
  212. google/genai/tests/transformers/test_duck_type.py +0 -96
  213. google/genai/tests/transformers/test_function_responses.py +0 -72
  214. google/genai/tests/transformers/test_schema.py +0 -653
  215. google/genai/tests/transformers/test_t_batch.py +0 -286
  216. google/genai/tests/transformers/test_t_content.py +0 -160
  217. google/genai/tests/transformers/test_t_contents.py +0 -398
  218. google/genai/tests/transformers/test_t_part.py +0 -85
  219. google/genai/tests/transformers/test_t_parts.py +0 -87
  220. google/genai/tests/transformers/test_t_tool.py +0 -157
  221. google/genai/tests/transformers/test_t_tools.py +0 -195
  222. google/genai/tests/tunings/__init__.py +0 -16
  223. google/genai/tests/tunings/test_cancel.py +0 -39
  224. google/genai/tests/tunings/test_end_to_end.py +0 -106
  225. google/genai/tests/tunings/test_get.py +0 -67
  226. google/genai/tests/tunings/test_list.py +0 -75
  227. google/genai/tests/tunings/test_tune.py +0 -268
  228. google/genai/tests/types/__init__.py +0 -16
  229. google/genai/tests/types/test_bytes_internal.py +0 -271
  230. google/genai/tests/types/test_bytes_type.py +0 -152
  231. google/genai/tests/types/test_future.py +0 -101
  232. google/genai/tests/types/test_optional_types.py +0 -36
  233. google/genai/tests/types/test_part_type.py +0 -616
  234. google/genai/tests/types/test_schema_from_json_schema.py +0 -417
  235. google/genai/tests/types/test_schema_json_schema.py +0 -468
  236. google/genai/tests/types/test_types.py +0 -2903
  237. google_genai-1.55.0.dist-info/RECORD +0 -345
  238. /google/genai/{tests/interactions/__init__.py → _interactions/py.typed} +0 -0
  239. {google_genai-1.55.0.dist-info → google_genai-1.56.0.dist-info}/WHEEL +0 -0
  240. {google_genai-1.55.0.dist-info → google_genai-1.56.0.dist-info}/licenses/LICENSE +0 -0
  241. {google_genai-1.55.0.dist-info → google_genai-1.56.0.dist-info}/top_level.txt +0 -0
@@ -1,120 +0,0 @@
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
@@ -1,159 +0,0 @@
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
- )
@@ -1,107 +0,0 @@
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)
@@ -1,264 +0,0 @@
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