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.
Files changed (324) hide show
  1. google/genai/__init__.py +1 -0
  2. google/genai/_api_client.py +6 -6
  3. google/genai/_interactions/__init__.py +117 -0
  4. google/genai/_interactions/_base_client.py +2019 -0
  5. google/genai/_interactions/_client.py +511 -0
  6. google/genai/_interactions/_compat.py +234 -0
  7. google/genai/_interactions/_constants.py +29 -0
  8. google/genai/_interactions/_exceptions.py +122 -0
  9. google/genai/_interactions/_files.py +139 -0
  10. google/genai/_interactions/_models.py +873 -0
  11. google/genai/_interactions/_qs.py +165 -0
  12. google/genai/_interactions/_resource.py +58 -0
  13. google/genai/_interactions/_response.py +847 -0
  14. google/genai/_interactions/_streaming.py +354 -0
  15. google/genai/_interactions/_types.py +276 -0
  16. google/genai/_interactions/_utils/__init__.py +79 -0
  17. google/genai/_interactions/_utils/_compat.py +61 -0
  18. google/genai/_interactions/_utils/_datetime_parse.py +151 -0
  19. google/genai/_interactions/_utils/_logs.py +40 -0
  20. google/genai/_interactions/_utils/_proxy.py +80 -0
  21. google/genai/_interactions/_utils/_reflection.py +57 -0
  22. google/genai/_interactions/_utils/_resources_proxy.py +39 -0
  23. google/genai/_interactions/_utils/_streams.py +27 -0
  24. google/genai/_interactions/_utils/_sync.py +73 -0
  25. google/genai/_interactions/_utils/_transform.py +472 -0
  26. google/genai/_interactions/_utils/_typing.py +172 -0
  27. google/genai/_interactions/_utils/_utils.py +437 -0
  28. google/genai/_interactions/_version.py +18 -0
  29. google/genai/_interactions/resources/__init__.py +34 -0
  30. google/genai/_interactions/resources/interactions.py +1350 -0
  31. google/genai/_interactions/types/__init__.py +107 -0
  32. google/genai/_interactions/types/allowed_tools.py +33 -0
  33. google/genai/_interactions/types/allowed_tools_param.py +35 -0
  34. google/genai/_interactions/types/annotation.py +42 -0
  35. google/genai/_interactions/types/annotation_param.py +42 -0
  36. google/genai/_interactions/types/audio_content.py +38 -0
  37. google/genai/_interactions/types/audio_content_param.py +45 -0
  38. google/genai/_interactions/types/audio_mime_type.py +25 -0
  39. google/genai/_interactions/types/audio_mime_type_param.py +27 -0
  40. google/genai/_interactions/types/code_execution_call_arguments.py +33 -0
  41. google/genai/_interactions/types/code_execution_call_arguments_param.py +32 -0
  42. google/genai/_interactions/types/code_execution_call_content.py +37 -0
  43. google/genai/_interactions/types/code_execution_call_content_param.py +37 -0
  44. google/genai/_interactions/types/code_execution_result_content.py +42 -0
  45. google/genai/_interactions/types/code_execution_result_content_param.py +41 -0
  46. google/genai/_interactions/types/content_delta.py +358 -0
  47. google/genai/_interactions/types/content_start.py +79 -0
  48. google/genai/_interactions/types/content_stop.py +35 -0
  49. google/genai/_interactions/types/deep_research_agent_config.py +33 -0
  50. google/genai/_interactions/types/deep_research_agent_config_param.py +32 -0
  51. google/genai/_interactions/types/document_content.py +36 -0
  52. google/genai/_interactions/types/document_content_param.py +43 -0
  53. google/genai/_interactions/types/dynamic_agent_config.py +44 -0
  54. google/genai/_interactions/types/dynamic_agent_config_param.py +33 -0
  55. google/genai/_interactions/types/error_event.py +46 -0
  56. google/genai/_interactions/types/file_search_result_content.py +46 -0
  57. google/genai/_interactions/types/file_search_result_content_param.py +46 -0
  58. google/genai/_interactions/types/function.py +38 -0
  59. google/genai/_interactions/types/function_call_content.py +39 -0
  60. google/genai/_interactions/types/function_call_content_param.py +39 -0
  61. google/genai/_interactions/types/function_param.py +37 -0
  62. google/genai/_interactions/types/function_result_content.py +52 -0
  63. google/genai/_interactions/types/function_result_content_param.py +54 -0
  64. google/genai/_interactions/types/generation_config.py +57 -0
  65. google/genai/_interactions/types/generation_config_param.py +59 -0
  66. google/genai/_interactions/types/google_search_call_arguments.py +29 -0
  67. google/genai/_interactions/types/google_search_call_arguments_param.py +31 -0
  68. google/genai/_interactions/types/google_search_call_content.py +37 -0
  69. google/genai/_interactions/types/google_search_call_content_param.py +37 -0
  70. google/genai/_interactions/types/google_search_result.py +35 -0
  71. google/genai/_interactions/types/google_search_result_content.py +43 -0
  72. google/genai/_interactions/types/google_search_result_content_param.py +44 -0
  73. google/genai/_interactions/types/google_search_result_param.py +35 -0
  74. google/genai/_interactions/types/image_content.py +41 -0
  75. google/genai/_interactions/types/image_content_param.py +48 -0
  76. google/genai/_interactions/types/image_mime_type.py +23 -0
  77. google/genai/_interactions/types/image_mime_type_param.py +25 -0
  78. google/genai/_interactions/types/interaction.py +165 -0
  79. google/genai/_interactions/types/interaction_create_params.py +212 -0
  80. google/genai/_interactions/types/interaction_event.py +37 -0
  81. google/genai/_interactions/types/interaction_get_params.py +46 -0
  82. google/genai/_interactions/types/interaction_sse_event.py +32 -0
  83. google/genai/_interactions/types/interaction_status_update.py +37 -0
  84. google/genai/_interactions/types/mcp_server_tool_call_content.py +42 -0
  85. google/genai/_interactions/types/mcp_server_tool_call_content_param.py +42 -0
  86. google/genai/_interactions/types/mcp_server_tool_result_content.py +52 -0
  87. google/genai/_interactions/types/mcp_server_tool_result_content_param.py +54 -0
  88. google/genai/_interactions/types/model.py +36 -0
  89. google/genai/_interactions/types/model_param.py +38 -0
  90. google/genai/_interactions/types/speech_config.py +35 -0
  91. google/genai/_interactions/types/speech_config_param.py +35 -0
  92. google/genai/_interactions/types/text_content.py +37 -0
  93. google/genai/_interactions/types/text_content_param.py +38 -0
  94. google/genai/_interactions/types/thinking_level.py +22 -0
  95. google/genai/_interactions/types/thought_content.py +41 -0
  96. google/genai/_interactions/types/thought_content_param.py +47 -0
  97. google/genai/_interactions/types/tool.py +100 -0
  98. google/genai/_interactions/types/tool_choice.py +26 -0
  99. google/genai/_interactions/types/tool_choice_config.py +28 -0
  100. google/genai/_interactions/types/tool_choice_config_param.py +29 -0
  101. google/genai/_interactions/types/tool_choice_param.py +28 -0
  102. google/genai/_interactions/types/tool_choice_type.py +22 -0
  103. google/genai/_interactions/types/tool_param.py +97 -0
  104. google/genai/_interactions/types/turn.py +76 -0
  105. google/genai/_interactions/types/turn_param.py +73 -0
  106. google/genai/_interactions/types/url_context_call_arguments.py +29 -0
  107. google/genai/_interactions/types/url_context_call_arguments_param.py +31 -0
  108. google/genai/_interactions/types/url_context_call_content.py +37 -0
  109. google/genai/_interactions/types/url_context_call_content_param.py +37 -0
  110. google/genai/_interactions/types/url_context_result.py +33 -0
  111. google/genai/_interactions/types/url_context_result_content.py +43 -0
  112. google/genai/_interactions/types/url_context_result_content_param.py +44 -0
  113. google/genai/_interactions/types/url_context_result_param.py +32 -0
  114. google/genai/_interactions/types/usage.py +106 -0
  115. google/genai/_interactions/types/usage_param.py +106 -0
  116. google/genai/_interactions/types/video_content.py +41 -0
  117. google/genai/_interactions/types/video_content_param.py +48 -0
  118. google/genai/_interactions/types/video_mime_type.py +36 -0
  119. google/genai/_interactions/types/video_mime_type_param.py +38 -0
  120. google/genai/_live_converters.py +34 -3
  121. google/genai/_tokens_converters.py +5 -0
  122. google/genai/batches.py +62 -55
  123. google/genai/client.py +223 -0
  124. google/genai/errors.py +16 -1
  125. google/genai/file_search_stores.py +60 -60
  126. google/genai/files.py +56 -56
  127. google/genai/interactions.py +17 -0
  128. google/genai/live.py +4 -3
  129. google/genai/models.py +15 -3
  130. google/genai/tests/__init__.py +21 -0
  131. google/genai/tests/afc/__init__.py +21 -0
  132. google/genai/tests/afc/test_convert_if_exist_pydantic_model.py +309 -0
  133. google/genai/tests/afc/test_convert_number_values_for_function_call_args.py +63 -0
  134. google/genai/tests/afc/test_find_afc_incompatible_tool_indexes.py +240 -0
  135. google/genai/tests/afc/test_generate_content_stream_afc.py +530 -0
  136. google/genai/tests/afc/test_generate_content_stream_afc_thoughts.py +77 -0
  137. google/genai/tests/afc/test_get_function_map.py +176 -0
  138. google/genai/tests/afc/test_get_function_response_parts.py +277 -0
  139. google/genai/tests/afc/test_get_max_remote_calls_for_afc.py +130 -0
  140. google/genai/tests/afc/test_invoke_function_from_dict_args.py +241 -0
  141. google/genai/tests/afc/test_raise_error_for_afc_incompatible_config.py +159 -0
  142. google/genai/tests/afc/test_should_append_afc_history.py +53 -0
  143. google/genai/tests/afc/test_should_disable_afc.py +214 -0
  144. google/genai/tests/batches/__init__.py +17 -0
  145. google/genai/tests/batches/test_cancel.py +77 -0
  146. google/genai/tests/batches/test_create.py +78 -0
  147. google/genai/tests/batches/test_create_with_bigquery.py +113 -0
  148. google/genai/tests/batches/test_create_with_file.py +82 -0
  149. google/genai/tests/batches/test_create_with_gcs.py +125 -0
  150. google/genai/tests/batches/test_create_with_inlined_requests.py +255 -0
  151. google/genai/tests/batches/test_delete.py +86 -0
  152. google/genai/tests/batches/test_embedding.py +157 -0
  153. google/genai/tests/batches/test_get.py +78 -0
  154. google/genai/tests/batches/test_list.py +79 -0
  155. google/genai/tests/caches/__init__.py +17 -0
  156. google/genai/tests/caches/constants.py +29 -0
  157. google/genai/tests/caches/test_create.py +210 -0
  158. google/genai/tests/caches/test_create_custom_url.py +105 -0
  159. google/genai/tests/caches/test_delete.py +54 -0
  160. google/genai/tests/caches/test_delete_custom_url.py +52 -0
  161. google/genai/tests/caches/test_get.py +94 -0
  162. google/genai/tests/caches/test_get_custom_url.py +52 -0
  163. google/genai/tests/caches/test_list.py +68 -0
  164. google/genai/tests/caches/test_update.py +70 -0
  165. google/genai/tests/caches/test_update_custom_url.py +58 -0
  166. google/genai/tests/chats/__init__.py +1 -0
  167. google/genai/tests/chats/test_get_history.py +597 -0
  168. google/genai/tests/chats/test_send_message.py +844 -0
  169. google/genai/tests/chats/test_validate_response.py +90 -0
  170. google/genai/tests/client/__init__.py +17 -0
  171. google/genai/tests/client/test_async_stream.py +427 -0
  172. google/genai/tests/client/test_client_close.py +197 -0
  173. google/genai/tests/client/test_client_initialization.py +1687 -0
  174. google/genai/tests/client/test_client_requests.py +355 -0
  175. google/genai/tests/client/test_custom_client.py +77 -0
  176. google/genai/tests/client/test_http_options.py +178 -0
  177. google/genai/tests/client/test_replay_client_equality.py +168 -0
  178. google/genai/tests/client/test_retries.py +846 -0
  179. google/genai/tests/client/test_upload_errors.py +136 -0
  180. google/genai/tests/common/__init__.py +17 -0
  181. google/genai/tests/common/test_common.py +954 -0
  182. google/genai/tests/conftest.py +162 -0
  183. google/genai/tests/documents/__init__.py +17 -0
  184. google/genai/tests/documents/test_delete.py +51 -0
  185. google/genai/tests/documents/test_get.py +85 -0
  186. google/genai/tests/documents/test_list.py +72 -0
  187. google/genai/tests/errors/__init__.py +1 -0
  188. google/genai/tests/errors/test_api_error.py +417 -0
  189. google/genai/tests/file_search_stores/__init__.py +17 -0
  190. google/genai/tests/file_search_stores/test_create.py +66 -0
  191. google/genai/tests/file_search_stores/test_delete.py +64 -0
  192. google/genai/tests/file_search_stores/test_get.py +94 -0
  193. google/genai/tests/file_search_stores/test_import_file.py +112 -0
  194. google/genai/tests/file_search_stores/test_list.py +57 -0
  195. google/genai/tests/file_search_stores/test_upload_to_file_search_store.py +141 -0
  196. google/genai/tests/files/__init__.py +17 -0
  197. google/genai/tests/files/test_delete.py +46 -0
  198. google/genai/tests/files/test_download.py +85 -0
  199. google/genai/tests/files/test_get.py +46 -0
  200. google/genai/tests/files/test_list.py +72 -0
  201. google/genai/tests/files/test_upload.py +255 -0
  202. google/genai/tests/imports/test_no_optional_imports.py +28 -0
  203. google/genai/tests/interactions/__init__.py +0 -0
  204. google/genai/tests/interactions/test_integration.py +80 -0
  205. google/genai/tests/live/__init__.py +16 -0
  206. google/genai/tests/live/test_live.py +2177 -0
  207. google/genai/tests/live/test_live_music.py +362 -0
  208. google/genai/tests/live/test_live_response.py +163 -0
  209. google/genai/tests/live/test_send_client_content.py +147 -0
  210. google/genai/tests/live/test_send_realtime_input.py +268 -0
  211. google/genai/tests/live/test_send_tool_response.py +222 -0
  212. google/genai/tests/local_tokenizer/__init__.py +17 -0
  213. google/genai/tests/local_tokenizer/test_local_tokenizer.py +343 -0
  214. google/genai/tests/local_tokenizer/test_local_tokenizer_loader.py +235 -0
  215. google/genai/tests/mcp/__init__.py +17 -0
  216. google/genai/tests/mcp/test_has_mcp_tool_usage.py +89 -0
  217. google/genai/tests/mcp/test_mcp_to_gemini_tools.py +191 -0
  218. google/genai/tests/mcp/test_parse_config_for_mcp_sessions.py +201 -0
  219. google/genai/tests/mcp/test_parse_config_for_mcp_usage.py +130 -0
  220. google/genai/tests/mcp/test_set_mcp_usage_header.py +72 -0
  221. google/genai/tests/models/__init__.py +17 -0
  222. google/genai/tests/models/constants.py +8 -0
  223. google/genai/tests/models/test_compute_tokens.py +120 -0
  224. google/genai/tests/models/test_count_tokens.py +159 -0
  225. google/genai/tests/models/test_delete.py +107 -0
  226. google/genai/tests/models/test_edit_image.py +264 -0
  227. google/genai/tests/models/test_embed_content.py +94 -0
  228. google/genai/tests/models/test_function_call_streaming.py +442 -0
  229. google/genai/tests/models/test_generate_content.py +2502 -0
  230. google/genai/tests/models/test_generate_content_cached_content.py +132 -0
  231. google/genai/tests/models/test_generate_content_config_zero_value.py +103 -0
  232. google/genai/tests/models/test_generate_content_from_apikey.py +44 -0
  233. google/genai/tests/models/test_generate_content_http_options.py +40 -0
  234. google/genai/tests/models/test_generate_content_image_generation.py +143 -0
  235. google/genai/tests/models/test_generate_content_mcp.py +343 -0
  236. google/genai/tests/models/test_generate_content_media_resolution.py +97 -0
  237. google/genai/tests/models/test_generate_content_model.py +139 -0
  238. google/genai/tests/models/test_generate_content_part.py +821 -0
  239. google/genai/tests/models/test_generate_content_thought.py +76 -0
  240. google/genai/tests/models/test_generate_content_tools.py +1761 -0
  241. google/genai/tests/models/test_generate_images.py +191 -0
  242. google/genai/tests/models/test_generate_videos.py +759 -0
  243. google/genai/tests/models/test_get.py +104 -0
  244. google/genai/tests/models/test_list.py +233 -0
  245. google/genai/tests/models/test_recontext_image.py +189 -0
  246. google/genai/tests/models/test_segment_image.py +148 -0
  247. google/genai/tests/models/test_update.py +95 -0
  248. google/genai/tests/models/test_upscale_image.py +157 -0
  249. google/genai/tests/operations/__init__.py +17 -0
  250. google/genai/tests/operations/test_get.py +38 -0
  251. google/genai/tests/public_samples/__init__.py +17 -0
  252. google/genai/tests/public_samples/test_gemini_text_only.py +34 -0
  253. google/genai/tests/pytest_helper.py +229 -0
  254. google/genai/tests/shared/__init__.py +16 -0
  255. google/genai/tests/shared/batches/__init__.py +14 -0
  256. google/genai/tests/shared/batches/test_create_delete.py +57 -0
  257. google/genai/tests/shared/batches/test_create_get_cancel.py +56 -0
  258. google/genai/tests/shared/batches/test_list.py +40 -0
  259. google/genai/tests/shared/caches/__init__.py +14 -0
  260. google/genai/tests/shared/caches/test_create_get_delete.py +67 -0
  261. google/genai/tests/shared/caches/test_create_update_get.py +71 -0
  262. google/genai/tests/shared/caches/test_list.py +40 -0
  263. google/genai/tests/shared/chats/__init__.py +14 -0
  264. google/genai/tests/shared/chats/test_send_message.py +48 -0
  265. google/genai/tests/shared/chats/test_send_message_stream.py +50 -0
  266. google/genai/tests/shared/files/__init__.py +14 -0
  267. google/genai/tests/shared/files/test_list.py +41 -0
  268. google/genai/tests/shared/files/test_upload_get_delete.py +54 -0
  269. google/genai/tests/shared/models/__init__.py +14 -0
  270. google/genai/tests/shared/models/test_compute_tokens.py +41 -0
  271. google/genai/tests/shared/models/test_count_tokens.py +40 -0
  272. google/genai/tests/shared/models/test_edit_image.py +67 -0
  273. google/genai/tests/shared/models/test_embed.py +40 -0
  274. google/genai/tests/shared/models/test_generate_content.py +39 -0
  275. google/genai/tests/shared/models/test_generate_content_stream.py +54 -0
  276. google/genai/tests/shared/models/test_generate_images.py +40 -0
  277. google/genai/tests/shared/models/test_generate_videos.py +38 -0
  278. google/genai/tests/shared/models/test_list.py +37 -0
  279. google/genai/tests/shared/models/test_recontext_image.py +55 -0
  280. google/genai/tests/shared/models/test_segment_image.py +52 -0
  281. google/genai/tests/shared/models/test_upscale_image.py +52 -0
  282. google/genai/tests/shared/tunings/__init__.py +16 -0
  283. google/genai/tests/shared/tunings/test_create.py +46 -0
  284. google/genai/tests/shared/tunings/test_create_get_cancel.py +56 -0
  285. google/genai/tests/shared/tunings/test_list.py +39 -0
  286. google/genai/tests/tokens/__init__.py +16 -0
  287. google/genai/tests/tokens/test_create.py +154 -0
  288. google/genai/tests/transformers/__init__.py +17 -0
  289. google/genai/tests/transformers/test_blobs.py +71 -0
  290. google/genai/tests/transformers/test_bytes.py +15 -0
  291. google/genai/tests/transformers/test_duck_type.py +96 -0
  292. google/genai/tests/transformers/test_function_responses.py +72 -0
  293. google/genai/tests/transformers/test_schema.py +653 -0
  294. google/genai/tests/transformers/test_t_batch.py +286 -0
  295. google/genai/tests/transformers/test_t_content.py +160 -0
  296. google/genai/tests/transformers/test_t_contents.py +398 -0
  297. google/genai/tests/transformers/test_t_part.py +85 -0
  298. google/genai/tests/transformers/test_t_parts.py +87 -0
  299. google/genai/tests/transformers/test_t_tool.py +157 -0
  300. google/genai/tests/transformers/test_t_tools.py +195 -0
  301. google/genai/tests/tunings/__init__.py +16 -0
  302. google/genai/tests/tunings/test_cancel.py +39 -0
  303. google/genai/tests/tunings/test_end_to_end.py +106 -0
  304. google/genai/tests/tunings/test_get.py +67 -0
  305. google/genai/tests/tunings/test_list.py +75 -0
  306. google/genai/tests/tunings/test_tune.py +268 -0
  307. google/genai/tests/types/__init__.py +16 -0
  308. google/genai/tests/types/test_bytes_internal.py +271 -0
  309. google/genai/tests/types/test_bytes_type.py +152 -0
  310. google/genai/tests/types/test_future.py +101 -0
  311. google/genai/tests/types/test_optional_types.py +36 -0
  312. google/genai/tests/types/test_part_type.py +616 -0
  313. google/genai/tests/types/test_schema_from_json_schema.py +417 -0
  314. google/genai/tests/types/test_schema_json_schema.py +468 -0
  315. google/genai/tests/types/test_types.py +2903 -0
  316. google/genai/tunings.py +57 -57
  317. google/genai/types.py +229 -121
  318. google/genai/version.py +1 -1
  319. {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/METADATA +4 -2
  320. google_genai-1.55.0.dist-info/RECORD +345 -0
  321. google_genai-1.53.0.dist-info/RECORD +0 -41
  322. {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/WHEEL +0 -0
  323. {google_genai-1.53.0.dist-info → google_genai-1.55.0.dist-info}/licenses/LICENSE +0 -0
  324. {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