vellum-ai 1.1.3__py3-none-any.whl → 1.1.4__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 (660) hide show
  1. vellum/__init__.py +2 -0
  2. vellum/client/README.md +22 -0
  3. vellum/client/__init__.py +89 -99
  4. vellum/client/core/__init__.py +2 -0
  5. vellum/client/core/api_error.py +13 -5
  6. vellum/client/core/client_wrapper.py +16 -4
  7. vellum/client/core/force_multipart.py +16 -0
  8. vellum/client/core/http_client.py +70 -24
  9. vellum/client/core/http_response.py +19 -11
  10. vellum/client/core/pydantic_utilities.py +71 -114
  11. vellum/client/core/serialization.py +6 -1
  12. vellum/client/errors/__init__.py +2 -0
  13. vellum/client/errors/bad_request_error.py +4 -3
  14. vellum/client/errors/forbidden_error.py +4 -3
  15. vellum/client/errors/internal_server_error.py +4 -3
  16. vellum/client/errors/not_found_error.py +4 -3
  17. vellum/client/raw_client.py +270 -201
  18. vellum/client/resources/__init__.py +2 -0
  19. vellum/client/resources/ad_hoc/__init__.py +2 -0
  20. vellum/client/resources/ad_hoc/client.py +16 -17
  21. vellum/client/resources/ad_hoc/raw_client.py +68 -53
  22. vellum/client/resources/container_images/__init__.py +2 -0
  23. vellum/client/resources/container_images/client.py +24 -21
  24. vellum/client/resources/container_images/raw_client.py +23 -24
  25. vellum/client/resources/deployments/__init__.py +2 -0
  26. vellum/client/resources/deployments/client.py +43 -44
  27. vellum/client/resources/deployments/raw_client.py +73 -66
  28. vellum/client/resources/deployments/types/__init__.py +2 -0
  29. vellum/client/resources/document_indexes/__init__.py +2 -0
  30. vellum/client/resources/document_indexes/client.py +38 -39
  31. vellum/client/resources/document_indexes/raw_client.py +42 -43
  32. vellum/client/resources/document_indexes/types/__init__.py +2 -0
  33. vellum/client/resources/documents/__init__.py +2 -0
  34. vellum/client/resources/documents/client.py +25 -26
  35. vellum/client/resources/documents/raw_client.py +51 -44
  36. vellum/client/resources/folder_entities/__init__.py +2 -0
  37. vellum/client/resources/folder_entities/client.py +12 -13
  38. vellum/client/resources/folder_entities/raw_client.py +15 -16
  39. vellum/client/resources/folder_entities/types/__init__.py +2 -0
  40. vellum/client/resources/metric_definitions/__init__.py +2 -0
  41. vellum/client/resources/metric_definitions/client.py +12 -13
  42. vellum/client/resources/metric_definitions/raw_client.py +17 -18
  43. vellum/client/resources/ml_models/__init__.py +2 -0
  44. vellum/client/resources/ml_models/client.py +7 -8
  45. vellum/client/resources/ml_models/raw_client.py +11 -12
  46. vellum/client/resources/organizations/__init__.py +2 -0
  47. vellum/client/resources/organizations/client.py +7 -8
  48. vellum/client/resources/organizations/raw_client.py +10 -11
  49. vellum/client/resources/prompts/__init__.py +2 -0
  50. vellum/client/resources/prompts/client.py +13 -12
  51. vellum/client/resources/prompts/raw_client.py +40 -33
  52. vellum/client/resources/sandboxes/__init__.py +2 -0
  53. vellum/client/resources/sandboxes/client.py +15 -16
  54. vellum/client/resources/sandboxes/raw_client.py +20 -21
  55. vellum/client/resources/test_suite_runs/__init__.py +2 -0
  56. vellum/client/resources/test_suite_runs/client.py +17 -18
  57. vellum/client/resources/test_suite_runs/raw_client.py +20 -21
  58. vellum/client/resources/test_suites/__init__.py +2 -0
  59. vellum/client/resources/test_suites/client.py +20 -19
  60. vellum/client/resources/test_suites/raw_client.py +46 -31
  61. vellum/client/resources/workflow_deployments/__init__.py +2 -0
  62. vellum/client/resources/workflow_deployments/client.py +45 -46
  63. vellum/client/resources/workflow_deployments/raw_client.py +48 -49
  64. vellum/client/resources/workflow_deployments/types/__init__.py +2 -0
  65. vellum/client/resources/workflow_executions/__init__.py +2 -0
  66. vellum/client/resources/workflow_executions/client.py +7 -8
  67. vellum/client/resources/workflow_executions/raw_client.py +11 -12
  68. vellum/client/resources/workflow_sandboxes/__init__.py +2 -0
  69. vellum/client/resources/workflow_sandboxes/client.py +12 -13
  70. vellum/client/resources/workflow_sandboxes/raw_client.py +16 -17
  71. vellum/client/resources/workflow_sandboxes/types/__init__.py +2 -0
  72. vellum/client/resources/workflows/__init__.py +2 -0
  73. vellum/client/resources/workflows/client.py +11 -12
  74. vellum/client/resources/workflows/raw_client.py +34 -27
  75. vellum/client/resources/workspace_secrets/__init__.py +2 -0
  76. vellum/client/resources/workspace_secrets/client.py +11 -12
  77. vellum/client/resources/workspace_secrets/raw_client.py +15 -16
  78. vellum/client/resources/workspaces/__init__.py +2 -0
  79. vellum/client/resources/workspaces/client.py +7 -8
  80. vellum/client/resources/workspaces/raw_client.py +10 -11
  81. vellum/client/types/__init__.py +2 -0
  82. vellum/client/types/ad_hoc_execute_prompt_event.py +3 -2
  83. vellum/client/types/ad_hoc_expand_meta.py +2 -2
  84. vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py +3 -3
  85. vellum/client/types/ad_hoc_initiated_prompt_execution_meta.py +2 -2
  86. vellum/client/types/ad_hoc_rejected_prompt_execution_meta.py +3 -3
  87. vellum/client/types/ad_hoc_streaming_prompt_execution_meta.py +2 -2
  88. vellum/client/types/api_node_result.py +3 -3
  89. vellum/client/types/api_node_result_data.py +4 -4
  90. vellum/client/types/api_request_parent_context.py +11 -11
  91. vellum/client/types/array_chat_message_content.py +3 -3
  92. vellum/client/types/array_chat_message_content_item.py +5 -4
  93. vellum/client/types/array_chat_message_content_item_request.py +5 -4
  94. vellum/client/types/array_chat_message_content_request.py +3 -3
  95. vellum/client/types/array_input.py +12 -6
  96. vellum/client/types/array_vellum_value.py +4 -4
  97. vellum/client/types/array_vellum_value_request.py +4 -4
  98. vellum/client/types/audio_chat_message_content.py +3 -3
  99. vellum/client/types/audio_chat_message_content_request.py +3 -3
  100. vellum/client/types/audio_prompt_block.py +4 -4
  101. vellum/client/types/audio_vellum_value.py +3 -3
  102. vellum/client/types/audio_vellum_value_request.py +3 -3
  103. vellum/client/types/base_output.py +2 -2
  104. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large.py +2 -2
  105. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large_request.py +2 -2
  106. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1.py +2 -2
  107. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1_request.py +2 -2
  108. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1.py +2 -2
  109. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1_request.py +2 -2
  110. vellum/client/types/chat_history_input.py +3 -3
  111. vellum/client/types/chat_history_input_request.py +3 -3
  112. vellum/client/types/chat_history_vellum_value.py +3 -3
  113. vellum/client/types/chat_history_vellum_value_request.py +3 -3
  114. vellum/client/types/chat_message.py +4 -4
  115. vellum/client/types/chat_message_content.py +5 -4
  116. vellum/client/types/chat_message_content_request.py +5 -4
  117. vellum/client/types/chat_message_prompt_block.py +7 -7
  118. vellum/client/types/chat_message_request.py +4 -4
  119. vellum/client/types/code_execution_node_array_result.py +11 -5
  120. vellum/client/types/code_execution_node_chat_history_result.py +3 -3
  121. vellum/client/types/code_execution_node_error_result.py +3 -3
  122. vellum/client/types/code_execution_node_function_call_result.py +3 -3
  123. vellum/client/types/code_execution_node_json_result.py +2 -2
  124. vellum/client/types/code_execution_node_number_result.py +2 -2
  125. vellum/client/types/code_execution_node_result.py +10 -4
  126. vellum/client/types/code_execution_node_result_data.py +10 -4
  127. vellum/client/types/code_execution_node_result_output.py +6 -5
  128. vellum/client/types/code_execution_node_search_results_result.py +3 -3
  129. vellum/client/types/code_execution_node_string_result.py +2 -2
  130. vellum/client/types/code_execution_package.py +2 -2
  131. vellum/client/types/code_executor_input.py +7 -6
  132. vellum/client/types/code_executor_response.py +11 -5
  133. vellum/client/types/code_executor_secret_input.py +3 -3
  134. vellum/client/types/code_resource_definition.py +3 -3
  135. vellum/client/types/compile_prompt_deployment_expand_meta_request.py +2 -2
  136. vellum/client/types/compile_prompt_meta.py +2 -2
  137. vellum/client/types/conditional_node_result.py +3 -3
  138. vellum/client/types/conditional_node_result_data.py +2 -2
  139. vellum/client/types/container_image_build_config.py +3 -3
  140. vellum/client/types/container_image_container_image_tag.py +2 -2
  141. vellum/client/types/container_image_read.py +5 -5
  142. vellum/client/types/create_test_suite_test_case_request.py +9 -3
  143. vellum/client/types/deployment_history_item.py +10 -4
  144. vellum/client/types/deployment_provider_payload_response.py +4 -4
  145. vellum/client/types/deployment_read.py +10 -4
  146. vellum/client/types/deployment_release_tag_deployment_history_item.py +2 -2
  147. vellum/client/types/deployment_release_tag_read.py +4 -4
  148. vellum/client/types/docker_service_token.py +2 -2
  149. vellum/client/types/document_chat_message_content.py +3 -3
  150. vellum/client/types/document_chat_message_content_request.py +3 -3
  151. vellum/client/types/document_document_to_document_index.py +3 -3
  152. vellum/client/types/document_index_chunking.py +1 -0
  153. vellum/client/types/document_index_chunking_request.py +1 -0
  154. vellum/client/types/document_index_indexing_config.py +4 -4
  155. vellum/client/types/document_index_indexing_config_request.py +4 -4
  156. vellum/client/types/document_index_read.py +4 -4
  157. vellum/client/types/document_prompt_block.py +4 -4
  158. vellum/client/types/document_read.py +4 -4
  159. vellum/client/types/document_vellum_value.py +3 -3
  160. vellum/client/types/document_vellum_value_request.py +3 -3
  161. vellum/client/types/enriched_normalized_completion.py +3 -3
  162. vellum/client/types/ephemeral_prompt_cache_config.py +3 -3
  163. vellum/client/types/error_input.py +3 -3
  164. vellum/client/types/error_vellum_value.py +3 -3
  165. vellum/client/types/error_vellum_value_request.py +3 -3
  166. vellum/client/types/execute_api_request_bearer_token.py +1 -0
  167. vellum/client/types/execute_api_request_headers_value.py +1 -0
  168. vellum/client/types/execute_api_response.py +5 -5
  169. vellum/client/types/execute_prompt_event.py +3 -2
  170. vellum/client/types/execute_prompt_response.py +1 -0
  171. vellum/client/types/execute_workflow_response.py +10 -4
  172. vellum/client/types/execute_workflow_workflow_result_event.py +1 -0
  173. vellum/client/types/execution_array_vellum_value.py +12 -6
  174. vellum/client/types/execution_chat_history_vellum_value.py +3 -3
  175. vellum/client/types/execution_error_vellum_value.py +3 -3
  176. vellum/client/types/execution_function_call_vellum_value.py +3 -3
  177. vellum/client/types/execution_json_vellum_value.py +3 -3
  178. vellum/client/types/execution_number_vellum_value.py +3 -3
  179. vellum/client/types/execution_search_results_vellum_value.py +3 -3
  180. vellum/client/types/execution_string_vellum_value.py +3 -3
  181. vellum/client/types/execution_thinking_vellum_value.py +3 -3
  182. vellum/client/types/execution_vellum_value.py +6 -5
  183. vellum/client/types/external_input_descriptor.py +3 -3
  184. vellum/client/types/external_parent_context.py +11 -11
  185. vellum/client/types/external_test_case_execution.py +10 -4
  186. vellum/client/types/external_test_case_execution_request.py +10 -4
  187. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15.py +2 -2
  188. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15_request.py +2 -2
  189. vellum/client/types/folder_entity.py +4 -3
  190. vellum/client/types/folder_entity_dataset.py +3 -3
  191. vellum/client/types/folder_entity_dataset_data.py +3 -3
  192. vellum/client/types/folder_entity_document_index.py +3 -3
  193. vellum/client/types/folder_entity_document_index_data.py +4 -4
  194. vellum/client/types/folder_entity_folder.py +3 -3
  195. vellum/client/types/folder_entity_folder_data.py +2 -2
  196. vellum/client/types/folder_entity_prompt_sandbox.py +3 -3
  197. vellum/client/types/folder_entity_prompt_sandbox_data.py +3 -3
  198. vellum/client/types/folder_entity_test_suite.py +3 -3
  199. vellum/client/types/folder_entity_test_suite_data.py +3 -3
  200. vellum/client/types/folder_entity_workflow_sandbox.py +3 -3
  201. vellum/client/types/folder_entity_workflow_sandbox_data.py +3 -3
  202. vellum/client/types/fulfilled_ad_hoc_execute_prompt_event.py +4 -4
  203. vellum/client/types/fulfilled_execute_prompt_event.py +4 -4
  204. vellum/client/types/fulfilled_execute_prompt_response.py +3 -3
  205. vellum/client/types/fulfilled_execute_workflow_workflow_result_event.py +11 -5
  206. vellum/client/types/fulfilled_prompt_execution_meta.py +3 -3
  207. vellum/client/types/fulfilled_workflow_node_result_event.py +12 -6
  208. vellum/client/types/function_call.py +2 -2
  209. vellum/client/types/function_call_chat_message_content.py +3 -3
  210. vellum/client/types/function_call_chat_message_content_request.py +3 -3
  211. vellum/client/types/function_call_chat_message_content_value.py +2 -2
  212. vellum/client/types/function_call_chat_message_content_value_request.py +2 -2
  213. vellum/client/types/function_call_input.py +3 -3
  214. vellum/client/types/function_call_prompt_block.py +4 -4
  215. vellum/client/types/function_call_request.py +2 -2
  216. vellum/client/types/function_call_vellum_value.py +3 -3
  217. vellum/client/types/function_call_vellum_value_request.py +3 -3
  218. vellum/client/types/function_definition.py +4 -4
  219. vellum/client/types/generate_options_request.py +3 -3
  220. vellum/client/types/generate_request.py +2 -2
  221. vellum/client/types/generate_response.py +3 -3
  222. vellum/client/types/generate_result.py +3 -3
  223. vellum/client/types/generate_result_data.py +3 -3
  224. vellum/client/types/generate_result_error.py +3 -3
  225. vellum/client/types/generate_stream_response.py +3 -3
  226. vellum/client/types/generate_stream_result.py +4 -4
  227. vellum/client/types/generate_stream_result_data.py +3 -3
  228. vellum/client/types/google_vertex_ai_vectorizer_config.py +2 -2
  229. vellum/client/types/google_vertex_ai_vectorizer_config_request.py +2 -2
  230. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001.py +3 -3
  231. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001_request.py +3 -3
  232. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004.py +3 -3
  233. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004_request.py +3 -3
  234. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002.py +3 -3
  235. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002_request.py +3 -3
  236. vellum/client/types/hkunlp_instructor_xl_vectorizer.py +3 -3
  237. vellum/client/types/hkunlp_instructor_xl_vectorizer_request.py +3 -3
  238. vellum/client/types/image_chat_message_content.py +3 -3
  239. vellum/client/types/image_chat_message_content_request.py +3 -3
  240. vellum/client/types/image_prompt_block.py +4 -4
  241. vellum/client/types/image_vellum_value.py +3 -3
  242. vellum/client/types/image_vellum_value_request.py +3 -3
  243. vellum/client/types/indexing_config_vectorizer.py +7 -6
  244. vellum/client/types/indexing_config_vectorizer_request.py +7 -6
  245. vellum/client/types/initiated_ad_hoc_execute_prompt_event.py +3 -3
  246. vellum/client/types/initiated_execute_prompt_event.py +3 -3
  247. vellum/client/types/initiated_prompt_execution_meta.py +2 -2
  248. vellum/client/types/initiated_workflow_node_result_event.py +12 -6
  249. vellum/client/types/instructor_vectorizer_config.py +2 -2
  250. vellum/client/types/instructor_vectorizer_config_request.py +2 -2
  251. vellum/client/types/invoked_port.py +2 -2
  252. vellum/client/types/jinja_prompt_block.py +4 -4
  253. vellum/client/types/json_input.py +3 -3
  254. vellum/client/types/json_input_request.py +3 -3
  255. vellum/client/types/json_vellum_value.py +2 -2
  256. vellum/client/types/json_vellum_value_request.py +2 -2
  257. vellum/client/types/map_node_result.py +3 -3
  258. vellum/client/types/map_node_result_data.py +3 -3
  259. vellum/client/types/merge_node_result.py +3 -3
  260. vellum/client/types/merge_node_result_data.py +2 -2
  261. vellum/client/types/metadata_filter_config_request.py +12 -6
  262. vellum/client/types/metadata_filter_rule_request.py +5 -5
  263. vellum/client/types/metadata_filters_request.py +1 -0
  264. vellum/client/types/metric_definition_execution.py +10 -4
  265. vellum/client/types/metric_definition_history_item.py +10 -4
  266. vellum/client/types/metric_definition_input.py +3 -2
  267. vellum/client/types/metric_node_result.py +2 -2
  268. vellum/client/types/ml_model_read.py +6 -3
  269. vellum/client/types/ml_model_usage.py +2 -2
  270. vellum/client/types/ml_model_usage_wrapper.py +3 -3
  271. vellum/client/types/named_scenario_input_chat_history_variable_value_request.py +3 -3
  272. vellum/client/types/named_scenario_input_json_variable_value_request.py +2 -2
  273. vellum/client/types/named_scenario_input_request.py +3 -2
  274. vellum/client/types/named_scenario_input_string_variable_value_request.py +2 -2
  275. vellum/client/types/named_test_case_array_variable_value.py +11 -5
  276. vellum/client/types/named_test_case_array_variable_value_request.py +11 -5
  277. vellum/client/types/named_test_case_chat_history_variable_value.py +3 -3
  278. vellum/client/types/named_test_case_chat_history_variable_value_request.py +3 -3
  279. vellum/client/types/named_test_case_error_variable_value.py +3 -3
  280. vellum/client/types/named_test_case_error_variable_value_request.py +3 -3
  281. vellum/client/types/named_test_case_function_call_variable_value.py +3 -3
  282. vellum/client/types/named_test_case_function_call_variable_value_request.py +3 -3
  283. vellum/client/types/named_test_case_json_variable_value.py +2 -2
  284. vellum/client/types/named_test_case_json_variable_value_request.py +2 -2
  285. vellum/client/types/named_test_case_number_variable_value.py +2 -2
  286. vellum/client/types/named_test_case_number_variable_value_request.py +2 -2
  287. vellum/client/types/named_test_case_search_results_variable_value.py +3 -3
  288. vellum/client/types/named_test_case_search_results_variable_value_request.py +3 -3
  289. vellum/client/types/named_test_case_string_variable_value.py +2 -2
  290. vellum/client/types/named_test_case_string_variable_value_request.py +2 -2
  291. vellum/client/types/named_test_case_variable_value.py +6 -5
  292. vellum/client/types/named_test_case_variable_value_request.py +6 -5
  293. vellum/client/types/node_execution_fulfilled_body.py +4 -4
  294. vellum/client/types/node_execution_fulfilled_event.py +22 -16
  295. vellum/client/types/node_execution_initiated_body.py +3 -3
  296. vellum/client/types/node_execution_initiated_event.py +22 -16
  297. vellum/client/types/node_execution_paused_body.py +3 -3
  298. vellum/client/types/node_execution_paused_event.py +22 -16
  299. vellum/client/types/node_execution_rejected_body.py +4 -4
  300. vellum/client/types/node_execution_rejected_event.py +22 -16
  301. vellum/client/types/node_execution_resumed_body.py +3 -3
  302. vellum/client/types/node_execution_resumed_event.py +22 -16
  303. vellum/client/types/node_execution_span.py +19 -13
  304. vellum/client/types/node_execution_span_attributes.py +2 -2
  305. vellum/client/types/node_execution_streaming_body.py +4 -4
  306. vellum/client/types/node_execution_streaming_event.py +22 -16
  307. vellum/client/types/node_input_compiled_array_value.py +11 -5
  308. vellum/client/types/node_input_compiled_chat_history_value.py +3 -3
  309. vellum/client/types/node_input_compiled_error_value.py +3 -3
  310. vellum/client/types/node_input_compiled_function_call_value.py +3 -3
  311. vellum/client/types/node_input_compiled_json_value.py +2 -2
  312. vellum/client/types/node_input_compiled_number_value.py +2 -2
  313. vellum/client/types/node_input_compiled_search_results_value.py +3 -3
  314. vellum/client/types/node_input_compiled_secret_value.py +3 -3
  315. vellum/client/types/node_input_compiled_string_value.py +2 -2
  316. vellum/client/types/node_input_variable_compiled_value.py +6 -5
  317. vellum/client/types/node_output_compiled_array_value.py +12 -6
  318. vellum/client/types/node_output_compiled_chat_history_value.py +3 -3
  319. vellum/client/types/node_output_compiled_error_value.py +3 -3
  320. vellum/client/types/node_output_compiled_function_call_value.py +3 -3
  321. vellum/client/types/node_output_compiled_json_value.py +3 -3
  322. vellum/client/types/node_output_compiled_number_value.py +3 -3
  323. vellum/client/types/node_output_compiled_search_results_value.py +3 -3
  324. vellum/client/types/node_output_compiled_string_value.py +3 -3
  325. vellum/client/types/node_output_compiled_thinking_value.py +3 -3
  326. vellum/client/types/node_output_compiled_value.py +6 -5
  327. vellum/client/types/node_parent_context.py +12 -12
  328. vellum/client/types/normalized_log_probs.py +3 -3
  329. vellum/client/types/normalized_token_log_probs.py +2 -2
  330. vellum/client/types/number_input.py +3 -3
  331. vellum/client/types/number_vellum_value.py +2 -2
  332. vellum/client/types/number_vellum_value_request.py +2 -2
  333. vellum/client/types/open_ai_vectorizer_config.py +3 -3
  334. vellum/client/types/open_ai_vectorizer_config_request.py +3 -3
  335. vellum/client/types/open_ai_vectorizer_text_embedding_3_large.py +3 -3
  336. vellum/client/types/open_ai_vectorizer_text_embedding_3_large_request.py +3 -3
  337. vellum/client/types/open_ai_vectorizer_text_embedding_3_small.py +3 -3
  338. vellum/client/types/open_ai_vectorizer_text_embedding_3_small_request.py +3 -3
  339. vellum/client/types/open_ai_vectorizer_text_embedding_ada_002.py +3 -3
  340. vellum/client/types/open_ai_vectorizer_text_embedding_ada_002_request.py +3 -3
  341. vellum/client/types/organization_read.py +4 -4
  342. vellum/client/types/paginated_container_image_read_list.py +3 -3
  343. vellum/client/types/paginated_deployment_release_tag_read_list.py +3 -3
  344. vellum/client/types/paginated_document_index_read_list.py +3 -3
  345. vellum/client/types/paginated_folder_entity_list.py +3 -3
  346. vellum/client/types/paginated_slim_deployment_read_list.py +10 -4
  347. vellum/client/types/paginated_slim_document_list.py +3 -3
  348. vellum/client/types/paginated_slim_workflow_deployment_list.py +10 -4
  349. vellum/client/types/paginated_test_suite_run_execution_list.py +10 -4
  350. vellum/client/types/paginated_test_suite_test_case_list.py +10 -4
  351. vellum/client/types/paginated_workflow_release_tag_read_list.py +3 -3
  352. vellum/client/types/paginated_workflow_sandbox_example_list.py +3 -3
  353. vellum/client/types/parent_context.py +5 -5
  354. vellum/client/types/pdf_search_result_meta_source.py +2 -2
  355. vellum/client/types/pdf_search_result_meta_source_request.py +2 -2
  356. vellum/client/types/plain_text_prompt_block.py +4 -4
  357. vellum/client/types/price.py +3 -3
  358. vellum/client/types/prompt_block.py +7 -6
  359. vellum/client/types/prompt_deployment_expand_meta_request.py +2 -2
  360. vellum/client/types/prompt_deployment_input_request.py +3 -2
  361. vellum/client/types/prompt_deployment_parent_context.py +11 -11
  362. vellum/client/types/prompt_deployment_release.py +6 -6
  363. vellum/client/types/prompt_deployment_release_prompt_deployment.py +2 -2
  364. vellum/client/types/prompt_deployment_release_prompt_version.py +4 -4
  365. vellum/client/types/prompt_exec_config.py +15 -9
  366. vellum/client/types/prompt_execution_meta.py +3 -3
  367. vellum/client/types/prompt_node_execution_meta.py +3 -3
  368. vellum/client/types/prompt_node_result.py +3 -3
  369. vellum/client/types/prompt_node_result_data.py +3 -3
  370. vellum/client/types/prompt_output.py +3 -2
  371. vellum/client/types/prompt_parameters.py +2 -2
  372. vellum/client/types/prompt_push_response.py +2 -2
  373. vellum/client/types/prompt_request_chat_history_input.py +3 -3
  374. vellum/client/types/prompt_request_input.py +3 -2
  375. vellum/client/types/prompt_request_json_input.py +3 -3
  376. vellum/client/types/prompt_request_string_input.py +3 -3
  377. vellum/client/types/prompt_settings.py +2 -2
  378. vellum/client/types/prompt_version_build_config_sandbox.py +2 -2
  379. vellum/client/types/raw_prompt_execution_overrides_request.py +2 -2
  380. vellum/client/types/reducto_chunker_config.py +2 -2
  381. vellum/client/types/reducto_chunker_config_request.py +2 -2
  382. vellum/client/types/reducto_chunking.py +3 -3
  383. vellum/client/types/reducto_chunking_request.py +3 -3
  384. vellum/client/types/rejected_ad_hoc_execute_prompt_event.py +4 -4
  385. vellum/client/types/rejected_execute_prompt_event.py +4 -4
  386. vellum/client/types/rejected_execute_prompt_response.py +3 -3
  387. vellum/client/types/rejected_execute_workflow_workflow_result_event.py +4 -4
  388. vellum/client/types/rejected_prompt_execution_meta.py +3 -3
  389. vellum/client/types/rejected_workflow_node_result_event.py +12 -6
  390. vellum/client/types/release_created_by.py +2 -2
  391. vellum/client/types/release_environment.py +2 -2
  392. vellum/client/types/release_release_tag.py +3 -3
  393. vellum/client/types/release_review_reviewer.py +2 -2
  394. vellum/client/types/release_tag_release.py +2 -2
  395. vellum/client/types/replace_test_suite_test_case_request.py +9 -3
  396. vellum/client/types/rich_text_child_block.py +2 -1
  397. vellum/client/types/rich_text_prompt_block.py +4 -4
  398. vellum/client/types/sandbox_scenario.py +3 -3
  399. vellum/client/types/scenario_input.py +3 -2
  400. vellum/client/types/scenario_input_chat_history_variable_value.py +3 -3
  401. vellum/client/types/scenario_input_json_variable_value.py +2 -2
  402. vellum/client/types/scenario_input_string_variable_value.py +2 -2
  403. vellum/client/types/search_filters_request.py +11 -5
  404. vellum/client/types/search_node_result.py +3 -3
  405. vellum/client/types/search_node_result_data.py +3 -3
  406. vellum/client/types/search_request_options_request.py +13 -7
  407. vellum/client/types/search_response.py +3 -3
  408. vellum/client/types/search_result.py +3 -3
  409. vellum/client/types/search_result_document.py +2 -2
  410. vellum/client/types/search_result_document_request.py +2 -2
  411. vellum/client/types/search_result_merging_request.py +2 -2
  412. vellum/client/types/search_result_meta.py +3 -3
  413. vellum/client/types/search_result_meta_request.py +3 -3
  414. vellum/client/types/search_result_request.py +3 -3
  415. vellum/client/types/search_results_input.py +3 -3
  416. vellum/client/types/search_results_vellum_value.py +3 -3
  417. vellum/client/types/search_results_vellum_value_request.py +3 -3
  418. vellum/client/types/search_weights_request.py +2 -2
  419. vellum/client/types/sentence_chunker_config.py +2 -2
  420. vellum/client/types/sentence_chunker_config_request.py +2 -2
  421. vellum/client/types/sentence_chunking.py +3 -3
  422. vellum/client/types/sentence_chunking_request.py +3 -3
  423. vellum/client/types/slim_deployment_read.py +10 -4
  424. vellum/client/types/slim_document.py +5 -5
  425. vellum/client/types/slim_document_document_to_document_index.py +3 -3
  426. vellum/client/types/slim_release_review.py +4 -4
  427. vellum/client/types/slim_workflow_deployment.py +11 -5
  428. vellum/client/types/slim_workflow_execution_read.py +21 -15
  429. vellum/client/types/span_link.py +12 -12
  430. vellum/client/types/streaming_ad_hoc_execute_prompt_event.py +4 -4
  431. vellum/client/types/streaming_execute_prompt_event.py +3 -3
  432. vellum/client/types/streaming_prompt_execution_meta.py +2 -2
  433. vellum/client/types/streaming_workflow_node_result_event.py +12 -6
  434. vellum/client/types/string_chat_message_content.py +2 -2
  435. vellum/client/types/string_chat_message_content_request.py +2 -2
  436. vellum/client/types/string_input.py +3 -3
  437. vellum/client/types/string_input_request.py +3 -3
  438. vellum/client/types/string_vellum_value.py +2 -2
  439. vellum/client/types/string_vellum_value_request.py +2 -2
  440. vellum/client/types/submit_completion_actual_request.py +3 -3
  441. vellum/client/types/submit_workflow_execution_actual_request.py +3 -2
  442. vellum/client/types/subworkflow_node_result.py +3 -3
  443. vellum/client/types/subworkflow_node_result_data.py +2 -2
  444. vellum/client/types/templating_node_array_result.py +11 -5
  445. vellum/client/types/templating_node_chat_history_result.py +3 -3
  446. vellum/client/types/templating_node_error_result.py +3 -3
  447. vellum/client/types/templating_node_function_call_result.py +3 -3
  448. vellum/client/types/templating_node_json_result.py +2 -2
  449. vellum/client/types/templating_node_number_result.py +2 -2
  450. vellum/client/types/templating_node_result.py +10 -4
  451. vellum/client/types/templating_node_result_data.py +10 -4
  452. vellum/client/types/templating_node_result_output.py +6 -5
  453. vellum/client/types/templating_node_search_results_result.py +3 -3
  454. vellum/client/types/templating_node_string_result.py +2 -2
  455. vellum/client/types/terminal_node_array_result.py +11 -5
  456. vellum/client/types/terminal_node_chat_history_result.py +2 -2
  457. vellum/client/types/terminal_node_error_result.py +2 -2
  458. vellum/client/types/terminal_node_function_call_result.py +2 -2
  459. vellum/client/types/terminal_node_json_result.py +2 -2
  460. vellum/client/types/terminal_node_number_result.py +2 -2
  461. vellum/client/types/terminal_node_result.py +10 -4
  462. vellum/client/types/terminal_node_result_data.py +10 -4
  463. vellum/client/types/terminal_node_result_output.py +6 -5
  464. vellum/client/types/terminal_node_search_results_result.py +2 -2
  465. vellum/client/types/terminal_node_string_result.py +2 -2
  466. vellum/client/types/test_case_array_variable_value.py +11 -5
  467. vellum/client/types/test_case_chat_history_variable_value.py +3 -3
  468. vellum/client/types/test_case_error_variable_value.py +3 -3
  469. vellum/client/types/test_case_function_call_variable_value.py +3 -3
  470. vellum/client/types/test_case_json_variable_value.py +2 -2
  471. vellum/client/types/test_case_number_variable_value.py +2 -2
  472. vellum/client/types/test_case_search_results_variable_value.py +3 -3
  473. vellum/client/types/test_case_string_variable_value.py +2 -2
  474. vellum/client/types/test_case_variable_value.py +6 -5
  475. vellum/client/types/test_suite_run_deployment_release_tag_exec_config.py +3 -3
  476. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data.py +3 -3
  477. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data_request.py +3 -3
  478. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_request.py +3 -3
  479. vellum/client/types/test_suite_run_exec_config.py +2 -1
  480. vellum/client/types/test_suite_run_exec_config_request.py +2 -1
  481. vellum/client/types/test_suite_run_execution.py +11 -5
  482. vellum/client/types/test_suite_run_execution_array_output.py +11 -5
  483. vellum/client/types/test_suite_run_execution_chat_history_output.py +3 -3
  484. vellum/client/types/test_suite_run_execution_error_output.py +3 -3
  485. vellum/client/types/test_suite_run_execution_function_call_output.py +3 -3
  486. vellum/client/types/test_suite_run_execution_json_output.py +2 -2
  487. vellum/client/types/test_suite_run_execution_metric_definition.py +2 -2
  488. vellum/client/types/test_suite_run_execution_metric_result.py +11 -5
  489. vellum/client/types/test_suite_run_execution_number_output.py +2 -2
  490. vellum/client/types/test_suite_run_execution_output.py +6 -5
  491. vellum/client/types/test_suite_run_execution_search_results_output.py +3 -3
  492. vellum/client/types/test_suite_run_execution_string_output.py +2 -2
  493. vellum/client/types/test_suite_run_external_exec_config.py +10 -4
  494. vellum/client/types/test_suite_run_external_exec_config_data.py +10 -4
  495. vellum/client/types/test_suite_run_external_exec_config_data_request.py +10 -4
  496. vellum/client/types/test_suite_run_external_exec_config_request.py +10 -4
  497. vellum/client/types/test_suite_run_metric_array_output.py +11 -5
  498. vellum/client/types/test_suite_run_metric_error_output.py +3 -3
  499. vellum/client/types/test_suite_run_metric_json_output.py +2 -2
  500. vellum/client/types/test_suite_run_metric_number_output.py +2 -2
  501. vellum/client/types/test_suite_run_metric_output.py +5 -4
  502. vellum/client/types/test_suite_run_metric_string_output.py +2 -2
  503. vellum/client/types/test_suite_run_progress.py +2 -2
  504. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_data_request.py +3 -3
  505. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_request.py +3 -3
  506. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py +3 -3
  507. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py +3 -3
  508. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py +3 -3
  509. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py +3 -3
  510. vellum/client/types/test_suite_run_read.py +12 -6
  511. vellum/client/types/test_suite_run_test_suite.py +2 -2
  512. vellum/client/types/test_suite_run_workflow_release_tag_exec_config.py +3 -3
  513. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data.py +3 -3
  514. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data_request.py +3 -3
  515. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_request.py +3 -3
  516. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_data_request.py +3 -3
  517. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_request.py +3 -3
  518. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config.py +3 -3
  519. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data.py +3 -3
  520. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data_request.py +3 -3
  521. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_request.py +3 -3
  522. vellum/client/types/test_suite_test_case.py +10 -4
  523. vellum/client/types/test_suite_test_case_bulk_operation_request.py +2 -1
  524. vellum/client/types/test_suite_test_case_bulk_result.py +2 -1
  525. vellum/client/types/test_suite_test_case_create_bulk_operation_request.py +10 -4
  526. vellum/client/types/test_suite_test_case_created_bulk_result.py +3 -3
  527. vellum/client/types/test_suite_test_case_created_bulk_result_data.py +2 -2
  528. vellum/client/types/test_suite_test_case_delete_bulk_operation_data_request.py +2 -2
  529. vellum/client/types/test_suite_test_case_delete_bulk_operation_request.py +3 -3
  530. vellum/client/types/test_suite_test_case_deleted_bulk_result.py +3 -3
  531. vellum/client/types/test_suite_test_case_deleted_bulk_result_data.py +2 -2
  532. vellum/client/types/test_suite_test_case_rejected_bulk_result.py +2 -2
  533. vellum/client/types/test_suite_test_case_replace_bulk_operation_request.py +10 -4
  534. vellum/client/types/test_suite_test_case_replaced_bulk_result.py +3 -3
  535. vellum/client/types/test_suite_test_case_replaced_bulk_result_data.py +2 -2
  536. vellum/client/types/test_suite_test_case_upsert_bulk_operation_request.py +10 -4
  537. vellum/client/types/thinking_vellum_value.py +3 -3
  538. vellum/client/types/thinking_vellum_value_request.py +3 -3
  539. vellum/client/types/token_overlapping_window_chunker_config.py +2 -2
  540. vellum/client/types/token_overlapping_window_chunker_config_request.py +2 -2
  541. vellum/client/types/token_overlapping_window_chunking.py +3 -3
  542. vellum/client/types/token_overlapping_window_chunking_request.py +3 -3
  543. vellum/client/types/upload_document_response.py +3 -3
  544. vellum/client/types/upsert_test_suite_test_case_request.py +9 -3
  545. vellum/client/types/variable_prompt_block.py +4 -4
  546. vellum/client/types/vellum_audio.py +3 -3
  547. vellum/client/types/vellum_audio_request.py +3 -3
  548. vellum/client/types/vellum_code_resource_definition.py +2 -2
  549. vellum/client/types/vellum_document.py +2 -2
  550. vellum/client/types/vellum_document_request.py +2 -2
  551. vellum/client/types/vellum_error.py +3 -3
  552. vellum/client/types/vellum_error_request.py +3 -3
  553. vellum/client/types/vellum_image.py +2 -2
  554. vellum/client/types/vellum_image_request.py +2 -2
  555. vellum/client/types/vellum_node_execution_event.py +4 -3
  556. vellum/client/types/vellum_sdk_error.py +3 -3
  557. vellum/client/types/vellum_secret.py +2 -2
  558. vellum/client/types/vellum_span.py +2 -1
  559. vellum/client/types/vellum_value.py +9 -8
  560. vellum/client/types/vellum_value_logical_condition_group_request.py +6 -6
  561. vellum/client/types/vellum_value_logical_condition_request.py +13 -7
  562. vellum/client/types/vellum_value_logical_expression_request.py +2 -1
  563. vellum/client/types/vellum_value_request.py +9 -8
  564. vellum/client/types/vellum_variable.py +13 -7
  565. vellum/client/types/vellum_variable_extensions.py +2 -2
  566. vellum/client/types/vellum_video.py +3 -3
  567. vellum/client/types/vellum_video_request.py +3 -3
  568. vellum/client/types/vellum_workflow_execution_event.py +4 -3
  569. vellum/client/types/video_chat_message_content.py +3 -3
  570. vellum/client/types/video_chat_message_content_request.py +3 -3
  571. vellum/client/types/video_prompt_block.py +4 -4
  572. vellum/client/types/video_vellum_value.py +3 -3
  573. vellum/client/types/video_vellum_value_request.py +3 -3
  574. vellum/client/types/workflow_deployment_event_executions_response.py +18 -12
  575. vellum/client/types/workflow_deployment_history_item.py +10 -4
  576. vellum/client/types/workflow_deployment_parent_context.py +11 -11
  577. vellum/client/types/workflow_deployment_read.py +11 -5
  578. vellum/client/types/workflow_deployment_release.py +13 -7
  579. vellum/client/types/workflow_deployment_release_workflow_deployment.py +2 -2
  580. vellum/client/types/workflow_deployment_release_workflow_version.py +10 -4
  581. vellum/client/types/workflow_error.py +1 -0
  582. vellum/client/types/workflow_event_error.py +3 -3
  583. vellum/client/types/workflow_event_execution_read.py +22 -16
  584. vellum/client/types/workflow_execution_actual.py +10 -4
  585. vellum/client/types/workflow_execution_actual_chat_history_request.py +2 -2
  586. vellum/client/types/workflow_execution_actual_json_request.py +2 -2
  587. vellum/client/types/workflow_execution_actual_string_request.py +2 -2
  588. vellum/client/types/workflow_execution_detail.py +22 -16
  589. vellum/client/types/workflow_execution_fulfilled_body.py +3 -3
  590. vellum/client/types/workflow_execution_fulfilled_event.py +22 -16
  591. vellum/client/types/workflow_execution_initiated_body.py +3 -3
  592. vellum/client/types/workflow_execution_initiated_event.py +22 -16
  593. vellum/client/types/workflow_execution_node_result_event.py +10 -4
  594. vellum/client/types/workflow_execution_paused_body.py +4 -4
  595. vellum/client/types/workflow_execution_paused_event.py +22 -16
  596. vellum/client/types/workflow_execution_rejected_body.py +4 -4
  597. vellum/client/types/workflow_execution_rejected_event.py +22 -16
  598. vellum/client/types/workflow_execution_resumed_body.py +3 -3
  599. vellum/client/types/workflow_execution_resumed_event.py +22 -16
  600. vellum/client/types/workflow_execution_snapshotted_body.py +3 -3
  601. vellum/client/types/workflow_execution_snapshotted_event.py +22 -16
  602. vellum/client/types/workflow_execution_span.py +18 -12
  603. vellum/client/types/workflow_execution_span_attributes.py +2 -2
  604. vellum/client/types/workflow_execution_streaming_body.py +4 -4
  605. vellum/client/types/workflow_execution_streaming_event.py +22 -16
  606. vellum/client/types/workflow_execution_usage_calculation_error.py +3 -3
  607. vellum/client/types/workflow_execution_usage_calculation_fulfilled_body.py +3 -3
  608. vellum/client/types/workflow_execution_usage_result.py +3 -3
  609. vellum/client/types/workflow_execution_view_online_eval_metric_result.py +10 -4
  610. vellum/client/types/workflow_execution_workflow_result_event.py +10 -4
  611. vellum/client/types/workflow_expand_meta_request.py +2 -2
  612. vellum/client/types/workflow_initialization_error.py +2 -2
  613. vellum/client/types/workflow_node_result_data.py +8 -7
  614. vellum/client/types/workflow_node_result_event.py +3 -2
  615. vellum/client/types/workflow_output.py +6 -5
  616. vellum/client/types/workflow_output_array.py +12 -6
  617. vellum/client/types/workflow_output_chat_history.py +3 -3
  618. vellum/client/types/workflow_output_error.py +3 -3
  619. vellum/client/types/workflow_output_function_call.py +3 -3
  620. vellum/client/types/workflow_output_image.py +3 -3
  621. vellum/client/types/workflow_output_json.py +3 -3
  622. vellum/client/types/workflow_output_number.py +3 -3
  623. vellum/client/types/workflow_output_search_results.py +3 -3
  624. vellum/client/types/workflow_output_string.py +3 -3
  625. vellum/client/types/workflow_parent_context.py +12 -12
  626. vellum/client/types/workflow_push_deployment_config_request.py +2 -2
  627. vellum/client/types/workflow_push_response.py +2 -2
  628. vellum/client/types/workflow_release_tag_read.py +4 -4
  629. vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py +2 -2
  630. vellum/client/types/workflow_request_chat_history_input_request.py +3 -3
  631. vellum/client/types/workflow_request_input_request.py +3 -2
  632. vellum/client/types/workflow_request_json_input_request.py +3 -3
  633. vellum/client/types/workflow_request_number_input_request.py +3 -3
  634. vellum/client/types/workflow_request_string_input_request.py +3 -3
  635. vellum/client/types/workflow_result_event.py +13 -7
  636. vellum/client/types/workflow_result_event_output_data.py +7 -6
  637. vellum/client/types/workflow_result_event_output_data_array.py +12 -6
  638. vellum/client/types/workflow_result_event_output_data_chat_history.py +3 -3
  639. vellum/client/types/workflow_result_event_output_data_error.py +3 -3
  640. vellum/client/types/workflow_result_event_output_data_function_call.py +3 -3
  641. vellum/client/types/workflow_result_event_output_data_json.py +3 -3
  642. vellum/client/types/workflow_result_event_output_data_number.py +3 -3
  643. vellum/client/types/workflow_result_event_output_data_search_results.py +3 -3
  644. vellum/client/types/workflow_result_event_output_data_string.py +3 -3
  645. vellum/client/types/workflow_sandbox_example.py +2 -2
  646. vellum/client/types/workflow_sandbox_parent_context.py +11 -11
  647. vellum/client/types/workflow_stream_event.py +2 -1
  648. vellum/client/types/workspace_read.py +3 -3
  649. vellum/client/types/workspace_secret_read.py +3 -3
  650. vellum/core/force_multipart.py +3 -0
  651. vellum/workflows/events/node.py +25 -10
  652. vellum/workflows/events/tests/test_event.py +19 -19
  653. vellum/workflows/state/encoder.py +2 -4
  654. vellum/workflows/utils/functions.py +1 -1
  655. {vellum_ai-1.1.3.dist-info → vellum_ai-1.1.4.dist-info}/METADATA +2 -2
  656. {vellum_ai-1.1.3.dist-info → vellum_ai-1.1.4.dist-info}/RECORD +660 -658
  657. vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py +154 -0
  658. {vellum_ai-1.1.3.dist-info → vellum_ai-1.1.4.dist-info}/LICENSE +0 -0
  659. {vellum_ai-1.1.3.dist-info → vellum_ai-1.1.4.dist-info}/WHEEL +0 -0
  660. {vellum_ai-1.1.3.dist-info → vellum_ai-1.1.4.dist-info}/entry_points.txt +0 -0
