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,36 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
17
+
18
+ from typing import Union
19
+ from typing_extensions import Literal, TypeAlias
20
+
21
+ __all__ = ["VideoMimeType"]
22
+
23
+ VideoMimeType: TypeAlias = Union[
24
+ Literal[
25
+ "video/mp4",
26
+ "video/mpeg",
27
+ "video/mov",
28
+ "video/avi",
29
+ "video/x-flv",
30
+ "video/mpg",
31
+ "video/webm",
32
+ "video/wmv",
33
+ "video/3gpp",
34
+ ],
35
+ str,
36
+ ]
@@ -0,0 +1,38 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
17
+
18
+ from __future__ import annotations
19
+
20
+ from typing import Union
21
+ from typing_extensions import Literal, TypeAlias
22
+
23
+ __all__ = ["VideoMimeTypeParam"]
24
+
25
+ VideoMimeTypeParam: TypeAlias = Union[
26
+ Literal[
27
+ "video/mp4",
28
+ "video/mpeg",
29
+ "video/mov",
30
+ "video/avi",
31
+ "video/x-flv",
32
+ "video/mpg",
33
+ "video/webm",
34
+ "video/wmv",
35
+ "video/3gpp",
36
+ ],
37
+ str,
38
+ ]
@@ -534,6 +534,11 @@ def _LiveClientSetup_to_mldev(
534
534
  if getv(from_object, ['proactivity']) is not None:
535
535
  setv(to_object, ['proactivity'], getv(from_object, ['proactivity']))
536
536
 
537
+ if getv(from_object, ['explicit_vad_signal']) is not None:
538
+ raise ValueError(
539
+ 'explicit_vad_signal parameter is not supported in Gemini API.'
540
+ )
541
+
537
542
  return to_object
538
543
 
539
544
 
@@ -603,6 +608,13 @@ def _LiveClientSetup_to_vertex(
603
608
  if getv(from_object, ['proactivity']) is not None:
604
609
  setv(to_object, ['proactivity'], getv(from_object, ['proactivity']))
605
610
 
611
+ if getv(from_object, ['explicit_vad_signal']) is not None:
612
+ setv(
613
+ to_object,
614
+ ['explicitVadSignal'],
615
+ getv(from_object, ['explicit_vad_signal']),
616
+ )
617
+
606
618
  return to_object
607
619
 
608
620
 
@@ -753,6 +765,11 @@ def _LiveConnectConfig_to_mldev(
753
765
  getv(from_object, ['proactivity']),
754
766
  )
755
767
 
768
+ if getv(from_object, ['explicit_vad_signal']) is not None:
769
+ raise ValueError(
770
+ 'explicit_vad_signal parameter is not supported in Gemini API.'
771
+ )
772
+
756
773
  return to_object
757
774
 
758
775
 
@@ -904,6 +921,13 @@ def _LiveConnectConfig_to_vertex(
904
921
  getv(from_object, ['proactivity']),
905
922
  )
906
923
 
924
+ if getv(from_object, ['explicit_vad_signal']) is not None:
925
+ setv(
926
+ parent_object,
927
+ ['setup', 'explicitVadSignal'],
928
+ getv(from_object, ['explicit_vad_signal']),
929
+ )
930
+
907
931
  return to_object
908
932
 
909
933
 
@@ -1176,6 +1200,13 @@ def _LiveServerMessage_from_vertex(
1176
1200
  getv(from_object, ['sessionResumptionUpdate']),
1177
1201
  )
1178
1202
 
1203
+ if getv(from_object, ['voiceActivityDetectionSignal']) is not None:
1204
+ setv(
1205
+ to_object,
1206
+ ['voice_activity_detection_signal'],
1207
+ getv(from_object, ['voiceActivityDetectionSignal']),
1208
+ )
1209
+
1179
1210
  return to_object
1180
1211
 
1181
1212
 
@@ -1265,12 +1296,12 @@ def _SpeechConfig_to_vertex(
1265
1296
  parent_object: Optional[dict[str, Any]] = None,
1266
1297
  ) -> dict[str, Any]:
1267
1298
  to_object: dict[str, Any] = {}
1268
- if getv(from_object, ['language_code']) is not None:
1269
- setv(to_object, ['languageCode'], getv(from_object, ['language_code']))
1270
-
1271
1299
  if getv(from_object, ['voice_config']) is not None:
1272
1300
  setv(to_object, ['voiceConfig'], getv(from_object, ['voice_config']))
1273
1301
 
1302
+ if getv(from_object, ['language_code']) is not None:
1303
+ setv(to_object, ['languageCode'], getv(from_object, ['language_code']))
1304
+
1274
1305
  if getv(from_object, ['multi_speaker_voice_config']) is not None:
1275
1306
  raise ValueError(
1276
1307
  'multi_speaker_voice_config parameter is not supported in Vertex AI.'
@@ -355,6 +355,11 @@ def _LiveConnectConfig_to_mldev(
355
355
  getv(from_object, ['proactivity']),
356
356
  )
357
357
 
358
+ if getv(from_object, ['explicit_vad_signal']) is not None:
359
+ raise ValueError(
360
+ 'explicit_vad_signal parameter is not supported in Gemini API.'
361
+ )
362
+
358
363
  return to_object
359
364
 
360
365
 
google/genai/batches.py CHANGED
@@ -1006,6 +1006,13 @@ def _GenerateContentConfig_to_mldev(
1006
1006
  _ImageConfig_to_mldev(getv(from_object, ['image_config']), to_object),
1007
1007
  )
1008
1008
 
1009
+ if getv(from_object, ['enable_enhanced_civic_answers']) is not None:
1010
+ setv(
1011
+ to_object,
1012
+ ['enableEnhancedCivicAnswers'],
1013
+ getv(from_object, ['enable_enhanced_civic_answers']),
1014
+ )
1015
+
1009
1016
  return to_object
1010
1017
 
1011
1018
 
@@ -1902,34 +1909,6 @@ class Batches(_api_module.BaseModule):
1902
1909
  self._api_client._verify_response(return_value)
1903
1910
  return return_value
1904
1911
 
1905
- def list(
1906
- self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
1907
- ) -> Pager[types.BatchJob]:
1908
- """Lists batch jobs.
1909
-
1910
- Args:
1911
- config (ListBatchJobsConfig): Optional configuration for the list request.
1912
-
1913
- Returns:
1914
- A Pager object that contains one page of batch jobs. When iterating over
1915
- the pager, it automatically fetches the next page if there are more.
1916
-
1917
- Usage:
1918
-
1919
- .. code-block:: python
1920
- config = {'page_size': 10}
1921
- for batch_job in client.batches.list(config):
1922
- print(batch_job.name)
1923
- """
1924
-
1925
- list_request = self._list
1926
- return Pager(
1927
- 'batch_jobs',
1928
- list_request,
1929
- self._list(config=config),
1930
- config,
1931
- )
1932
-
1933
1912
  def create(
1934
1913
  self,
1935
1914
  *,
@@ -2025,6 +2004,34 @@ class Batches(_api_module.BaseModule):
2025
2004
  else:
2026
2005
  return self._create_embeddings(model=model, src=src, config=config)
2027
2006
 
2007
+ def list(
2008
+ self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
2009
+ ) -> Pager[types.BatchJob]:
2010
+ """Lists batch jobs.
2011
+
2012
+ Args:
2013
+ config (ListBatchJobsConfig): Optional configuration for the list request.
2014
+
2015
+ Returns:
2016
+ A Pager object that contains one page of batch jobs. When iterating over
2017
+ the pager, it automatically fetches the next page if there are more.
2018
+
2019
+ Usage:
2020
+
2021
+ .. code-block:: python
2022
+ config = {'page_size': 10}
2023
+ for batch_job in client.batches.list(config):
2024
+ print(batch_job.name)
2025
+ """
2026
+
2027
+ list_request = self._list
2028
+ return Pager(
2029
+ 'batch_jobs',
2030
+ list_request,
2031
+ self._list(config=config),
2032
+ config,
2033
+ )
2034
+
2028
2035
 
2029
2036
  class AsyncBatches(_api_module.BaseModule):
2030
2037
 
@@ -2451,33 +2458,6 @@ class AsyncBatches(_api_module.BaseModule):
2451
2458
  self._api_client._verify_response(return_value)
2452
2459
  return return_value
2453
2460
 
2454
- async def list(
2455
- self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
2456
- ) -> AsyncPager[types.BatchJob]:
2457
- """Lists batch jobs asynchronously.
2458
-
2459
- Args:
2460
- config (ListBatchJobsConfig): Optional configuration for the list request.
2461
-
2462
- Returns:
2463
- A Pager object that contains one page of batch jobs. When iterating over
2464
- the pager, it automatically fetches the next page if there are more.
2465
-
2466
- Usage:
2467
-
2468
- .. code-block:: python
2469
- async for batch_job in await client.aio.batches.list():
2470
- print(batch_job.name)
2471
- """
2472
-
2473
- list_request = self._list
2474
- return AsyncPager(
2475
- 'batch_jobs',
2476
- list_request,
2477
- await self._list(config=config),
2478
- config,
2479
- )
2480
-
2481
2461
  async def create(
2482
2462
  self,
2483
2463
  *,
@@ -2578,3 +2558,30 @@ class AsyncBatches(_api_module.BaseModule):
2578
2558
  raise ValueError('Vertex AI does not support batches.create_embeddings.')
2579
2559
  else:
2580
2560
  return await self._create_embeddings(model=model, src=src, config=config)
2561
+
2562
+ async def list(
2563
+ self, *, config: Optional[types.ListBatchJobsConfigOrDict] = None
2564
+ ) -> AsyncPager[types.BatchJob]:
2565
+ """Lists batch jobs asynchronously.
2566
+
2567
+ Args:
2568
+ config (ListBatchJobsConfig): Optional configuration for the list request.
2569
+
2570
+ Returns:
2571
+ A Pager object that contains one page of batch jobs. When iterating over
2572
+ the pager, it automatically fetches the next page if there are more.
2573
+
2574
+ Usage:
2575
+
2576
+ .. code-block:: python
2577
+ async for batch_job in await client.aio.batches.list():
2578
+ print(batch_job.name)
2579
+ """
2580
+
2581
+ list_request = self._list
2582
+ return AsyncPager(
2583
+ 'batch_jobs',
2584
+ list_request,
2585
+ await self._list(config=config),
2586
+ config,
2587
+ )
google/genai/client.py CHANGED
@@ -36,6 +36,20 @@ from .tokens import AsyncTokens, Tokens
36
36
  from .tunings import AsyncTunings, Tunings
37
37
  from .types import HttpOptions, HttpOptionsDict, HttpRetryOptions
38
38
 
39
+ import warnings
40
+ import httpx
41
+
42
+ from ._api_client import has_aiohttp
43
+
44
+ from . import _common
45
+
46
+ from ._interactions import AsyncGeminiNextGenAPIClient, DEFAULT_MAX_RETRIES, DefaultAioHttpClient, GeminiNextGenAPIClient
47
+ from ._interactions._models import FinalRequestOptions
48
+ from ._interactions._types import Headers
49
+ from ._interactions._utils import is_given
50
+ from ._interactions.resources import AsyncInteractionsResource as AsyncNextGenInteractionsResource, InteractionsResource as NextGenInteractionsResource
51
+ _interactions_experimental_warned = False
52
+
39
53
 
40
54
  class AsyncClient:
41
55
  """Client for making asynchronous (non-blocking) requests."""
@@ -52,6 +66,113 @@ class AsyncClient:
52
66
  self._live = AsyncLive(self._api_client)
53
67
  self._tokens = AsyncTokens(self._api_client)
54
68
  self._operations = AsyncOperations(self._api_client)
69
+ self._nextgen_client_instance: Optional[AsyncGeminiNextGenAPIClient] = None
70
+
71
+ @property
72
+ def _nextgen_client(self) -> AsyncGeminiNextGenAPIClient:
73
+ if self._nextgen_client_instance is not None:
74
+ return self._nextgen_client_instance
75
+
76
+ http_opts = self._api_client._http_options
77
+
78
+ if http_opts.extra_body:
79
+ warnings.warn(
80
+ 'extra_body properties are not supported in `.interactions` yet',
81
+ category=UserWarning,
82
+ stacklevel=5,
83
+ )
84
+
85
+ retry_opts = http_opts.retry_options
86
+ if retry_opts is not None and (
87
+ retry_opts.initial_delay is not None
88
+ or retry_opts.max_delay is not None
89
+ or retry_opts.exp_base is not None
90
+ or retry_opts.jitter is not None
91
+ or retry_opts.http_status_codes is not None
92
+ ):
93
+ warnings.warn(
94
+ 'Granular retry options are not supported in `.interactions` yet',
95
+ category=UserWarning,
96
+ stacklevel=5,
97
+ )
98
+
99
+ http_client: httpx.AsyncClient = self._api_client._async_httpx_client
100
+
101
+ async_client_args = self._api_client._http_options.async_client_args or {}
102
+ has_custom_transport = 'transport' in async_client_args
103
+
104
+ if has_aiohttp and not has_custom_transport:
105
+ warnings.warn(
106
+ 'Async interactions client cannot use aiohttp, fallingback to httpx.',
107
+ category=UserWarning,
108
+ stacklevel=5,
109
+ )
110
+
111
+ if retry_opts is not None and retry_opts.attempts is not None:
112
+ max_retries = retry_opts.attempts
113
+ else:
114
+ max_retries = DEFAULT_MAX_RETRIES + 1
115
+
116
+ self._nextgen_client_instance = AsyncGeminiNextGenAPIClient(
117
+ base_url=http_opts.base_url,
118
+ api_key=self._api_client.api_key,
119
+ default_headers=http_opts.headers,
120
+ http_client=http_client,
121
+ # uSDk expects ms, nextgen uses a httpx Timeout -> expects seconds.
122
+ timeout=http_opts.timeout / 1000 if http_opts.timeout else None,
123
+ max_retries=max_retries,
124
+ )
125
+
126
+ client = self._nextgen_client_instance
127
+ if self._api_client.vertexai:
128
+ client._is_vertex = True
129
+ client._vertex_project = self._api_client.project
130
+ client._vertex_location = self._api_client.location
131
+
132
+ async def prepare_options(options: FinalRequestOptions) -> FinalRequestOptions:
133
+ headers = {}
134
+ if is_given(options.headers):
135
+ headers = {**options.headers}
136
+
137
+ headers['Authorization'] = f'Bearer {await self._api_client._async_access_token()}'
138
+ if (
139
+ self._api_client._credentials
140
+ and self._api_client._credentials.quota_project_id
141
+ ):
142
+ headers['x-goog-user-project'] = (
143
+ self._api_client._credentials.quota_project_id
144
+ )
145
+ options.headers = headers
146
+
147
+ return options
148
+
149
+ if self._api_client.project or self._api_client.location:
150
+ client._prepare_options = prepare_options # type: ignore[method-assign]
151
+
152
+ def validate_headers(headers: Headers, custom_headers: Headers) -> None:
153
+ return
154
+
155
+ client._validate_headers = validate_headers # type: ignore[method-assign]
156
+ return self._nextgen_client_instance
157
+
158
+ @property
159
+ def interactions(self) -> AsyncNextGenInteractionsResource:
160
+ global _interactions_experimental_warned
161
+ if not _interactions_experimental_warned:
162
+ _interactions_experimental_warned = True
163
+ warnings.warn(
164
+ 'Interactions usage is experimental and may change in future versions.',
165
+ category=UserWarning,
166
+ stacklevel=1,
167
+ )
168
+ return self._nextgen_client.interactions
169
+
170
+ @property
171
+ def _has_nextgen_client(self) -> bool:
172
+ return (
173
+ hasattr(self, '_nextgen_client_instance') and
174
+ self._nextgen_client_instance is not None
175
+ )
55
176
 
56
177
  @property
57
178
  def models(self) -> AsyncModels:
@@ -120,6 +241,9 @@ class AsyncClient:
120
241
  """
121
242
  await self._api_client.aclose()
122
243
 
244
+ if self._has_nextgen_client:
245
+ await self._nextgen_client.close()
246
+
123
247
  async def __aenter__(self) -> 'AsyncClient':
124
248
  return self
125
249
 
@@ -287,6 +411,7 @@ class Client:
287
411
  self._files = Files(self._api_client)
288
412
  self._tokens = Tokens(self._api_client)
289
413
  self._operations = Operations(self._api_client)
414
+ self._nextgen_client_instance: Optional[GeminiNextGenAPIClient] = None
290
415
 
291
416
  @staticmethod
292
417
  def _get_api_client(
@@ -324,6 +449,101 @@ class Client:
324
449
  http_options=http_options,
325
450
  )
326
451
 
452
+ @property
453
+ def _nextgen_client(self) -> GeminiNextGenAPIClient:
454
+ if self._nextgen_client_instance is not None:
455
+ return self._nextgen_client_instance
456
+
457
+ http_opts = self._api_client._http_options
458
+
459
+ if http_opts.extra_body:
460
+ warnings.warn(
461
+ 'extra_body properties are not supported in `.interactions` yet',
462
+ category=UserWarning,
463
+ stacklevel=5,
464
+ )
465
+
466
+ retry_opts = http_opts.retry_options
467
+ if retry_opts is not None and (
468
+ retry_opts.initial_delay is not None
469
+ or retry_opts.max_delay is not None
470
+ or retry_opts.exp_base is not None
471
+ or retry_opts.jitter is not None
472
+ or retry_opts.http_status_codes is not None
473
+ ):
474
+ warnings.warn(
475
+ 'Granular retry options are not supported in `.interactions` yet',
476
+ category=UserWarning,
477
+ stacklevel=5,
478
+ )
479
+
480
+ if retry_opts is not None and retry_opts.attempts is not None:
481
+ max_retries = retry_opts.attempts
482
+ else:
483
+ max_retries = DEFAULT_MAX_RETRIES + 1
484
+
485
+ self._nextgen_client_instance = GeminiNextGenAPIClient(
486
+ base_url=http_opts.base_url,
487
+ api_key=self._api_client.api_key,
488
+ default_headers=http_opts.headers,
489
+ http_client=self._api_client._httpx_client,
490
+ # uSDk expects ms, nextgen uses a httpx Timeout -> expects seconds.
491
+ timeout=http_opts.timeout / 1000 if http_opts.timeout else None,
492
+ max_retries=max_retries,
493
+ )
494
+
495
+ client = self._nextgen_client_instance
496
+ if self.vertexai:
497
+ client._is_vertex = True
498
+ client._vertex_project = self._api_client.project
499
+ client._vertex_location = self._api_client.location
500
+
501
+ def prepare_options(options: FinalRequestOptions) -> FinalRequestOptions:
502
+ headers = {}
503
+ if is_given(options.headers):
504
+ headers = {**options.headers}
505
+ options.headers = headers
506
+
507
+ headers['Authorization'] = f'Bearer {self._api_client._access_token()}'
508
+ if (
509
+ self._api_client._credentials
510
+ and self._api_client._credentials.quota_project_id
511
+ ):
512
+ headers['x-goog-user-project'] = (
513
+ self._api_client._credentials.quota_project_id
514
+ )
515
+
516
+ return options
517
+
518
+ if self._api_client.project or self._api_client.location:
519
+ client._prepare_options = prepare_options # type: ignore[method-assign]
520
+
521
+ def validate_headers(headers: Headers, custom_headers: Headers) -> None:
522
+ return
523
+
524
+ client._validate_headers = validate_headers # type: ignore[method-assign]
525
+
526
+ return self._nextgen_client_instance
527
+
528
+ @property
529
+ def interactions(self) -> NextGenInteractionsResource:
530
+ global _interactions_experimental_warned
531
+ if not _interactions_experimental_warned:
532
+ _interactions_experimental_warned = True
533
+ warnings.warn(
534
+ 'Interactions usage is experimental and may change in future versions.',
535
+ category=UserWarning,
536
+ stacklevel=2,
537
+ )
538
+ return self._nextgen_client.interactions
539
+
540
+ @property
541
+ def _has_nextgen_client(self) -> bool:
542
+ return (
543
+ hasattr(self, '_nextgen_client_instance') and
544
+ self._nextgen_client_instance is not None
545
+ )
546
+
327
547
  @property
328
548
  def chats(self) -> Chats:
329
549
  return Chats(modules=self.models)
@@ -396,6 +616,9 @@ class Client:
396
616
  """
397
617
  self._api_client.close()
398
618
 
619
+ if self._has_nextgen_client:
620
+ self._nextgen_client.close()
621
+
399
622
  def __enter__(self) -> 'Client':
400
623
  return self
401
624
 
google/genai/errors.py CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  """Error classes for the GenAI SDK."""
17
17
 
18
- from typing import Any, Optional, TYPE_CHECKING, Union
18
+ from typing import Any, Callable, Optional, TYPE_CHECKING, Union
19
19
  import httpx
20
20
  import json
21
21
  from . import _common
@@ -53,6 +53,21 @@ class APIError(Exception):
53
53
 
54
54
  super().__init__(f'{self.code} {self.status}. {self.details}')
55
55
 
56
+ def __reduce__(
57
+ self,
58
+ ) -> tuple[Callable[..., 'APIError'], tuple[dict[str, Any]]]:
59
+ """Returns a tuple that can be used to reconstruct the error for pickling."""
60
+ state = self.__dict__.copy()
61
+ return (self.__class__._rebuild, (state,))
62
+
63
+ @staticmethod
64
+ def _rebuild(state: dict[str, Any]) -> 'APIError':
65
+ """Rebuilds the error from the state."""
66
+ obj = APIError.__new__(APIError)
67
+ obj.__dict__.update(state)
68
+ Exception.__init__(obj, f'{obj.code} {obj.status}. {obj.details}')
69
+ return obj
70
+
56
71
  def _get_status(self, response_json: Any) -> Any:
57
72
  return response_json.get(
58
73
  'status', response_json.get('error', {}).get('status', None)