vellum-ai 0.7.3__py3-none-any.whl → 0.7.5__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (483) hide show
  1. vellum/__init__.py +142 -94
  2. vellum/client.py +1051 -1097
  3. vellum/core/__init__.py +4 -1
  4. vellum/core/client_wrapper.py +7 -3
  5. vellum/core/http_client.py +365 -20
  6. vellum/core/jsonable_encoder.py +3 -0
  7. vellum/core/pydantic_utilities.py +16 -0
  8. vellum/core/query_encoder.py +33 -0
  9. vellum/core/remove_none_from_dict.py +2 -2
  10. vellum/core/request_options.py +2 -2
  11. vellum/resources/__init__.py +2 -0
  12. vellum/resources/deployments/client.py +349 -377
  13. vellum/resources/document_indexes/client.py +542 -610
  14. vellum/resources/documents/client.py +327 -399
  15. vellum/resources/folder_entities/client.py +56 -72
  16. vellum/{types/map_enum.py → resources/ml_models/__init__.py} +0 -3
  17. vellum/resources/ml_models/client.py +837 -0
  18. vellum/resources/sandboxes/client.py +204 -242
  19. vellum/resources/test_suite_runs/client.py +183 -213
  20. vellum/resources/test_suites/client.py +307 -311
  21. vellum/resources/workflow_deployments/client.py +230 -268
  22. vellum/resources/workflow_sandboxes/client.py +82 -96
  23. vellum/terraform/_jsii/vellum-ai_vellum@0.0.0.jsii.tgz +0 -0
  24. vellum/terraform/data_vellum_document_index/__init__.py +10 -10
  25. vellum/terraform/document_index/__init__.py +17 -17
  26. vellum/terraform/provider/__init__.py +57 -12
  27. vellum/terraform/versions.json +1 -1
  28. vellum/types/__init__.py +148 -96
  29. vellum/types/api_node_result.py +7 -3
  30. vellum/types/api_node_result_data.py +7 -3
  31. vellum/types/array_chat_message_content.py +7 -3
  32. vellum/types/array_chat_message_content_item.py +53 -12
  33. vellum/types/array_chat_message_content_item_request.py +53 -12
  34. vellum/types/array_chat_message_content_request.py +7 -3
  35. vellum/types/array_parameter_config.py +50 -0
  36. vellum/types/array_parameter_config_request.py +50 -0
  37. vellum/types/array_variable_value_item.py +102 -24
  38. vellum/types/array_vellum_value_item.py +102 -24
  39. vellum/types/array_vellum_value_item_request.py +102 -24
  40. vellum/types/basic_vectorizer_intfloat_multilingual_e_5_large.py +7 -3
  41. vellum/types/basic_vectorizer_intfloat_multilingual_e_5_large_request.py +7 -3
  42. vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1.py +7 -3
  43. vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1_request.py +7 -3
  44. vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1.py +7 -3
  45. vellum/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1_request.py +7 -3
  46. vellum/types/boolean_parameter_config.py +35 -0
  47. vellum/types/boolean_parameter_config_request.py +35 -0
  48. vellum/types/chat_history_input_request.py +7 -3
  49. vellum/types/chat_message.py +7 -3
  50. vellum/types/chat_message_content.py +70 -16
  51. vellum/types/chat_message_content_request.py +70 -16
  52. vellum/types/chat_message_request.py +7 -3
  53. vellum/types/code_execution_node_array_result.py +7 -3
  54. vellum/types/code_execution_node_chat_history_result.py +7 -3
  55. vellum/types/code_execution_node_error_result.py +7 -3
  56. vellum/types/code_execution_node_function_call_result.py +7 -3
  57. vellum/types/code_execution_node_json_result.py +7 -3
  58. vellum/types/code_execution_node_number_result.py +7 -3
  59. vellum/types/code_execution_node_result.py +7 -3
  60. vellum/types/code_execution_node_result_data.py +7 -3
  61. vellum/types/code_execution_node_result_output.py +144 -32
  62. vellum/types/code_execution_node_search_results_result.py +7 -3
  63. vellum/types/code_execution_node_string_result.py +7 -3
  64. vellum/types/compile_prompt_deployment_expand_meta_request.py +7 -3
  65. vellum/types/compile_prompt_meta.py +7 -3
  66. vellum/types/conditional_node_result.py +7 -3
  67. vellum/types/conditional_node_result_data.py +7 -3
  68. vellum/types/const_parameter_config.py +35 -0
  69. vellum/types/const_parameter_config_request.py +35 -0
  70. vellum/types/create_test_suite_test_case_request.py +7 -3
  71. vellum/types/deployment_provider_payload_response.py +7 -3
  72. vellum/types/deployment_read.py +12 -3
  73. vellum/types/deployment_release_tag_deployment_history_item.py +7 -3
  74. vellum/types/deployment_release_tag_read.py +7 -3
  75. vellum/types/document_document_to_document_index.py +7 -3
  76. vellum/types/document_index_chunking.py +54 -12
  77. vellum/types/document_index_chunking_request.py +54 -12
  78. vellum/types/document_index_indexing_config.py +7 -3
  79. vellum/types/document_index_indexing_config_request.py +7 -3
  80. vellum/types/document_index_read.py +7 -3
  81. vellum/types/document_read.py +7 -3
  82. vellum/types/enriched_normalized_completion.py +7 -3
  83. vellum/types/error_variable_value.py +7 -3
  84. vellum/types/error_vellum_value.py +7 -3
  85. vellum/types/error_vellum_value_request.py +7 -3
  86. vellum/types/execute_prompt_event.py +82 -16
  87. vellum/types/execute_prompt_response.py +44 -8
  88. vellum/types/execute_workflow_response.py +7 -3
  89. vellum/types/execute_workflow_workflow_result_event.py +41 -8
  90. vellum/types/execution_array_vellum_value.py +7 -3
  91. vellum/types/execution_chat_history_vellum_value.py +7 -3
  92. vellum/types/execution_error_vellum_value.py +7 -3
  93. vellum/types/execution_function_call_vellum_value.py +7 -3
  94. vellum/types/execution_json_vellum_value.py +7 -3
  95. vellum/types/execution_number_vellum_value.py +7 -3
  96. vellum/types/execution_search_results_vellum_value.py +7 -3
  97. vellum/types/execution_string_vellum_value.py +7 -3
  98. vellum/types/execution_vellum_value.py +152 -32
  99. vellum/types/external_test_case_execution.py +7 -3
  100. vellum/types/external_test_case_execution_request.py +7 -3
  101. vellum/types/fulfilled_execute_prompt_event.py +7 -3
  102. vellum/types/fulfilled_execute_prompt_response.py +7 -3
  103. vellum/types/fulfilled_execute_workflow_workflow_result_event.py +7 -3
  104. vellum/types/fulfilled_prompt_execution_meta.py +7 -3
  105. vellum/types/fulfilled_workflow_node_result_event.py +7 -3
  106. vellum/types/function_call.py +7 -3
  107. vellum/types/function_call_chat_message_content.py +7 -3
  108. vellum/types/function_call_chat_message_content_request.py +7 -3
  109. vellum/types/function_call_chat_message_content_value.py +7 -3
  110. vellum/types/function_call_chat_message_content_value_request.py +7 -3
  111. vellum/types/function_call_request.py +7 -3
  112. vellum/types/function_call_variable_value.py +7 -3
  113. vellum/types/function_call_vellum_value.py +7 -3
  114. vellum/types/function_call_vellum_value_request.py +7 -3
  115. vellum/types/generate_options_request.py +7 -3
  116. vellum/types/generate_request.py +7 -3
  117. vellum/types/generate_result.py +7 -3
  118. vellum/types/generate_result_data.py +7 -3
  119. vellum/types/generate_result_error.py +7 -3
  120. vellum/types/generate_stream_response.py +7 -3
  121. vellum/types/generate_stream_result.py +7 -3
  122. vellum/types/generate_stream_result_data.py +7 -3
  123. vellum/types/hkunlp_instructor_xl_vectorizer.py +7 -3
  124. vellum/types/hkunlp_instructor_xl_vectorizer_request.py +7 -3
  125. vellum/types/hosted_by_enum.py +26 -0
  126. vellum/types/hugging_face_tokenizer_config.py +34 -0
  127. vellum/types/hugging_face_tokenizer_config_request.py +34 -0
  128. vellum/types/image_chat_message_content.py +7 -3
  129. vellum/types/image_chat_message_content_request.py +7 -3
  130. vellum/types/image_variable_value.py +7 -3
  131. vellum/types/image_vellum_value.py +7 -3
  132. vellum/types/image_vellum_value_request.py +7 -3
  133. vellum/types/indexing_config_vectorizer.py +117 -36
  134. vellum/types/indexing_config_vectorizer_request.py +117 -36
  135. vellum/types/initiated_execute_prompt_event.py +7 -3
  136. vellum/types/initiated_prompt_execution_meta.py +7 -3
  137. vellum/types/initiated_workflow_node_result_event.py +7 -3
  138. vellum/types/instructor_vectorizer_config.py +7 -3
  139. vellum/types/instructor_vectorizer_config_request.py +7 -3
  140. vellum/types/integer_parameter_config.py +39 -0
  141. vellum/types/integer_parameter_config_request.py +39 -0
  142. vellum/types/json_input_request.py +7 -3
  143. vellum/types/json_variable_value.py +7 -3
  144. vellum/types/json_vellum_value.py +7 -3
  145. vellum/types/json_vellum_value_request.py +7 -3
  146. vellum/types/map_node_result.py +7 -3
  147. vellum/types/map_node_result_data.py +7 -3
  148. vellum/types/merge_node_result.py +7 -3
  149. vellum/types/merge_node_result_data.py +7 -3
  150. vellum/types/metadata_filter_config_request.py +7 -3
  151. vellum/types/metadata_filter_rule_request.py +7 -3
  152. vellum/types/metric_node_result.py +7 -3
  153. vellum/types/{execute_workflow_stream_error_response.py → ml_model_build_config.py} +9 -8
  154. vellum/types/{execute_prompt_api_error_response.py → ml_model_build_config_request.py} +9 -8
  155. vellum/types/ml_model_developer.py +27 -0
  156. vellum/types/ml_model_developer_enum_value_label.py +31 -0
  157. vellum/types/ml_model_display_config_labelled.py +33 -0
  158. vellum/types/ml_model_display_config_request.py +33 -0
  159. vellum/types/ml_model_display_tag.py +7 -0
  160. vellum/types/ml_model_display_tag_enum_value_label.py +31 -0
  161. vellum/types/ml_model_exec_config.py +40 -0
  162. vellum/types/ml_model_exec_config_request.py +40 -0
  163. vellum/types/ml_model_family.py +29 -0
  164. vellum/types/ml_model_family_enum_value_label.py +31 -0
  165. vellum/types/ml_model_feature.py +18 -0
  166. vellum/types/ml_model_parameter_config.py +42 -0
  167. vellum/types/ml_model_parameter_config_request.py +42 -0
  168. vellum/types/ml_model_read.py +108 -0
  169. vellum/types/ml_model_request_authorization_config.py +30 -0
  170. vellum/types/ml_model_request_authorization_config_request.py +30 -0
  171. vellum/types/ml_model_request_authorization_config_type_enum.py +5 -0
  172. vellum/types/ml_model_request_config.py +32 -0
  173. vellum/types/ml_model_request_config_request.py +32 -0
  174. vellum/types/ml_model_response_config.py +31 -0
  175. vellum/types/ml_model_response_config_request.py +31 -0
  176. vellum/types/ml_model_tokenizer_config.py +59 -0
  177. vellum/types/ml_model_tokenizer_config_request.py +61 -0
  178. vellum/types/ml_model_usage.py +7 -3
  179. vellum/types/named_scenario_input_chat_history_variable_value_request.py +7 -3
  180. vellum/types/named_scenario_input_request.py +38 -8
  181. vellum/types/named_scenario_input_string_variable_value_request.py +7 -3
  182. vellum/types/named_test_case_array_variable_value.py +7 -3
  183. vellum/types/named_test_case_array_variable_value_request.py +7 -3
  184. vellum/types/named_test_case_chat_history_variable_value.py +7 -3
  185. vellum/types/named_test_case_chat_history_variable_value_request.py +7 -3
  186. vellum/types/named_test_case_error_variable_value.py +7 -3
  187. vellum/types/named_test_case_error_variable_value_request.py +7 -3
  188. vellum/types/named_test_case_function_call_variable_value.py +7 -3
  189. vellum/types/named_test_case_function_call_variable_value_request.py +7 -3
  190. vellum/types/named_test_case_json_variable_value.py +7 -3
  191. vellum/types/named_test_case_json_variable_value_request.py +7 -3
  192. vellum/types/named_test_case_number_variable_value.py +7 -3
  193. vellum/types/named_test_case_number_variable_value_request.py +7 -3
  194. vellum/types/named_test_case_search_results_variable_value.py +7 -3
  195. vellum/types/named_test_case_search_results_variable_value_request.py +7 -3
  196. vellum/types/named_test_case_string_variable_value.py +7 -3
  197. vellum/types/named_test_case_string_variable_value_request.py +7 -3
  198. vellum/types/named_test_case_variable_value.py +144 -32
  199. vellum/types/named_test_case_variable_value_request.py +144 -32
  200. vellum/types/node_input_compiled_array_value.py +7 -3
  201. vellum/types/node_input_compiled_chat_history_value.py +7 -3
  202. vellum/types/node_input_compiled_error_value.py +7 -3
  203. vellum/types/node_input_compiled_function_call.py +7 -3
  204. vellum/types/node_input_compiled_json_value.py +7 -3
  205. vellum/types/node_input_compiled_number_value.py +7 -3
  206. vellum/types/node_input_compiled_search_results_value.py +7 -3
  207. vellum/types/node_input_compiled_string_value.py +7 -3
  208. vellum/types/node_input_variable_compiled_value.py +152 -32
  209. vellum/types/node_output_compiled_array_value.py +7 -3
  210. vellum/types/node_output_compiled_chat_history_value.py +7 -3
  211. vellum/types/node_output_compiled_error_value.py +7 -3
  212. vellum/types/node_output_compiled_function_call_value.py +7 -3
  213. vellum/types/node_output_compiled_json_value.py +7 -3
  214. vellum/types/node_output_compiled_number_value.py +7 -3
  215. vellum/types/node_output_compiled_search_results_value.py +7 -3
  216. vellum/types/node_output_compiled_string_value.py +7 -3
  217. vellum/types/node_output_compiled_value.py +153 -32
  218. vellum/types/normalized_log_probs.py +7 -3
  219. vellum/types/normalized_token_log_probs.py +7 -3
  220. vellum/types/number_parameter_config.py +40 -0
  221. vellum/types/number_parameter_config_request.py +40 -0
  222. vellum/types/number_variable_value.py +7 -3
  223. vellum/types/number_vellum_value.py +7 -3
  224. vellum/types/number_vellum_value_request.py +7 -3
  225. vellum/types/object_parameter_config.py +49 -0
  226. vellum/types/object_parameter_config_request.py +49 -0
  227. vellum/types/one_of_parameter_config.py +44 -0
  228. vellum/types/one_of_parameter_config_request.py +44 -0
  229. vellum/types/open_ai_vectorizer_config.py +7 -3
  230. vellum/types/open_ai_vectorizer_config_request.py +7 -3
  231. vellum/types/open_ai_vectorizer_text_embedding_3_large.py +7 -3
  232. vellum/types/open_ai_vectorizer_text_embedding_3_large_request.py +7 -3
  233. vellum/types/open_ai_vectorizer_text_embedding_3_small.py +7 -3
  234. vellum/types/open_ai_vectorizer_text_embedding_3_small_request.py +7 -3
  235. vellum/types/open_ai_vectorizer_text_embedding_ada_002.py +7 -3
  236. vellum/types/open_ai_vectorizer_text_embedding_ada_002_request.py +7 -3
  237. vellum/types/paginated_document_index_read_list.py +7 -3
  238. vellum/types/paginated_ml_model_read_list.py +33 -0
  239. vellum/types/paginated_slim_deployment_read_list.py +7 -3
  240. vellum/types/paginated_slim_document_list.py +7 -3
  241. vellum/types/paginated_slim_workflow_deployment_list.py +7 -3
  242. vellum/types/paginated_test_suite_run_execution_list.py +7 -3
  243. vellum/types/paginated_test_suite_test_case_list.py +7 -3
  244. vellum/types/parameter_config.py +251 -0
  245. vellum/types/parameter_config_request.py +251 -0
  246. vellum/types/pdf_search_result_meta_source.py +7 -3
  247. vellum/types/pdf_search_result_meta_source_request.py +7 -3
  248. vellum/types/prompt_deployment_expand_meta_request_request.py +7 -3
  249. vellum/types/prompt_deployment_input_request.py +55 -12
  250. vellum/types/prompt_execution_meta.py +7 -3
  251. vellum/types/prompt_node_execution_meta.py +7 -3
  252. vellum/types/prompt_node_result.py +7 -3
  253. vellum/types/prompt_node_result_data.py +7 -3
  254. vellum/types/prompt_output.py +69 -16
  255. vellum/types/raw_prompt_execution_overrides_request.py +7 -3
  256. vellum/types/reducto_chunker_config.py +7 -3
  257. vellum/types/reducto_chunker_config_request.py +7 -3
  258. vellum/types/reducto_chunking.py +7 -3
  259. vellum/types/reducto_chunking_request.py +7 -3
  260. vellum/types/rejected_execute_prompt_event.py +7 -3
  261. vellum/types/rejected_execute_prompt_response.py +7 -3
  262. vellum/types/rejected_execute_workflow_workflow_result_event.py +7 -3
  263. vellum/types/rejected_prompt_execution_meta.py +7 -3
  264. vellum/types/rejected_workflow_node_result_event.py +7 -3
  265. vellum/types/replace_test_suite_test_case_request.py +7 -3
  266. vellum/types/sandbox_scenario.py +7 -3
  267. vellum/types/scenario_input.py +38 -8
  268. vellum/types/scenario_input_chat_history_variable_value.py +7 -3
  269. vellum/types/scenario_input_string_variable_value.py +7 -3
  270. vellum/types/search_filters_request.py +7 -3
  271. vellum/types/search_node_result.py +7 -3
  272. vellum/types/search_node_result_data.py +7 -3
  273. vellum/types/search_request_options_request.py +7 -3
  274. vellum/types/search_response.py +7 -3
  275. vellum/types/search_result.py +7 -3
  276. vellum/types/search_result_document.py +7 -3
  277. vellum/types/search_result_document_request.py +7 -3
  278. vellum/types/search_result_merging_request.py +7 -3
  279. vellum/types/search_result_meta.py +7 -3
  280. vellum/types/search_result_meta_request.py +7 -3
  281. vellum/types/search_result_meta_source.py +21 -5
  282. vellum/types/search_result_meta_source_request.py +21 -5
  283. vellum/types/search_result_request.py +7 -3
  284. vellum/types/search_weights_request.py +7 -3
  285. vellum/types/sentence_chunker_config.py +7 -3
  286. vellum/types/sentence_chunker_config_request.py +7 -3
  287. vellum/types/sentence_chunking.py +7 -3
  288. vellum/types/sentence_chunking_request.py +7 -3
  289. vellum/types/slim_deployment_read.py +11 -3
  290. vellum/types/slim_document.py +7 -3
  291. vellum/types/slim_workflow_deployment.py +12 -3
  292. vellum/types/streaming_execute_prompt_event.py +7 -3
  293. vellum/types/streaming_prompt_execution_meta.py +7 -3
  294. vellum/types/streaming_workflow_node_result_event.py +7 -3
  295. vellum/types/string_chat_message_content.py +7 -3
  296. vellum/types/string_chat_message_content_request.py +7 -3
  297. vellum/types/string_input_request.py +7 -3
  298. vellum/types/string_parameter_config.py +39 -0
  299. vellum/types/string_parameter_config_request.py +39 -0
  300. vellum/types/string_variable_value.py +7 -3
  301. vellum/types/string_vellum_value.py +7 -3
  302. vellum/types/string_vellum_value_request.py +7 -3
  303. vellum/types/submit_completion_actual_request.py +7 -3
  304. vellum/types/submit_workflow_execution_actual_request.py +67 -12
  305. vellum/types/subworkflow_node_result.py +7 -3
  306. vellum/types/subworkflow_node_result_data.py +7 -3
  307. vellum/types/templating_node_array_result.py +7 -3
  308. vellum/types/templating_node_chat_history_result.py +7 -3
  309. vellum/types/templating_node_error_result.py +7 -3
  310. vellum/types/templating_node_function_call_result.py +7 -3
  311. vellum/types/templating_node_json_result.py +7 -3
  312. vellum/types/templating_node_number_result.py +7 -3
  313. vellum/types/templating_node_result.py +7 -3
  314. vellum/types/templating_node_result_data.py +7 -3
  315. vellum/types/templating_node_result_output.py +144 -32
  316. vellum/types/templating_node_search_results_result.py +7 -3
  317. vellum/types/templating_node_string_result.py +7 -3
  318. vellum/types/terminal_node_array_result.py +7 -3
  319. vellum/types/terminal_node_chat_history_result.py +7 -3
  320. vellum/types/terminal_node_error_result.py +7 -3
  321. vellum/types/terminal_node_function_call_result.py +7 -3
  322. vellum/types/terminal_node_json_result.py +7 -3
  323. vellum/types/terminal_node_number_result.py +7 -3
  324. vellum/types/terminal_node_result.py +7 -3
  325. vellum/types/terminal_node_result_data.py +7 -3
  326. vellum/types/terminal_node_result_output.py +152 -32
  327. vellum/types/terminal_node_search_results_result.py +7 -3
  328. vellum/types/terminal_node_string_result.py +7 -3
  329. vellum/types/test_case_array_variable_value.py +7 -3
  330. vellum/types/test_case_chat_history_variable_value.py +7 -3
  331. vellum/types/test_case_error_variable_value.py +7 -3
  332. vellum/types/test_case_function_call_variable_value.py +7 -3
  333. vellum/types/test_case_json_variable_value.py +8 -4
  334. vellum/types/test_case_number_variable_value.py +7 -3
  335. vellum/types/test_case_search_results_variable_value.py +7 -3
  336. vellum/types/test_case_string_variable_value.py +7 -3
  337. vellum/types/test_case_variable_value.py +152 -32
  338. vellum/types/test_suite_run_deployment_release_tag_exec_config.py +7 -3
  339. vellum/types/test_suite_run_deployment_release_tag_exec_config_data.py +7 -3
  340. vellum/types/test_suite_run_deployment_release_tag_exec_config_data_request.py +7 -3
  341. vellum/types/test_suite_run_deployment_release_tag_exec_config_request.py +7 -3
  342. vellum/types/test_suite_run_exec_config.py +57 -12
  343. vellum/types/test_suite_run_exec_config_request.py +61 -12
  344. vellum/types/test_suite_run_execution.py +7 -3
  345. vellum/types/test_suite_run_execution_array_output.py +7 -3
  346. vellum/types/test_suite_run_execution_chat_history_output.py +7 -3
  347. vellum/types/test_suite_run_execution_error_output.py +7 -3
  348. vellum/types/test_suite_run_execution_function_call_output.py +7 -3
  349. vellum/types/test_suite_run_execution_json_output.py +7 -3
  350. vellum/types/test_suite_run_execution_metric_definition.py +7 -3
  351. vellum/types/test_suite_run_execution_metric_result.py +7 -3
  352. vellum/types/test_suite_run_execution_number_output.py +7 -3
  353. vellum/types/test_suite_run_execution_output.py +152 -32
  354. vellum/types/test_suite_run_execution_search_results_output.py +7 -3
  355. vellum/types/test_suite_run_execution_string_output.py +7 -3
  356. vellum/types/test_suite_run_external_exec_config.py +7 -3
  357. vellum/types/test_suite_run_external_exec_config_data.py +7 -3
  358. vellum/types/test_suite_run_external_exec_config_data_request.py +7 -3
  359. vellum/types/test_suite_run_external_exec_config_request.py +7 -3
  360. vellum/types/test_suite_run_metric_error_output.py +7 -3
  361. vellum/types/test_suite_run_metric_number_output.py +7 -3
  362. vellum/types/test_suite_run_metric_output.py +55 -12
  363. vellum/types/test_suite_run_metric_string_output.py +7 -3
  364. vellum/types/test_suite_run_read.py +7 -3
  365. vellum/types/test_suite_run_test_suite.py +7 -3
  366. vellum/types/test_suite_run_workflow_release_tag_exec_config.py +7 -3
  367. vellum/types/test_suite_run_workflow_release_tag_exec_config_data.py +7 -3
  368. vellum/types/test_suite_run_workflow_release_tag_exec_config_data_request.py +7 -3
  369. vellum/types/test_suite_run_workflow_release_tag_exec_config_request.py +7 -3
  370. vellum/types/test_suite_test_case.py +7 -3
  371. vellum/types/test_suite_test_case_bulk_operation_request.py +75 -16
  372. vellum/types/test_suite_test_case_bulk_result.py +74 -16
  373. vellum/types/test_suite_test_case_create_bulk_operation_request.py +7 -3
  374. vellum/types/test_suite_test_case_created_bulk_result.py +7 -3
  375. vellum/types/test_suite_test_case_created_bulk_result_data.py +7 -3
  376. vellum/types/test_suite_test_case_delete_bulk_operation_data_request.py +7 -3
  377. vellum/types/test_suite_test_case_delete_bulk_operation_request.py +7 -3
  378. vellum/types/test_suite_test_case_deleted_bulk_result.py +7 -3
  379. vellum/types/test_suite_test_case_deleted_bulk_result_data.py +7 -3
  380. vellum/types/test_suite_test_case_rejected_bulk_result.py +7 -3
  381. vellum/types/test_suite_test_case_replace_bulk_operation_request.py +7 -3
  382. vellum/types/test_suite_test_case_replaced_bulk_result.py +7 -3
  383. vellum/types/test_suite_test_case_replaced_bulk_result_data.py +7 -3
  384. vellum/types/test_suite_test_case_upsert_bulk_operation_request.py +7 -3
  385. vellum/types/{execute_workflow_error_response.py → tik_token_tokenizer_config.py} +11 -6
  386. vellum/types/{generate_error_response.py → tik_token_tokenizer_config_request.py} +11 -6
  387. vellum/types/token_overlapping_window_chunker_config.py +7 -3
  388. vellum/types/token_overlapping_window_chunker_config_request.py +7 -3
  389. vellum/types/token_overlapping_window_chunking.py +7 -3
  390. vellum/types/token_overlapping_window_chunking_request.py +7 -3
  391. vellum/types/upload_document_response.py +7 -3
  392. vellum/types/upsert_test_suite_test_case_request.py +7 -3
  393. vellum/types/vellum_error.py +7 -3
  394. vellum/types/vellum_error_request.py +7 -3
  395. vellum/types/vellum_image.py +7 -3
  396. vellum/types/vellum_image_request.py +7 -3
  397. vellum/types/vellum_variable.py +7 -3
  398. vellum/types/visibility_enum.py +5 -0
  399. vellum/types/workflow_deployment_read.py +12 -3
  400. vellum/types/workflow_event_error.py +7 -3
  401. vellum/types/workflow_execution_actual_chat_history_request.py +7 -3
  402. vellum/types/workflow_execution_actual_json_request.py +7 -3
  403. vellum/types/workflow_execution_actual_string_request.py +7 -3
  404. vellum/types/workflow_execution_node_result_event.py +7 -3
  405. vellum/types/workflow_execution_workflow_result_event.py +7 -3
  406. vellum/types/workflow_expand_meta_request.py +7 -3
  407. vellum/types/workflow_node_result_data.py +189 -45
  408. vellum/types/workflow_node_result_event.py +101 -20
  409. vellum/types/workflow_output.py +171 -36
  410. vellum/types/workflow_output_array.py +7 -3
  411. vellum/types/workflow_output_chat_history.py +7 -3
  412. vellum/types/workflow_output_error.py +7 -3
  413. vellum/types/workflow_output_function_call.py +7 -3
  414. vellum/types/workflow_output_image.py +7 -3
  415. vellum/types/workflow_output_json.py +7 -3
  416. vellum/types/workflow_output_number.py +7 -3
  417. vellum/types/workflow_output_search_results.py +7 -3
  418. vellum/types/workflow_output_string.py +7 -3
  419. vellum/types/workflow_release_tag_read.py +7 -3
  420. vellum/types/workflow_release_tag_workflow_deployment_history_item.py +7 -3
  421. vellum/types/workflow_request_chat_history_input_request.py +7 -3
  422. vellum/types/workflow_request_input_request.py +72 -16
  423. vellum/types/workflow_request_json_input_request.py +7 -3
  424. vellum/types/workflow_request_number_input_request.py +7 -3
  425. vellum/types/workflow_request_string_input_request.py +7 -3
  426. vellum/types/workflow_result_event.py +7 -3
  427. vellum/types/workflow_result_event_output_data.py +178 -33
  428. vellum/types/workflow_result_event_output_data_array.py +7 -3
  429. vellum/types/workflow_result_event_output_data_chat_history.py +7 -3
  430. vellum/types/workflow_result_event_output_data_error.py +7 -3
  431. vellum/types/workflow_result_event_output_data_function_call.py +7 -3
  432. vellum/types/workflow_result_event_output_data_json.py +7 -3
  433. vellum/types/workflow_result_event_output_data_number.py +7 -3
  434. vellum/types/workflow_result_event_output_data_search_results.py +7 -3
  435. vellum/types/workflow_result_event_output_data_string.py +7 -3
  436. vellum/types/workflow_stream_event.py +43 -8
  437. {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/METADATA +13 -1
  438. vellum_ai-0.7.5.dist-info/RECORD +502 -0
  439. vellum/types/array_enum.py +0 -5
  440. vellum/types/chat_history_enum.py +0 -5
  441. vellum/types/create_enum.py +0 -5
  442. vellum/types/created_enum.py +0 -5
  443. vellum/types/delete_enum.py +0 -5
  444. vellum/types/deleted_enum.py +0 -5
  445. vellum/types/error_enum.py +0 -5
  446. vellum/types/function_call_enum.py +0 -5
  447. vellum/types/hkunlp_instructor_xl_enum.py +0 -5
  448. vellum/types/image_enum.py +0 -5
  449. vellum/types/initiated_enum.py +0 -5
  450. vellum/types/intfloat_multilingual_e_5_large_enum.py +0 -5
  451. vellum/types/json_enum.py +0 -5
  452. vellum/types/merge_enum.py +0 -5
  453. vellum/types/metric_enum.py +0 -5
  454. vellum/types/number_enum.py +0 -5
  455. vellum/types/pdf_enum.py +0 -5
  456. vellum/types/reducto_chunker_enum.py +0 -5
  457. vellum/types/rejected_enum.py +0 -5
  458. vellum/types/replace_enum.py +0 -5
  459. vellum/types/replaced_enum.py +0 -5
  460. vellum/types/search_error_response.py +0 -28
  461. vellum/types/search_results_enum.py +0 -5
  462. vellum/types/sentence_chunker_enum.py +0 -5
  463. vellum/types/sentence_transformers_multi_qa_mpnet_base_cos_v_1_enum.py +0 -5
  464. vellum/types/sentence_transformers_multi_qa_mpnet_base_dot_v_1_enum.py +0 -5
  465. vellum/types/streaming_enum.py +0 -5
  466. vellum/types/string_enum.py +0 -5
  467. vellum/types/submit_completion_actuals_error_response.py +0 -25
  468. vellum/types/subworkflow_enum.py +0 -5
  469. vellum/types/test_suite_run_deployment_release_tag_exec_config_type_enum.py +0 -5
  470. vellum/types/test_suite_run_external_exec_config_type_enum.py +0 -5
  471. vellum/types/test_suite_run_metric_error_output_type_enum.py +0 -5
  472. vellum/types/test_suite_run_metric_number_output_type_enum.py +0 -5
  473. vellum/types/test_suite_run_metric_string_output_type_enum.py +0 -5
  474. vellum/types/test_suite_run_workflow_release_tag_exec_config_type_enum.py +0 -5
  475. vellum/types/text_embedding_3_large_enum.py +0 -5
  476. vellum/types/text_embedding_3_small_enum.py +0 -5
  477. vellum/types/text_embedding_ada_002_enum.py +0 -5
  478. vellum/types/token_overlapping_window_chunker_enum.py +0 -5
  479. vellum/types/upload_document_error_response.py +0 -25
  480. vellum/types/upsert_enum.py +0 -5
  481. vellum_ai-0.7.3.dist-info/RECORD +0 -496
  482. {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/LICENSE +0 -0
  483. {vellum_ai-0.7.3.dist-info → vellum_ai-0.7.5.dist-info}/WHEEL +0 -0
vellum/core/__init__.py CHANGED
@@ -6,7 +6,8 @@ from .datetime_utils import serialize_datetime
6
6
  from .file import File, convert_file_dict_to_httpx_tuples
7
7
  from .http_client import AsyncHttpClient, HttpClient
8
8
  from .jsonable_encoder import jsonable_encoder
9
- from .pydantic_utilities import pydantic_v1
9
+ from .pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
10
+ from .query_encoder import encode_query
10
11
  from .remove_none_from_dict import remove_none_from_dict
11
12
  from .request_options import RequestOptions
12
13
 
@@ -20,6 +21,8 @@ __all__ = [
20
21
  "RequestOptions",
21
22
  "SyncClientWrapper",
22
23
  "convert_file_dict_to_httpx_tuples",
24
+ "deep_union_pydantic_dicts",
25
+ "encode_query",
23
26
  "jsonable_encoder",
24
27
  "pydantic_v1",
25
28
  "remove_none_from_dict",
@@ -18,7 +18,7 @@ class BaseClientWrapper:
18
18
  headers: typing.Dict[str, str] = {
19
19
  "X-Fern-Language": "Python",
20
20
  "X-Fern-SDK-Name": "vellum-ai",
21
- "X-Fern-SDK-Version": "0.7.3",
21
+ "X-Fern-SDK-Version": "0.7.5",
22
22
  }
23
23
  headers["X_API_KEY"] = self.api_key
24
24
  return headers
@@ -40,7 +40,9 @@ class SyncClientWrapper(BaseClientWrapper):
40
40
  httpx_client: httpx.Client
41
41
  ):
42
42
  super().__init__(api_key=api_key, environment=environment, timeout=timeout)
43
- self.httpx_client = HttpClient(httpx_client=httpx_client)
43
+ self.httpx_client = HttpClient(
44
+ httpx_client=httpx_client, base_headers=self.get_headers(), base_timeout=self.get_timeout()
45
+ )
44
46
 
45
47
 
46
48
  class AsyncClientWrapper(BaseClientWrapper):
@@ -53,4 +55,6 @@ class AsyncClientWrapper(BaseClientWrapper):
53
55
  httpx_client: httpx.AsyncClient
54
56
  ):
55
57
  super().__init__(api_key=api_key, environment=environment, timeout=timeout)
56
- self.httpx_client = AsyncHttpClient(httpx_client=httpx_client)
58
+ self.httpx_client = AsyncHttpClient(
59
+ httpx_client=httpx_client, base_headers=self.get_headers(), base_timeout=self.get_timeout()
60
+ )
@@ -2,15 +2,22 @@
2
2
 
3
3
  import asyncio
4
4
  import email.utils
5
+ import json
5
6
  import re
6
7
  import time
7
8
  import typing
9
+ import urllib.parse
8
10
  from contextlib import asynccontextmanager, contextmanager
9
- from functools import wraps
10
11
  from random import random
11
12
 
12
13
  import httpx
13
14
 
15
+ from .file import File, convert_file_dict_to_httpx_tuples
16
+ from .jsonable_encoder import jsonable_encoder
17
+ from .query_encoder import encode_query
18
+ from .remove_none_from_dict import remove_none_from_dict
19
+ from .request_options import RequestOptions
20
+
14
21
  INITIAL_RETRY_DELAY_SECONDS = 0.5
15
22
  MAX_RETRY_DELAY_SECONDS = 10
16
23
  MAX_RETRY_DELAY_SECONDS_FROM_HEADER = 30
@@ -82,49 +89,387 @@ def _should_retry(response: httpx.Response) -> bool:
82
89
  return response.status_code >= 500 or response.status_code in retriable_400s
83
90
 
84
91
 
92
+ def remove_omit_from_dict(
93
+ original: typing.Dict[str, typing.Optional[typing.Any]], omit: typing.Optional[typing.Any]
94
+ ) -> typing.Dict[str, typing.Any]:
95
+ if omit is None:
96
+ return original
97
+ new: typing.Dict[str, typing.Any] = {}
98
+ for key, value in original.items():
99
+ if value is not omit:
100
+ new[key] = value
101
+ return new
102
+
103
+
104
+ def maybe_filter_request_body(
105
+ data: typing.Optional[typing.Any],
106
+ request_options: typing.Optional[RequestOptions],
107
+ omit: typing.Optional[typing.Any],
108
+ ) -> typing.Optional[typing.Any]:
109
+ if data is None:
110
+ return (
111
+ jsonable_encoder(request_options.get("additional_body_parameters", {})) or {}
112
+ if request_options is not None
113
+ else None
114
+ )
115
+ elif not isinstance(data, typing.Mapping):
116
+ data_content = jsonable_encoder(data)
117
+ else:
118
+ data_content = {
119
+ **(jsonable_encoder(remove_omit_from_dict(data, omit))), # type: ignore
120
+ **(
121
+ jsonable_encoder(request_options.get("additional_body_parameters", {})) or {}
122
+ if request_options is not None
123
+ else {}
124
+ ),
125
+ }
126
+ return data_content
127
+
128
+
129
+ # Abstracted out for testing purposes
130
+ def get_request_body(
131
+ *,
132
+ json: typing.Optional[typing.Any],
133
+ data: typing.Optional[typing.Any],
134
+ request_options: typing.Optional[RequestOptions],
135
+ omit: typing.Optional[typing.Any],
136
+ ) -> typing.Tuple[typing.Optional[typing.Any], typing.Optional[typing.Any]]:
137
+ json_body = None
138
+ data_body = None
139
+ if data is not None:
140
+ data_body = maybe_filter_request_body(data, request_options, omit)
141
+ else:
142
+ # If both data and json are None, we send json data in the event extra properties are specified
143
+ json_body = maybe_filter_request_body(json, request_options, omit)
144
+
145
+ return json_body, data_body
146
+
147
+
85
148
  class HttpClient:
86
- def __init__(self, *, httpx_client: httpx.Client):
149
+ def __init__(
150
+ self,
151
+ *,
152
+ httpx_client: httpx.Client,
153
+ base_timeout: typing.Optional[float],
154
+ base_headers: typing.Dict[str, str],
155
+ base_url: typing.Optional[str] = None,
156
+ ):
157
+ self.base_url = base_url
158
+ self.base_timeout = base_timeout
159
+ self.base_headers = base_headers
87
160
  self.httpx_client = httpx_client
88
161
 
89
- # Ensure that the signature of the `request` method is the same as the `httpx.Client.request` method
90
- @wraps(httpx.Client.request)
162
+ def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str:
163
+ base_url = self.base_url if maybe_base_url is None else maybe_base_url
164
+ if base_url is None:
165
+ raise ValueError("A base_url is required to make this request, please provide one and try again.")
166
+ return base_url
167
+
91
168
  def request(
92
- self, *args: typing.Any, max_retries: int = 0, retries: int = 0, **kwargs: typing.Any
169
+ self,
170
+ path: typing.Optional[str] = None,
171
+ *,
172
+ method: str,
173
+ base_url: typing.Optional[str] = None,
174
+ params: typing.Optional[typing.Dict[str, typing.Any]] = None,
175
+ json: typing.Optional[typing.Any] = None,
176
+ data: typing.Optional[typing.Any] = None,
177
+ content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
178
+ files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
179
+ headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
180
+ request_options: typing.Optional[RequestOptions] = None,
181
+ retries: int = 0,
182
+ omit: typing.Optional[typing.Any] = None,
93
183
  ) -> httpx.Response:
94
- response = self.httpx_client.request(*args, **kwargs)
184
+ base_url = self.get_base_url(base_url)
185
+ timeout = (
186
+ request_options.get("timeout_in_seconds")
187
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
188
+ else self.base_timeout
189
+ )
190
+
191
+ json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
192
+
193
+ response = self.httpx_client.request(
194
+ method=method,
195
+ url=urllib.parse.urljoin(f"{base_url}/", path),
196
+ headers=jsonable_encoder(
197
+ remove_none_from_dict(
198
+ {
199
+ **self.base_headers,
200
+ **(headers if headers is not None else {}),
201
+ **(request_options.get("additional_headers", {}) or {} if request_options is not None else {}),
202
+ }
203
+ )
204
+ ),
205
+ params=encode_query(
206
+ jsonable_encoder(
207
+ remove_none_from_dict(
208
+ remove_omit_from_dict(
209
+ {
210
+ **(params if params is not None else {}),
211
+ **(
212
+ request_options.get("additional_query_parameters", {}) or {}
213
+ if request_options is not None
214
+ else {}
215
+ ),
216
+ },
217
+ omit,
218
+ )
219
+ )
220
+ )
221
+ ),
222
+ json=json_body,
223
+ data=data_body,
224
+ content=content,
225
+ files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
226
+ timeout=timeout,
227
+ )
228
+
229
+ max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0
95
230
  if _should_retry(response=response):
96
231
  if max_retries > retries:
97
232
  time.sleep(_retry_timeout(response=response, retries=retries))
98
- return self.request(max_retries=max_retries, retries=retries + 1, *args, **kwargs)
233
+ return self.request(
234
+ path=path,
235
+ method=method,
236
+ base_url=base_url,
237
+ params=params,
238
+ json=json,
239
+ content=content,
240
+ files=files,
241
+ headers=headers,
242
+ request_options=request_options,
243
+ retries=retries + 1,
244
+ omit=omit,
245
+ )
246
+
99
247
  return response
100
248
 
101
- @wraps(httpx.Client.stream)
102
249
  @contextmanager
103
- def stream(self, *args: typing.Any, max_retries: int = 0, retries: int = 0, **kwargs: typing.Any) -> typing.Any:
104
- with self.httpx_client.stream(*args, **kwargs) as stream:
250
+ def stream(
251
+ self,
252
+ path: typing.Optional[str] = None,
253
+ *,
254
+ method: str,
255
+ base_url: typing.Optional[str] = None,
256
+ params: typing.Optional[typing.Dict[str, typing.Any]] = None,
257
+ json: typing.Optional[typing.Any] = None,
258
+ data: typing.Optional[typing.Any] = None,
259
+ content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
260
+ files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
261
+ headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
262
+ request_options: typing.Optional[RequestOptions] = None,
263
+ retries: int = 0,
264
+ omit: typing.Optional[typing.Any] = None,
265
+ ) -> typing.Iterator[httpx.Response]:
266
+ base_url = self.get_base_url(base_url)
267
+ timeout = (
268
+ request_options.get("timeout_in_seconds")
269
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
270
+ else self.base_timeout
271
+ )
272
+
273
+ json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
274
+
275
+ with self.httpx_client.stream(
276
+ method=method,
277
+ url=urllib.parse.urljoin(f"{base_url}/", path),
278
+ headers=jsonable_encoder(
279
+ remove_none_from_dict(
280
+ {
281
+ **self.base_headers,
282
+ **(headers if headers is not None else {}),
283
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
284
+ }
285
+ )
286
+ ),
287
+ params=encode_query(
288
+ jsonable_encoder(
289
+ remove_none_from_dict(
290
+ remove_omit_from_dict(
291
+ {
292
+ **(params if params is not None else {}),
293
+ **(
294
+ request_options.get("additional_query_parameters", {})
295
+ if request_options is not None
296
+ else {}
297
+ ),
298
+ },
299
+ omit,
300
+ )
301
+ )
302
+ )
303
+ ),
304
+ json=json_body,
305
+ data=data_body,
306
+ content=content,
307
+ files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
308
+ timeout=timeout,
309
+ ) as stream:
105
310
  yield stream
106
311
 
107
312
 
108
313
  class AsyncHttpClient:
109
- def __init__(self, *, httpx_client: httpx.AsyncClient):
314
+ def __init__(
315
+ self,
316
+ *,
317
+ httpx_client: httpx.AsyncClient,
318
+ base_timeout: typing.Optional[float],
319
+ base_headers: typing.Dict[str, str],
320
+ base_url: typing.Optional[str] = None,
321
+ ):
322
+ self.base_url = base_url
323
+ self.base_timeout = base_timeout
324
+ self.base_headers = base_headers
110
325
  self.httpx_client = httpx_client
111
326
 
112
- # Ensure that the signature of the `request` method is the same as the `httpx.Client.request` method
113
- @wraps(httpx.AsyncClient.request)
327
+ def get_base_url(self, maybe_base_url: typing.Optional[str]) -> str:
328
+ base_url = self.base_url if maybe_base_url is None else maybe_base_url
329
+ if base_url is None:
330
+ raise ValueError("A base_url is required to make this request, please provide one and try again.")
331
+ return base_url
332
+
114
333
  async def request(
115
- self, *args: typing.Any, max_retries: int = 0, retries: int = 0, **kwargs: typing.Any
334
+ self,
335
+ path: typing.Optional[str] = None,
336
+ *,
337
+ method: str,
338
+ base_url: typing.Optional[str] = None,
339
+ params: typing.Optional[typing.Dict[str, typing.Any]] = None,
340
+ json: typing.Optional[typing.Any] = None,
341
+ data: typing.Optional[typing.Any] = None,
342
+ content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
343
+ files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
344
+ headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
345
+ request_options: typing.Optional[RequestOptions] = None,
346
+ retries: int = 0,
347
+ omit: typing.Optional[typing.Any] = None,
116
348
  ) -> httpx.Response:
117
- response = await self.httpx_client.request(*args, **kwargs)
349
+ base_url = self.get_base_url(base_url)
350
+ timeout = (
351
+ request_options.get("timeout_in_seconds")
352
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
353
+ else self.base_timeout
354
+ )
355
+
356
+ json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
357
+
358
+ # Add the input to each of these and do None-safety checks
359
+ response = await self.httpx_client.request(
360
+ method=method,
361
+ url=urllib.parse.urljoin(f"{base_url}/", path),
362
+ headers=jsonable_encoder(
363
+ remove_none_from_dict(
364
+ {
365
+ **self.base_headers,
366
+ **(headers if headers is not None else {}),
367
+ **(request_options.get("additional_headers", {}) or {} if request_options is not None else {}),
368
+ }
369
+ )
370
+ ),
371
+ params=encode_query(
372
+ jsonable_encoder(
373
+ remove_none_from_dict(
374
+ remove_omit_from_dict(
375
+ {
376
+ **(params if params is not None else {}),
377
+ **(
378
+ request_options.get("additional_query_parameters", {}) or {}
379
+ if request_options is not None
380
+ else {}
381
+ ),
382
+ },
383
+ omit,
384
+ )
385
+ )
386
+ )
387
+ ),
388
+ json=json_body,
389
+ data=data_body,
390
+ content=content,
391
+ files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
392
+ timeout=timeout,
393
+ )
394
+
395
+ max_retries: int = request_options.get("max_retries", 0) if request_options is not None else 0
118
396
  if _should_retry(response=response):
119
397
  if max_retries > retries:
120
398
  await asyncio.sleep(_retry_timeout(response=response, retries=retries))
121
- return await self.request(max_retries=max_retries, retries=retries + 1, *args, **kwargs)
399
+ return await self.request(
400
+ path=path,
401
+ method=method,
402
+ base_url=base_url,
403
+ params=params,
404
+ json=json,
405
+ content=content,
406
+ files=files,
407
+ headers=headers,
408
+ request_options=request_options,
409
+ retries=retries + 1,
410
+ omit=omit,
411
+ )
122
412
  return response
123
413
 
124
- @wraps(httpx.AsyncClient.stream)
125
414
  @asynccontextmanager
126
415
  async def stream(
127
- self, *args: typing.Any, max_retries: int = 0, retries: int = 0, **kwargs: typing.Any
128
- ) -> typing.Any:
129
- async with self.httpx_client.stream(*args, **kwargs) as stream:
416
+ self,
417
+ path: typing.Optional[str] = None,
418
+ *,
419
+ method: str,
420
+ base_url: typing.Optional[str] = None,
421
+ params: typing.Optional[typing.Dict[str, typing.Any]] = None,
422
+ json: typing.Optional[typing.Any] = None,
423
+ data: typing.Optional[typing.Any] = None,
424
+ content: typing.Optional[typing.Union[bytes, typing.Iterator[bytes], typing.AsyncIterator[bytes]]] = None,
425
+ files: typing.Optional[typing.Dict[str, typing.Optional[typing.Union[File, typing.List[File]]]]] = None,
426
+ headers: typing.Optional[typing.Dict[str, typing.Any]] = None,
427
+ request_options: typing.Optional[RequestOptions] = None,
428
+ retries: int = 0,
429
+ omit: typing.Optional[typing.Any] = None,
430
+ ) -> typing.AsyncIterator[httpx.Response]:
431
+ base_url = self.get_base_url(base_url)
432
+ timeout = (
433
+ request_options.get("timeout_in_seconds")
434
+ if request_options is not None and request_options.get("timeout_in_seconds") is not None
435
+ else self.base_timeout
436
+ )
437
+
438
+ json_body, data_body = get_request_body(json=json, data=data, request_options=request_options, omit=omit)
439
+
440
+ async with self.httpx_client.stream(
441
+ method=method,
442
+ url=urllib.parse.urljoin(f"{base_url}/", path),
443
+ headers=jsonable_encoder(
444
+ remove_none_from_dict(
445
+ {
446
+ **self.base_headers,
447
+ **(headers if headers is not None else {}),
448
+ **(request_options.get("additional_headers", {}) if request_options is not None else {}),
449
+ }
450
+ )
451
+ ),
452
+ params=encode_query(
453
+ jsonable_encoder(
454
+ remove_none_from_dict(
455
+ remove_omit_from_dict(
456
+ {
457
+ **(params if params is not None else {}),
458
+ **(
459
+ request_options.get("additional_query_parameters", {})
460
+ if request_options is not None
461
+ else {}
462
+ ),
463
+ },
464
+ omit=omit,
465
+ )
466
+ )
467
+ )
468
+ ),
469
+ json=json_body,
470
+ data=data_body,
471
+ content=content,
472
+ files=convert_file_dict_to_httpx_tuples(remove_none_from_dict(files)) if files is not None else None,
473
+ timeout=timeout,
474
+ ) as stream:
130
475
  yield stream