@@ -11,10 +11,12 @@ from random import random
11
11
 
12
12
  import httpx
13
13
  from .file import File, convert_file_dict_to_httpx_tuples
14
+ from .force_multipart import FORCE_MULTIPART
14
15
  from .jsonable_encoder import jsonable_encoder
15
16
  from .query_encoder import encode_query
16
17
  from .remove_none_from_dict import remove_none_from_dict
17
18
  from .request_options import RequestOptions
19
+ from httpx._types import RequestFiles
18
20
 
19
21
  INITIAL_RETRY_DELAY_SECONDS = 0.5
20
22
  MAX_RETRY_DELAY_SECONDS = 10
@@ -178,11 +180,17 @@ class HttpClient:
178
180
  json: typing.Optional[typing.Any] = None,
179
181
  data: typing.Optional[typing.Any] = None,
180
182
  content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
181
- files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
183
+ files: typing.Optional[
184
+ typing.Union[
185
+ typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]],
186
+ typing.List[typing.Tuple[str, File]],
187
+ ]
188
+ ] = None,
182
189
  headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
183
190
  request_options: typing.Optional[RequestOptions] = None,
184
191
  retries: int = 2,
185
192
  omit: typing.Optional[typing.Any] = None,
193
+ force_multipart: typing.Optional[bool] = None,
186
194
  ) -> httpx.Response:
