google-genai 1.54.0__py3-none-any.whl → 1.55.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. google/genai/__init__.py +1 -0
  2. google/genai/_interactions/__init__.py +117 -0
  3. google/genai/_interactions/_base_client.py +2019 -0
  4. google/genai/_interactions/_client.py +511 -0
  5. google/genai/_interactions/_compat.py +234 -0
  6. google/genai/_interactions/_constants.py +29 -0
  7. google/genai/_interactions/_exceptions.py +122 -0
  8. google/genai/_interactions/_files.py +139 -0
  9. google/genai/_interactions/_models.py +873 -0
  10. google/genai/_interactions/_qs.py +165 -0
  11. google/genai/_interactions/_resource.py +58 -0
  12. google/genai/_interactions/_response.py +847 -0
  13. google/genai/_interactions/_streaming.py +354 -0
  14. google/genai/_interactions/_types.py +276 -0
  15. google/genai/_interactions/_utils/__init__.py +79 -0
  16. google/genai/_interactions/_utils/_compat.py +61 -0
  17. google/genai/_interactions/_utils/_datetime_parse.py +151 -0
  18. google/genai/_interactions/_utils/_logs.py +40 -0
  19. google/genai/_interactions/_utils/_proxy.py +80 -0
  20. google/genai/_interactions/_utils/_reflection.py +57 -0
  21. google/genai/_interactions/_utils/_resources_proxy.py +39 -0
  22. google/genai/_interactions/_utils/_streams.py +27 -0
  23. google/genai/_interactions/_utils/_sync.py +73 -0
  24. google/genai/_interactions/_utils/_transform.py +472 -0
  25. google/genai/_interactions/_utils/_typing.py +172 -0
  26. google/genai/_interactions/_utils/_utils.py +437 -0
  27. google/genai/_interactions/_version.py +18 -0
  28. google/genai/_interactions/resources/__init__.py +34 -0
  29. google/genai/_interactions/resources/interactions.py +1350 -0
  30. google/genai/_interactions/types/__init__.py +107 -0
  31. google/genai/_interactions/types/allowed_tools.py +33 -0
  32. google/genai/_interactions/types/allowed_tools_param.py +35 -0
  33. google/genai/_interactions/types/annotation.py +42 -0
  34. google/genai/_interactions/types/annotation_param.py +42 -0
  35. google/genai/_interactions/types/audio_content.py +38 -0
  36. google/genai/_interactions/types/audio_content_param.py +45 -0
  37. google/genai/_interactions/types/audio_mime_type.py +25 -0
  38. google/genai/_interactions/types/audio_mime_type_param.py +27 -0
  39. google/genai/_interactions/types/code_execution_call_arguments.py +33 -0
  40. google/genai/_interactions/types/code_execution_call_arguments_param.py +32 -0
  41. google/genai/_interactions/types/code_execution_call_content.py +37 -0
  42. google/genai/_interactions/types/code_execution_call_content_param.py +37 -0
  43. google/genai/_interactions/types/code_execution_result_content.py +42 -0
  44. google/genai/_interactions/types/code_execution_result_content_param.py +41 -0
  45. google/genai/_interactions/types/content_delta.py +358 -0
  46. google/genai/_interactions/types/content_start.py +79 -0
  47. google/genai/_interactions/types/content_stop.py +35 -0
  48. google/genai/_interactions/types/deep_research_agent_config.py +33 -0
  49. google/genai/_interactions/types/deep_research_agent_config_param.py +32 -0
  50. google/genai/_interactions/types/document_content.py +36 -0
  51. google/genai/_interactions/types/document_content_param.py +43 -0
  52. google/genai/_interactions/types/dynamic_agent_config.py +44 -0
  53. google/genai/_interactions/types/dynamic_agent_config_param.py +33 -0
  54. google/genai/_interactions/types/error_event.py +46 -0
  55. google/genai/_interactions/types/file_search_result_content.py +46 -0
  56. google/genai/_interactions/types/file_search_result_content_param.py +46 -0
  57. google/genai/_interactions/types/function.py +38 -0
  58. google/genai/_interactions/types/function_call_content.py +39 -0
  59. google/genai/_interactions/types/function_call_content_param.py +39 -0
  60. google/genai/_interactions/types/function_param.py +37 -0
  61. google/genai/_interactions/types/function_result_content.py +52 -0
  62. google/genai/_interactions/types/function_result_content_param.py +54 -0
  63. google/genai/_interactions/types/generation_config.py +57 -0
  64. google/genai/_interactions/types/generation_config_param.py +59 -0
  65. google/genai/_interactions/types/google_search_call_arguments.py +29 -0
  66. google/genai/_interactions/types/google_search_call_arguments_param.py +31 -0
  67. google/genai/_interactions/types/google_search_call_content.py +37 -0
  68. google/genai/_interactions/types/google_search_call_content_param.py +37 -0
  69. google/genai/_interactions/types/google_search_result.py +35 -0
  70. google/genai/_interactions/types/google_search_result_content.py +43 -0
  71. google/genai/_interactions/types/google_search_result_content_param.py +44 -0
  72. google/genai/_interactions/types/google_search_result_param.py +35 -0
  73. google/genai/_interactions/types/image_content.py +41 -0
  74. google/genai/_interactions/types/image_content_param.py +48 -0
  75. google/genai/_interactions/types/image_mime_type.py +23 -0
  76. google/genai/_interactions/types/image_mime_type_param.py +25 -0
  77. google/genai/_interactions/types/interaction.py +165 -0
  78. google/genai/_interactions/types/interaction_create_params.py +212 -0
  79. google/genai/_interactions/types/interaction_event.py +37 -0
  80. google/genai/_interactions/types/interaction_get_params.py +46 -0
  81. google/genai/_interactions/types/interaction_sse_event.py +32 -0
  82. google/genai/_interactions/types/interaction_status_update.py +37 -0
  83. google/genai/_interactions/types/mcp_server_tool_call_content.py +42 -0
  84. google/genai/_interactions/types/mcp_server_tool_call_content_param.py +42 -0
  85. google/genai/_interactions/types/mcp_server_tool_result_content.py +52 -0
  86. google/genai/_interactions/types/mcp_server_tool_result_content_param.py +54 -0
  87. google/genai/_interactions/types/model.py +36 -0
  88. google/genai/_interactions/types/model_param.py +38 -0
  89. google/genai/_interactions/types/speech_config.py +35 -0
  90. google/genai/_interactions/types/speech_config_param.py +35 -0
  91. google/genai/_interactions/types/text_content.py +37 -0
  92. google/genai/_interactions/types/text_content_param.py +38 -0
  93. google/genai/_interactions/types/thinking_level.py +22 -0
  94. google/genai/_interactions/types/thought_content.py +41 -0
  95. google/genai/_interactions/types/thought_content_param.py +47 -0
  96. google/genai/_interactions/types/tool.py +100 -0
  97. google/genai/_interactions/types/tool_choice.py +26 -0
  98. google/genai/_interactions/types/tool_choice_config.py +28 -0
  99. google/genai/_interactions/types/tool_choice_config_param.py +29 -0
  100. google/genai/_interactions/types/tool_choice_param.py +28 -0
  101. google/genai/_interactions/types/tool_choice_type.py +22 -0
  102. google/genai/_interactions/types/tool_param.py +97 -0
  103. google/genai/_interactions/types/turn.py +76 -0
  104. google/genai/_interactions/types/turn_param.py +73 -0
  105. google/genai/_interactions/types/url_context_call_arguments.py +29 -0
  106. google/genai/_interactions/types/url_context_call_arguments_param.py +31 -0
  107. google/genai/_interactions/types/url_context_call_content.py +37 -0
  108. google/genai/_interactions/types/url_context_call_content_param.py +37 -0
  109. google/genai/_interactions/types/url_context_result.py +33 -0
  110. google/genai/_interactions/types/url_context_result_content.py +43 -0
  111. google/genai/_interactions/types/url_context_result_content_param.py +44 -0
  112. google/genai/_interactions/types/url_context_result_param.py +32 -0
  113. google/genai/_interactions/types/usage.py +106 -0
  114. google/genai/_interactions/types/usage_param.py +106 -0
  115. google/genai/_interactions/types/video_content.py +41 -0
  116. google/genai/_interactions/types/video_content_param.py +48 -0
  117. google/genai/_interactions/types/video_mime_type.py +36 -0
  118. google/genai/_interactions/types/video_mime_type_param.py +38 -0
  119. google/genai/_live_converters.py +31 -0
  120. google/genai/_tokens_converters.py +5 -0
  121. google/genai/batches.py +7 -0
  122. google/genai/client.py +223 -0
  123. google/genai/interactions.py +17 -0
  124. google/genai/live.py +4 -3
  125. google/genai/models.py +12 -0
  126. google/genai/tests/__init__.py +21 -0
  127. google/genai/tests/afc/__init__.py +21 -0
  128. google/genai/tests/afc/test_convert_if_exist_pydantic_model.py +309 -0
  129. google/genai/tests/afc/test_convert_number_values_for_function_call_args.py +63 -0
  130. google/genai/tests/afc/test_find_afc_incompatible_tool_indexes.py +240 -0
  131. google/genai/tests/afc/test_generate_content_stream_afc.py +530 -0
  132. google/genai/tests/afc/test_generate_content_stream_afc_thoughts.py +77 -0
  133. google/genai/tests/afc/test_get_function_map.py +176 -0
  134. google/genai/tests/afc/test_get_function_response_parts.py +277 -0
  135. google/genai/tests/afc/test_get_max_remote_calls_for_afc.py +130 -0
  136. google/genai/tests/afc/test_invoke_function_from_dict_args.py +241 -0
  137. google/genai/tests/afc/test_raise_error_for_afc_incompatible_config.py +159 -0
  138. google/genai/tests/afc/test_should_append_afc_history.py +53 -0
  139. google/genai/tests/afc/test_should_disable_afc.py +214 -0
  140. google/genai/tests/batches/__init__.py +17 -0
  141. google/genai/tests/batches/test_cancel.py +77 -0
  142. google/genai/tests/batches/test_create.py +78 -0
  143. google/genai/tests/batches/test_create_with_bigquery.py +113 -0
  144. google/genai/tests/batches/test_create_with_file.py +82 -0
  145. google/genai/tests/batches/test_create_with_gcs.py +125 -0
  146. google/genai/tests/batches/test_create_with_inlined_requests.py +255 -0
  147. google/genai/tests/batches/test_delete.py +86 -0
  148. google/genai/tests/batches/test_embedding.py +157 -0
  149. google/genai/tests/batches/test_get.py +78 -0
  150. google/genai/tests/batches/test_list.py +79 -0
  151. google/genai/tests/caches/__init__.py +17 -0
  152. google/genai/tests/caches/constants.py +29 -0
  153. google/genai/tests/caches/test_create.py +210 -0
  154. google/genai/tests/caches/test_create_custom_url.py +105 -0
  155. google/genai/tests/caches/test_delete.py +54 -0
  156. google/genai/tests/caches/test_delete_custom_url.py +52 -0
  157. google/genai/tests/caches/test_get.py +94 -0
  158. google/genai/tests/caches/test_get_custom_url.py +52 -0
  159. google/genai/tests/caches/test_list.py +68 -0
  160. google/genai/tests/caches/test_update.py +70 -0
  161. google/genai/tests/caches/test_update_custom_url.py +58 -0
  162. google/genai/tests/chats/__init__.py +1 -0
  163. google/genai/tests/chats/test_get_history.py +597 -0
  164. google/genai/tests/chats/test_send_message.py +844 -0
  165. google/genai/tests/chats/test_validate_response.py +90 -0
  166. google/genai/tests/client/__init__.py +17 -0
  167. google/genai/tests/client/test_async_stream.py +427 -0
  168. google/genai/tests/client/test_client_close.py +197 -0
  169. google/genai/tests/client/test_client_initialization.py +1687 -0
  170. google/genai/tests/client/test_client_requests.py +355 -0
  171. google/genai/tests/client/test_custom_client.py +77 -0
  172. google/genai/tests/client/test_http_options.py +178 -0
  173. google/genai/tests/client/test_replay_client_equality.py +168 -0
  174. google/genai/tests/client/test_retries.py +846 -0
  175. google/genai/tests/client/test_upload_errors.py +136 -0
  176. google/genai/tests/common/__init__.py +17 -0
  177. google/genai/tests/common/test_common.py +954 -0
  178. google/genai/tests/conftest.py +162 -0
  179. google/genai/tests/documents/__init__.py +17 -0
  180. google/genai/tests/documents/test_delete.py +51 -0
  181. google/genai/tests/documents/test_get.py +85 -0
  182. google/genai/tests/documents/test_list.py +72 -0
  183. google/genai/tests/errors/__init__.py +1 -0
  184. google/genai/tests/errors/test_api_error.py +417 -0
  185. google/genai/tests/file_search_stores/__init__.py +17 -0
  186. google/genai/tests/file_search_stores/test_create.py +66 -0
  187. google/genai/tests/file_search_stores/test_delete.py +64 -0
  188. google/genai/tests/file_search_stores/test_get.py +94 -0
  189. google/genai/tests/file_search_stores/test_import_file.py +112 -0
  190. google/genai/tests/file_search_stores/test_list.py +57 -0
  191. google/genai/tests/file_search_stores/test_upload_to_file_search_store.py +141 -0
  192. google/genai/tests/files/__init__.py +17 -0
  193. google/genai/tests/files/test_delete.py +46 -0
  194. google/genai/tests/files/test_download.py +85 -0
  195. google/genai/tests/files/test_get.py +46 -0
  196. google/genai/tests/files/test_list.py +72 -0
  197. google/genai/tests/files/test_upload.py +255 -0
  198. google/genai/tests/imports/test_no_optional_imports.py +28 -0
  199. google/genai/tests/interactions/__init__.py +0 -0
  200. google/genai/tests/interactions/test_integration.py +80 -0
  201. google/genai/tests/live/__init__.py +16 -0
  202. google/genai/tests/live/test_live.py +2177 -0
  203. google/genai/tests/live/test_live_music.py +362 -0
  204. google/genai/tests/live/test_live_response.py +163 -0
  205. google/genai/tests/live/test_send_client_content.py +147 -0
  206. google/genai/tests/live/test_send_realtime_input.py +268 -0
  207. google/genai/tests/live/test_send_tool_response.py +222 -0
  208. google/genai/tests/local_tokenizer/__init__.py +17 -0
  209. google/genai/tests/local_tokenizer/test_local_tokenizer.py +343 -0
  210. google/genai/tests/local_tokenizer/test_local_tokenizer_loader.py +235 -0
  211. google/genai/tests/mcp/__init__.py +17 -0
  212. google/genai/tests/mcp/test_has_mcp_tool_usage.py +89 -0
  213. google/genai/tests/mcp/test_mcp_to_gemini_tools.py +191 -0
  214. google/genai/tests/mcp/test_parse_config_for_mcp_sessions.py +201 -0
  215. google/genai/tests/mcp/test_parse_config_for_mcp_usage.py +130 -0
  216. google/genai/tests/mcp/test_set_mcp_usage_header.py +72 -0
  217. google/genai/tests/models/__init__.py +17 -0
  218. google/genai/tests/models/constants.py +8 -0
  219. google/genai/tests/models/test_compute_tokens.py +120 -0
  220. google/genai/tests/models/test_count_tokens.py +159 -0
  221. google/genai/tests/models/test_delete.py +107 -0
  222. google/genai/tests/models/test_edit_image.py +264 -0
  223. google/genai/tests/models/test_embed_content.py +94 -0
  224. google/genai/tests/models/test_function_call_streaming.py +442 -0
  225. google/genai/tests/models/test_generate_content.py +2502 -0
  226. google/genai/tests/models/test_generate_content_cached_content.py +132 -0
  227. google/genai/tests/models/test_generate_content_config_zero_value.py +103 -0
  228. google/genai/tests/models/test_generate_content_from_apikey.py +44 -0
  229. google/genai/tests/models/test_generate_content_http_options.py +40 -0
  230. google/genai/tests/models/test_generate_content_image_generation.py +143 -0
  231. google/genai/tests/models/test_generate_content_mcp.py +343 -0
  232. google/genai/tests/models/test_generate_content_media_resolution.py +97 -0
  233. google/genai/tests/models/test_generate_content_model.py +139 -0
  234. google/genai/tests/models/test_generate_content_part.py +821 -0
  235. google/genai/tests/models/test_generate_content_thought.py +76 -0
  236. google/genai/tests/models/test_generate_content_tools.py +1761 -0
  237. google/genai/tests/models/test_generate_images.py +191 -0
  238. google/genai/tests/models/test_generate_videos.py +759 -0
  239. google/genai/tests/models/test_get.py +104 -0
  240. google/genai/tests/models/test_list.py +233 -0
  241. google/genai/tests/models/test_recontext_image.py +189 -0
  242. google/genai/tests/models/test_segment_image.py +148 -0
  243. google/genai/tests/models/test_update.py +95 -0
  244. google/genai/tests/models/test_upscale_image.py +157 -0
  245. google/genai/tests/operations/__init__.py +17 -0
  246. google/genai/tests/operations/test_get.py +38 -0
  247. google/genai/tests/public_samples/__init__.py +17 -0
  248. google/genai/tests/public_samples/test_gemini_text_only.py +34 -0
  249. google/genai/tests/pytest_helper.py +229 -0
  250. google/genai/tests/shared/__init__.py +16 -0
  251. google/genai/tests/shared/batches/__init__.py +14 -0
  252. google/genai/tests/shared/batches/test_create_delete.py +57 -0
  253. google/genai/tests/shared/batches/test_create_get_cancel.py +56 -0
  254. google/genai/tests/shared/batches/test_list.py +40 -0
  255. google/genai/tests/shared/caches/__init__.py +14 -0
  256. google/genai/tests/shared/caches/test_create_get_delete.py +67 -0
  257. google/genai/tests/shared/caches/test_create_update_get.py +71 -0
  258. google/genai/tests/shared/caches/test_list.py +40 -0
  259. google/genai/tests/shared/chats/__init__.py +14 -0
  260. google/genai/tests/shared/chats/test_send_message.py +48 -0
  261. google/genai/tests/shared/chats/test_send_message_stream.py +50 -0
  262. google/genai/tests/shared/files/__init__.py +14 -0
  263. google/genai/tests/shared/files/test_list.py +41 -0
  264. google/genai/tests/shared/files/test_upload_get_delete.py +54 -0
  265. google/genai/tests/shared/models/__init__.py +14 -0
  266. google/genai/tests/shared/models/test_compute_tokens.py +41 -0
  267. google/genai/tests/shared/models/test_count_tokens.py +40 -0
  268. google/genai/tests/shared/models/test_edit_image.py +67 -0
  269. google/genai/tests/shared/models/test_embed.py +40 -0
  270. google/genai/tests/shared/models/test_generate_content.py +39 -0
  271. google/genai/tests/shared/models/test_generate_content_stream.py +54 -0
  272. google/genai/tests/shared/models/test_generate_images.py +40 -0
  273. google/genai/tests/shared/models/test_generate_videos.py +38 -0
  274. google/genai/tests/shared/models/test_list.py +37 -0
  275. google/genai/tests/shared/models/test_recontext_image.py +55 -0
  276. google/genai/tests/shared/models/test_segment_image.py +52 -0
  277. google/genai/tests/shared/models/test_upscale_image.py +52 -0
  278. google/genai/tests/shared/tunings/__init__.py +16 -0
  279. google/genai/tests/shared/tunings/test_create.py +46 -0
  280. google/genai/tests/shared/tunings/test_create_get_cancel.py +56 -0
  281. google/genai/tests/shared/tunings/test_list.py +39 -0
  282. google/genai/tests/tokens/__init__.py +16 -0
  283. google/genai/tests/tokens/test_create.py +154 -0
  284. google/genai/tests/transformers/__init__.py +17 -0
  285. google/genai/tests/transformers/test_blobs.py +71 -0
  286. google/genai/tests/transformers/test_bytes.py +15 -0
  287. google/genai/tests/transformers/test_duck_type.py +96 -0
  288. google/genai/tests/transformers/test_function_responses.py +72 -0
  289. google/genai/tests/transformers/test_schema.py +653 -0
  290. google/genai/tests/transformers/test_t_batch.py +286 -0
  291. google/genai/tests/transformers/test_t_content.py +160 -0
  292. google/genai/tests/transformers/test_t_contents.py +398 -0
  293. google/genai/tests/transformers/test_t_part.py +85 -0
  294. google/genai/tests/transformers/test_t_parts.py +87 -0
  295. google/genai/tests/transformers/test_t_tool.py +157 -0
  296. google/genai/tests/transformers/test_t_tools.py +195 -0
  297. google/genai/tests/tunings/__init__.py +16 -0
  298. google/genai/tests/tunings/test_cancel.py +39 -0
  299. google/genai/tests/tunings/test_end_to_end.py +106 -0
  300. google/genai/tests/tunings/test_get.py +67 -0
  301. google/genai/tests/tunings/test_list.py +75 -0
  302. google/genai/tests/tunings/test_tune.py +268 -0
  303. google/genai/tests/types/__init__.py +16 -0
  304. google/genai/tests/types/test_bytes_internal.py +271 -0
  305. google/genai/tests/types/test_bytes_type.py +152 -0
  306. google/genai/tests/types/test_future.py +101 -0
  307. google/genai/tests/types/test_optional_types.py +36 -0
  308. google/genai/tests/types/test_part_type.py +616 -0
  309. google/genai/tests/types/test_schema_from_json_schema.py +417 -0
  310. google/genai/tests/types/test_schema_json_schema.py +468 -0
  311. google/genai/tests/types/test_types.py +2903 -0
  312. google/genai/types.py +72 -0
  313. google/genai/version.py +1 -1
  314. {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/METADATA +3 -1
  315. google_genai-1.55.0.dist-info/RECORD +345 -0
  316. google_genai-1.54.0.dist-info/RECORD +0 -41
  317. {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/WHEEL +0 -0
  318. {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/licenses/LICENSE +0 -0
  319. {google_genai-1.54.0.dist-info → google_genai-1.55.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,234 @@
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
+ from __future__ import annotations
17
+
18
+ from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload
19
+ from datetime import date, datetime
20
+ from typing_extensions import Self, Literal
21
+
22
+ import pydantic
23
+ from pydantic.fields import FieldInfo
24
+
25
+ from ._types import IncEx, StrBytesIntFloat
26
+
27
+ _T = TypeVar("_T")
28
+ _ModelT = TypeVar("_ModelT", bound=pydantic.BaseModel)
29
+
30
+ # --------------- Pydantic v2, v3 compatibility ---------------
31
+
32
+ # Pyright incorrectly reports some of our functions as overriding a method when they don't
33
+ # pyright: reportIncompatibleMethodOverride=false
34
+
35
+ PYDANTIC_V1 = pydantic.VERSION.startswith("1.")
36
+
37
+ if TYPE_CHECKING:
38
+
39
+ def parse_date(value: date | StrBytesIntFloat) -> date: # noqa: ARG001
40
+ ...
41
+
42
+ def parse_datetime(value: Union[datetime, StrBytesIntFloat]) -> datetime: # noqa: ARG001
43
+ ...
44
+
45
+ def get_args(t: type[Any]) -> tuple[Any, ...]: # noqa: ARG001
46
+ ...
47
+
48
+ def is_union(tp: type[Any] | None) -> bool: # noqa: ARG001
49
+ ...
50
+
51
+ def get_origin(t: type[Any]) -> type[Any] | None: # noqa: ARG001
52
+ ...
53
+
54
+ def is_literal_type(type_: type[Any]) -> bool: # noqa: ARG001
55
+ ...
56
+
57
+ def is_typeddict(type_: type[Any]) -> bool: # noqa: ARG001
58
+ ...
59
+
60
+ else:
61
+ # v1 re-exports
62
+ if PYDANTIC_V1:
63
+ from pydantic.typing import (
64
+ get_args as get_args,
65
+ is_union as is_union,
66
+ get_origin as get_origin,
67
+ is_typeddict as is_typeddict,
68
+ is_literal_type as is_literal_type,
69
+ )
70
+ from pydantic.datetime_parse import parse_date as parse_date, parse_datetime as parse_datetime
71
+ else:
72
+ from ._utils import (
73
+ get_args as get_args,
74
+ is_union as is_union,
75
+ get_origin as get_origin,
76
+ parse_date as parse_date,
77
+ is_typeddict as is_typeddict,
78
+ parse_datetime as parse_datetime,
79
+ is_literal_type as is_literal_type,
80
+ )
81
+
82
+
83
+ # refactored config
84
+ if TYPE_CHECKING:
85
+ from pydantic import ConfigDict as ConfigDict
86
+ else:
87
+ if PYDANTIC_V1:
88
+ # TODO: provide an error message here?
89
+ ConfigDict = None
90
+ else:
91
+ from pydantic import ConfigDict as ConfigDict
92
+
93
+
94
+ # renamed methods / properties
95
+ def parse_obj(model: type[_ModelT], value: object) -> _ModelT:
96
+ if PYDANTIC_V1:
97
+ return cast(_ModelT, model.parse_obj(value)) # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
98
+ else:
99
+ return model.model_validate(value)
100
+
101
+
102
+ def field_is_required(field: FieldInfo) -> bool:
103
+ if PYDANTIC_V1:
104
+ return field.required # type: ignore
105
+ return field.is_required()
106
+
107
+
108
+ def field_get_default(field: FieldInfo) -> Any:
109
+ value = field.get_default()
110
+ if PYDANTIC_V1:
111
+ return value
112
+ from pydantic_core import PydanticUndefined
113
+
114
+ if value == PydanticUndefined:
115
+ return None
116
+ return value
117
+
118
+
119
+ def field_outer_type(field: FieldInfo) -> Any:
120
+ if PYDANTIC_V1:
121
+ return field.outer_type_ # type: ignore
122
+ return field.annotation
123
+
124
+
125
+ def get_model_config(model: type[pydantic.BaseModel]) -> Any:
126
+ if PYDANTIC_V1:
127
+ return model.__config__ # type: ignore
128
+ return model.model_config
129
+
130
+
131
+ def get_model_fields(model: type[pydantic.BaseModel]) -> dict[str, FieldInfo]:
132
+ if PYDANTIC_V1:
133
+ return model.__fields__ # type: ignore
134
+ return model.model_fields
135
+
136
+
137
+ def model_copy(model: _ModelT, *, deep: bool = False) -> _ModelT:
138
+ if PYDANTIC_V1:
139
+ return model.copy(deep=deep) # type: ignore
140
+ return model.model_copy(deep=deep)
141
+
142
+
143
+ def model_json(model: pydantic.BaseModel, *, indent: int | None = None) -> str:
144
+ if PYDANTIC_V1:
145
+ return model.json(indent=indent) # type: ignore
146
+ return model.model_dump_json(indent=indent)
147
+
148
+
149
+ def model_dump(
150
+ model: pydantic.BaseModel,
151
+ *,
152
+ exclude: IncEx | None = None,
153
+ exclude_unset: bool = False,
154
+ exclude_defaults: bool = False,
155
+ warnings: bool = True,
156
+ mode: Literal["json", "python"] = "python",
157
+ ) -> dict[str, Any]:
158
+ if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
159
+ return model.model_dump(
160
+ mode=mode,
161
+ exclude=exclude,
162
+ exclude_unset=exclude_unset,
163
+ exclude_defaults=exclude_defaults,
164
+ # warnings are not supported in Pydantic v1
165
+ warnings=True if PYDANTIC_V1 else warnings,
166
+ )
167
+ return cast(
168
+ "dict[str, Any]",
169
+ model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
170
+ exclude=exclude,
171
+ exclude_unset=exclude_unset,
172
+ exclude_defaults=exclude_defaults,
173
+ ),
174
+ )
175
+
176
+
177
+ def model_parse(model: type[_ModelT], data: Any) -> _ModelT:
178
+ if PYDANTIC_V1:
179
+ return model.parse_obj(data) # pyright: ignore[reportDeprecated]
180
+ return model.model_validate(data)
181
+
182
+
183
+ # generic models
184
+ if TYPE_CHECKING:
185
+
186
+ class GenericModel(pydantic.BaseModel): ...
187
+
188
+ else:
189
+ if PYDANTIC_V1:
190
+ import pydantic.generics
191
+
192
+ class GenericModel(pydantic.generics.GenericModel, pydantic.BaseModel): ...
193
+ else:
194
+ # there no longer needs to be a distinction in v2 but
195
+ # we still have to create our own subclass to avoid
196
+ # inconsistent MRO ordering errors
197
+ class GenericModel(pydantic.BaseModel): ...
198
+
199
+
200
+ # cached properties
201
+ if TYPE_CHECKING:
202
+ cached_property = property
203
+
204
+ # we define a separate type (copied from typeshed)
205
+ # that represents that `cached_property` is `set`able
206
+ # at runtime, which differs from `@property`.
207
+ #
208
+ # this is a separate type as editors likely special case
209
+ # `@property` and we don't want to cause issues just to have
210
+ # more helpful internal types.
211
+
212
+ class typed_cached_property(Generic[_T]):
213
+ func: Callable[[Any], _T]
214
+ attrname: str | None
215
+
216
+ def __init__(self, func: Callable[[Any], _T]) -> None: ...
217
+
218
+ @overload
219
+ def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ...
220
+
221
+ @overload
222
+ def __get__(self, instance: object, owner: type[Any] | None = None) -> _T: ...
223
+
224
+ def __get__(self, instance: object, owner: type[Any] | None = None) -> _T | Self:
225
+ raise NotImplementedError()
226
+
227
+ def __set_name__(self, owner: type[Any], name: str) -> None: ...
228
+
229
+ # __set__ is not defined at runtime, but @cached_property is designed to be settable
230
+ def __set__(self, instance: object, value: _T) -> None: ...
231
+ else:
232
+ from functools import cached_property as cached_property
233
+
234
+ typed_cached_property = cached_property
@@ -0,0 +1,29 @@
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
+ import httpx
19
+
20
+ RAW_RESPONSE_HEADER = "X-Stainless-Raw-Response"
21
+ OVERRIDE_CAST_TO_HEADER = "____stainless_override_cast_to"
22
+
23
+ # default timeout is 1 minute
24
+ DEFAULT_TIMEOUT = httpx.Timeout(timeout=60, connect=5.0)
25
+ DEFAULT_MAX_RETRIES = 2
26
+ DEFAULT_CONNECTION_LIMITS = httpx.Limits(max_connections=100, max_keepalive_connections=20)
27
+
28
+ INITIAL_RETRY_DELAY = 0.5
29
+ MAX_RETRY_DELAY = 8.0
@@ -0,0 +1,122 @@
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_extensions import Literal
21
+
22
+ import httpx
23
+
24
+ __all__ = [
25
+ "BadRequestError",
26
+ "AuthenticationError",
27
+ "PermissionDeniedError",
28
+ "NotFoundError",
29
+ "ConflictError",
30
+ "UnprocessableEntityError",
31
+ "RateLimitError",
32
+ "InternalServerError",
33
+ ]
34
+
35
+
36
+ class GeminiNextGenAPIClientError(Exception):
37
+ pass
38
+
39
+
40
+ class APIError(GeminiNextGenAPIClientError):
41
+ message: str
42
+ request: httpx.Request
43
+
44
+ body: object | None
45
+ """The API response body.
46
+
47
+ If the API responded with a valid JSON structure then this property will be the decoded result.
48
+
49
+ If it isn't a valid JSON structure then this will be the raw response.
50
+
51
+ If there was no response associated with this error then it will be `None`.
52
+ """
53
+
54
+ def __init__(self, message: str, request: httpx.Request, *, body: object | None) -> None: # noqa: ARG002
55
+ super().__init__(message)
56
+ self.request = request
57
+ self.message = message
58
+ self.body = body
59
+
60
+
61
+ class APIResponseValidationError(APIError):
62
+ response: httpx.Response
63
+ status_code: int
64
+
65
+ def __init__(self, response: httpx.Response, body: object | None, *, message: str | None = None) -> None:
66
+ super().__init__(message or "Data returned by API invalid for expected schema.", response.request, body=body)
67
+ self.response = response
68
+ self.status_code = response.status_code
69
+
70
+
71
+ class APIStatusError(APIError):
72
+ """Raised when an API response has a status code of 4xx or 5xx."""
73
+
74
+ response: httpx.Response
75
+ status_code: int
76
+
77
+ def __init__(self, message: str, *, response: httpx.Response, body: object | None) -> None:
78
+ super().__init__(message, response.request, body=body)
79
+ self.response = response
80
+ self.status_code = response.status_code
81
+
82
+
83
+ class APIConnectionError(APIError):
84
+ def __init__(self, *, message: str = "Connection error.", request: httpx.Request) -> None:
85
+ super().__init__(message, request, body=None)
86
+
87
+
88
+ class APITimeoutError(APIConnectionError):
89
+ def __init__(self, request: httpx.Request) -> None:
90
+ super().__init__(message="Request timed out.", request=request)
91
+
92
+
93
+ class BadRequestError(APIStatusError):
94
+ status_code: Literal[400] = 400 # pyright: ignore[reportIncompatibleVariableOverride]
95
+
96
+
97
+ class AuthenticationError(APIStatusError):
98
+ status_code: Literal[401] = 401 # pyright: ignore[reportIncompatibleVariableOverride]
99
+
100
+
101
+ class PermissionDeniedError(APIStatusError):
102
+ status_code: Literal[403] = 403 # pyright: ignore[reportIncompatibleVariableOverride]
103
+
104
+
105
+ class NotFoundError(APIStatusError):
106
+ status_code: Literal[404] = 404 # pyright: ignore[reportIncompatibleVariableOverride]
107
+
108
+
109
+ class ConflictError(APIStatusError):
110
+ status_code: Literal[409] = 409 # pyright: ignore[reportIncompatibleVariableOverride]
111
+
112
+
113
+ class UnprocessableEntityError(APIStatusError):
114
+ status_code: Literal[422] = 422 # pyright: ignore[reportIncompatibleVariableOverride]
115
+
116
+
117
+ class RateLimitError(APIStatusError):
118
+ status_code: Literal[429] = 429 # pyright: ignore[reportIncompatibleVariableOverride]
119
+
120
+
121
+ class InternalServerError(APIStatusError):
122
+ pass
@@ -0,0 +1,139 @@
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
+ # mypy: ignore-errors
17
+ from __future__ import annotations
18
+
19
+ import io
20
+ import os
21
+ import pathlib
22
+ from typing import overload
23
+ from typing_extensions import TypeGuard
24
+
25
+ import anyio
26
+
27
+ from ._types import (
28
+ FileTypes,
29
+ FileContent,
30
+ RequestFiles,
31
+ HttpxFileTypes,
32
+ Base64FileInput,
33
+ HttpxFileContent,
34
+ HttpxRequestFiles,
35
+ )
36
+ from ._utils import is_tuple_t, is_mapping_t, is_sequence_t
37
+
38
+
39
+ def is_base64_file_input(obj: object) -> TypeGuard[Base64FileInput]:
40
+ return isinstance(obj, io.IOBase) or isinstance(obj, os.PathLike)
41
+
42
+
43
+ def is_file_content(obj: object) -> TypeGuard[FileContent]:
44
+ return (
45
+ isinstance(obj, bytes) or isinstance(obj, tuple) or isinstance(obj, io.IOBase) or isinstance(obj, os.PathLike)
46
+ )
47
+
48
+
49
+ def assert_is_file_content(obj: object, *, key: str | None = None) -> None:
50
+ if not is_file_content(obj):
51
+ prefix = f"Expected entry at `{key}`" if key is not None else f"Expected file input `{obj!r}`"
52
+ raise RuntimeError(
53
+ f"{prefix} to be bytes, an io.IOBase instance, PathLike or a tuple but received {type(obj)} instead."
54
+ ) from None
55
+
56
+
57
+ @overload
58
+ def to_httpx_files(files: None) -> None: ...
59
+
60
+
61
+ @overload
62
+ def to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ...
63
+
64
+
65
+ def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None:
66
+ if files is None:
67
+ return None
68
+
69
+ if is_mapping_t(files):
70
+ files = {key: _transform_file(file) for key, file in files.items()}
71
+ elif is_sequence_t(files):
72
+ files = [(key, _transform_file(file)) for key, file in files]
73
+ else:
74
+ raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence")
75
+
76
+ return files
77
+
78
+
79
+ def _transform_file(file: FileTypes) -> HttpxFileTypes:
80
+ if is_file_content(file):
81
+ if isinstance(file, os.PathLike):
82
+ path = pathlib.Path(file)
83
+ return (path.name, path.read_bytes())
84
+
85
+ return file
86
+
87
+ if is_tuple_t(file):
88
+ return (file[0], read_file_content(file[1]), *file[2:])
89
+
90
+ raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple")
91
+
92
+
93
+ def read_file_content(file: FileContent) -> HttpxFileContent:
94
+ if isinstance(file, os.PathLike):
95
+ return pathlib.Path(file).read_bytes()
96
+ return file
97
+
98
+
99
+ @overload
100
+ async def async_to_httpx_files(files: None) -> None: ...
101
+
102
+
103
+ @overload
104
+ async def async_to_httpx_files(files: RequestFiles) -> HttpxRequestFiles: ...
105
+
106
+
107
+ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None:
108
+ if files is None:
109
+ return None
110
+
111
+ if is_mapping_t(files):
112
+ files = {key: await _async_transform_file(file) for key, file in files.items()}
113
+ elif is_sequence_t(files):
114
+ files = [(key, await _async_transform_file(file)) for key, file in files]
115
+ else:
116
+ raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence")
117
+
118
+ return files
119
+
120
+
121
+ async def _async_transform_file(file: FileTypes) -> HttpxFileTypes:
122
+ if is_file_content(file):
123
+ if isinstance(file, os.PathLike):
124
+ path = anyio.Path(file)
125
+ return (path.name, await path.read_bytes())
126
+
127
+ return file
128
+
129
+ if is_tuple_t(file):
130
+ return (file[0], await async_read_file_content(file[1]), *file[2:])
131
+
132
+ raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple")
133
+
134
+
135
+ async def async_read_file_content(file: FileContent) -> HttpxFileContent:
136
+ if isinstance(file, os.PathLike):
137
+ return await anyio.Path(file).read_bytes()
138
+
139
+ return file