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,241 @@
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
+ """Test invoke_function_from_dict_args."""
18
+
19
+ from typing import Union
20
+ import pydantic
21
+ import pytest
22
+ import sys
23
+ from ... import errors
24
+ from ..._extra_utils import invoke_function_from_dict_args
25
+
26
+
27
+ def test_builtin_primitive_types():
28
+ def func_under_test(x: int, y: float, z: str, w: bool):
29
+ return {
30
+ 'x': x + 1,
31
+ 'y': y + 1.0,
32
+ 'z': z + '1.0',
33
+ 'w': not w,
34
+ }
35
+
36
+ original_args = {
37
+ 'x': 1,
38
+ 'y': 1.0,
39
+ 'z': '1.0',
40
+ 'w': True,
41
+ }
42
+ expected_response = {
43
+ 'x': 2,
44
+ 'y': 2.0,
45
+ 'z': '1.01.0',
46
+ 'w': False,
47
+ }
48
+
49
+ actual_response = invoke_function_from_dict_args(
50
+ original_args, func_under_test
51
+ )
52
+
53
+ assert actual_response == expected_response
54
+
55
+
56
+ @pytest.mark.skipif(
57
+ sys.version_info < (3, 10),
58
+ reason='| is only supported in Python 3.9 and above.',
59
+ )
60
+ def test_builtin_compound_types():
61
+ def func_under_test(x: list[int], y: dict[str, float]):
62
+ return {
63
+ 'new_x': x + [3],
64
+ 'new_y': y | {'key3': 3.0},
65
+ }
66
+
67
+ original_args = {
68
+ 'x': [1, 2],
69
+ 'y': {'key1': 1.0, 'key2': 2.0},
70
+ }
71
+ expected_response = {
72
+ 'new_x': [1, 2, 3],
73
+ 'new_y': {'key1': 1.0, 'key2': 2.0, 'key3': 3.0},
74
+ }
75
+
76
+ actual_response = invoke_function_from_dict_args(
77
+ original_args, func_under_test
78
+ )
79
+
80
+ assert actual_response == expected_response
81
+
82
+
83
+ def test_nested_pydantic_model():
84
+ class SimpleModel(pydantic.BaseModel):
85
+ key1_simple: int
86
+ key2_simple: float
87
+
88
+ class ComplexModel(pydantic.BaseModel):
89
+ key1_complex: SimpleModel
90
+ key2_complex: list[SimpleModel]
91
+ key3_complex: dict[str, SimpleModel]
92
+
93
+ def func_under_test(x: ComplexModel):
94
+ y = x.model_copy()
95
+ y.key1_complex.key1_simple += 1
96
+ y.key1_complex.key2_simple += 1.0
97
+ for simple_model in y.key2_complex:
98
+ simple_model.key1_simple += 1
99
+ simple_model.key2_simple += 1.0
100
+ for simple_model in y.key3_complex.values():
101
+ simple_model.key1_simple += 1
102
+ simple_model.key2_simple += 1.0
103
+ return y
104
+
105
+ original_args = {
106
+ 'x': {
107
+ 'key1_complex': {'key1_simple': 1, 'key2_simple': 1.0},
108
+ 'key2_complex': [
109
+ {'key1_simple': 2, 'key2_simple': 2.0},
110
+ {'key1_simple': 3, 'key2_simple': 3.0},
111
+ ],
112
+ 'key3_complex': {
113
+ 'key1_simple': {'key1_simple': 4, 'key2_simple': 4.0},
114
+ 'key2_simple': {'key1_simple': 5, 'key2_simple': 5.0},
115
+ },
116
+ }
117
+ }
118
+ expected_response = {
119
+ 'key1_complex': {'key1_simple': 2, 'key2_simple': 2.0},
120
+ 'key2_complex': [
121
+ {'key1_simple': 3, 'key2_simple': 3.0},
122
+ {'key1_simple': 4, 'key2_simple': 4.0},
123
+ ],
124
+ 'key3_complex': {
125
+ 'key1_simple': {'key1_simple': 5, 'key2_simple': 5.0},
126
+ 'key2_simple': {'key1_simple': 6, 'key2_simple': 6.0},
127
+ },
128
+ }
129
+
130
+ actual_response = invoke_function_from_dict_args(
131
+ original_args, func_under_test
132
+ )
133
+
134
+ assert isinstance(actual_response, ComplexModel)
135
+ assert isinstance(actual_response.key1_complex, SimpleModel)
136
+ assert isinstance(actual_response.key2_complex[0], SimpleModel)
137
+ assert isinstance(actual_response.key2_complex[1], SimpleModel)
138
+ assert isinstance(actual_response.key3_complex['key1_simple'], SimpleModel)
139
+ assert isinstance(actual_response.key3_complex['key2_simple'], SimpleModel)
140
+ assert actual_response.model_dump() == expected_response
141
+
142
+
143
+ def test_pydantic_model_in_list_union_type():
144
+ class SimpleModel(pydantic.BaseModel):
145
+ key1_simple: int
146
+ key2_simple: float
147
+
148
+ def func_under_test(x: list[Union[int, SimpleModel]]):
149
+ result = []
150
+ for item in x:
151
+ if isinstance(item, int):
152
+ result.append(item + 1)
153
+ elif isinstance(item, SimpleModel):
154
+ result.append(item.model_copy())
155
+ result[-1].key1_simple += 1
156
+ result[-1].key2_simple += 1.0
157
+ else:
158
+ raise ValueError('Unsupported type: %s' % type(item))
159
+ return result
160
+
161
+ expected_response = [2, {'key1_simple': 2, 'key2_simple': 2.0}]
162
+ original_args = {'x': [1, {'key1_simple': 1, 'key2_simple': 1.0}]}
163
+ actual_response = invoke_function_from_dict_args(
164
+ original_args, func_under_test
165
+ )
166
+ assert isinstance(actual_response, list)
167
+ assert len(actual_response) == 2
168
+ assert isinstance(actual_response[0], int)
169
+ assert isinstance(actual_response[1], SimpleModel)
170
+ assert actual_response[0] == expected_response[0]
171
+ assert actual_response[1].model_dump() == expected_response[1]
172
+
173
+
174
+ def test_unknown_pydantic_model_argument():
175
+ class SimpleModel(pydantic.BaseModel):
176
+ key1_simple: int
177
+ key2_simple: float
178
+
179
+ def func_under_test(x: SimpleModel):
180
+ return x.model_copy()
181
+
182
+ original_args = {'x': {'key3_simple': 1, 'key2_simple': 1.0}}
183
+
184
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
185
+ invoke_function_from_dict_args(original_args, func_under_test)
186
+
187
+
188
+ def test_unknown_pydantic_model_argument_with_union_type():
189
+ class SimpleModel1(pydantic.BaseModel):
190
+ key1_simple: int
191
+ key2_simple: float
192
+
193
+ class SimpleModel2(pydantic.BaseModel):
194
+ key3_simple: str
195
+ key4_simple: float
196
+
197
+ def func_under_test(x: Union[SimpleModel1, SimpleModel2]):
198
+ return x.model_copy()
199
+
200
+ original_args = {'x': {'key5_simple': 1, 'key4_simple': 1.0}}
201
+
202
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
203
+ invoke_function_from_dict_args(original_args, func_under_test)
204
+
205
+
206
+ def test_unknown_pydantic_model_argument_with_union_type_and_builtin_type():
207
+ class SimpleModel1(pydantic.BaseModel):
208
+ key1_simple: int
209
+ key2_simple: float
210
+
211
+ def func_under_test(x: Union[SimpleModel1, int]):
212
+ return x.model_copy()
213
+
214
+ original_args = {'x': {'key5_simple': 1, 'key4_simple': 1.0}}
215
+
216
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
217
+ invoke_function_from_dict_args(original_args, func_under_test)
218
+
219
+
220
+ def test_incompatible_value_and_annotation():
221
+ def func_under_test(x: int):
222
+ return x + 1
223
+
224
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
225
+ invoke_function_from_dict_args({'x': {'k': 'v'}}, func_under_test)
226
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
227
+ invoke_function_from_dict_args({'x': 'a'}, func_under_test)
228
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
229
+ invoke_function_from_dict_args({'x': []}, func_under_test)
230
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
231
+ invoke_function_from_dict_args({'x': 1.0}, func_under_test)
232
+ with pytest.raises(errors.UnknownFunctionCallArgumentError):
233
+ invoke_function_from_dict_args({'x': {}}, func_under_test)
234
+
235
+
236
+ def test_function_invocation_error():
237
+ def func_under_test(x: int):
238
+ return x / 0
239
+
240
+ with pytest.raises(errors.FunctionInvocationError):
241
+ invoke_function_from_dict_args({'x': 1}, func_under_test)
@@ -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
+ """Tests for raise_error_for_afc_incompatible_config."""
18
+
19
+ import pytest
20
+ from ... import types
21
+ from ..._extra_utils import raise_error_for_afc_incompatible_config
22
+
23
+
24
+ def test_config_is_none():
25
+ assert raise_error_for_afc_incompatible_config(None) is None
26
+
27
+
28
+ def test_tool_config_config_unset():
29
+ assert (
30
+ raise_error_for_afc_incompatible_config(types.GenerateContentConfig(
31
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
32
+ disable=False,
33
+ maximum_remote_calls=1,
34
+ ),
35
+ ))
36
+ is None
37
+ )
38
+
39
+
40
+ def test_function_calling_config_unset():
41
+ assert (
42
+ raise_error_for_afc_incompatible_config(types.GenerateContentConfig(
43
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
44
+ disable=False,
45
+ maximum_remote_calls=1,
46
+ ),
47
+ tool_config=types.ToolConfig(),
48
+ ))
49
+ is None
50
+ )
51
+
52
+
53
+
54
+ def test_compatible_config_afc_disabled():
55
+ assert (
56
+ raise_error_for_afc_incompatible_config(
57
+ types.GenerateContentConfig(
58
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
59
+ disable=True,
60
+ ),
61
+ tool_config=types.ToolConfig(
62
+ function_calling_config=types.FunctionCallingConfig(
63
+ stream_function_call_arguments=False,
64
+ ),
65
+ ),
66
+ )
67
+ )
68
+ is None
69
+ )
70
+
71
+
72
+ def test_compatible_config_stream_function_call_arguments_unset_afc_unset():
73
+ assert (
74
+ raise_error_for_afc_incompatible_config(
75
+ types.GenerateContentConfig(
76
+ tool_config=types.ToolConfig(
77
+ function_calling_config=types.FunctionCallingConfig(
78
+ ),
79
+ ),
80
+ )
81
+ )
82
+ is None
83
+ )
84
+
85
+
86
+ def test_compatible_config_stream_function_call_arguments_unset_no_disable_afc():
87
+ assert (
88
+ raise_error_for_afc_incompatible_config(
89
+ types.GenerateContentConfig(
90
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
91
+ ),
92
+ tool_config=types.ToolConfig(
93
+ function_calling_config=types.FunctionCallingConfig(
94
+ ),
95
+ ),
96
+ )
97
+ )
98
+ is None
99
+ )
100
+
101
+
102
+ def test_compatible_config_stream_function_call_arguments_unset_disable_afc_true():
103
+ assert (
104
+ raise_error_for_afc_incompatible_config(
105
+ types.GenerateContentConfig(
106
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
107
+ disable=True,
108
+ ),
109
+ tool_config=types.ToolConfig(
110
+ function_calling_config=types.FunctionCallingConfig(
111
+ ),
112
+ ),
113
+ )
114
+ )
115
+ is None
116
+ )
117
+
118
+
119
+ def test_incompatible_config_stream_function_call_arguments_set_enable_afc():
120
+ with pytest.raises(ValueError):
121
+ raise_error_for_afc_incompatible_config(
122
+ types.GenerateContentConfig(
123
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
124
+ disable=False,
125
+ ),
126
+ tool_config=types.ToolConfig(
127
+ function_calling_config=types.FunctionCallingConfig(
128
+ stream_function_call_arguments=True,
129
+ ),
130
+ ),
131
+ )
132
+ )
133
+
134
+
135
+ def test_incompatible_config_stream_function_call_arguments_set_no_afc_config():
136
+ with pytest.raises(ValueError):
137
+ raise_error_for_afc_incompatible_config(
138
+ types.GenerateContentConfig(
139
+ tool_config=types.ToolConfig(
140
+ function_calling_config=types.FunctionCallingConfig(
141
+ stream_function_call_arguments=True,
142
+ ),
143
+ ),
144
+ )
145
+ )
146
+
147
+
148
+ def test_incompatible_config_stream_function_call_arguments_set_no_disable_afc():
149
+ with pytest.raises(ValueError):
150
+ raise_error_for_afc_incompatible_config(
151
+ types.GenerateContentConfig(
152
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(),
153
+ tool_config=types.ToolConfig(
154
+ function_calling_config=types.FunctionCallingConfig(
155
+ stream_function_call_arguments=True,
156
+ ),
157
+ ),
158
+ )
159
+ )
@@ -0,0 +1,53 @@
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
+ """Tests for _extra_utils.should_append_afc_history."""
17
+
18
+ from ... import types
19
+ from ..._extra_utils import should_append_afc_history
20
+
21
+
22
+ def test_should_append_afc_history_with_default_config():
23
+ config = types.GenerateContentConfig()
24
+
25
+ assert should_append_afc_history(config) == True
26
+
27
+
28
+ def test_should_append_afc_history_with_empty_afc_config():
29
+ config = types.GenerateContentConfig(
30
+ automatic_function_calling=types.AutomaticFunctionCallingConfig()
31
+ )
32
+
33
+ assert should_append_afc_history(config) == True
34
+
35
+
36
+ def test_should_append_afc_history_with_ignore_call_history_true():
37
+ config = types.GenerateContentConfig(
38
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
39
+ ignore_call_history=True
40
+ )
41
+ )
42
+
43
+ assert should_append_afc_history(config) == False
44
+
45
+
46
+ def test_should_append_afc_history_with_ignore_call_history_false():
47
+ config = types.GenerateContentConfig(
48
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
49
+ ignore_call_history=False
50
+ )
51
+ )
52
+
53
+ assert should_append_afc_history(config) == True
@@ -0,0 +1,214 @@
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 should_disable_afc."""
18
+
19
+ import pytest
20
+ from ... import types
21
+ from ..._extra_utils import should_disable_afc
22
+
23
+
24
+ def test_config_is_none():
25
+ assert should_disable_afc(None) is False
26
+
27
+
28
+ def test_afc_config_unset():
29
+ assert should_disable_afc(types.GenerateContentConfig()) is False
30
+
31
+
32
+ def test_afc_enable_unset_max_0():
33
+ assert (
34
+ should_disable_afc(
35
+ types.GenerateContentConfig(
36
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
37
+ maximum_remote_calls=0,
38
+ ),
39
+ )
40
+ )
41
+ is True
42
+ )
43
+
44
+
45
+ def test_afc_enable_unset_max_negative():
46
+ assert (
47
+ should_disable_afc(
48
+ types.GenerateContentConfig(
49
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
50
+ maximum_remote_calls=-1,
51
+ ),
52
+ )
53
+ )
54
+ is True
55
+ )
56
+
57
+
58
+ def test_afc_enable_unset_max_0_0():
59
+ assert (
60
+ should_disable_afc(
61
+ {'automatic_function_calling': {'maximum_remote_calls': 0.0}}
62
+ )
63
+ is True
64
+ )
65
+
66
+
67
+ def test_afc_enable_unset_max_1():
68
+ assert (
69
+ should_disable_afc(
70
+ types.GenerateContentConfig(
71
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
72
+ maximum_remote_calls=1,
73
+ ),
74
+ )
75
+ )
76
+ is False
77
+ )
78
+
79
+
80
+ def test_afc_enable_unset_max_1_0():
81
+ assert (
82
+ should_disable_afc(
83
+ {'automatic_function_calling': {'maximum_remote_calls': 1.0}}
84
+ )
85
+ is False
86
+ )
87
+
88
+
89
+ def test_afc_enable_false_max_unset():
90
+ assert (
91
+ should_disable_afc(
92
+ types.GenerateContentConfig(
93
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
94
+ disable=True,
95
+ ),
96
+ )
97
+ )
98
+ is True
99
+ )
100
+
101
+
102
+ def test_afc_enable_false_max_0():
103
+ assert (
104
+ should_disable_afc(
105
+ types.GenerateContentConfig(
106
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
107
+ disable=True,
108
+ maximum_remote_calls=0,
109
+ ),
110
+ )
111
+ )
112
+ is True
113
+ )
114
+
115
+
116
+ def test_afc_enable_false_max_negative():
117
+ assert (
118
+ should_disable_afc(
119
+ types.GenerateContentConfig(
120
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
121
+ disable=True,
122
+ maximum_remote_calls=-1,
123
+ ),
124
+ )
125
+ )
126
+ is True
127
+ )
128
+
129
+
130
+ def test_afc_enable_false_max_0_0():
131
+ assert (
132
+ should_disable_afc(
133
+ {'automatic_function_calling': {'maximum_remote_calls': 0.0}}
134
+ )
135
+ is True
136
+ )
137
+
138
+
139
+ def test_afc_enable_false_max_1():
140
+ assert (
141
+ should_disable_afc(
142
+ types.GenerateContentConfig(
143
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
144
+ disable=True,
145
+ maximum_remote_calls=1,
146
+ ),
147
+ )
148
+ )
149
+ is True
150
+ )
151
+
152
+
153
+ def test_afc_enable_true_max_unset():
154
+ assert (
155
+ should_disable_afc(
156
+ types.GenerateContentConfig(
157
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
158
+ disable=False,
159
+ ),
160
+ )
161
+ )
162
+ is False
163
+ )
164
+
165
+
166
+ def test_afc_enable_true_max_0():
167
+ assert (
168
+ should_disable_afc(
169
+ types.GenerateContentConfig(
170
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
171
+ disable=False,
172
+ maximum_remote_calls=0,
173
+ ),
174
+ )
175
+ )
176
+ is True
177
+ )
178
+
179
+
180
+ def test_afc_enable_true_max_negative():
181
+ assert (
182
+ should_disable_afc(
183
+ types.GenerateContentConfig(
184
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
185
+ disable=False,
186
+ maximum_remote_calls=-1,
187
+ ),
188
+ )
189
+ )
190
+ is True
191
+ )
192
+
193
+
194
+ def test_afc_enable_true_max_0_0():
195
+ assert (
196
+ should_disable_afc(
197
+ {'automatic_function_calling': {'maximum_remote_calls': 0.0}}
198
+ )
199
+ is True
200
+ )
201
+
202
+
203
+ def test_afc_enable_true_max_1():
204
+ assert (
205
+ should_disable_afc(
206
+ types.GenerateContentConfig(
207
+ automatic_function_calling=types.AutomaticFunctionCallingConfig(
208
+ disable=False,
209
+ maximum_remote_calls=1,
210
+ ),
211
+ )
212
+ )
213
+ is False
214
+ )
@@ -0,0 +1,17 @@
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 the Google GenAI SDK's batches module."""