187
195
  base_url = self.get_base_url(base_url)
188
196
  timeout = (
@@ -193,6 +201,15 @@ class HttpClient:
193
201
 
194
202
  json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
195
203
 
204
+ request_files: typing.Optional[RequestFiles] = (
205
+ convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
206
+ if (files is not None and files is not omit and isinstance(files, dict))
207
+ else None
208
+ )
209
+
210
+ if (request_files is None or len(request_files) == 0) and force_multipart:
211
+ request_files = FORCE_MULTIPART
212
+
196
213
  response = self.httpx_client.request(
197
214
  method=method,
198
215
  url=urllib.parse.urljoin(f"{base_url}/", path),
@@ -225,11 +242,7 @@ class HttpClient:
225
242
  json=json_body,
226
243
  data=data_body,
227
244
  content=content,
228
- files=(
229
- convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
230
- if (files is not None and files is not omit)
231
- else None
232
- ),
245
+ files=request_files,
233
246
  timeout=timeout,
234
247
  )
235
248
 
@@ -264,11 +277,17 @@ class HttpClient:
264
277
  json: typing.Optional[typing.Any] = None,
265
278
  data: typing.Optional[typing.Any] = None,
266
279
  content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
267
- files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
280
+ files: typing.Optional[
281
+ typing.Union[
282
+ typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]],
283
+ typing.List[typing.Tuple[str, File]],
284
+ ]
285
+ ] = None,
268
286
  headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