@@ -8,6 +8,7 @@ Taken from FastAPI, and made a bit simpler
8
8
  https://github.com/tiangolo/fastapi/blob/master/fastapi/encoders.py
9
9
  """
10
10
 
11
+ import base64
11
12
  import dataclasses
12
13
  import datetime as dt
13
14
  from collections import defaultdict
@@ -55,6 +56,8 @@ def jsonable_encoder(obj: Any, custom_encoder: Optional[Dict[Any, Callable[[Any]
55
56
  if dataclasses.is_dataclass(obj):
56
57
  obj_dict = dataclasses.asdict(obj)
57
58
  return jsonable_encoder(obj_dict, custom_encoder=custom_encoder)
59
+ if isinstance(obj, bytes):
60
+ return base64.b64encode(obj).decode("utf-8")
58
61
  if isinstance(obj, Enum):
59
62
  return obj.value
60
63
  if isinstance(obj, PurePath):
@@ -1,5 +1,7 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ import typing
4
+
3
5
  import pydantic
4
6
 
5
7
  IS_PYDANTIC_V2 = pydantic.VERSION.startswith("2.")
@@ -9,4 +11,18 @@ if IS_PYDANTIC_V2:
9
11
  else:
10
12
  import pydantic as pydantic_v1 # type: ignore # nopycln: import
11
13
 
14
+
15
+ def deep_union_pydantic_dicts(
16
+ source: typing.Dict[str, typing.Any], destination: typing.Dict[str, typing.Any]
17
+ ) -> typing.Dict[str, typing.Any]:
18
+ for key, value in source.items():
19
+ if isinstance(value, dict):
20
+ node = destination.setdefault(key, {})
21
+ deep_union_pydantic_dicts(value, node)
22
+ else:
23
+ destination[key] = value
24
+
25
+ return destination
26
+
27
+
12
28
  __all__ = ["pydantic_v1"]
@@ -0,0 +1,33 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from collections import ChainMap
4
+ from typing import Any, Dict, Optional
5
+
6
+ from .pydantic_utilities import pydantic_v1
7
+
8
+
9
+ # Flattens dicts to be of the form {"key[subkey][subkey2]": value} where value is not a dict
10
+ def traverse_query_dict(dict_flat: Dict[str, Any], key_prefix: Optional[str] = None) -> Dict[str, Any]:
11
+ result = {}
12
+ for k, v in dict_flat.items():
13
+ key = f"{key_prefix}[{k}]" if key_prefix is not None else k
14
+ if isinstance(v, dict):
15
+ result.update(traverse_query_dict(v, key))
16
+ else:
17
+ result[key] = v
18
+ return result
19
+
20
+
21
+ def single_query_encoder(query_key: str, query_value: Any) -> Dict[str, Any]:
22
+ if isinstance(query_value, pydantic_v1.BaseModel) or isinstance(query_value, dict):
23
+ if isinstance(query_value, pydantic_v1.BaseModel):
24
+ obj_dict = query_value.dict(by_alias=True)
25
+ else:
26
+ obj_dict = query_value
27
+ return traverse_query_dict(obj_dict, query_key)
28
+
29
+ return {query_key: query_value}
30
+
31
+
32
+ def encode_query(query: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
33
+ return dict(ChainMap(*[single_query_encoder(k, v) for k, v in query.items()])) if query is not None else None
@@ -1,9 +1,9 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- from typing import Any, Dict, Optional
3
+ from typing import Any, Dict, Mapping, Optional
4
4
 
5
5
 
6
- def remove_none_from_dict(original: Dict[str, Optional[Any]]) -> Dict[str, Any]:
6
+ def remove_none_from_dict(original: Mapping[str, Optional[Any]]) -> Dict[str, Any]:
7
7
  new: Dict[str, Any] = {}
8
8
  for key, value in original.items():
9
9
  if value is not None:
@@ -5,10 +5,10 @@ import typing
5
5
  try:
6
6
  from typing import NotRequired # type: ignore
7
7
  except ImportError:
8
- from typing_extensions import NotRequired # type: ignore
8
+ from typing_extensions import NotRequired
9
9
 
10
10
 
11
- class RequestOptions(typing.TypedDict):
11
+ class RequestOptions(typing.TypedDict, total=False):
12
12
  """
13
13
  Additional options for request-specific configuration when calling APIs via the SDK.
14
14
  This is used primarily as an optional final parameter for service functions.
@@ -5,6 +5,7 @@ from . import (
5
5
  document_indexes,
6
6
  documents,
7
7
  folder_entities,
8
+ ml_models,
8
9
  sandboxes,
9
10
  test_suite_runs,
10
11
  test_suites,
@@ -23,6 +24,7 @@ __all__ = [
23
24
  "document_indexes",
24
25
  "documents",
25
26
  "folder_entities",
27
+ "ml_models",
26
28
  "sandboxes",
27
29
  "test_suite_runs",
28
30
  "test_suites",