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,398 @@
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 t_contents."""
17
+
18
+ import pytest
19
+ import pydantic
20
+
21
+ from ... import _transformers as t
22
+ from ... import types
23
+
24
+
25
+ def test_none():
26
+ with pytest.raises(ValueError):
27
+ t.t_contents(None)
28
+
29
+
30
+ def test_empty_list():
31
+ with pytest.raises(ValueError):
32
+ t.t_contents([])
33
+
34
+
35
+ def test_content():
36
+ assert t.t_contents(
37
+ [types.Content(parts=[types.Part(text='test')])]
38
+ ) == [types.Content(parts=[types.Part(text='test')])]
39
+
40
+
41
+ def test_content_dict():
42
+ assert t.t_contents(
43
+ [{'role': 'user', 'parts': [{'text': 'test'}]}]
44
+ ) == [types.Content(parts=[types.Part(text='test')], role='user')]
45
+
46
+
47
+ def test_empty_dict():
48
+ assert t.t_contents({}) == [types.Content()]
49
+
50
+
51
+ def test_invalid_dict():
52
+ with pytest.raises(pydantic.ValidationError):
53
+ t.t_contents({'invalid_key': 'test'})
54
+
55
+
56
+ def test_text_part():
57
+ assert t.t_contents([types.Part(text='test')]) == [
58
+ types.UserContent(parts=[types.Part(text='test')])
59
+ ]
60
+
61
+
62
+ def test_function_call_part():
63
+ function_call = types.FunctionCall(name='test_func', args={'arg1': 'value1'})
64
+ assert t.t_contents(
65
+ [types.Part(function_call=function_call)]
66
+ ) == [
67
+ types.ModelContent(
68
+ parts=[
69
+ types.Part(function_call=function_call)
70
+ ]
71
+ )
72
+ ]
73
+
74
+
75
+ def test_text_part_dict():
76
+ assert t.t_contents([{'text': 'test'}]) == [
77
+ types.UserContent(parts=[types.Part(text='test')])
78
+ ]
79
+
80
+
81
+ def test_function_call_part_dict():
82
+ assert t.t_contents(
83
+ [{'function_call': {'name': 'test_func', 'args': {'arg1': 'value1'}}}]
84
+ ) == [
85
+ types.ModelContent(
86
+ parts=[
87
+ types.Part(
88
+ function_call=types.FunctionCall(
89
+ name='test_func', args={'arg1': 'value1'}
90
+ )
91
+ )
92
+ ]
93
+ )
94
+ ]
95
+
96
+
97
+ def test_empty_string():
98
+ assert t.t_contents('') == [
99
+ types.UserContent(parts=[types.Part(text='')])
100
+ ]
101
+
102
+
103
+ def test_string():
104
+ assert t.t_contents('test') == [
105
+ types.UserContent(parts=[types.Part(text='test')])
106
+ ]
107
+
108
+
109
+ def test_file():
110
+ assert t.t_contents(
111
+ types.File(uri='gs://test', mime_type='image/png')
112
+ ) == [
113
+ types.UserContent(
114
+ parts=[
115
+ types.Part(
116
+ file_data=types.FileData(
117
+ file_uri='gs://test', mime_type='image/png'
118
+ )
119
+ )
120
+ ]
121
+ )
122
+ ]
123
+
124
+
125
+ def test_file_dict():
126
+ assert t.t_contents({'file_uri': 'gs://test', 'mime_type': 'image/png'}) == [
127
+ types.UserContent(
128
+ parts=[
129
+ types.Part(
130
+ file_data=types.FileData(
131
+ file_uri='gs://test', mime_type='image/png'
132
+ )
133
+ )
134
+ ]
135
+ )
136
+ ]
137
+
138
+ def test_file_dict_list():
139
+ assert t.t_contents([{'file_uri': 'gs://test', 'mime_type': 'image/png'}]) == [
140
+ types.UserContent(
141
+ parts=[
142
+ types.Part(
143
+ file_data=types.FileData(
144
+ file_uri='gs://test', mime_type='image/png'
145
+ )
146
+ )
147
+ ]
148
+ )
149
+ ]
150
+
151
+ def test_file_no_uri():
152
+ with pytest.raises(ValueError):
153
+ t.t_contents(types.File(mime_type='image/png'))
154
+
155
+
156
+ def test_file_no_mime_type():
157
+ with pytest.raises(ValueError):
158
+ t.t_contents(types.File(uri='gs://test'))
159
+
160
+
161
+ def test_string_list():
162
+ assert t.t_contents(['test1', 'test2']) == [
163
+ types.UserContent(parts=[
164
+ types.Part(text='test1'),
165
+ types.Part(text='test2'),
166
+ ])
167
+ ]
168
+
169
+
170
+ def test_file_list():
171
+ assert t.t_contents(
172
+ [
173
+ types.File(uri='gs://test1', mime_type='image/png'),
174
+ types.File(uri='gs://test2', mime_type='image/png'),
175
+ ],
176
+ ) == [
177
+ types.UserContent(
178
+ parts=[
179
+ types.Part(
180
+ file_data=types.FileData(
181
+ file_uri='gs://test1', mime_type='image/png'
182
+ )
183
+ ),
184
+ types.Part(
185
+ file_data=types.FileData(
186
+ file_uri='gs://test2', mime_type='image/png'
187
+ )
188
+ ),
189
+ ]
190
+ )
191
+ ]
192
+
193
+
194
+ def test_string_file_list():
195
+ assert t.t_contents(
196
+ ['test1', types.File(uri='gs://test2', mime_type='image/png')],
197
+ ) == [
198
+ types.UserContent(
199
+ parts=[
200
+ types.Part(text='test1'),
201
+ types.Part(
202
+ file_data=types.FileData(
203
+ file_uri='gs://test2', mime_type='image/png'
204
+ )
205
+ ),
206
+ ]
207
+ )
208
+ ]
209
+
210
+
211
+ def test_function_call_list():
212
+ function_call1 = types.FunctionCall(
213
+ name='test_func1', args={'arg1': 'value1'}
214
+ )
215
+ function_call2 = types.FunctionCall(
216
+ name='test_func2', args={'arg2': 'value2'}
217
+ )
218
+
219
+ assert t.t_contents(
220
+ [
221
+ types.Part(function_call=function_call1),
222
+ types.Part(function_call=function_call2),
223
+ ],
224
+ ) == [
225
+ types.ModelContent(
226
+ parts=[
227
+ types.Part(function_call=function_call1),
228
+ types.Part(function_call=function_call2),
229
+ ]
230
+ )
231
+ ]
232
+
233
+
234
+ def test_function_call_function_response_list():
235
+ question1 = 'question1'
236
+ question2 = 'question2'
237
+ function_call1 = types.FunctionCall(
238
+ name='test_func1', args={'arg1': 'value1'}
239
+ )
240
+ function_call2 = types.FunctionCall(
241
+ name='test_func2', args={'arg2': 'value2'}
242
+ )
243
+ function_response1 = types.FunctionResponse(
244
+ name='test_func1',
245
+ response={
246
+ 'answer': 'answer1',
247
+ },
248
+ )
249
+ function_response2 = types.FunctionResponse(
250
+ name='test_func2',
251
+ response={
252
+ 'answer': 'answer2',
253
+ },
254
+ )
255
+
256
+ assert t.t_contents(
257
+ [
258
+ question1,
259
+ question2,
260
+ types.Part(function_call=function_call1),
261
+ {'function_call': function_call2},
262
+ {'function_response': function_response1},
263
+ types.Part(function_response=function_response2),
264
+ ],
265
+ ) == [
266
+ types.UserContent(
267
+ parts=[
268
+ types.Part(text=question1),
269
+ types.Part(text=question2),
270
+ ]
271
+ ),
272
+ types.ModelContent(
273
+ parts=[
274
+ types.Part(function_call=function_call1),
275
+ types.Part(function_call=function_call2),
276
+ ]
277
+ ),
278
+ types.UserContent(
279
+ parts=[
280
+ types.Part(function_response=function_response1),
281
+ types.Part(function_response=function_response2),
282
+ ]
283
+ ),
284
+ ]
285
+
286
+
287
+ def test_content_list():
288
+ assert t.t_contents(
289
+ [
290
+ types.Content(parts=[types.Part(text='test1')]),
291
+ types.Content(parts=[types.Part(text='test2')]),
292
+ ],
293
+ ) == [
294
+ types.Content(parts=[types.Part(text='test1')]),
295
+ types.Content(parts=[types.Part(text='test2')]),
296
+ ]
297
+
298
+
299
+ def test_content_text_part_list():
300
+ assert t.t_contents(
301
+ [
302
+ types.Part(text='test1'),
303
+ types.Part(text='test2'),
304
+ types.Content(parts=[types.Part(text='test3')]),
305
+ types.Part(text='test4'),
306
+ ],
307
+ ) == [
308
+ types.UserContent(
309
+ parts=[
310
+ types.Part(text='test1'),
311
+ types.Part(text='test2'),
312
+ ]
313
+ ),
314
+ types.Content(parts=[types.Part(text='test3')]),
315
+ types.UserContent(parts=[types.Part(text='test4')]),
316
+ ]
317
+
318
+
319
+ def test_list_of_text_part_list():
320
+ contents = [
321
+ 'question1',
322
+ {'function_call': {'name': 'test_func1', 'args': {'arg1': 'value1'}}},
323
+ types.Part(
324
+ function_response=types.FunctionResponse(
325
+ name='test_func1',
326
+ response={
327
+ 'answer': 'answer1',
328
+ },
329
+ )
330
+ ),
331
+ ['context2_1', 'context2_2', types.Part(text='context2_3')],
332
+ 'question2',
333
+ types.Part(
334
+ function_call={'name': 'test_func2', 'args': {'arg2': 'value2'}}
335
+ ),
336
+ {
337
+ 'function_response': types.FunctionResponse(
338
+ name='test_func2',
339
+ response={
340
+ 'answer': 'answer2',
341
+ },
342
+ )
343
+ },
344
+ ]
345
+
346
+ assert t.t_contents(contents) == [
347
+ types.UserContent(parts='question1'),
348
+ types.ModelContent(
349
+ parts=[
350
+ types.Part(
351
+ function_call=types.FunctionCall(
352
+ name='test_func1', args={'arg1': 'value1'}
353
+ )
354
+ )
355
+ ]
356
+ ),
357
+ types.UserContent(
358
+ parts=[
359
+ types.Part(
360
+ function_response=types.FunctionResponse(
361
+ name='test_func1',
362
+ response={
363
+ 'answer': 'answer1',
364
+ },
365
+ )
366
+ )
367
+ ]
368
+ ),
369
+ types.UserContent(
370
+ parts=[
371
+ types.Part(text='context2_1'),
372
+ types.Part(text='context2_2'),
373
+ types.Part(text='context2_3'),
374
+ ]
375
+ ),
376
+ types.UserContent(parts=[types.Part(text='question2')]),
377
+ types.ModelContent(
378
+ parts=[
379
+ types.Part(
380
+ function_call=types.FunctionCall(
381
+ name='test_func2', args={'arg2': 'value2'}
382
+ )
383
+ )
384
+ ]
385
+ ),
386
+ types.UserContent(
387
+ parts=[
388
+ types.Part(
389
+ function_response=types.FunctionResponse(
390
+ name='test_func2',
391
+ response={
392
+ 'answer': 'answer2',
393
+ },
394
+ )
395
+ )
396
+ ]
397
+ ),
398
+ ]
@@ -0,0 +1,85 @@
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 t_part."""
17
+
18
+ import pytest
19
+ import pydantic
20
+
21
+ from ... import _transformers as t
22
+ from ... import types
23
+
24
+
25
+ def test_none():
26
+ with pytest.raises(ValueError):
27
+ t.t_part(None)
28
+
29
+
30
+ def test_empty_string():
31
+ assert t.t_part('') == types.Part(text='')
32
+
33
+
34
+ def test_string():
35
+ assert t.t_part('test') == types.Part(text='test')
36
+
37
+
38
+ def test_file():
39
+ assert t.t_part(
40
+ types.File(uri='gs://test', mime_type='image/png')
41
+ ) == types.Part(
42
+ file_data=types.FileData(file_uri='gs://test', mime_type='image/png')
43
+ )
44
+
45
+
46
+ def test_file_dict():
47
+ assert t.t_part(
48
+ {'file_uri': 'gs://test', 'mime_type': 'image/png'}
49
+ ) == types.Part(
50
+ file_data=types.FileData(file_uri='gs://test', mime_type='image/png')
51
+ )
52
+
53
+
54
+ def test_file_no_uri():
55
+ with pytest.raises(ValueError):
56
+ t.t_part(types.File(mime_type='image/png'))
57
+
58
+
59
+ def test_file_no_mime_type():
60
+ with pytest.raises(ValueError):
61
+ t.t_part(types.File(uri='gs://test'))
62
+
63
+
64
+ def test_empty_dict():
65
+ assert t.t_part({}) == types.Part()
66
+
67
+
68
+ def test_dict():
69
+ assert t.t_part({'text': 'test'}) == types.Part(text='test')
70
+
71
+
72
+ def test_invalid_dict():
73
+ with pytest.raises(pydantic.ValidationError):
74
+ t.t_part({'invalid_key': 'test'})
75
+
76
+
77
+ def test_part():
78
+ assert t.t_part(types.Part(text='test')) == types.Part(text='test')
79
+
80
+
81
+ def test_int():
82
+ try:
83
+ t.t_part(1)
84
+ except ValueError as e:
85
+ assert 'Unsupported content part type: <class \'int\'>' in str(e)
@@ -0,0 +1,87 @@
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 t_parts."""
17
+
18
+ import pytest
19
+ import pydantic
20
+
21
+ from ... import _transformers as t
22
+ from ... import types
23
+
24
+
25
+ def test_none():
26
+ with pytest.raises(ValueError):
27
+ t.t_parts(None)
28
+
29
+
30
+ def test_empty_list():
31
+ with pytest.raises(ValueError):
32
+ t.t_parts([])
33
+
34
+
35
+ def test_list():
36
+ assert t.t_parts(['test1', 'test2']) == [
37
+ types.Part(text='test1'),
38
+ types.Part(text='test2'),
39
+ ]
40
+
41
+
42
+ def test_empty_dict():
43
+ assert t.t_parts({}) == [types.Part()]
44
+
45
+
46
+ def test_dict():
47
+ assert t.t_parts({'text': 'test'}) == [types.Part(text='test')]
48
+
49
+
50
+ def test_invalid_dict():
51
+ with pytest.raises(pydantic.ValidationError):
52
+ t.t_parts({'invalid_key': 'test'})
53
+
54
+
55
+ def test_string():
56
+ assert t.t_parts('test') == [types.Part(text='test')]
57
+
58
+
59
+ def test_file():
60
+ assert t.t_parts(
61
+ types.File(uri='gs://test', mime_type='image/png')
62
+ ) == [
63
+ types.Part(
64
+ file_data=types.FileData(file_uri='gs://test', mime_type='image/png')
65
+ )
66
+ ]
67
+
68
+
69
+ def test_file_no_uri():
70
+ with pytest.raises(ValueError):
71
+ t.t_parts(types.File(mime_type='image/png'))
72
+
73
+
74
+ def test_file_no_mime_type():
75
+ with pytest.raises(ValueError):
76
+ t.t_parts(types.File(uri='gs://test'))
77
+
78
+
79
+ def test_part():
80
+ assert t.t_parts(types.Part(text='test')) == [types.Part(text='test')]
81
+
82
+
83
+ def test_int():
84
+ try:
85
+ t.t_parts(1)
86
+ except ValueError as e:
87
+ assert 'Unsupported content part type: <class \'int\'>' in str(e)