269
287
  request_options: typing.Optional[RequestOptions] = None,
270
288
  retries: int = 2,
271
289
  omit: typing.Optional[typing.Any] = None,
290
+ force_multipart: typing.Optional[bool] = None,
272
291
  ) -> typing.Iterator[httpx.Response]:
273
292
  base_url = self.get_base_url(base_url)
274
293
  timeout = (
@@ -277,6 +296,15 @@ class HttpClient:
277
296
  else self.base_timeout()
278
297
  )
279
298
 
299
+ request_files: typing.Optional[RequestFiles] = (
300
+ convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
301
+ if (files is not None and files is not omit and isinstance(files, dict))
302
+ else None
303
+ )
304
+
305
+ if (request_files is None or len(request_files) == 0) and force_multipart:
306
+ request_files = FORCE_MULTIPART
307
+
280
308
  json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
281
309
 
282
310
  with self.httpx_client.stream(
@@ -311,11 +339,7 @@ class HttpClient:
311
339
  json=json_body,
312
340
  data=data_body,
313
341
  content=content,
314
- files=(
315
- convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
316
- if (files is not None and files is not omit)
317
- else None
318
- ),
342
+ files=request_files,
319
343
  timeout=timeout,
320
344
  ) as stream:
321
345
  yield stream
@@ -354,11 +378,17 @@ class AsyncHttpClient:
354
378
  json: typing.Optional[typing.Any] = None,
355
379
  data: typing.Optional[typing.Any] = None,
356
380
  content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
357
- files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
381
+ files: typing.Optional[
382
+ typing.Union[
383
+ typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]],
384
+ typing.List[typing.Tuple[str, File]],
385
+ ]
386
+ ] = None,
358
387
  headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
359
388
  request_options: typing.Optional[RequestOptions] = None,
360
389
  retries: int = 2,
361
390
  omit: typing.Optional[typing.Any] = None,
391
+ force_multipart: typing.Optional[bool] = None,
362
392
  ) -> httpx.Response:
363
393
  base_url = self.get_base_url(base_url)
364
394
  timeout = (
@@ -367,6 +397,15 @@ class AsyncHttpClient:
367
397
  else self.base_timeout()
368
398
  )
369
399
 
400
+ request_files: typing.Optional[RequestFiles] = (
401
+ convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
402
+ if (files is not None and files is not omit and isinstance(files, dict))
403
+ else None
404
+ )
405
+
406
+ if (request_files is None or len(request_files) == 0) and force_multipart:
407
+ request_files = FORCE_MULTIPART
408
+
370
409
  json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
371
410
 
372
411
  # Add the input to each of these and do None-safety checks
@@ -402,11 +441,7 @@ class AsyncHttpClient:
402
441
  json=json_body,
403
442
  data=data_body,
404
443
  content=content,
405
- files=(
406
- convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
407
- if files is not None
408
- else None
409
- ),
444
+ files=request_files,
410
445
  timeout=timeout,
411
446
  )
412
447
 
@@ -440,11 +475,17 @@ class AsyncHttpClient:
440
475
  json: typing.Optional[typing.Any] = None,
441
476
  data: typing.Optional[typing.Any] = None,
442
477
  content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
443
- files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
478
+ files: typing.Optional[
479
+ typing.Union[
480
+ typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]],
481
+ typing.List[typing.Tuple[str, File]],
482
+ ]
483
+ ] = None,
444
484
  headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
445
485
  request_options: typing.Optional[RequestOptions] = None,
446
486
  retries: int = 2,
447
487
  omit: typing.Optional[typing.Any] = None,
488
+ force_multipart: typing.Optional[bool] = None,
448
489
  ) -> typing.AsyncIterator[httpx.Response]:
449
490
  base_url = self.get_base_url(base_url)
450
491
  timeout = (
@@ -453,6 +494,15 @@ class AsyncHttpClient:
453
494
  else self.base_timeout()
454
495
  )
455
496
 
497
+ request_files: typing.Optional[RequestFiles] = (
498
+ convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
499
+ if (files is not None and files is not omit and isinstance(files, dict))
500
+ else None
501
+ )
502
+
503
+ if (request_files is None or len(request_files) == 0) and force_multipart:
504
+ request_files = FORCE_MULTIPART
505
+
456
506
  json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
457
507
 
458
508
  async with self.httpx_client.stream(
@@ -487,11 +537,7 @@ class AsyncHttpClient:
487
537
  json=json_body,
488
538
  data=data_body,
489
539
  content=content,
490
- files=(
491
- convert_file_dict_to_httpx_tuples(remove_omit_from_dict(remove_none_from_dict(files), omit))
492
- if files is not None
493
- else None
494
- ),
540
+ files=request_files,
495
541
  timeout=timeout,
496
542
  ) as stream:
497
543
  yield stream
@@ -5,20 +5,31 @@ from typing import Dict, Generic, TypeVar
5
5
  import httpx
6
6
 
7
7
  T = TypeVar("T")
8
+ """Generic to represent the underlying type of the data wrapped by the HTTP response."""
8
9
 
9
10
 
10
- class HttpResponse(Generic[T]):
11
+ class BaseHttpResponse:
12
+ """Minimalist HTTP response wrapper that exposes response headers."""
13
+
11
14
  _response: httpx.Response
12
- _data: T
13
15
 
14
- def __init__(self, response: httpx.Response, data: T):
16
+ def __init__(self, response: httpx.Response):
15
17
  self._response = response
16
- self._data = data
17
18
 
18
19
  @property
19
20
  def headers(self) -> Dict[str, str]:
20
21
  return dict(self._response.headers)
21
22
 
23
+
24
+ class HttpResponse(Generic[T], BaseHttpResponse):
25
+ """HTTP response wrapper that exposes response headers and data."""
26
+
27
+ _data: T
28
+
29
+ def __init__(self, response: httpx.Response, data: T):
30
+ super().__init__(response)
31
+ self._data = data
32
+
22
33
  @property
23
34
  def data(self) -> T:
24
35
  return self._data
@@ -27,18 +38,15 @@ class HttpResponse(Generic[T]):
27
38
  self._response.close()
28
39
 
29
40
 
30
- class AsyncHttpResponse(Generic[T]):
31
- _response: httpx.Response
41
+ class AsyncHttpResponse(Generic[T], BaseHttpResponse):
42
+ """HTTP response wrapper that exposes response headers and data."""
43
+
32
44
  _data: T
33
45
 
34
46
  def __init__(self, response: httpx.Response, data: T):
35
- self._response = response
47
+ super().__init__(response)
36
48
  self._data = data
37
49
 
38
- @property
39
- def headers(self) -> Dict[str, str]:
40
- return dict(self._response.headers)
41
-
42
50
  @property
43
51
  def data(self) -> T:
44
52
  return self._data
@@ -2,98 +2,76 @@
2
2
 
3
3
  # nopycln: file
4
4
  import datetime as dt
5
- import typing
6
5
  from collections import defaultdict
6
+ from typing import Any, Callable, ClassVar, Dict, List, Mapping, Optional, Set, Tuple, Type, TypeVar, Union, cast
7
7
 
8
8
  import pydantic
9
9
  import logging
10
- import typing_extensions
11
- from .datetime_utils import serialize_datetime
12
- from .serialization import convert_and_respect_annotation_metadata
13
10
 
14
11
  logger = logging.getLogger(__name__)
15
12
 
16
13
  IS_PYDANTIC_V2 = pydantic.VERSION.startswith("2.")
17
14
 
18
15
  if IS_PYDANTIC_V2:
19
- # isort will try to reformat the comments on these imports, which breaks mypy
20
- # isort: off
21
- from pydantic.v1.datetime_parse import ( # type: ignore # pyright: ignore[reportMissingImports] # Pydantic v2
22
- parse_date as parse_date,
23
- )
24
- from pydantic.v1.datetime_parse import ( # pyright: ignore[reportMissingImports] # Pydantic v2
25
- parse_datetime as parse_datetime,
26
- )
27
- from pydantic.v1.json import ( # type: ignore # pyright: ignore[reportMissingImports] # Pydantic v2
28
- ENCODERS_BY_TYPE as encoders_by_type,
29
- )
30
- from pydantic.v1.typing import ( # type: ignore # pyright: ignore[reportMissingImports] # Pydantic v2
31
- get_args as get_args,
32
- )
33
- from pydantic.v1.typing import ( # pyright: ignore[reportMissingImports] # Pydantic v2
34
- get_origin as get_origin,
35
- )
36
- from pydantic.v1.typing import ( # pyright: ignore[reportMissingImports] # Pydantic v2
37
- is_literal_type as is_literal_type,
38
- )
39
- from pydantic.v1.typing import ( # pyright: ignore[reportMissingImports] # Pydantic v2
40
- is_union as is_union,
41
- )
42
- from pydantic.v1.fields import ModelField as ModelField # type: ignore # pyright: ignore[reportMissingImports] # Pydantic v2
16
+ from pydantic.v1.datetime_parse import parse_date as parse_date
17
+ from pydantic.v1.datetime_parse import parse_datetime as parse_datetime
18
+ from pydantic.v1.fields import ModelField as ModelField
19
+ from pydantic.v1.json import ENCODERS_BY_TYPE as encoders_by_type # type: ignore[attr-defined]
20
+ from pydantic.v1.typing import get_args as get_args
21
+ from pydantic.v1.typing import get_origin as get_origin
22
+ from pydantic.v1.typing import is_literal_type as is_literal_type
23
+ from pydantic.v1.typing import is_union as is_union
43
24
  else:
44
- from pydantic.datetime_parse import parse_date as parse_date # type: ignore # Pydantic v1
45
- from pydantic.datetime_parse import parse_datetime as parse_datetime # type: ignore # Pydantic v1
46
- from pydantic.fields import ModelField as ModelField # type: ignore # Pydantic v1
47
- from pydantic.json import ENCODERS_BY_TYPE as encoders_by_type # type: ignore # Pydantic v1
48
- from pydantic.typing import get_args as get_args # type: ignore # Pydantic v1
49
- from pydantic.typing import get_origin as get_origin # type: ignore # Pydantic v1
50
- from pydantic.typing import is_literal_type as is_literal_type # type: ignore # Pydantic v1
51
- from pydantic.typing import is_union as is_union # type: ignore # Pydantic v1
52
-
53
- # isort: on
25
+ from pydantic.datetime_parse import parse_date as parse_date # type: ignore[no-redef]
26
+ from pydantic.datetime_parse import parse_datetime as parse_datetime # type: ignore[no-redef]
27
+ from pydantic.fields import ModelField as ModelField # type: ignore[attr-defined, no-redef]
28
+ from pydantic.json import ENCODERS_BY_TYPE as encoders_by_type # type: ignore[no-redef]
29
+ from pydantic.typing import get_args as get_args # type: ignore[no-redef]
30
+ from pydantic.typing import get_origin as get_origin # type: ignore[no-redef]
31
+ from pydantic.typing import is_literal_type as is_literal_type # type: ignore[no-redef]
32
+ from pydantic.typing import is_union as is_union # type: ignore[no-redef]
54
33
 
34
+ from .datetime_utils import serialize_datetime
35
+ from .serialization import convert_and_respect_annotation_metadata
36
+ from typing_extensions import TypeAlias
55
37
 
56
- T = typing.TypeVar("T")
57
- Model = typing.TypeVar("Model", bound=pydantic.BaseModel)
58
- type_adapter_cache: typing.Dict[typing.Type, pydantic.TypeAdapter] = {}
38
+ T = TypeVar("T")
39
+ Model = TypeVar("Model", bound=pydantic.BaseModel)
40
+ type_adapter_cache: Dict[Type, pydantic.TypeAdapter] = {}
59
41
  annotated_types = {"ExecuteApiResponse"}
60
42
 
61
43
 
62
- def parse_obj_as(type_: typing.Type[T], object_: typing.Any, convert_metadata: bool = False) -> T:
44
+ def parse_obj_as(type_: Type[T], object_: Any) -> T:
63
45
  if hasattr(type_, "__name__") and type_.__name__ in annotated_types:
64
46
  dealiased_object = convert_and_respect_annotation_metadata(object_=object_, annotation=type_, direction="read")
65
47
  else:
66
48
  dealiased_object = object_
67
49
  if IS_PYDANTIC_V2:
68
- adapter = pydantic.TypeAdapter(type_) if type_ not in type_adapter_cache else type_adapter_cache[type_] # type: ignore # Pydantic v2
50
+ adapter = pydantic.TypeAdapter(type_) if type_ not in type_adapter_cache else type_adapter_cache[type_] # type: ignore[attr-defined]
69
51
  if type_ not in type_adapter_cache:
70
52
  type_adapter_cache[type_] = adapter
71
53
  return adapter.validate_python(dealiased_object)
72
- else:
73
- return pydantic.parse_obj_as(type_, dealiased_object)
54
+ return pydantic.parse_obj_as(type_, dealiased_object)
74
55
 
75
56
 
76
- def to_jsonable_with_fallback(
77
- obj: typing.Any, fallback_serializer: typing.Callable[[typing.Any], typing.Any]
78
- ) -> typing.Any:
57
+ def to_jsonable_with_fallback(obj: Any, fallback_serializer: Callable[[Any], Any]) -> Any:
79
58
  if IS_PYDANTIC_V2:
80
59
  from pydantic_core import to_jsonable_python
81
60
 
82
61
  return to_jsonable_python(obj, fallback=fallback_serializer)
83
- else:
84
- return fallback_serializer(obj)
62
+ return fallback_serializer(obj)
85
63
 
86
64
 
87
65
  class UniversalBaseModel(pydantic.BaseModel):
88
66
  if IS_PYDANTIC_V2:
89
- model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(
67
+ model_config: ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict( # type: ignore[typeddict-unknown-key]
90
68
  # Allow fields beginning with `model_` to be used in the model
91
69
  protected_namespaces=(),
92
- ) # type: ignore # Pydantic v2
70
+ )
93
71
 
94
- @pydantic.model_serializer(mode="wrap", when_used="json") # type: ignore # Pydantic v2
95
- def serialize_model(self, handler: pydantic.SerializerFunctionWrapHandler) -> typing.Any: # type: ignore # Pydantic v2
96
- serialized = handler(self)
72
+ @pydantic.model_serializer(mode="plain", when_used="json") # type: ignore[attr-defined]
73
+ def serialize_model(self) -> Any: # type: ignore[name-defined]
74
+ serialized = self.model_dump()
97
75
  data = {k: serialize_datetime(v) if isinstance(v, dt.datetime) else v for k, v in serialized.items()}
98
76
  return data
99
77
 
@@ -104,34 +82,28 @@ class UniversalBaseModel(pydantic.BaseModel):
104
82
  json_encoders = {dt.datetime: serialize_datetime}
105
83
 
106
84
  @classmethod
107
- def model_construct(
108
- cls: typing.Type["Model"], _fields_set: typing.Optional[typing.Set[str]] = None, **values: typing.Any
109
- ) -> "Model":
85
+ def model_construct(cls: Type["Model"], _fields_set: Optional[Set[str]] = None, **values: Any) -> "Model":
110
86
  dealiased_object = convert_and_respect_annotation_metadata(object_=values, annotation=cls, direction="read")
111
87
  return cls.construct(_fields_set, **dealiased_object)
112
88
 
113
89
  @classmethod
114
- def construct(
115
- cls: typing.Type["Model"], _fields_set: typing.Optional[typing.Set[str]] = None, **values: typing.Any
116
- ) -> "Model":
90
+ def construct(cls: Type["Model"], _fields_set: Optional[Set[str]] = None, **values: Any) -> "Model":
117
91
  dealiased_object = convert_and_respect_annotation_metadata(object_=values, annotation=cls, direction="read")
118
92
  if IS_PYDANTIC_V2:
119
- return super().model_construct(_fields_set, **dealiased_object) # type: ignore # Pydantic v2
120
- else:
121
- return super().construct(_fields_set, **dealiased_object)
93
+ return super().model_construct(_fields_set, **dealiased_object) # type: ignore[misc]
94
+ return super().construct(_fields_set, **dealiased_object)
122
95
 
123
- def json(self, **kwargs: typing.Any) -> str:
124
- kwargs_with_defaults: typing.Any = {
96
+ def json(self, **kwargs: Any) -> str:
97
+ kwargs_with_defaults = {
125
98
  "by_alias": True,
126
99
  "exclude_unset": True,
127
100
  **kwargs,
128
101
  }
129
102
  if IS_PYDANTIC_V2:
130
- return super().model_dump_json(**kwargs_with_defaults) # type: ignore # Pydantic v2
131
- else:
132
- return super().json(**kwargs_with_defaults)
103
+ return super().model_dump_json(**kwargs_with_defaults) # type: ignore[misc]
104
+ return super().json(**kwargs_with_defaults)
133
105
 
134
- def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
106
+ def dict(self, **kwargs: Any) -> Dict[str, Any]:
135
107
  """
136
108
  Override the default dict method to `exclude_unset` by default. This function patches
137
109
  `exclude_unset` to work include fields within non-None default values.
@@ -142,25 +114,21 @@ class UniversalBaseModel(pydantic.BaseModel):
142
114
  # We'd ideally do the same for Pydantic V2, but it shells out to a library to serialize models
143
115
  # that we have less control over, and this is less intrusive than custom serializers for now.
144
116
  if IS_PYDANTIC_V2:
145
- kwargs = {
146
- **kwargs,
147
- "warnings": False,
148
- }
149
- kwargs_with_defaults_exclude_unset: typing.Any = {
117
+ kwargs_with_defaults_exclude_unset = {
150
118
  **kwargs,
151
119
  "by_alias": True,
152
120
  "exclude_unset": True,
153
121
  "exclude_none": False,
154
122
  }
155
- kwargs_with_defaults_exclude_none: typing.Any = {
123
+ kwargs_with_defaults_exclude_none = {
156
124
  **kwargs,
157
125
  "by_alias": True,
158
126
  "exclude_none": True,
159
127
  "exclude_unset": False,
160
128
  }
161
129
  dict_dump = deep_union_pydantic_dicts(
162
- super().model_dump(**kwargs_with_defaults_exclude_unset), # type: ignore # Pydantic v2
163
- super().model_dump(**kwargs_with_defaults_exclude_none), # type: ignore # Pydantic v2
130
+ super().model_dump(**kwargs_with_defaults_exclude_unset), # type: ignore[misc]
131
+ super().model_dump(**kwargs_with_defaults_exclude_none), # type: ignore[misc]
164
132
  )
165
133
 
166
134
  else:
@@ -180,7 +148,7 @@ class UniversalBaseModel(pydantic.BaseModel):
180
148
  if default is not None:
181
149
  self.__fields_set__.add(name)
182
150
 
183
- kwargs_with_defaults_exclude_unset_include_fields: typing.Any = {
151
+ kwargs_with_defaults_exclude_unset_include_fields = {
184
152
  "by_alias": True,
185
153
  "exclude_unset": True,
186
154
  "include": _fields_set,
@@ -192,12 +160,10 @@ class UniversalBaseModel(pydantic.BaseModel):
192
160
  return convert_and_respect_annotation_metadata(object_=dict_dump, annotation=self.__class__, direction="write")
193
161
 
194
162
 
195
- def _union_list_of_pydantic_dicts(
196
- source: typing.List[typing.Any], destination: typing.List[typing.Any]
197
- ) -> typing.List[typing.Any]:
198
- converted_list: typing.List[typing.Any] = []
163
+ def _union_list_of_pydantic_dicts(source: List[Any], destination: List[Any]) -> List[Any]:
164
+ converted_list: List[Any] = []
199
165
  for i, item in enumerate(source):
200
- destination_value = destination[i] # type: ignore
166
+ destination_value = destination[i]
201
167
  if isinstance(item, dict):
202
168
  converted_list.append(deep_union_pydantic_dicts(item, destination_value))
203
169
  elif isinstance(item, list):
@@ -207,9 +173,7 @@ def _union_list_of_pydantic_dicts(
207
173
  return converted_list
208
174
 
209
175
 
210
- def deep_union_pydantic_dicts(
211
- source: typing.Dict[str, typing.Any], destination: typing.Dict[str, typing.Any]
212
- ) -> typing.Dict[str, typing.Any]:
176
+ def deep_union_pydantic_dicts(source: Dict[str, Any], destination: Dict[str, Any]) -> Dict[str, Any]:
213
177
  for key, value in source.items():
214
178
  node = destination.setdefault(key, {})
215
179
  if isinstance(value, dict):
@@ -227,18 +191,16 @@ def deep_union_pydantic_dicts(
227
191
 
228
192
  if IS_PYDANTIC_V2:
229
193
 
230
- class V2RootModel(UniversalBaseModel, pydantic.RootModel): # type: ignore # Pydantic v2
194
+ class V2RootModel(UniversalBaseModel, pydantic.RootModel): # type: ignore[misc, name-defined, type-arg]
231
195
  pass
232
196
 
233
- UniversalRootModel: typing_extensions.TypeAlias = V2RootModel # type: ignore
197
+ UniversalRootModel: TypeAlias = V2RootModel # type: ignore[misc]
234
198
  else:
235
- UniversalRootModel: typing_extensions.TypeAlias = UniversalBaseModel # type: ignore
199
+ UniversalRootModel: TypeAlias = UniversalBaseModel # type: ignore[misc, no-redef]
236
200
 
237
201
 
238
- def encode_by_type(o: typing.Any) -> typing.Any:
239
- encoders_by_class_tuples: typing.Dict[typing.Callable[[typing.Any], typing.Any], typing.Tuple[typing.Any, ...]] = (
240
- defaultdict(tuple)
241
- )
202
+ def encode_by_type(o: Any) -> Any:
203
+ encoders_by_class_tuples: Dict[Callable[[Any], Any], Tuple[Any, ...]] = defaultdict(tuple)
242
204
  for type_, encoder in encoders_by_type.items():
243
205
  encoders_by_class_tuples[encoder] += (type_,)
244
206
 
@@ -249,9 +211,9 @@ def encode_by_type(o: typing.Any) -> typing.Any:
249
211
  return encoder(o)
250
212
 
251
213
 
252
- def update_forward_refs(model: typing.Type["Model"], **localns: typing.Any) -> None:
214
+ def update_forward_refs(model: Type["Model"], **localns: Any) -> None:
253
215
  if IS_PYDANTIC_V2:
254
- model.model_rebuild(raise_errors=False) # type: ignore # Pydantic v2
216
+ model.model_rebuild(raise_errors=False) # type: ignore[attr-defined]
255
217
  else:
256
218
  try:
257
219
  model.update_forward_refs(**localns)
@@ -260,46 +222,41 @@ def update_forward_refs(model: typing.Type["Model"], **localns: typing.Any) -> N
260
222
 
261
223
 
262
224
  # Mirrors Pydantic's internal typing
263
- AnyCallable = typing.Callable[..., typing.Any]
225
+ AnyCallable = Callable[..., Any]
264
226
 
265
227
 
266
228
  def universal_root_validator(
267
229
  pre: bool = False,
268
- ) -> typing.Callable[[AnyCallable], AnyCallable]:
230
+ ) -> Callable[[AnyCallable], AnyCallable]:
269
231
  def decorator(func: AnyCallable) -> AnyCallable:
270
232
  if IS_PYDANTIC_V2:
271
- return pydantic.model_validator(mode="before" if pre else "after")(func) # type: ignore # Pydantic v2
272
- else:
273
- return pydantic.root_validator(pre=pre)(func) # type: ignore # Pydantic v1
233
+ return cast(AnyCallable, pydantic.model_validator(mode="before" if pre else "after")(func)) # type: ignore[attr-defined]
234
+ return cast(AnyCallable, pydantic.root_validator(pre=pre)(func)) # type: ignore[call-overload]
274
235
 
275
236
  return decorator
276
237
 
277
238
 
278
- def universal_field_validator(field_name: str, pre: bool = False) -> typing.Callable[[AnyCallable], AnyCallable]:
239
+ def universal_field_validator(field_name: str, pre: bool = False) -> Callable[[AnyCallable], AnyCallable]:
279
240
  def decorator(func: AnyCallable) -> AnyCallable:
280
241
  if IS_PYDANTIC_V2:
281
- return pydantic.field_validator(field_name, mode="before" if pre else "after")(func) # type: ignore # Pydantic v2
282
- else:
283
- return pydantic.validator(field_name, pre=pre)(func) # type: ignore # Pydantic v1
242
+ return cast(AnyCallable, pydantic.field_validator(field_name, mode="before" if pre else "after")(func)) # type: ignore[attr-defined]
243
+ return cast(AnyCallable, pydantic.validator(field_name, pre=pre)(func))
284
244
 
285
245
  return decorator
286
246
 
287
247
 
288
- PydanticField = typing.Union[ModelField, pydantic.fields.FieldInfo]
248
+ PydanticField = Union[ModelField, pydantic.fields.FieldInfo]
289
249
 
290
250
 
291
- def _get_model_fields(
292
- model: typing.Type["Model"],
293
- ) -> typing.Mapping[str, PydanticField]:
251
+ def _get_model_fields(model: Type["Model"]) -> Mapping[str, PydanticField]:
294
252
  if IS_PYDANTIC_V2:
295
- return model.model_fields # type: ignore # Pydantic v2
296
- else:
297
- return model.__fields__ # type: ignore # Pydantic v1
253
+ return cast(Mapping[str, PydanticField], model.model_fields) # type: ignore[attr-defined]
254
+ return cast(Mapping[str, PydanticField], model.__fields__)
298
255
 
299
256
 
300
- def _get_field_default(field: PydanticField) -> typing.Any:
257
+ def _get_field_default(field: PydanticField) -> Any:
301
258
  try:
302
- value = field.get_default() # type: ignore # Pydantic < v1.10.15
259
+ value = field.get_default() # type: ignore[union-attr]
303
260
  except:
304
261
  value = field.default
305
262
  if IS_PYDANTIC_V2:
@@ -160,7 +160,12 @@ def _convert_mapping(
160
160
  direction: typing.Literal["read", "write"],
161
161
  ) -> typing.Mapping[str, object]:
162
162
  converted_object: typing.Dict[str, object] = {}
163
- annotations = typing_extensions.get_type_hints(expected_type, include_extras=True)
163
+ try:
164
+ annotations = typing_extensions.get_type_hints(expected_type, include_extras=True)
165
+ except NameError:
166
+ # The TypedDict contains a circular reference, so
167
+ # we use the __annotations__ attribute directly.
168
+ annotations = getattr(expected_type, "__annotations__", {})
164
169
  aliases_to_field_names = _get_alias_to_field_name(annotations)
165
170
  for key, value in object_.items():
166
171
  if direction == "read" and key in aliases_to_field_names:
@@ -1,5 +1,7 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ # isort: skip_file
4
+
3
5
  from .bad_request_error import BadRequestError
4
6
  from .forbidden_error import ForbiddenError
5
7
  from .internal_server_error import InternalServerError
@@ -1,9 +1,10 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- from ..core.api_error import ApiError
4
3
  import typing
5
4
 
5
+ from ..core.api_error import ApiError
6
+
6
7
 
7
8
  class BadRequestError(ApiError):
8
- def __init__(self, body: typing.Optional[typing.Any]):
9
- super().__init__(status_code=400, body=body)
9
+ def __init__(self, body: typing.Optional[typing.Any], headers: typing.Optional[typing.Dict[str, str]] = None):
10
+ super().__init__(status_code=400, headers=headers, body=body)
@@ -1,9 +1,10 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- from ..core.api_error import ApiError
4
3
  import typing
5
4
 
5
+ from ..core.api_error import ApiError
6
+
6
7
 
7
8
  class ForbiddenError(ApiError):
8
- def __init__(self, body: typing.Optional[typing.Any]):
9
- super().__init__(status_code=403, body=body)
9
+ def __init__(self, body: typing.Optional[typing.Any], headers: typing.Optional[typing.Dict[str, str]] = None):
10
+ super().__init__(status_code=403, headers=headers, body=body)
@@ -1,9 +1,10 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- from ..core.api_error import ApiError
4
3
  import typing
5
4
 
5
+ from ..core.api_error import ApiError
6
+
6
7
 
7
8
  class InternalServerError(ApiError):
8
- def __init__(self, body: typing.Optional[typing.Any]):
9
- super().__init__(status_code=500, body=body)
9
+ def __init__(self, body: typing.Optional[typing.Any], headers: typing.Optional[typing.Dict[str, str]] = None):
10
+ super().__init__(status_code=500, headers=headers, body=body)