vellum-ai 0.14.63__py3-none-any.whl → 1.11.2__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.

Potentially problematic release.


This version of vellum-ai might be problematic. Click here for more details.

Files changed (1305) hide show
  1. vellum/__init__.py +269 -4
  2. vellum/client/README.md +68 -15
  3. vellum/client/__init__.py +598 -1437
  4. vellum/client/core/__init__.py +5 -0
  5. vellum/client/core/api_error.py +13 -5
  6. vellum/client/core/client_wrapper.py +30 -4
  7. vellum/client/core/force_multipart.py +16 -0
  8. vellum/client/core/http_client.py +70 -26
  9. vellum/client/core/http_response.py +55 -0
  10. vellum/client/core/jsonable_encoder.py +0 -1
  11. vellum/client/core/pydantic_utilities.py +87 -117
  12. vellum/client/core/serialization.py +7 -3
  13. vellum/client/errors/__init__.py +14 -1
  14. vellum/client/errors/bad_request_error.py +4 -3
  15. vellum/client/errors/forbidden_error.py +4 -3
  16. vellum/client/errors/internal_server_error.py +4 -3
  17. vellum/client/errors/misdirected_request_error.py +11 -0
  18. vellum/client/errors/not_found_error.py +4 -3
  19. vellum/client/errors/too_many_requests_error.py +11 -0
  20. vellum/client/errors/unauthorized_error.py +11 -0
  21. vellum/client/raw_client.py +2725 -0
  22. vellum/client/reference.md +1980 -638
  23. vellum/client/resources/__init__.py +16 -2
  24. vellum/client/resources/ad_hoc/__init__.py +2 -0
  25. vellum/client/resources/ad_hoc/client.py +173 -377
  26. vellum/client/resources/ad_hoc/raw_client.py +569 -0
  27. vellum/client/resources/container_images/__init__.py +2 -0
  28. vellum/client/resources/container_images/client.py +72 -191
  29. vellum/client/resources/container_images/raw_client.py +407 -0
  30. vellum/client/resources/deployments/__init__.py +2 -0
  31. vellum/client/resources/deployments/client.py +119 -463
  32. vellum/client/resources/deployments/raw_client.py +1002 -0
  33. vellum/client/resources/deployments/types/__init__.py +2 -0
  34. vellum/client/resources/document_indexes/__init__.py +2 -0
  35. vellum/client/resources/document_indexes/client.py +131 -383
  36. vellum/client/resources/document_indexes/raw_client.py +866 -0
  37. vellum/client/resources/document_indexes/types/__init__.py +2 -0
  38. vellum/client/resources/documents/__init__.py +2 -0
  39. vellum/client/resources/documents/client.py +93 -325
  40. vellum/client/resources/documents/raw_client.py +662 -0
  41. vellum/client/resources/{release_reviews → environments}/__init__.py +2 -0
  42. vellum/client/resources/environments/client.py +106 -0
  43. vellum/client/resources/environments/raw_client.py +95 -0
  44. vellum/client/resources/events/__init__.py +4 -0
  45. vellum/client/resources/events/client.py +201 -0
  46. vellum/client/resources/events/raw_client.py +211 -0
  47. vellum/client/resources/folder_entities/__init__.py +2 -0
  48. vellum/client/resources/folder_entities/client.py +56 -95
  49. vellum/client/resources/folder_entities/raw_client.py +276 -0
  50. vellum/client/resources/folder_entities/types/__init__.py +2 -0
  51. vellum/client/resources/integration_auth_configs/__init__.py +4 -0
  52. vellum/client/resources/integration_auth_configs/client.py +186 -0
  53. vellum/client/resources/integration_auth_configs/raw_client.py +171 -0
  54. vellum/client/resources/integration_providers/__init__.py +4 -0
  55. vellum/client/resources/integration_providers/client.py +299 -0
  56. vellum/client/resources/integration_providers/raw_client.py +275 -0
  57. vellum/client/resources/integrations/__init__.py +4 -0
  58. vellum/client/resources/integrations/client.py +466 -0
  59. vellum/client/resources/integrations/raw_client.py +557 -0
  60. vellum/client/resources/metric_definitions/__init__.py +2 -0
  61. vellum/client/resources/metric_definitions/client.py +60 -106
  62. vellum/client/resources/metric_definitions/raw_client.py +224 -0
  63. vellum/client/resources/ml_models/__init__.py +2 -0
  64. vellum/client/resources/ml_models/client.py +37 -46
  65. vellum/client/resources/ml_models/raw_client.py +102 -0
  66. vellum/client/resources/organizations/__init__.py +2 -0
  67. vellum/client/resources/organizations/client.py +37 -45
  68. vellum/client/resources/organizations/raw_client.py +95 -0
  69. vellum/client/resources/prompts/__init__.py +2 -0
  70. vellum/client/resources/prompts/client.py +84 -202
  71. vellum/client/resources/prompts/raw_client.py +353 -0
  72. vellum/client/resources/sandboxes/__init__.py +2 -0
  73. vellum/client/resources/sandboxes/client.py +69 -159
  74. vellum/client/resources/sandboxes/raw_client.py +392 -0
  75. vellum/client/resources/test_suite_runs/__init__.py +2 -0
  76. vellum/client/resources/test_suite_runs/client.py +65 -157
  77. vellum/client/resources/test_suite_runs/raw_client.py +354 -0
  78. vellum/client/resources/test_suites/__init__.py +2 -0
  79. vellum/client/resources/test_suites/client.py +162 -266
  80. vellum/client/resources/test_suites/raw_client.py +530 -0
  81. vellum/client/resources/uploaded_files/__init__.py +4 -0
  82. vellum/client/resources/uploaded_files/client.py +230 -0
  83. vellum/client/resources/uploaded_files/raw_client.py +316 -0
  84. vellum/client/resources/workflow_deployments/__init__.py +2 -0
  85. vellum/client/resources/workflow_deployments/client.py +302 -353
  86. vellum/client/resources/workflow_deployments/raw_client.py +1059 -0
  87. vellum/client/resources/workflow_deployments/types/__init__.py +2 -0
  88. vellum/client/resources/workflow_executions/__init__.py +4 -0
  89. vellum/client/resources/workflow_executions/client.py +140 -0
  90. vellum/client/resources/workflow_executions/raw_client.py +173 -0
  91. vellum/client/resources/workflow_sandboxes/__init__.py +2 -0
  92. vellum/client/resources/workflow_sandboxes/client.py +58 -123
  93. vellum/client/resources/workflow_sandboxes/raw_client.py +291 -0
  94. vellum/client/resources/workflow_sandboxes/types/__init__.py +2 -0
  95. vellum/client/resources/workflows/__init__.py +2 -0
  96. vellum/client/resources/workflows/client.py +256 -141
  97. vellum/client/resources/workflows/raw_client.py +547 -0
  98. vellum/client/resources/workspace_secrets/__init__.py +2 -0
  99. vellum/client/resources/workspace_secrets/client.py +43 -100
  100. vellum/client/resources/workspace_secrets/raw_client.py +219 -0
  101. vellum/client/resources/workspaces/__init__.py +2 -0
  102. vellum/client/resources/workspaces/client.py +37 -45
  103. vellum/client/resources/workspaces/raw_client.py +95 -0
  104. vellum/client/tests/__init__.py +0 -0
  105. vellum/client/tests/test_utils.py +34 -0
  106. vellum/client/types/__init__.py +242 -0
  107. vellum/client/types/ad_hoc_execute_prompt_event.py +3 -2
  108. vellum/client/types/ad_hoc_expand_meta.py +2 -2
  109. vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py +3 -3
  110. vellum/client/types/ad_hoc_initiated_prompt_execution_meta.py +2 -2
  111. vellum/client/types/ad_hoc_rejected_prompt_execution_meta.py +3 -3
  112. vellum/client/types/ad_hoc_streaming_prompt_execution_meta.py +2 -2
  113. vellum/client/types/api_actor_type_enum.py +7 -0
  114. vellum/client/types/api_node_result.py +3 -3
  115. vellum/client/types/api_node_result_data.py +4 -4
  116. vellum/client/types/api_request_parent_context.py +17 -10
  117. vellum/client/types/api_version_enum.py +1 -1
  118. vellum/client/types/array_chat_message_content.py +3 -3
  119. vellum/client/types/array_chat_message_content_item.py +7 -4
  120. vellum/client/types/array_chat_message_content_item_request.py +7 -4
  121. vellum/client/types/array_chat_message_content_request.py +3 -3
  122. vellum/client/types/array_input.py +12 -6
  123. vellum/client/types/array_vellum_value.py +4 -4
  124. vellum/client/types/array_vellum_value_request.py +4 -4
  125. vellum/client/types/audio_chat_message_content.py +3 -3
  126. vellum/client/types/audio_chat_message_content_request.py +3 -3
  127. vellum/client/types/audio_input.py +30 -0
  128. vellum/client/types/audio_input_request.py +30 -0
  129. vellum/client/types/audio_prompt_block.py +4 -4
  130. vellum/client/types/audio_vellum_value.py +3 -3
  131. vellum/client/types/audio_vellum_value_request.py +3 -3
  132. vellum/client/types/auth_type_enum.py +5 -0
  133. vellum/client/types/base_output.py +4 -4
  134. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large.py +2 -2
  135. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large_request.py +2 -2
  136. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1.py +2 -2
  137. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1_request.py +2 -2
  138. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1.py +2 -2
  139. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1_request.py +2 -2
  140. vellum/client/types/build_status_enum.py +5 -0
  141. vellum/client/types/chat_history_input.py +3 -3
  142. vellum/client/types/chat_history_input_request.py +3 -3
  143. vellum/client/types/chat_history_vellum_value.py +3 -3
  144. vellum/client/types/chat_history_vellum_value_request.py +3 -3
  145. vellum/client/types/chat_message.py +4 -4
  146. vellum/client/types/chat_message_content.py +7 -4
  147. vellum/client/types/chat_message_content_request.py +7 -4
  148. vellum/client/types/chat_message_prompt_block.py +7 -7
  149. vellum/client/types/chat_message_request.py +4 -4
  150. vellum/client/types/code_execution_node_array_result.py +11 -5
  151. vellum/client/types/code_execution_node_chat_history_result.py +3 -3
  152. vellum/client/types/code_execution_node_error_result.py +3 -3
  153. vellum/client/types/code_execution_node_function_call_result.py +3 -3
  154. vellum/client/types/code_execution_node_json_result.py +2 -2
  155. vellum/client/types/code_execution_node_number_result.py +2 -2
  156. vellum/client/types/code_execution_node_result.py +10 -4
  157. vellum/client/types/code_execution_node_result_data.py +10 -4
  158. vellum/client/types/code_execution_node_result_output.py +6 -5
  159. vellum/client/types/code_execution_node_search_results_result.py +3 -3
  160. vellum/client/types/code_execution_node_string_result.py +2 -2
  161. vellum/client/types/code_execution_package.py +3 -2
  162. vellum/client/types/code_executor_input.py +15 -6
  163. vellum/client/types/code_executor_response.py +11 -5
  164. vellum/client/types/code_executor_secret_input.py +3 -3
  165. vellum/client/types/code_resource_definition.py +3 -3
  166. vellum/client/types/compile_prompt_deployment_expand_meta_request.py +2 -2
  167. vellum/client/types/compile_prompt_meta.py +2 -2
  168. vellum/client/types/components_schemas_composio_execute_tool_request.py +5 -0
  169. vellum/client/types/components_schemas_composio_execute_tool_response.py +5 -0
  170. vellum/client/types/components_schemas_composio_integration_exec_config.py +5 -0
  171. vellum/client/types/components_schemas_composio_tool_definition.py +5 -0
  172. vellum/client/types/components_schemas_slim_composio_tool_definition.py +5 -0
  173. vellum/client/types/composio_execute_tool_request.py +24 -0
  174. vellum/client/types/composio_execute_tool_response.py +24 -0
  175. vellum/client/types/composio_integration_exec_config.py +21 -0
  176. vellum/client/types/composio_tool_definition.py +30 -0
  177. vellum/client/types/conditional_node_result.py +3 -3
  178. vellum/client/types/conditional_node_result_data.py +2 -2
  179. vellum/client/types/container_image_build_config.py +21 -0
  180. vellum/client/types/container_image_container_image_tag.py +2 -2
  181. vellum/client/types/container_image_read.py +8 -4
  182. vellum/client/types/create_test_suite_test_case_request.py +9 -3
  183. vellum/client/types/create_workflow_event_request.py +7 -0
  184. vellum/client/types/dataset_row_push_request.py +20 -0
  185. vellum/client/types/delimiter_chunker_config.py +20 -0
  186. vellum/client/types/delimiter_chunker_config_request.py +20 -0
  187. vellum/client/types/delimiter_chunking.py +21 -0
  188. vellum/client/types/delimiter_chunking_request.py +21 -0
  189. vellum/client/types/deployment_history_item.py +10 -4
  190. vellum/client/types/deployment_provider_payload_response.py +4 -4
  191. vellum/client/types/deployment_read.py +15 -9
  192. vellum/client/types/deployment_release_tag_deployment_history_item.py +2 -2
  193. vellum/client/types/deployment_release_tag_read.py +4 -4
  194. vellum/client/types/deprecated_prompt_request_input.py +8 -0
  195. vellum/client/types/docker_service_token.py +2 -2
  196. vellum/client/types/document_chat_message_content.py +3 -3
  197. vellum/client/types/document_chat_message_content_request.py +3 -3
  198. vellum/client/types/document_document_to_document_index.py +4 -4
  199. vellum/client/types/document_index_chunking.py +5 -1
  200. vellum/client/types/document_index_chunking_request.py +3 -1
  201. vellum/client/types/document_index_indexing_config.py +4 -4
  202. vellum/client/types/document_index_indexing_config_request.py +4 -4
  203. vellum/client/types/document_index_read.py +4 -4
  204. vellum/client/types/document_input.py +30 -0
  205. vellum/client/types/document_input_request.py +30 -0
  206. vellum/client/types/document_prompt_block.py +4 -4
  207. vellum/client/types/document_read.py +9 -5
  208. vellum/client/types/document_vellum_value.py +3 -3
  209. vellum/client/types/document_vellum_value_request.py +3 -3
  210. vellum/client/types/enriched_normalized_completion.py +3 -3
  211. vellum/client/types/environment_display_config.py +19 -0
  212. vellum/client/types/environment_read.py +23 -0
  213. vellum/client/types/ephemeral_prompt_cache_config.py +3 -3
  214. vellum/client/types/error_detail_response.py +22 -0
  215. vellum/client/types/error_input.py +3 -3
  216. vellum/client/types/error_vellum_value.py +3 -3
  217. vellum/client/types/error_vellum_value_request.py +3 -3
  218. vellum/client/types/event_create_response.py +31 -0
  219. vellum/client/types/execute_api_request_bearer_token.py +1 -0
  220. vellum/client/types/execute_api_request_headers_value.py +1 -0
  221. vellum/client/types/execute_api_response.py +6 -6
  222. vellum/client/types/execute_prompt_event.py +3 -2
  223. vellum/client/types/execute_prompt_response.py +1 -0
  224. vellum/client/types/execute_workflow_async_response.py +26 -0
  225. vellum/client/types/execute_workflow_response.py +10 -4
  226. vellum/client/types/execute_workflow_workflow_result_event.py +1 -0
  227. vellum/client/types/execution_array_vellum_value.py +12 -6
  228. vellum/client/types/execution_audio_vellum_value.py +31 -0
  229. vellum/client/types/execution_chat_history_vellum_value.py +3 -3
  230. vellum/client/types/execution_document_vellum_value.py +31 -0
  231. vellum/client/types/execution_error_vellum_value.py +3 -3
  232. vellum/client/types/execution_function_call_vellum_value.py +3 -3
  233. vellum/client/types/execution_image_vellum_value.py +31 -0
  234. vellum/client/types/execution_json_vellum_value.py +3 -3
  235. vellum/client/types/execution_number_vellum_value.py +3 -3
  236. vellum/client/types/execution_search_results_vellum_value.py +3 -3
  237. vellum/client/types/execution_string_vellum_value.py +3 -3
  238. vellum/client/types/execution_thinking_vellum_value.py +31 -0
  239. vellum/client/types/execution_vellum_value.py +16 -5
  240. vellum/client/types/execution_video_vellum_value.py +31 -0
  241. vellum/client/types/external_input_descriptor.py +3 -3
  242. vellum/client/types/external_parent_context.py +38 -0
  243. vellum/client/types/external_test_case_execution.py +10 -4
  244. vellum/client/types/external_test_case_execution_request.py +10 -4
  245. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15.py +23 -0
  246. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15_request.py +23 -0
  247. vellum/client/types/folder_entity.py +5 -2
  248. vellum/client/types/folder_entity_dataset.py +26 -0
  249. vellum/client/types/folder_entity_dataset_data.py +25 -0
  250. vellum/client/types/folder_entity_document_index.py +3 -3
  251. vellum/client/types/folder_entity_document_index_data.py +5 -3
  252. vellum/client/types/folder_entity_folder.py +3 -3
  253. vellum/client/types/folder_entity_folder_data.py +2 -2
  254. vellum/client/types/folder_entity_prompt_sandbox.py +3 -3
  255. vellum/client/types/folder_entity_prompt_sandbox_data.py +4 -3
  256. vellum/client/types/folder_entity_test_suite.py +3 -3
  257. vellum/client/types/folder_entity_test_suite_data.py +3 -3
  258. vellum/client/types/folder_entity_workflow_sandbox.py +3 -3
  259. vellum/client/types/folder_entity_workflow_sandbox_data.py +6 -3
  260. vellum/client/types/fulfilled_ad_hoc_execute_prompt_event.py +4 -4
  261. vellum/client/types/fulfilled_execute_prompt_event.py +4 -4
  262. vellum/client/types/fulfilled_execute_prompt_response.py +3 -3
  263. vellum/client/types/fulfilled_execute_workflow_workflow_result_event.py +11 -5
  264. vellum/client/types/fulfilled_prompt_execution_meta.py +3 -3
  265. vellum/client/types/fulfilled_workflow_node_result_event.py +12 -6
  266. vellum/client/types/function_call.py +2 -2
  267. vellum/client/types/function_call_chat_message_content.py +3 -3
  268. vellum/client/types/function_call_chat_message_content_request.py +3 -3
  269. vellum/client/types/function_call_chat_message_content_value.py +2 -2
  270. vellum/client/types/function_call_chat_message_content_value_request.py +2 -2
  271. vellum/client/types/function_call_input.py +3 -3
  272. vellum/client/types/function_call_prompt_block.py +4 -4
  273. vellum/client/types/function_call_request.py +2 -2
  274. vellum/client/types/function_call_vellum_value.py +3 -3
  275. vellum/client/types/function_call_vellum_value_request.py +3 -3
  276. vellum/client/types/function_definition.py +9 -4
  277. vellum/client/types/generate_options_request.py +3 -3
  278. vellum/client/types/generate_request.py +2 -2
  279. vellum/client/types/generate_response.py +3 -3
  280. vellum/client/types/generate_result.py +3 -3
  281. vellum/client/types/generate_result_data.py +3 -3
  282. vellum/client/types/generate_result_error.py +3 -3
  283. vellum/client/types/generate_stream_response.py +3 -3
  284. vellum/client/types/generate_stream_result.py +4 -4
  285. vellum/client/types/generate_stream_result_data.py +3 -3
  286. vellum/client/types/google_vertex_ai_vectorizer_config.py +2 -2
  287. vellum/client/types/google_vertex_ai_vectorizer_config_request.py +2 -2
  288. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001.py +21 -0
  289. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001_request.py +21 -0
  290. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004.py +3 -3
  291. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004_request.py +3 -3
  292. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002.py +3 -3
  293. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002_request.py +3 -3
  294. vellum/client/types/hkunlp_instructor_xl_vectorizer.py +3 -3
  295. vellum/client/types/hkunlp_instructor_xl_vectorizer_request.py +3 -3
  296. vellum/client/types/image_chat_message_content.py +3 -3
  297. vellum/client/types/image_chat_message_content_request.py +3 -3
  298. vellum/client/types/image_input.py +30 -0
  299. vellum/client/types/image_input_request.py +30 -0
  300. vellum/client/types/image_prompt_block.py +4 -4
  301. vellum/client/types/image_vellum_value.py +3 -3
  302. vellum/client/types/image_vellum_value_request.py +3 -3
  303. vellum/client/types/indexing_config_vectorizer.py +11 -4
  304. vellum/client/types/indexing_config_vectorizer_request.py +11 -4
  305. vellum/client/types/initiated_ad_hoc_execute_prompt_event.py +3 -3
  306. vellum/client/types/initiated_execute_prompt_event.py +3 -3
  307. vellum/client/types/initiated_prompt_execution_meta.py +2 -2
  308. vellum/client/types/initiated_workflow_node_result_event.py +12 -6
  309. vellum/client/types/instructor_vectorizer_config.py +2 -2
  310. vellum/client/types/instructor_vectorizer_config_request.py +2 -2
  311. vellum/client/types/integration.py +27 -0
  312. vellum/client/types/integration_auth_config_integration.py +23 -0
  313. vellum/client/types/integration_auth_config_integration_credential.py +19 -0
  314. vellum/client/types/integration_credential_access_type.py +5 -0
  315. vellum/client/types/integration_name.py +85 -0
  316. vellum/client/types/integration_provider.py +5 -0
  317. vellum/client/types/integration_read.py +30 -0
  318. vellum/client/types/integration_trigger_context.py +39 -0
  319. vellum/client/types/invoked_port.py +2 -2
  320. vellum/client/types/jinja_prompt_block.py +4 -4
  321. vellum/client/types/json_input.py +3 -3
  322. vellum/client/types/json_input_request.py +3 -3
  323. vellum/client/types/json_vellum_value.py +2 -2
  324. vellum/client/types/json_vellum_value_request.py +2 -2
  325. vellum/client/types/logical_operator.py +4 -0
  326. vellum/client/types/map_node_result.py +3 -3
  327. vellum/client/types/map_node_result_data.py +3 -3
  328. vellum/client/types/merge_node_result.py +3 -3
  329. vellum/client/types/merge_node_result_data.py +2 -2
  330. vellum/client/types/metadata_filter_config_request.py +12 -6
  331. vellum/client/types/metadata_filter_rule_request.py +5 -5
  332. vellum/client/types/metadata_filters_request.py +1 -0
  333. vellum/client/types/metric_definition_execution.py +10 -4
  334. vellum/client/types/metric_definition_history_item.py +10 -4
  335. vellum/client/types/metric_definition_input.py +3 -2
  336. vellum/client/types/metric_node_result.py +2 -2
  337. vellum/client/types/ml_model_read.py +6 -3
  338. vellum/client/types/ml_model_usage.py +2 -2
  339. vellum/client/types/ml_model_usage_wrapper.py +3 -3
  340. vellum/client/types/named_scenario_input_audio_variable_value_request.py +22 -0
  341. vellum/client/types/named_scenario_input_chat_history_variable_value_request.py +3 -3
  342. vellum/client/types/named_scenario_input_document_variable_value_request.py +22 -0
  343. vellum/client/types/named_scenario_input_image_variable_value_request.py +22 -0
  344. vellum/client/types/named_scenario_input_json_variable_value_request.py +2 -2
  345. vellum/client/types/named_scenario_input_request.py +11 -2
  346. vellum/client/types/named_scenario_input_string_variable_value_request.py +2 -2
  347. vellum/client/types/named_scenario_input_video_variable_value_request.py +22 -0
  348. vellum/client/types/named_test_case_array_variable_value.py +11 -5
  349. vellum/client/types/named_test_case_array_variable_value_request.py +11 -5
  350. vellum/client/types/named_test_case_audio_variable_value.py +26 -0
  351. vellum/client/types/named_test_case_audio_variable_value_request.py +26 -0
  352. vellum/client/types/named_test_case_chat_history_variable_value.py +3 -3
  353. vellum/client/types/named_test_case_chat_history_variable_value_request.py +3 -3
  354. vellum/client/types/named_test_case_document_variable_value.py +22 -0
  355. vellum/client/types/named_test_case_document_variable_value_request.py +22 -0
  356. vellum/client/types/named_test_case_error_variable_value.py +3 -3
  357. vellum/client/types/named_test_case_error_variable_value_request.py +3 -3
  358. vellum/client/types/named_test_case_function_call_variable_value.py +3 -3
  359. vellum/client/types/named_test_case_function_call_variable_value_request.py +3 -3
  360. vellum/client/types/named_test_case_image_variable_value.py +22 -0
  361. vellum/client/types/named_test_case_image_variable_value_request.py +22 -0
  362. vellum/client/types/named_test_case_json_variable_value.py +2 -2
  363. vellum/client/types/named_test_case_json_variable_value_request.py +2 -2
  364. vellum/client/types/named_test_case_number_variable_value.py +2 -2
  365. vellum/client/types/named_test_case_number_variable_value_request.py +2 -2
  366. vellum/client/types/named_test_case_search_results_variable_value.py +3 -3
  367. vellum/client/types/named_test_case_search_results_variable_value_request.py +3 -3
  368. vellum/client/types/named_test_case_string_variable_value.py +2 -2
  369. vellum/client/types/named_test_case_string_variable_value_request.py +2 -2
  370. vellum/client/types/named_test_case_variable_value.py +14 -5
  371. vellum/client/types/named_test_case_variable_value_request.py +14 -5
  372. vellum/client/types/named_test_case_video_variable_value.py +22 -0
  373. vellum/client/types/named_test_case_video_variable_value_request.py +22 -0
  374. vellum/client/types/node_execution_fulfilled_body.py +4 -4
  375. vellum/client/types/node_execution_fulfilled_event.py +24 -15
  376. vellum/client/types/node_execution_initiated_body.py +3 -3
  377. vellum/client/types/node_execution_initiated_event.py +24 -15
  378. vellum/client/types/node_execution_paused_body.py +3 -3
  379. vellum/client/types/node_execution_paused_event.py +24 -15
  380. vellum/client/types/node_execution_rejected_body.py +5 -4
  381. vellum/client/types/node_execution_rejected_event.py +24 -15
  382. vellum/client/types/node_execution_resumed_body.py +3 -3
  383. vellum/client/types/node_execution_resumed_event.py +24 -15
  384. vellum/client/types/node_execution_span.py +23 -12
  385. vellum/client/types/node_execution_span_attributes.py +4 -2
  386. vellum/client/types/node_execution_streaming_body.py +4 -4
  387. vellum/client/types/node_execution_streaming_event.py +24 -15
  388. vellum/client/types/node_input_compiled_array_value.py +11 -5
  389. vellum/client/types/node_input_compiled_audio_value.py +23 -0
  390. vellum/client/types/node_input_compiled_chat_history_value.py +3 -3
  391. vellum/client/types/node_input_compiled_document_value.py +23 -0
  392. vellum/client/types/node_input_compiled_error_value.py +3 -3
  393. vellum/client/types/node_input_compiled_function_call_value.py +3 -3
  394. vellum/client/types/node_input_compiled_image_value.py +23 -0
  395. vellum/client/types/node_input_compiled_json_value.py +2 -2
  396. vellum/client/types/node_input_compiled_number_value.py +2 -2
  397. vellum/client/types/node_input_compiled_search_results_value.py +3 -3
  398. vellum/client/types/node_input_compiled_secret_value.py +3 -3
  399. vellum/client/types/node_input_compiled_string_value.py +2 -2
  400. vellum/client/types/node_input_compiled_video_value.py +23 -0
  401. vellum/client/types/node_input_variable_compiled_value.py +14 -5
  402. vellum/client/types/node_output_compiled_array_value.py +12 -6
  403. vellum/client/types/node_output_compiled_chat_history_value.py +3 -3
  404. vellum/client/types/node_output_compiled_error_value.py +3 -3
  405. vellum/client/types/node_output_compiled_function_call_value.py +3 -3
  406. vellum/client/types/node_output_compiled_json_value.py +3 -3
  407. vellum/client/types/node_output_compiled_number_value.py +3 -3
  408. vellum/client/types/node_output_compiled_search_results_value.py +3 -3
  409. vellum/client/types/node_output_compiled_string_value.py +3 -3
  410. vellum/client/types/node_output_compiled_thinking_value.py +28 -0
  411. vellum/client/types/node_output_compiled_value.py +8 -5
  412. vellum/client/types/node_parent_context.py +14 -11
  413. vellum/client/types/normalized_log_probs.py +3 -3
  414. vellum/client/types/normalized_token_log_probs.py +2 -2
  415. vellum/client/types/number_input.py +3 -3
  416. vellum/client/types/number_vellum_value.py +2 -2
  417. vellum/client/types/number_vellum_value_request.py +2 -2
  418. vellum/client/types/open_ai_vectorizer_config.py +3 -3
  419. vellum/client/types/open_ai_vectorizer_config_request.py +3 -3
  420. vellum/client/types/open_ai_vectorizer_text_embedding_3_large.py +3 -3
  421. vellum/client/types/open_ai_vectorizer_text_embedding_3_large_request.py +3 -3
  422. vellum/client/types/open_ai_vectorizer_text_embedding_3_small.py +3 -3
  423. vellum/client/types/open_ai_vectorizer_text_embedding_3_small_request.py +3 -3
  424. vellum/client/types/open_ai_vectorizer_text_embedding_ada_002.py +3 -3
  425. vellum/client/types/open_ai_vectorizer_text_embedding_ada_002_request.py +3 -3
  426. vellum/client/types/organization_read.py +6 -3
  427. vellum/client/types/paginated_container_image_read_list.py +3 -3
  428. vellum/client/types/paginated_deployment_release_tag_read_list.py +3 -3
  429. vellum/client/types/paginated_document_index_read_list.py +3 -3
  430. vellum/client/types/paginated_folder_entity_list.py +3 -3
  431. vellum/client/types/paginated_slim_deployment_read_list.py +10 -4
  432. vellum/client/types/paginated_slim_document_list.py +3 -3
  433. vellum/client/types/paginated_slim_integration_auth_config_read_list.py +23 -0
  434. vellum/client/types/paginated_slim_integration_read_list.py +23 -0
  435. vellum/client/types/paginated_slim_tool_definition_list.py +23 -0
  436. vellum/client/types/paginated_slim_workflow_deployment_list.py +10 -4
  437. vellum/client/types/paginated_test_suite_run_execution_list.py +10 -4
  438. vellum/client/types/paginated_test_suite_test_case_list.py +10 -4
  439. vellum/client/types/paginated_workflow_deployment_release_list.py +30 -0
  440. vellum/client/types/paginated_workflow_release_tag_read_list.py +3 -3
  441. vellum/client/types/paginated_workflow_sandbox_example_list.py +3 -3
  442. vellum/client/types/parent_context.py +21 -11
  443. vellum/client/types/pdf_search_result_meta_source.py +2 -2
  444. vellum/client/types/pdf_search_result_meta_source_request.py +2 -2
  445. vellum/client/types/plain_text_prompt_block.py +4 -4
  446. vellum/client/types/price.py +3 -3
  447. vellum/client/types/private_vectorizer.py +23 -0
  448. vellum/client/types/private_vectorizer_request.py +23 -0
  449. vellum/client/types/processing_failure_reason_enum.py +3 -1
  450. vellum/client/types/prompt_block.py +9 -6
  451. vellum/client/types/prompt_deployment_expand_meta_request.py +2 -2
  452. vellum/client/types/prompt_deployment_input_request.py +16 -3
  453. vellum/client/types/prompt_deployment_parent_context.py +13 -10
  454. vellum/client/types/prompt_deployment_release.py +6 -6
  455. vellum/client/types/prompt_deployment_release_prompt_deployment.py +2 -2
  456. vellum/client/types/prompt_deployment_release_prompt_version.py +4 -4
  457. vellum/client/types/prompt_exec_config.py +15 -9
  458. vellum/client/types/prompt_execution_meta.py +3 -3
  459. vellum/client/types/prompt_node_execution_meta.py +3 -3
  460. vellum/client/types/prompt_node_result.py +3 -3
  461. vellum/client/types/prompt_node_result_data.py +3 -3
  462. vellum/client/types/prompt_output.py +7 -3
  463. vellum/client/types/prompt_parameters.py +2 -2
  464. vellum/client/types/prompt_push_response.py +2 -2
  465. vellum/client/types/prompt_request_audio_input.py +26 -0
  466. vellum/client/types/prompt_request_chat_history_input.py +3 -3
  467. vellum/client/types/prompt_request_document_input.py +26 -0
  468. vellum/client/types/prompt_request_image_input.py +26 -0
  469. vellum/client/types/prompt_request_input.py +16 -3
  470. vellum/client/types/prompt_request_json_input.py +3 -3
  471. vellum/client/types/prompt_request_string_input.py +3 -3
  472. vellum/client/types/prompt_request_video_input.py +26 -0
  473. vellum/client/types/prompt_settings.py +2 -2
  474. vellum/client/types/prompt_version_build_config_sandbox.py +2 -2
  475. vellum/client/types/raw_prompt_execution_overrides_request.py +2 -2
  476. vellum/client/types/reducto_chunker_config.py +2 -2
  477. vellum/client/types/reducto_chunker_config_request.py +2 -2
  478. vellum/client/types/reducto_chunking.py +3 -3
  479. vellum/client/types/reducto_chunking_request.py +3 -3
  480. vellum/client/types/rejected_ad_hoc_execute_prompt_event.py +4 -4
  481. vellum/client/types/rejected_execute_prompt_event.py +4 -4
  482. vellum/client/types/rejected_execute_prompt_response.py +3 -3
  483. vellum/client/types/rejected_execute_workflow_workflow_result_event.py +4 -4
  484. vellum/client/types/rejected_prompt_execution_meta.py +3 -3
  485. vellum/client/types/rejected_workflow_node_result_event.py +12 -6
  486. vellum/client/types/release_created_by.py +2 -2
  487. vellum/client/types/release_environment.py +2 -2
  488. vellum/client/types/release_release_tag.py +3 -3
  489. vellum/client/types/release_review_reviewer.py +2 -2
  490. vellum/client/types/release_tag_release.py +2 -2
  491. vellum/client/types/replace_test_suite_test_case_request.py +9 -3
  492. vellum/client/types/rich_text_child_block.py +2 -1
  493. vellum/client/types/rich_text_prompt_block.py +4 -4
  494. vellum/client/types/sandbox_scenario.py +3 -3
  495. vellum/client/types/scenario_input.py +14 -3
  496. vellum/client/types/scenario_input_audio_variable_value.py +22 -0
  497. vellum/client/types/scenario_input_chat_history_variable_value.py +3 -3
  498. vellum/client/types/scenario_input_document_variable_value.py +22 -0
  499. vellum/client/types/scenario_input_image_variable_value.py +22 -0
  500. vellum/client/types/scenario_input_json_variable_value.py +2 -2
  501. vellum/client/types/scenario_input_string_variable_value.py +2 -2
  502. vellum/client/types/scenario_input_video_variable_value.py +22 -0
  503. vellum/client/types/scheduled_trigger_context.py +39 -0
  504. vellum/client/types/search_filters_request.py +11 -5
  505. vellum/client/types/search_node_result.py +3 -3
  506. vellum/client/types/search_node_result_data.py +3 -3
  507. vellum/client/types/search_request_options_request.py +13 -7
  508. vellum/client/types/search_response.py +3 -3
  509. vellum/client/types/search_result.py +3 -3
  510. vellum/client/types/search_result_document.py +2 -2
  511. vellum/client/types/search_result_document_request.py +2 -2
  512. vellum/client/types/search_result_merging_request.py +2 -2
  513. vellum/client/types/search_result_meta.py +3 -3
  514. vellum/client/types/search_result_meta_request.py +3 -3
  515. vellum/client/types/search_result_request.py +3 -3
  516. vellum/client/types/search_results_input.py +3 -3
  517. vellum/client/types/search_results_vellum_value.py +3 -3
  518. vellum/client/types/search_results_vellum_value_request.py +3 -3
  519. vellum/client/types/search_weights_request.py +2 -2
  520. vellum/client/types/secret_type_enum.py +3 -1
  521. vellum/client/types/sentence_chunker_config.py +2 -2
  522. vellum/client/types/sentence_chunker_config_request.py +2 -2
  523. vellum/client/types/sentence_chunking.py +3 -3
  524. vellum/client/types/sentence_chunking_request.py +3 -3
  525. vellum/client/types/slim_composio_tool_definition.py +24 -0
  526. vellum/client/types/slim_deployment_read.py +15 -9
  527. vellum/client/types/slim_document.py +6 -5
  528. vellum/client/types/slim_document_document_to_document_index.py +4 -4
  529. vellum/client/types/slim_integration_auth_config_read.py +36 -0
  530. vellum/client/types/slim_integration_read.py +25 -0
  531. vellum/client/types/slim_release_review.py +4 -4
  532. vellum/client/types/slim_workflow_deployment.py +16 -10
  533. vellum/client/types/slim_workflow_execution_read.py +24 -15
  534. vellum/client/types/span_link.py +15 -12
  535. vellum/client/types/span_link_type_enum.py +1 -1
  536. vellum/client/types/streaming_ad_hoc_execute_prompt_event.py +4 -4
  537. vellum/client/types/streaming_execute_prompt_event.py +3 -3
  538. vellum/client/types/streaming_prompt_execution_meta.py +2 -2
  539. vellum/client/types/streaming_workflow_node_result_event.py +12 -6
  540. vellum/client/types/string_chat_message_content.py +2 -2
  541. vellum/client/types/string_chat_message_content_request.py +2 -2
  542. vellum/client/types/string_input.py +3 -3
  543. vellum/client/types/string_input_request.py +3 -3
  544. vellum/client/types/string_vellum_value.py +2 -2
  545. vellum/client/types/string_vellum_value_request.py +2 -2
  546. vellum/client/types/submit_completion_actual_request.py +3 -3
  547. vellum/client/types/submit_workflow_execution_actual_request.py +3 -2
  548. vellum/client/types/subworkflow_node_result.py +3 -3
  549. vellum/client/types/subworkflow_node_result_data.py +2 -2
  550. vellum/client/types/templating_node_array_result.py +11 -5
  551. vellum/client/types/templating_node_chat_history_result.py +3 -3
  552. vellum/client/types/templating_node_error_result.py +3 -3
  553. vellum/client/types/templating_node_function_call_result.py +3 -3
  554. vellum/client/types/templating_node_json_result.py +2 -2
  555. vellum/client/types/templating_node_number_result.py +2 -2
  556. vellum/client/types/templating_node_result.py +10 -4
  557. vellum/client/types/templating_node_result_data.py +10 -4
  558. vellum/client/types/templating_node_result_output.py +6 -5
  559. vellum/client/types/templating_node_search_results_result.py +3 -3
  560. vellum/client/types/templating_node_string_result.py +2 -2
  561. vellum/client/types/terminal_node_array_result.py +11 -5
  562. vellum/client/types/terminal_node_chat_history_result.py +2 -2
  563. vellum/client/types/terminal_node_error_result.py +2 -2
  564. vellum/client/types/terminal_node_function_call_result.py +2 -2
  565. vellum/client/types/terminal_node_json_result.py +2 -2
  566. vellum/client/types/terminal_node_number_result.py +2 -2
  567. vellum/client/types/terminal_node_result.py +10 -4
  568. vellum/client/types/terminal_node_result_data.py +10 -4
  569. vellum/client/types/terminal_node_result_output.py +6 -5
  570. vellum/client/types/terminal_node_search_results_result.py +2 -2
  571. vellum/client/types/terminal_node_string_result.py +2 -2
  572. vellum/client/types/test_case_array_variable_value.py +11 -5
  573. vellum/client/types/test_case_audio_variable_value.py +27 -0
  574. vellum/client/types/test_case_chat_history_variable_value.py +3 -3
  575. vellum/client/types/test_case_document_variable_value.py +27 -0
  576. vellum/client/types/test_case_error_variable_value.py +3 -3
  577. vellum/client/types/test_case_function_call_variable_value.py +3 -3
  578. vellum/client/types/test_case_image_variable_value.py +27 -0
  579. vellum/client/types/test_case_json_variable_value.py +2 -2
  580. vellum/client/types/test_case_number_variable_value.py +2 -2
  581. vellum/client/types/test_case_search_results_variable_value.py +3 -3
  582. vellum/client/types/test_case_string_variable_value.py +2 -2
  583. vellum/client/types/test_case_variable_value.py +14 -5
  584. vellum/client/types/test_case_video_variable_value.py +27 -0
  585. vellum/client/types/test_suite_run_deployment_release_tag_exec_config.py +3 -3
  586. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data.py +3 -3
  587. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data_request.py +3 -3
  588. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_request.py +3 -3
  589. vellum/client/types/test_suite_run_exec_config.py +2 -1
  590. vellum/client/types/test_suite_run_exec_config_request.py +2 -1
  591. vellum/client/types/test_suite_run_execution.py +11 -5
  592. vellum/client/types/test_suite_run_execution_array_output.py +11 -5
  593. vellum/client/types/test_suite_run_execution_chat_history_output.py +3 -3
  594. vellum/client/types/test_suite_run_execution_error_output.py +3 -3
  595. vellum/client/types/test_suite_run_execution_function_call_output.py +3 -3
  596. vellum/client/types/test_suite_run_execution_json_output.py +2 -2
  597. vellum/client/types/test_suite_run_execution_metric_definition.py +2 -2
  598. vellum/client/types/test_suite_run_execution_metric_result.py +11 -5
  599. vellum/client/types/test_suite_run_execution_number_output.py +2 -2
  600. vellum/client/types/test_suite_run_execution_output.py +6 -5
  601. vellum/client/types/test_suite_run_execution_search_results_output.py +3 -3
  602. vellum/client/types/test_suite_run_execution_string_output.py +2 -2
  603. vellum/client/types/test_suite_run_external_exec_config.py +10 -4
  604. vellum/client/types/test_suite_run_external_exec_config_data.py +10 -4
  605. vellum/client/types/test_suite_run_external_exec_config_data_request.py +10 -4
  606. vellum/client/types/test_suite_run_external_exec_config_request.py +10 -4
  607. vellum/client/types/test_suite_run_metric_array_output.py +11 -5
  608. vellum/client/types/test_suite_run_metric_error_output.py +3 -3
  609. vellum/client/types/test_suite_run_metric_json_output.py +2 -2
  610. vellum/client/types/test_suite_run_metric_number_output.py +2 -2
  611. vellum/client/types/test_suite_run_metric_output.py +5 -4
  612. vellum/client/types/test_suite_run_metric_string_output.py +2 -2
  613. vellum/client/types/test_suite_run_progress.py +2 -2
  614. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_data_request.py +3 -3
  615. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_request.py +3 -3
  616. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py +3 -3
  617. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py +3 -3
  618. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py +3 -3
  619. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py +3 -3
  620. vellum/client/types/test_suite_run_read.py +12 -6
  621. vellum/client/types/test_suite_run_test_suite.py +2 -2
  622. vellum/client/types/test_suite_run_workflow_release_tag_exec_config.py +3 -3
  623. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data.py +3 -3
  624. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data_request.py +3 -3
  625. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_request.py +3 -3
  626. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_data_request.py +3 -3
  627. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_request.py +3 -3
  628. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config.py +3 -3
  629. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data.py +3 -3
  630. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data_request.py +3 -3
  631. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_request.py +3 -3
  632. vellum/client/types/test_suite_test_case.py +10 -4
  633. vellum/client/types/test_suite_test_case_bulk_operation_request.py +2 -1
  634. vellum/client/types/test_suite_test_case_bulk_result.py +2 -1
  635. vellum/client/types/test_suite_test_case_create_bulk_operation_request.py +10 -4
  636. vellum/client/types/test_suite_test_case_created_bulk_result.py +3 -3
  637. vellum/client/types/test_suite_test_case_created_bulk_result_data.py +2 -2
  638. vellum/client/types/test_suite_test_case_delete_bulk_operation_data_request.py +2 -2
  639. vellum/client/types/test_suite_test_case_delete_bulk_operation_request.py +3 -3
  640. vellum/client/types/test_suite_test_case_deleted_bulk_result.py +3 -3
  641. vellum/client/types/test_suite_test_case_deleted_bulk_result_data.py +2 -2
  642. vellum/client/types/test_suite_test_case_rejected_bulk_result.py +2 -2
  643. vellum/client/types/test_suite_test_case_replace_bulk_operation_request.py +10 -4
  644. vellum/client/types/test_suite_test_case_replaced_bulk_result.py +3 -3
  645. vellum/client/types/test_suite_test_case_replaced_bulk_result_data.py +2 -2
  646. vellum/client/types/test_suite_test_case_upsert_bulk_operation_request.py +10 -4
  647. vellum/client/types/thinking_vellum_value.py +25 -0
  648. vellum/client/types/thinking_vellum_value_request.py +25 -0
  649. vellum/client/types/token_overlapping_window_chunker_config.py +2 -2
  650. vellum/client/types/token_overlapping_window_chunker_config_request.py +2 -2
  651. vellum/client/types/token_overlapping_window_chunking.py +3 -3
  652. vellum/client/types/token_overlapping_window_chunking_request.py +3 -3
  653. vellum/client/types/update_active_workspace_response.py +32 -0
  654. vellum/client/types/upload_document_response.py +3 -3
  655. vellum/client/types/uploaded_file_read.py +27 -0
  656. vellum/client/types/upsert_test_suite_test_case_request.py +9 -3
  657. vellum/client/types/variable_prompt_block.py +11 -4
  658. vellum/client/types/vellum_audio.py +5 -4
  659. vellum/client/types/vellum_audio_request.py +3 -3
  660. vellum/client/types/vellum_code_resource_definition.py +7 -2
  661. vellum/client/types/vellum_document.py +9 -4
  662. vellum/client/types/vellum_document_request.py +7 -3
  663. vellum/client/types/vellum_error.py +5 -4
  664. vellum/client/types/vellum_error_code_enum.py +6 -0
  665. vellum/client/types/vellum_error_request.py +5 -4
  666. vellum/client/types/vellum_image.py +9 -4
  667. vellum/client/types/vellum_image_request.py +7 -3
  668. vellum/client/types/vellum_node_execution_event.py +4 -3
  669. vellum/client/types/vellum_sdk_error.py +4 -3
  670. vellum/client/types/vellum_sdk_error_code_enum.py +5 -0
  671. vellum/client/types/vellum_secret.py +2 -2
  672. vellum/client/types/vellum_span.py +2 -1
  673. vellum/client/types/vellum_value.py +13 -8
  674. vellum/client/types/vellum_value_logical_condition_group_request.py +6 -6
  675. vellum/client/types/vellum_value_logical_condition_request.py +13 -7
  676. vellum/client/types/vellum_value_logical_expression_request.py +2 -1
  677. vellum/client/types/vellum_value_request.py +13 -8
  678. vellum/client/types/vellum_variable.py +13 -7
  679. vellum/client/types/vellum_variable_extensions.py +3 -2
  680. vellum/client/types/vellum_variable_type.py +3 -1
  681. vellum/client/types/vellum_video.py +25 -0
  682. vellum/client/types/vellum_video_request.py +24 -0
  683. vellum/client/types/vellum_workflow_execution_event.py +4 -3
  684. vellum/client/types/video_chat_message_content.py +25 -0
  685. vellum/client/types/video_chat_message_content_request.py +25 -0
  686. vellum/client/types/video_input.py +30 -0
  687. vellum/client/types/video_input_request.py +30 -0
  688. vellum/client/types/video_prompt_block.py +29 -0
  689. vellum/client/types/video_vellum_value.py +25 -0
  690. vellum/client/types/video_vellum_value_request.py +25 -0
  691. vellum/client/types/workflow_deployment_display_data.py +27 -0
  692. vellum/client/types/workflow_deployment_event_executions_response.py +20 -11
  693. vellum/client/types/workflow_deployment_history_item.py +10 -4
  694. vellum/client/types/workflow_deployment_parent_context.py +13 -10
  695. vellum/client/types/workflow_deployment_read.py +22 -10
  696. vellum/client/types/workflow_deployment_release.py +13 -7
  697. vellum/client/types/workflow_deployment_release_workflow_deployment.py +2 -2
  698. vellum/client/types/workflow_deployment_release_workflow_version.py +10 -4
  699. vellum/client/types/workflow_display_icon.py +24 -0
  700. vellum/client/types/workflow_error.py +1 -0
  701. vellum/client/types/workflow_event.py +37 -0
  702. vellum/client/types/workflow_event_error.py +5 -3
  703. vellum/client/types/workflow_event_execution_read.py +26 -16
  704. vellum/client/types/workflow_execution_actual.py +11 -5
  705. vellum/client/types/workflow_execution_actual_chat_history_request.py +2 -2
  706. vellum/client/types/workflow_execution_actual_json_request.py +2 -2
  707. vellum/client/types/workflow_execution_actual_string_request.py +2 -2
  708. vellum/client/types/workflow_execution_detail.py +51 -0
  709. vellum/client/types/workflow_execution_event_error_code.py +5 -0
  710. vellum/client/types/workflow_execution_fulfilled_body.py +5 -3
  711. vellum/client/types/workflow_execution_fulfilled_event.py +24 -15
  712. vellum/client/types/workflow_execution_initiated_body.py +3 -3
  713. vellum/client/types/workflow_execution_initiated_event.py +24 -15
  714. vellum/client/types/workflow_execution_node_result_event.py +10 -4
  715. vellum/client/types/workflow_execution_paused_body.py +4 -4
  716. vellum/client/types/workflow_execution_paused_event.py +24 -15
  717. vellum/client/types/workflow_execution_rejected_body.py +5 -4
  718. vellum/client/types/workflow_execution_rejected_event.py +24 -15
  719. vellum/client/types/workflow_execution_resumed_body.py +3 -3
  720. vellum/client/types/workflow_execution_resumed_event.py +24 -15
  721. vellum/client/types/workflow_execution_snapshotted_body.py +4 -3
  722. vellum/client/types/workflow_execution_snapshotted_event.py +24 -15
  723. vellum/client/types/workflow_execution_span.py +22 -11
  724. vellum/client/types/workflow_execution_span_attributes.py +3 -2
  725. vellum/client/types/workflow_execution_streaming_body.py +4 -4
  726. vellum/client/types/workflow_execution_streaming_event.py +24 -15
  727. vellum/client/types/workflow_execution_usage_calculation_error.py +3 -3
  728. vellum/client/types/workflow_execution_usage_calculation_fulfilled_body.py +22 -0
  729. vellum/client/types/workflow_execution_usage_result.py +3 -3
  730. vellum/client/types/workflow_execution_view_online_eval_metric_result.py +10 -4
  731. vellum/client/types/workflow_execution_workflow_result_event.py +10 -4
  732. vellum/client/types/workflow_expand_meta_request.py +2 -2
  733. vellum/client/types/workflow_initialization_error.py +2 -2
  734. vellum/client/types/workflow_input.py +31 -0
  735. vellum/client/types/workflow_node_result_data.py +8 -7
  736. vellum/client/types/workflow_node_result_event.py +3 -2
  737. vellum/client/types/workflow_output.py +12 -5
  738. vellum/client/types/workflow_output_array.py +12 -6
  739. vellum/client/types/workflow_output_audio.py +31 -0
  740. vellum/client/types/workflow_output_chat_history.py +3 -3
  741. vellum/client/types/workflow_output_document.py +31 -0
  742. vellum/client/types/workflow_output_error.py +3 -3
  743. vellum/client/types/workflow_output_function_call.py +3 -3
  744. vellum/client/types/workflow_output_image.py +3 -3
  745. vellum/client/types/workflow_output_json.py +3 -3
  746. vellum/client/types/workflow_output_number.py +3 -3
  747. vellum/client/types/workflow_output_search_results.py +3 -3
  748. vellum/client/types/workflow_output_string.py +3 -3
  749. vellum/client/types/workflow_output_video.py +31 -0
  750. vellum/client/types/workflow_parent_context.py +14 -11
  751. vellum/client/types/workflow_push_deployment_config_request.py +3 -2
  752. vellum/client/types/workflow_push_response.py +2 -2
  753. vellum/client/types/workflow_release_tag_read.py +4 -4
  754. vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py +2 -2
  755. vellum/client/types/workflow_request_audio_input_request.py +30 -0
  756. vellum/client/types/workflow_request_chat_history_input_request.py +3 -3
  757. vellum/client/types/workflow_request_document_input_request.py +30 -0
  758. vellum/client/types/workflow_request_image_input_request.py +30 -0
  759. vellum/client/types/workflow_request_input_request.py +11 -2
  760. vellum/client/types/workflow_request_json_input_request.py +3 -3
  761. vellum/client/types/workflow_request_number_input_request.py +3 -3
  762. vellum/client/types/workflow_request_string_input_request.py +3 -3
  763. vellum/client/types/workflow_request_video_input_request.py +30 -0
  764. vellum/client/types/workflow_resolved_state.py +31 -0
  765. vellum/client/types/workflow_result_event.py +14 -8
  766. vellum/client/types/workflow_result_event_output_data.py +7 -6
  767. vellum/client/types/workflow_result_event_output_data_array.py +12 -6
  768. vellum/client/types/workflow_result_event_output_data_chat_history.py +3 -3
  769. vellum/client/types/workflow_result_event_output_data_error.py +3 -3
  770. vellum/client/types/workflow_result_event_output_data_function_call.py +3 -3
  771. vellum/client/types/workflow_result_event_output_data_json.py +3 -3
  772. vellum/client/types/workflow_result_event_output_data_number.py +3 -3
  773. vellum/client/types/workflow_result_event_output_data_search_results.py +3 -3
  774. vellum/client/types/workflow_result_event_output_data_string.py +3 -3
  775. vellum/client/types/workflow_result_event_state.py +7 -0
  776. vellum/client/types/workflow_sandbox_display_data.py +27 -0
  777. vellum/client/types/workflow_sandbox_example.py +4 -2
  778. vellum/client/types/workflow_sandbox_parent_context.py +13 -10
  779. vellum/client/types/workflow_stream_event.py +2 -1
  780. vellum/client/types/workspace_display_config.py +19 -0
  781. vellum/client/types/workspace_read.py +5 -3
  782. vellum/client/types/workspace_secret_read.py +3 -3
  783. vellum/client/utils.py +24 -0
  784. vellum/core/force_multipart.py +3 -0
  785. vellum/core/http_response.py +3 -0
  786. vellum/errors/misdirected_request_error.py +3 -0
  787. vellum/errors/too_many_requests_error.py +3 -0
  788. vellum/errors/unauthorized_error.py +3 -0
  789. vellum/evaluations/resources.py +5 -5
  790. vellum/plugins/pydantic.py +14 -3
  791. vellum/plugins/tests/__init__.py +0 -0
  792. vellum/plugins/tests/test_pydantic.py +30 -0
  793. vellum/plugins/vellum_mypy.py +31 -23
  794. vellum/prompts/__init__.py +3 -0
  795. vellum/prompts/blocks/__init__.py +3 -0
  796. vellum/prompts/blocks/compilation.py +29 -11
  797. vellum/prompts/blocks/helpers.py +31 -0
  798. vellum/prompts/blocks/tests/test_compilation.py +64 -0
  799. vellum/raw_client.py +3 -0
  800. vellum/resources/ad_hoc/raw_client.py +3 -0
  801. vellum/resources/container_images/raw_client.py +3 -0
  802. vellum/resources/deployments/raw_client.py +3 -0
  803. vellum/resources/document_indexes/raw_client.py +3 -0
  804. vellum/resources/documents/raw_client.py +3 -0
  805. vellum/resources/{release_reviews → environments}/__init__.py +1 -1
  806. vellum/resources/{release_reviews → environments}/client.py +1 -1
  807. vellum/resources/environments/raw_client.py +3 -0
  808. vellum/resources/events/__init__.py +3 -0
  809. vellum/resources/events/client.py +3 -0
  810. vellum/resources/events/raw_client.py +3 -0
  811. vellum/resources/folder_entities/raw_client.py +3 -0
  812. vellum/resources/integration_auth_configs/__init__.py +3 -0
  813. vellum/resources/integration_auth_configs/client.py +3 -0
  814. vellum/resources/integration_auth_configs/raw_client.py +3 -0
  815. vellum/resources/integration_providers/__init__.py +3 -0
  816. vellum/resources/integration_providers/client.py +3 -0
  817. vellum/resources/integration_providers/raw_client.py +3 -0
  818. vellum/resources/integrations/__init__.py +3 -0
  819. vellum/resources/integrations/client.py +3 -0
  820. vellum/resources/integrations/raw_client.py +3 -0
  821. vellum/resources/metric_definitions/raw_client.py +3 -0
  822. vellum/resources/ml_models/raw_client.py +3 -0
  823. vellum/resources/organizations/raw_client.py +3 -0
  824. vellum/resources/prompts/raw_client.py +3 -0
  825. vellum/resources/sandboxes/raw_client.py +3 -0
  826. vellum/resources/test_suite_runs/raw_client.py +3 -0
  827. vellum/resources/test_suites/raw_client.py +3 -0
  828. vellum/resources/uploaded_files/__init__.py +3 -0
  829. vellum/resources/uploaded_files/client.py +3 -0
  830. vellum/resources/uploaded_files/raw_client.py +3 -0
  831. vellum/resources/workflow_deployments/raw_client.py +3 -0
  832. vellum/resources/workflow_executions/__init__.py +3 -0
  833. vellum/resources/workflow_executions/client.py +3 -0
  834. vellum/resources/workflow_executions/raw_client.py +3 -0
  835. vellum/resources/workflow_sandboxes/raw_client.py +3 -0
  836. vellum/resources/workflows/raw_client.py +3 -0
  837. vellum/resources/workspace_secrets/raw_client.py +3 -0
  838. vellum/resources/workspaces/raw_client.py +3 -0
  839. vellum/types/api_actor_type_enum.py +3 -0
  840. vellum/types/audio_input.py +3 -0
  841. vellum/types/audio_input_request.py +3 -0
  842. vellum/types/auth_type_enum.py +3 -0
  843. vellum/types/build_status_enum.py +3 -0
  844. vellum/types/components_schemas_composio_execute_tool_request.py +3 -0
  845. vellum/types/components_schemas_composio_execute_tool_response.py +3 -0
  846. vellum/types/components_schemas_composio_integration_exec_config.py +3 -0
  847. vellum/types/components_schemas_composio_tool_definition.py +3 -0
  848. vellum/types/components_schemas_slim_composio_tool_definition.py +3 -0
  849. vellum/types/composio_execute_tool_request.py +3 -0
  850. vellum/types/composio_execute_tool_response.py +3 -0
  851. vellum/types/composio_integration_exec_config.py +3 -0
  852. vellum/types/composio_tool_definition.py +3 -0
  853. vellum/types/container_image_build_config.py +3 -0
  854. vellum/types/create_workflow_event_request.py +3 -0
  855. vellum/types/dataset_row_push_request.py +3 -0
  856. vellum/types/delimiter_chunker_config.py +3 -0
  857. vellum/types/delimiter_chunker_config_request.py +3 -0
  858. vellum/types/delimiter_chunking.py +3 -0
  859. vellum/types/delimiter_chunking_request.py +3 -0
  860. vellum/types/deprecated_prompt_request_input.py +3 -0
  861. vellum/types/document_input.py +3 -0
  862. vellum/types/document_input_request.py +3 -0
  863. vellum/types/environment_display_config.py +3 -0
  864. vellum/types/environment_read.py +3 -0
  865. vellum/types/error_detail_response.py +3 -0
  866. vellum/types/event_create_response.py +3 -0
  867. vellum/types/execute_workflow_async_response.py +3 -0
  868. vellum/types/execution_audio_vellum_value.py +3 -0
  869. vellum/types/execution_document_vellum_value.py +3 -0
  870. vellum/types/execution_image_vellum_value.py +3 -0
  871. vellum/types/execution_thinking_vellum_value.py +3 -0
  872. vellum/types/execution_video_vellum_value.py +3 -0
  873. vellum/types/external_parent_context.py +3 -0
  874. vellum/types/fast_embed_vectorizer_baai_bge_small_en_v_15.py +3 -0
  875. vellum/types/fast_embed_vectorizer_baai_bge_small_en_v_15_request.py +3 -0
  876. vellum/types/folder_entity_dataset.py +3 -0
  877. vellum/types/folder_entity_dataset_data.py +3 -0
  878. vellum/types/google_vertex_ai_vectorizer_gemini_embedding_001.py +3 -0
  879. vellum/types/google_vertex_ai_vectorizer_gemini_embedding_001_request.py +3 -0
  880. vellum/types/image_input.py +3 -0
  881. vellum/types/image_input_request.py +3 -0
  882. vellum/types/integration.py +3 -0
  883. vellum/types/integration_auth_config_integration.py +3 -0
  884. vellum/types/integration_auth_config_integration_credential.py +3 -0
  885. vellum/types/integration_credential_access_type.py +3 -0
  886. vellum/types/integration_name.py +3 -0
  887. vellum/types/integration_provider.py +3 -0
  888. vellum/types/integration_read.py +3 -0
  889. vellum/types/integration_trigger_context.py +3 -0
  890. vellum/types/named_scenario_input_audio_variable_value_request.py +3 -0
  891. vellum/types/named_scenario_input_document_variable_value_request.py +3 -0
  892. vellum/types/named_scenario_input_image_variable_value_request.py +3 -0
  893. vellum/types/named_scenario_input_video_variable_value_request.py +3 -0
  894. vellum/types/named_test_case_audio_variable_value.py +3 -0
  895. vellum/types/named_test_case_audio_variable_value_request.py +3 -0
  896. vellum/types/named_test_case_document_variable_value.py +3 -0
  897. vellum/types/named_test_case_document_variable_value_request.py +3 -0
  898. vellum/types/named_test_case_image_variable_value.py +3 -0
  899. vellum/types/named_test_case_image_variable_value_request.py +3 -0
  900. vellum/types/named_test_case_video_variable_value.py +3 -0
  901. vellum/types/named_test_case_video_variable_value_request.py +3 -0
  902. vellum/types/node_input_compiled_audio_value.py +3 -0
  903. vellum/types/node_input_compiled_document_value.py +3 -0
  904. vellum/types/node_input_compiled_image_value.py +3 -0
  905. vellum/types/node_input_compiled_video_value.py +3 -0
  906. vellum/types/node_output_compiled_thinking_value.py +3 -0
  907. vellum/types/paginated_slim_integration_auth_config_read_list.py +3 -0
  908. vellum/types/paginated_slim_integration_read_list.py +3 -0
  909. vellum/types/paginated_slim_tool_definition_list.py +3 -0
  910. vellum/types/paginated_workflow_deployment_release_list.py +3 -0
  911. vellum/types/private_vectorizer.py +3 -0
  912. vellum/types/private_vectorizer_request.py +3 -0
  913. vellum/types/prompt_request_audio_input.py +3 -0
  914. vellum/types/prompt_request_document_input.py +3 -0
  915. vellum/types/prompt_request_image_input.py +3 -0
  916. vellum/types/prompt_request_video_input.py +3 -0
  917. vellum/types/scenario_input_audio_variable_value.py +3 -0
  918. vellum/types/scenario_input_document_variable_value.py +3 -0
  919. vellum/types/scenario_input_image_variable_value.py +3 -0
  920. vellum/types/scenario_input_video_variable_value.py +3 -0
  921. vellum/types/scheduled_trigger_context.py +3 -0
  922. vellum/types/slim_composio_tool_definition.py +3 -0
  923. vellum/types/slim_integration_auth_config_read.py +3 -0
  924. vellum/types/slim_integration_read.py +3 -0
  925. vellum/types/test_case_audio_variable_value.py +3 -0
  926. vellum/types/test_case_document_variable_value.py +3 -0
  927. vellum/types/test_case_image_variable_value.py +3 -0
  928. vellum/types/test_case_video_variable_value.py +3 -0
  929. vellum/types/thinking_vellum_value.py +3 -0
  930. vellum/types/thinking_vellum_value_request.py +3 -0
  931. vellum/types/update_active_workspace_response.py +3 -0
  932. vellum/types/uploaded_file_read.py +3 -0
  933. vellum/types/vellum_video.py +3 -0
  934. vellum/types/vellum_video_request.py +3 -0
  935. vellum/types/video_chat_message_content.py +3 -0
  936. vellum/types/video_chat_message_content_request.py +3 -0
  937. vellum/types/video_input.py +3 -0
  938. vellum/types/video_input_request.py +3 -0
  939. vellum/types/video_prompt_block.py +3 -0
  940. vellum/types/video_vellum_value.py +3 -0
  941. vellum/types/video_vellum_value_request.py +3 -0
  942. vellum/types/workflow_deployment_display_data.py +3 -0
  943. vellum/types/workflow_display_icon.py +3 -0
  944. vellum/types/workflow_event.py +3 -0
  945. vellum/types/workflow_execution_detail.py +3 -0
  946. vellum/types/workflow_execution_usage_calculation_fulfilled_body.py +3 -0
  947. vellum/types/workflow_input.py +3 -0
  948. vellum/types/workflow_output_audio.py +3 -0
  949. vellum/types/workflow_output_document.py +3 -0
  950. vellum/types/workflow_output_video.py +3 -0
  951. vellum/types/workflow_request_audio_input_request.py +3 -0
  952. vellum/types/workflow_request_document_input_request.py +3 -0
  953. vellum/types/workflow_request_image_input_request.py +3 -0
  954. vellum/types/workflow_request_video_input_request.py +3 -0
  955. vellum/types/workflow_resolved_state.py +3 -0
  956. vellum/types/workflow_result_event_state.py +3 -0
  957. vellum/types/workflow_sandbox_display_data.py +3 -0
  958. vellum/types/workspace_display_config.py +3 -0
  959. vellum/utils/files/__init__.py +18 -0
  960. vellum/utils/files/constants.py +47 -0
  961. vellum/utils/files/exceptions.py +25 -0
  962. vellum/utils/files/extensions.py +59 -0
  963. vellum/utils/files/mixin.py +109 -0
  964. vellum/utils/files/read.py +41 -0
  965. vellum/utils/files/stream.py +135 -0
  966. vellum/utils/files/tests/__init__.py +0 -0
  967. vellum/utils/files/tests/test_extensions.py +54 -0
  968. vellum/utils/files/tests/test_mixin.py +205 -0
  969. vellum/utils/files/tests/test_read.py +204 -0
  970. vellum/utils/files/tests/test_stream.py +199 -0
  971. vellum/utils/files/tests/test_upload.py +309 -0
  972. vellum/utils/files/tests/test_urls.py +252 -0
  973. vellum/utils/files/types.py +8 -0
  974. vellum/utils/files/upload.py +151 -0
  975. vellum/utils/files/urls.py +71 -0
  976. vellum/utils/json_encoder.py +95 -0
  977. vellum/utils/templating/custom_filters.py +4 -4
  978. vellum/utils/templating/render.py +4 -4
  979. vellum/utils/tests/__init__.py +0 -0
  980. vellum/utils/tests/test_json_encoder.py +92 -0
  981. vellum/utils/vellum_client.py +40 -0
  982. vellum/workflows/__init__.py +78 -0
  983. vellum/workflows/constants.py +7 -0
  984. vellum/workflows/context.py +27 -9
  985. vellum/workflows/descriptors/base.py +83 -2
  986. vellum/workflows/descriptors/exceptions.py +18 -1
  987. vellum/workflows/descriptors/tests/test_utils.py +57 -0
  988. vellum/workflows/descriptors/utils.py +27 -3
  989. vellum/workflows/edges/__init__.py +2 -0
  990. vellum/workflows/edges/trigger_edge.py +67 -0
  991. vellum/workflows/emitters/__init__.py +2 -0
  992. vellum/workflows/emitters/base.py +25 -0
  993. vellum/workflows/emitters/vellum_emitter.py +150 -0
  994. vellum/workflows/environment/__init__.py +2 -1
  995. vellum/workflows/environment/environment.py +10 -3
  996. vellum/workflows/errors/types.py +18 -1
  997. vellum/workflows/events/__init__.py +2 -0
  998. vellum/workflows/events/context.py +90 -0
  999. vellum/workflows/events/exception_handling.py +58 -0
  1000. vellum/workflows/events/node.py +27 -11
  1001. vellum/workflows/events/relational_threads.py +41 -0
  1002. vellum/workflows/events/stream.py +28 -0
  1003. vellum/workflows/events/tests/test_basic_workflow.py +50 -0
  1004. vellum/workflows/events/tests/test_event.py +145 -20
  1005. vellum/workflows/events/types.py +32 -4
  1006. vellum/workflows/events/workflow.py +111 -8
  1007. vellum/workflows/exceptions.py +46 -7
  1008. vellum/workflows/executable.py +9 -0
  1009. vellum/workflows/expressions/accessor.py +65 -11
  1010. vellum/workflows/expressions/add.py +41 -0
  1011. vellum/workflows/expressions/comparison_utils.py +38 -0
  1012. vellum/workflows/expressions/concat.py +35 -0
  1013. vellum/workflows/expressions/contains.py +7 -0
  1014. vellum/workflows/expressions/greater_than.py +8 -1
  1015. vellum/workflows/expressions/greater_than_or_equal_to.py +8 -1
  1016. vellum/workflows/expressions/is_error.py +23 -0
  1017. vellum/workflows/expressions/length.py +46 -0
  1018. vellum/workflows/expressions/less_than.py +8 -1
  1019. vellum/workflows/expressions/less_than_or_equal_to.py +8 -1
  1020. vellum/workflows/expressions/minus.py +41 -0
  1021. vellum/workflows/expressions/tests/test_accessor.py +248 -0
  1022. vellum/workflows/expressions/tests/test_add.py +72 -0
  1023. vellum/workflows/expressions/tests/test_concat.py +108 -0
  1024. vellum/workflows/expressions/tests/test_contains.py +175 -0
  1025. vellum/workflows/expressions/tests/test_expressions.py +145 -32
  1026. vellum/workflows/expressions/tests/test_length.py +38 -0
  1027. vellum/workflows/expressions/tests/test_minus.py +109 -0
  1028. vellum/workflows/graph/graph.py +255 -8
  1029. vellum/workflows/graph/tests/test_graph.py +300 -0
  1030. vellum/workflows/inputs/__init__.py +2 -0
  1031. vellum/workflows/inputs/base.py +49 -15
  1032. vellum/workflows/inputs/dataset_row.py +81 -0
  1033. vellum/workflows/inputs/tests/test_inputs.py +181 -1
  1034. vellum/workflows/integrations/__init__.py +5 -0
  1035. vellum/workflows/integrations/composio_service.py +158 -0
  1036. vellum/workflows/integrations/mcp_service.py +282 -0
  1037. vellum/workflows/integrations/tests/__init__.py +0 -0
  1038. vellum/workflows/integrations/tests/test_mcp_service.py +273 -0
  1039. vellum/workflows/integrations/tests/test_vellum_integration_service.py +299 -0
  1040. vellum/workflows/integrations/vellum_integration_service.py +136 -0
  1041. vellum/workflows/loaders/__init__.py +3 -0
  1042. vellum/workflows/loaders/base.py +36 -0
  1043. vellum/workflows/nodes/__init__.py +2 -0
  1044. vellum/workflows/nodes/bases/base.py +142 -80
  1045. vellum/workflows/nodes/bases/base_adornment_node.py +55 -1
  1046. vellum/workflows/nodes/bases/tests/test_base_node.py +50 -4
  1047. vellum/workflows/nodes/core/error_node/node.py +11 -2
  1048. vellum/workflows/nodes/core/inline_subworkflow_node/node.py +29 -3
  1049. vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +35 -0
  1050. vellum/workflows/nodes/core/map_node/node.py +26 -1
  1051. vellum/workflows/nodes/core/map_node/tests/test_node.py +73 -0
  1052. vellum/workflows/nodes/core/retry_node/tests/test_node.py +2 -3
  1053. vellum/workflows/nodes/core/templating_node/node.py +7 -2
  1054. vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py +194 -1
  1055. vellum/workflows/nodes/displayable/__init__.py +6 -0
  1056. vellum/workflows/nodes/displayable/api_node/node.py +10 -1
  1057. vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py +113 -2
  1058. vellum/workflows/nodes/displayable/bases/api_node/node.py +70 -16
  1059. vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py +0 -0
  1060. vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py +150 -0
  1061. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +68 -7
  1062. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +215 -17
  1063. vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py +352 -32
  1064. vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +73 -1
  1065. vellum/workflows/nodes/displayable/bases/search_node.py +26 -3
  1066. vellum/workflows/nodes/displayable/bases/tests/test_prompt_deployment_node.py +90 -0
  1067. vellum/workflows/nodes/displayable/bases/utils.py +82 -5
  1068. vellum/workflows/nodes/displayable/code_execution_node/node.py +35 -9
  1069. vellum/workflows/nodes/displayable/code_execution_node/tests/test_node.py +242 -13
  1070. vellum/workflows/nodes/displayable/code_execution_node/utils.py +5 -21
  1071. vellum/workflows/nodes/displayable/conditional_node/node.py +8 -4
  1072. vellum/workflows/nodes/displayable/final_output_node/node.py +80 -1
  1073. vellum/workflows/nodes/displayable/final_output_node/tests/test_node.py +96 -1
  1074. vellum/workflows/nodes/displayable/guardrail_node/node.py +13 -4
  1075. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +9 -36
  1076. vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +3 -0
  1077. vellum/workflows/nodes/displayable/merge_node/node.py +8 -1
  1078. vellum/workflows/nodes/displayable/note_node/node.py +8 -1
  1079. vellum/workflows/nodes/displayable/prompt_deployment_node/node.py +7 -23
  1080. vellum/workflows/nodes/displayable/search_node/node.py +15 -2
  1081. vellum/workflows/nodes/displayable/search_node/tests/test_node.py +33 -0
  1082. vellum/workflows/nodes/displayable/set_state_node/__init__.py +5 -0
  1083. vellum/workflows/nodes/displayable/set_state_node/node.py +71 -0
  1084. vellum/workflows/nodes/displayable/set_state_node/tests/__init__.py +0 -0
  1085. vellum/workflows/nodes/displayable/set_state_node/tests/test_node.py +212 -0
  1086. vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +220 -59
  1087. vellum/workflows/nodes/displayable/subworkflow_deployment_node/tests/test_node.py +1 -1
  1088. vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +4 -1
  1089. vellum/workflows/nodes/displayable/tests/test_search_node_error_handling.py +329 -0
  1090. vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +10 -15
  1091. vellum/workflows/nodes/displayable/tool_calling_node/__init__.py +3 -0
  1092. vellum/workflows/nodes/displayable/tool_calling_node/node.py +225 -0
  1093. vellum/workflows/nodes/displayable/tool_calling_node/state.py +11 -0
  1094. vellum/workflows/nodes/displayable/tool_calling_node/tests/__init__.py +0 -0
  1095. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py +219 -0
  1096. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +802 -0
  1097. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +316 -0
  1098. vellum/workflows/nodes/displayable/tool_calling_node/utils.py +633 -0
  1099. vellum/workflows/nodes/displayable/web_search_node/__init__.py +3 -0
  1100. vellum/workflows/nodes/displayable/web_search_node/node.py +136 -0
  1101. vellum/workflows/nodes/displayable/web_search_node/tests/__init__.py +0 -0
  1102. vellum/workflows/nodes/displayable/web_search_node/tests/test_node.py +246 -0
  1103. vellum/workflows/nodes/experimental/__init__.py +1 -3
  1104. vellum/workflows/nodes/mocks.py +40 -9
  1105. vellum/workflows/nodes/tests/test_mocks.py +2 -2
  1106. vellum/workflows/nodes/tests/test_utils.py +34 -5
  1107. vellum/workflows/nodes/utils.py +45 -6
  1108. vellum/workflows/outputs/base.py +53 -12
  1109. vellum/workflows/ports/node_ports.py +3 -0
  1110. vellum/workflows/ports/port.py +27 -12
  1111. vellum/workflows/ports/tests/test_port.py +45 -0
  1112. vellum/workflows/ports/utils.py +26 -6
  1113. vellum/workflows/references/__init__.py +2 -0
  1114. vellum/workflows/references/constant.py +4 -1
  1115. vellum/workflows/references/environment_variable.py +27 -9
  1116. vellum/workflows/references/output.py +4 -6
  1117. vellum/workflows/references/trigger.py +77 -0
  1118. vellum/workflows/resolvers/base.py +19 -1
  1119. vellum/workflows/resolvers/resolver.py +71 -0
  1120. vellum/workflows/resolvers/tests/test_resolver.py +168 -0
  1121. vellum/workflows/resolvers/types.py +11 -0
  1122. vellum/workflows/runner/runner.py +642 -160
  1123. vellum/workflows/sandbox.py +55 -9
  1124. vellum/workflows/state/base.py +164 -40
  1125. vellum/workflows/state/context.py +225 -6
  1126. vellum/workflows/state/delta.py +20 -0
  1127. vellum/workflows/state/encoder.py +2 -77
  1128. vellum/workflows/state/tests/test_state.py +24 -9
  1129. vellum/workflows/tests/test_dataset_row.py +190 -0
  1130. vellum/workflows/tests/test_sandbox.py +137 -0
  1131. vellum/workflows/tests/triggers/test_integration_trigger.py +156 -0
  1132. vellum/workflows/triggers/__init__.py +6 -0
  1133. vellum/workflows/triggers/base.py +391 -0
  1134. vellum/workflows/triggers/integration.py +186 -0
  1135. vellum/workflows/triggers/manual.py +37 -0
  1136. vellum/workflows/triggers/schedule.py +18 -0
  1137. vellum/workflows/triggers/tests/__init__.py +1 -0
  1138. vellum/workflows/triggers/tests/test_base_trigger_display.py +147 -0
  1139. vellum/workflows/triggers/tests/test_integration.py +155 -0
  1140. vellum/workflows/types/__init__.py +2 -1
  1141. vellum/workflows/types/code_execution_node_wrappers.py +5 -1
  1142. vellum/workflows/types/core.py +5 -0
  1143. vellum/workflows/types/definition.py +168 -2
  1144. vellum/workflows/types/generics.py +5 -0
  1145. vellum/workflows/types/tests/test_definition.py +183 -0
  1146. vellum/workflows/types/tests/test_utils.py +11 -0
  1147. vellum/workflows/types/utils.py +33 -3
  1148. vellum/workflows/utils/files.py +28 -0
  1149. vellum/workflows/utils/functions.py +244 -19
  1150. vellum/workflows/utils/hmac.py +44 -0
  1151. vellum/workflows/utils/names.py +32 -4
  1152. vellum/workflows/utils/pydantic_schema.py +38 -0
  1153. vellum/workflows/utils/tests/test_functions.py +357 -15
  1154. vellum/workflows/utils/tests/test_names.py +9 -0
  1155. vellum/workflows/utils/tests/test_vellum_variables.py +32 -2
  1156. vellum/workflows/utils/uuids.py +35 -0
  1157. vellum/workflows/utils/vellum_variables.py +131 -7
  1158. vellum/workflows/utils/zip.py +46 -0
  1159. vellum/workflows/vellum_client.py +3 -33
  1160. vellum/workflows/workflows/base.py +350 -39
  1161. vellum/workflows/workflows/event_filters.py +13 -0
  1162. vellum/workflows/workflows/tests/test_base_workflow.py +118 -6
  1163. vellum/workflows/workflows/tests/test_event_filters.py +126 -0
  1164. {vellum_ai-0.14.63.dist-info → vellum_ai-1.11.2.dist-info}/METADATA +12 -13
  1165. vellum_ai-1.11.2.dist-info/RECORD +2177 -0
  1166. vellum_ai-1.11.2.dist-info/entry_points.txt +4 -0
  1167. vellum_cli/__init__.py +34 -4
  1168. vellum_cli/config.py +5 -3
  1169. vellum_cli/image_push.py +106 -8
  1170. vellum_cli/move.py +56 -0
  1171. vellum_cli/ping.py +6 -0
  1172. vellum_cli/pull.py +48 -14
  1173. vellum_cli/push.py +103 -26
  1174. vellum_cli/tests/conftest.py +6 -0
  1175. vellum_cli/tests/test_image_push.py +190 -12
  1176. vellum_cli/tests/test_image_push_error_handling.py +258 -0
  1177. vellum_cli/tests/test_init.py +7 -24
  1178. vellum_cli/tests/test_move.py +154 -0
  1179. vellum_cli/tests/test_ping.py +15 -0
  1180. vellum_cli/tests/test_pull.py +42 -61
  1181. vellum_cli/tests/test_push.py +443 -11
  1182. vellum_ee/assets/node-definitions.json +1135 -0
  1183. vellum_ee/scripts/generate_node_definitions.py +89 -0
  1184. vellum_ee/workflows/display/base.py +29 -55
  1185. vellum_ee/workflows/display/editor/types.py +3 -0
  1186. vellum_ee/workflows/display/exceptions.py +3 -0
  1187. vellum_ee/workflows/display/nodes/base_node_display.py +164 -56
  1188. vellum_ee/workflows/display/nodes/tests/test_base_node_display.py +149 -3
  1189. vellum_ee/workflows/display/nodes/vellum/__init__.py +2 -0
  1190. vellum_ee/workflows/display/nodes/vellum/api_node.py +26 -13
  1191. vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +3 -3
  1192. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +23 -7
  1193. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +18 -7
  1194. vellum_ee/workflows/display/nodes/vellum/error_node.py +2 -4
  1195. vellum_ee/workflows/display/nodes/vellum/final_output_node.py +3 -14
  1196. vellum_ee/workflows/display/nodes/vellum/function_node.py +14 -0
  1197. vellum_ee/workflows/display/nodes/vellum/guardrail_node.py +2 -5
  1198. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +77 -44
  1199. vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +33 -10
  1200. vellum_ee/workflows/display/nodes/vellum/map_node.py +29 -15
  1201. vellum_ee/workflows/display/nodes/vellum/merge_node.py +2 -5
  1202. vellum_ee/workflows/display/nodes/vellum/note_node.py +2 -3
  1203. vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +13 -9
  1204. vellum_ee/workflows/display/nodes/vellum/retry_node.py +5 -6
  1205. vellum_ee/workflows/display/nodes/vellum/search_node.py +76 -19
  1206. vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +21 -10
  1207. vellum_ee/workflows/display/nodes/vellum/templating_node.py +3 -6
  1208. vellum_ee/workflows/display/nodes/vellum/tests/test_api_node.py +65 -0
  1209. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +176 -3
  1210. vellum_ee/workflows/display/nodes/vellum/tests/test_final_output_node.py +80 -0
  1211. vellum_ee/workflows/display/nodes/vellum/tests/test_inline_subworkflow_node.py +88 -0
  1212. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_deployment_node.py +71 -1
  1213. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +115 -13
  1214. vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py +1 -1
  1215. vellum_ee/workflows/display/nodes/vellum/tests/test_search_node.py +104 -0
  1216. vellum_ee/workflows/display/nodes/vellum/tests/test_subworkflow_deployment_node.py +1 -1
  1217. vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +2 -2
  1218. vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py +526 -49
  1219. vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py +2 -2
  1220. vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +8 -9
  1221. vellum_ee/workflows/display/nodes/vellum/try_node.py +5 -6
  1222. vellum_ee/workflows/display/tests/test_base_workflow_display.py +383 -9
  1223. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +2 -2
  1224. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +102 -39
  1225. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +233 -90
  1226. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +21 -17
  1227. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +76 -64
  1228. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +69 -12
  1229. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +68 -46
  1230. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +92 -80
  1231. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +193 -177
  1232. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +14 -14
  1233. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +14 -9
  1234. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +28 -17
  1235. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +20 -16
  1236. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +386 -31
  1237. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +59 -46
  1238. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +41 -32
  1239. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +37 -33
  1240. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +73 -61
  1241. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +40 -36
  1242. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_set_state_node_serialization.py +86 -0
  1243. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +25 -21
  1244. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +22 -18
  1245. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +13 -8
  1246. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py +87 -0
  1247. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py +313 -0
  1248. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_mcp_serialization.py +65 -0
  1249. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_parent_input.py +89 -0
  1250. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +57 -23
  1251. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_vellum_integration_serialization.py +68 -0
  1252. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_workflow_deployment_serialization.py +107 -0
  1253. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +2 -2
  1254. vellum_ee/workflows/display/tests/workflow_serialization/test_chat_message_dict_reference_serialization.py +108 -0
  1255. vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +15 -10
  1256. vellum_ee/workflows/display/tests/workflow_serialization/test_final_output_node_map_reference_serialization.py +88 -0
  1257. vellum_ee/workflows/display/tests/workflow_serialization/test_integration_trigger_serialization.py +306 -0
  1258. vellum_ee/workflows/display/tests/workflow_serialization/test_integration_trigger_with_entrypoint_node_id.py +88 -0
  1259. vellum_ee/workflows/display/tests/workflow_serialization/test_list_vellum_document_serialization.py +65 -0
  1260. vellum_ee/workflows/display/tests/workflow_serialization/test_manual_trigger_serialization.py +110 -0
  1261. vellum_ee/workflows/display/tests/workflow_serialization/test_map_node_with_terminal_nodes_serialization.py +62 -0
  1262. vellum_ee/workflows/display/tests/workflow_serialization/test_multi_trigger_same_node_serialization.py +99 -0
  1263. vellum_ee/workflows/display/tests/workflow_serialization/test_scheduled_trigger_serialization.py +267 -0
  1264. vellum_ee/workflows/display/tests/workflow_serialization/test_terminal_node_any_serialization.py +49 -0
  1265. vellum_ee/workflows/display/tests/workflow_serialization/test_trigger_display_from_display_class.py +153 -0
  1266. vellum_ee/workflows/display/tests/workflow_serialization/test_web_search_node_serialization.py +72 -0
  1267. vellum_ee/workflows/display/tests/workflow_serialization/test_workflow_input_parameterization_error.py +37 -0
  1268. vellum_ee/workflows/display/types.py +29 -2
  1269. vellum_ee/workflows/display/utils/auto_layout.py +130 -0
  1270. vellum_ee/workflows/display/utils/events.py +57 -0
  1271. vellum_ee/workflows/display/utils/exceptions.py +19 -0
  1272. vellum_ee/workflows/display/utils/expressions.py +231 -28
  1273. vellum_ee/workflows/display/utils/metadata.py +146 -0
  1274. vellum_ee/workflows/display/utils/registry.py +46 -0
  1275. vellum_ee/workflows/display/utils/tests/__init__.py +0 -0
  1276. vellum_ee/workflows/display/utils/tests/test_auto_layout.py +56 -0
  1277. vellum_ee/workflows/display/utils/tests/test_events.py +185 -0
  1278. vellum_ee/workflows/display/utils/tests/test_expressions.py +92 -0
  1279. vellum_ee/workflows/display/utils/vellum.py +39 -4
  1280. vellum_ee/workflows/display/vellum.py +2 -128
  1281. vellum_ee/workflows/display/workflows/__init__.py +0 -1
  1282. vellum_ee/workflows/display/workflows/base_workflow_display.py +727 -95
  1283. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +318 -28
  1284. vellum_ee/workflows/server/virtual_file_loader.py +131 -6
  1285. vellum_ee/workflows/tests/local_workflow/display/nodes/final_output.py +1 -1
  1286. vellum_ee/workflows/tests/local_workflow/display/nodes/templating_node.py +1 -1
  1287. vellum_ee/workflows/tests/local_workflow/display/workflow.py +11 -14
  1288. vellum_ee/workflows/tests/test_display_meta.py +41 -0
  1289. vellum_ee/workflows/tests/test_registry.py +169 -0
  1290. vellum_ee/workflows/tests/test_serialize_module.py +265 -0
  1291. vellum_ee/workflows/tests/test_server.py +619 -44
  1292. vellum_ee/workflows/tests/test_virtual_files.py +48 -0
  1293. vellum/client/resources/release_reviews/client.py +0 -137
  1294. vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py +0 -5
  1295. vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py +0 -266
  1296. vellum/workflows/nodes/experimental/tool_calling_node/__init__.py +0 -3
  1297. vellum/workflows/nodes/experimental/tool_calling_node/node.py +0 -135
  1298. vellum/workflows/nodes/experimental/tool_calling_node/tests/test_node.py +0 -53
  1299. vellum/workflows/nodes/experimental/tool_calling_node/utils.py +0 -259
  1300. vellum_ai-0.14.63.dist-info/RECORD +0 -1719
  1301. vellum_ai-0.14.63.dist-info/entry_points.txt +0 -3
  1302. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +0 -9
  1303. /vellum/{workflows/nodes/displayable/bases/inline_prompt_node → prompts}/constants.py +0 -0
  1304. {vellum_ai-0.14.63.dist-info → vellum_ai-1.11.2.dist-info}/LICENSE +0 -0
  1305. {vellum_ai-0.14.63.dist-info → vellum_ai-1.11.2.dist-info}/WHEEL +0 -0
@@ -1,15 +1,34 @@
1
1
  from collections import defaultdict
2
+ from contextlib import contextmanager
2
3
  from copy import deepcopy
3
4
  from dataclasses import dataclass
4
5
  import logging
5
6
  from queue import Empty, Queue
7
+ import sys
6
8
  from threading import Event as ThreadingEvent, Thread
9
+ import traceback
7
10
  from uuid import UUID, uuid4
8
- from typing import TYPE_CHECKING, Any, Dict, Generic, Iterable, Iterator, Optional, Sequence, Set, Tuple, Type, Union
11
+ from typing import (
12
+ TYPE_CHECKING,
13
+ Any,
14
+ Dict,
15
+ Generator,
16
+ Generic,
17
+ Iterable,
18
+ Iterator,
19
+ List,
20
+ Optional,
21
+ Sequence,
22
+ Set,
23
+ Tuple,
24
+ Type,
25
+ Union,
26
+ )
9
27
 
10
28
  from vellum.workflows.constants import undefined
11
29
  from vellum.workflows.context import ExecutionContext, execution_context, get_execution_context
12
30
  from vellum.workflows.descriptors.base import BaseDescriptor
31
+ from vellum.workflows.descriptors.exceptions import InvalidExpressionException
13
32
  from vellum.workflows.errors import WorkflowError, WorkflowErrorCode
14
33
  from vellum.workflows.events import (
15
34
  NodeExecutionFulfilledEvent,
@@ -17,20 +36,22 @@ from vellum.workflows.events import (
17
36
  NodeExecutionRejectedEvent,
18
37
  NodeExecutionStreamingEvent,
19
38
  WorkflowEvent,
20
- WorkflowEventStream,
39
+ WorkflowEventGenerator,
21
40
  WorkflowExecutionFulfilledEvent,
22
41
  WorkflowExecutionInitiatedEvent,
23
42
  WorkflowExecutionRejectedEvent,
24
43
  WorkflowExecutionStreamingEvent,
25
44
  )
26
45
  from vellum.workflows.events.node import (
46
+ NodeEvent,
27
47
  NodeExecutionFulfilledBody,
28
48
  NodeExecutionInitiatedBody,
29
49
  NodeExecutionRejectedBody,
30
50
  NodeExecutionStreamingBody,
31
51
  )
32
- from vellum.workflows.events.types import BaseEvent, NodeParentContext, ParentContext, WorkflowParentContext
52
+ from vellum.workflows.events.types import BaseEvent, NodeParentContext, ParentContext, SpanLink, WorkflowParentContext
33
53
  from vellum.workflows.events.workflow import (
54
+ WorkflowEventStream,
34
55
  WorkflowExecutionFulfilledBody,
35
56
  WorkflowExecutionInitiatedBody,
36
57
  WorkflowExecutionPausedBody,
@@ -50,7 +71,13 @@ from vellum.workflows.outputs import BaseOutputs
50
71
  from vellum.workflows.outputs.base import BaseOutput
51
72
  from vellum.workflows.ports.port import Port
52
73
  from vellum.workflows.references import ExternalInputReference, OutputReference
74
+ from vellum.workflows.references.state_value import StateValueReference
53
75
  from vellum.workflows.state.base import BaseState
76
+ from vellum.workflows.state.delta import StateDelta
77
+ from vellum.workflows.triggers.base import BaseTrigger
78
+ from vellum.workflows.triggers.integration import IntegrationTrigger
79
+ from vellum.workflows.triggers.manual import ManualTrigger
80
+ from vellum.workflows.types.core import CancelSignal
54
81
  from vellum.workflows.types.generics import InputsType, OutputsType, StateType
55
82
 
56
83
  if TYPE_CHECKING:
@@ -58,7 +85,7 @@ if TYPE_CHECKING:
58
85
 
59
86
  logger = logging.getLogger(__name__)
60
87
 
61
- RunFromNodeArg = Sequence[Type[BaseNode]]
88
+ RunFromNodeArg = Sequence[Union[Type[BaseNode], UUID]]
62
89
  ExternalInputsArg = Dict[ExternalInputReference, Any]
63
90
  BackgroundThreadItem = Union[BaseState, WorkflowEvent, None]
64
91
 
@@ -79,10 +106,14 @@ class WorkflowRunner(Generic[StateType]):
79
106
  state: Optional[StateType] = None,
80
107
  entrypoint_nodes: Optional[RunFromNodeArg] = None,
81
108
  external_inputs: Optional[ExternalInputsArg] = None,
82
- cancel_signal: Optional[ThreadingEvent] = None,
109
+ previous_execution_id: Optional[Union[str, UUID]] = None,
110
+ cancel_signal: Optional[CancelSignal] = None,
83
111
  node_output_mocks: Optional[MockNodeExecutionArg] = None,
84
112
  max_concurrency: Optional[int] = None,
113
+ timeout: Optional[float] = None,
85
114
  init_execution_context: Optional[ExecutionContext] = None,
115
+ trigger: Optional[BaseTrigger] = None,
116
+ execution_id: Optional[UUID] = None,
86
117
  ):
87
118
  if state and external_inputs:
88
119
  raise ValueError("Can only run a Workflow providing one of state or external inputs, not both")
@@ -90,22 +121,35 @@ class WorkflowRunner(Generic[StateType]):
90
121
  self.workflow = workflow
91
122
  self._is_resuming = False
92
123
  self._should_emit_initial_state = True
124
+ self._span_link_info: Optional[Tuple[str, str, str, str]] = None
93
125
  if entrypoint_nodes:
94
- if len(list(entrypoint_nodes)) > 1:
95
- raise ValueError("Cannot resume from multiple nodes")
126
+ nodes_by_id = {node.__id__: node for node in self.workflow.get_all_nodes()}
127
+
128
+ resolved_nodes = []
129
+ for item in entrypoint_nodes:
130
+ if isinstance(item, UUID):
131
+ matching_node = nodes_by_id.get(item)
132
+ if matching_node is None:
133
+ raise ValueError(f"No node found with UUID {item}")
134
+ resolved_nodes.append(matching_node)
135
+ else:
136
+ resolved_nodes.append(item)
137
+
138
+ if len(list(resolved_nodes)) > 1:
139
+ raise WorkflowInitializationException("Cannot resume from multiple nodes")
96
140
 
97
141
  # TODO: Support resuming from multiple nodes
98
142
  # https://app.shortcut.com/vellum/story/4408
99
- node = next(iter(entrypoint_nodes))
143
+ node = next(iter(resolved_nodes))
100
144
  if state:
101
145
  self._initial_state = deepcopy(state)
102
- self._initial_state.meta.span_id = uuid4()
146
+ self._initial_state.meta.span_id = execution_id or uuid4()
103
147
  self._initial_state.meta.workflow_definition = self.workflow.__class__
104
148
  else:
105
149
  self._initial_state = self.workflow.get_state_at_node(node)
106
- self._entrypoints = entrypoint_nodes
150
+ self._entrypoints = resolved_nodes
107
151
  elif external_inputs:
108
- self._initial_state = self.workflow.get_most_recent_state()
152
+ self._initial_state = self.workflow.get_most_recent_state(execution_id)
109
153
  for descriptor, value in external_inputs.items():
110
154
  if not any(isinstance(value, type_) for type_ in descriptor.types):
111
155
  raise NodeException(
@@ -120,21 +164,84 @@ class WorkflowRunner(Generic[StateType]):
120
164
  if issubclass(ei.inputs_class.__parent_class__, BaseNode)
121
165
  ]
122
166
  self._is_resuming = True
167
+ elif previous_execution_id:
168
+ if not self.workflow.resolvers:
169
+ raise WorkflowInitializationException(
170
+ message=f"No resolvers configured to load initial state for execution ID: {previous_execution_id}",
171
+ workflow_definition=self.workflow.__class__,
172
+ code=WorkflowErrorCode.INVALID_INPUTS,
173
+ )
174
+
175
+ resolver_failed = True
176
+ for resolver in self.workflow.resolvers:
177
+ try:
178
+ load_state_result = resolver.load_state(previous_execution_id)
179
+
180
+ if load_state_result is not None:
181
+ if execution_id:
182
+ load_state_result.state.meta.span_id = execution_id
183
+
184
+ state_class = self.workflow.get_state_class()
185
+ if isinstance(load_state_result.state, state_class):
186
+ self._initial_state = load_state_result.state
187
+ normalized_inputs = deepcopy(inputs) if inputs else self.workflow.get_default_inputs()
188
+ self._initial_state.meta.workflow_inputs = normalized_inputs
189
+ self._initial_state.meta.workflow_definition = self.workflow.__class__
190
+ self._span_link_info = (
191
+ load_state_result.previous_trace_id,
192
+ load_state_result.previous_span_id,
193
+ load_state_result.root_trace_id,
194
+ load_state_result.root_span_id,
195
+ )
196
+ resolver_failed = False
197
+ break
198
+ except Exception as e:
199
+ logger.warning(f"Failed to load state from resolver {type(resolver).__name__}: {e}")
200
+ continue
201
+
202
+ if resolver_failed:
203
+ raise WorkflowInitializationException(
204
+ message=f"All resolvers failed to load initial state for execution ID: {previous_execution_id}",
205
+ workflow_definition=self.workflow.__class__,
206
+ code=WorkflowErrorCode.INVALID_INPUTS,
207
+ )
208
+
209
+ self._entrypoints = self.workflow.get_entrypoints()
210
+ elif trigger:
211
+ # When trigger is provided, set up default state and filter entrypoints by trigger type
212
+ normalized_inputs = deepcopy(inputs) if inputs else self.workflow.get_default_inputs()
213
+ if state:
214
+ self._initial_state = deepcopy(state)
215
+ self._initial_state.meta.workflow_inputs = normalized_inputs
216
+ self._initial_state.meta.span_id = execution_id or uuid4()
217
+ self._initial_state.meta.workflow_definition = self.workflow.__class__
218
+ else:
219
+ self._initial_state = self.workflow.get_default_state(normalized_inputs, execution_id)
220
+ self._should_emit_initial_state = False
221
+
222
+ # Validate and bind trigger, then filter entrypoints
223
+ self._validate_and_bind_trigger(trigger)
224
+ self._entrypoints = self.workflow.get_entrypoints()
225
+ self._filter_entrypoints_for_trigger(trigger)
123
226
  else:
227
+ # Default case: no entrypoint overrides and no trigger
124
228
  normalized_inputs = deepcopy(inputs) if inputs else self.workflow.get_default_inputs()
125
229
  if state:
126
230
  self._initial_state = deepcopy(state)
127
231
  self._initial_state.meta.workflow_inputs = normalized_inputs
128
- self._initial_state.meta.span_id = uuid4()
232
+ self._initial_state.meta.span_id = execution_id or uuid4()
129
233
  self._initial_state.meta.workflow_definition = self.workflow.__class__
130
234
  else:
131
- self._initial_state = self.workflow.get_default_state(normalized_inputs)
235
+ self._initial_state = self.workflow.get_default_state(normalized_inputs, execution_id)
132
236
  # We don't want to emit the initial state on the base case of Workflow Runs, since
133
237
  # all of that data is redundant and is derivable. It also clearly communicates that
134
238
  # there was no initial state provided by the user to invoke the workflow.
135
239
  self._should_emit_initial_state = False
136
240
  self._entrypoints = self.workflow.get_entrypoints()
137
241
 
242
+ # Check if workflow requires a trigger but none was provided
243
+ self._validate_no_trigger_provided()
244
+
138
245
  # This queue is responsible for sending events from WorkflowRunner to the outside world
139
246
  self._workflow_event_outer_queue: Queue[WorkflowEvent] = Queue()
140
247
 
@@ -153,17 +260,165 @@ class WorkflowRunner(Generic[StateType]):
153
260
 
154
261
  self._active_nodes_by_execution_id: Dict[UUID, ActiveNode[StateType]] = {}
155
262
  self._cancel_signal = cancel_signal
263
+ self._timeout = timeout
156
264
  self._execution_context = init_execution_context or get_execution_context()
265
+ self._trigger = trigger
157
266
 
158
267
  setattr(
159
268
  self._initial_state,
160
269
  "__snapshot_callback__",
161
- lambda s: self._snapshot_state(s),
270
+ lambda s, d: self._snapshot_state(s, d),
162
271
  )
163
272
  self.workflow.context._register_event_queue(self._workflow_event_inner_queue)
164
273
  self.workflow.context._register_node_output_mocks(node_output_mocks or [])
165
274
 
166
- def _snapshot_state(self, state: StateType) -> StateType:
275
+ self._outputs_listening_to_state = [
276
+ descriptor for descriptor in self.workflow.Outputs if isinstance(descriptor.instance, StateValueReference)
277
+ ]
278
+
279
+ self._background_thread: Optional[Thread] = None
280
+ self._cancel_thread: Optional[Thread] = None
281
+ self._timeout_thread: Optional[Thread] = None
282
+
283
+ def _has_manual_trigger(self) -> bool:
284
+ """Check if workflow has ManualTrigger."""
285
+ for subgraph in self.workflow.get_subgraphs():
286
+ for trigger in subgraph.triggers:
287
+ if issubclass(trigger, ManualTrigger):
288
+ return True
289
+ return False
290
+
291
+ def _get_entrypoints_for_trigger_type(self, trigger_class: Type) -> List[Type[BaseNode]]:
292
+ """Get all entrypoints connected to a specific trigger type.
293
+
294
+ Allows subclasses: if trigger_class is a subclass of any declared trigger,
295
+ returns those entrypoints.
296
+ """
297
+ entrypoints: List[Type[BaseNode]] = []
298
+ for subgraph in self.workflow.get_subgraphs():
299
+ for trigger in subgraph.triggers:
300
+ # Check if the provided trigger_class is a subclass of the declared trigger
301
+ # This allows runtime instances to be subclasses of what's declared in the workflow
302
+ if issubclass(trigger_class, trigger):
303
+ entrypoints.extend(subgraph.entrypoints)
304
+ return entrypoints
305
+
306
+ def _validate_and_bind_trigger(self, trigger: BaseTrigger) -> None:
307
+ """
308
+ Validate that trigger is compatible with workflow and bind it to state.
309
+
310
+ Supports all trigger types derived from BaseTrigger:
311
+ - IntegrationTrigger instances (Slack, Gmail, etc.)
312
+ - ManualTrigger instances (explicit manual execution)
313
+ - ScheduledTrigger instances (time-based triggers)
314
+ - Any future trigger types
315
+
316
+ Raises:
317
+ WorkflowInitializationException: If trigger type is not compatible with workflow
318
+ """
319
+ trigger_class = type(trigger)
320
+
321
+ # Search for a compatible trigger type in the workflow
322
+ found_compatible_trigger = False
323
+ has_any_triggers = False
324
+ incompatible_trigger_names: List[str] = []
325
+
326
+ for subgraph in self.workflow.get_subgraphs():
327
+ for declared_trigger in subgraph.triggers:
328
+ has_any_triggers = True
329
+ # Allow subclasses: if workflow declares BaseSlackTrigger, accept SpecificSlackTrigger instances
330
+ if issubclass(trigger_class, declared_trigger):
331
+ found_compatible_trigger = True
332
+ break
333
+ else:
334
+ incompatible_trigger_names.append(declared_trigger.__name__)
335
+
336
+ if found_compatible_trigger:
337
+ break
338
+
339
+ # Special case: workflows with no explicit triggers implicitly support ManualTrigger
340
+ if not has_any_triggers and not isinstance(trigger, ManualTrigger):
341
+ raise WorkflowInitializationException(
342
+ message=f"Provided trigger type {trigger_class.__name__} is not compatible with workflow. "
343
+ f"Workflow has no explicit triggers and only supports ManualTrigger.",
344
+ workflow_definition=self.workflow.__class__,
345
+ code=WorkflowErrorCode.INVALID_INPUTS,
346
+ )
347
+
348
+ # Validate that we found a compatible trigger type
349
+ if has_any_triggers and not found_compatible_trigger:
350
+ raise WorkflowInitializationException(
351
+ message=f"Provided trigger type {trigger_class.__name__} is not compatible with workflow triggers. "
352
+ f"Workflow has: {sorted(set(incompatible_trigger_names))}",
353
+ workflow_definition=self.workflow.__class__,
354
+ code=WorkflowErrorCode.INVALID_INPUTS,
355
+ )
356
+
357
+ # Bind trigger to state (works for all trigger types via BaseTrigger.bind_to_state)
358
+ trigger.bind_to_state(self._initial_state)
359
+
360
+ def _filter_entrypoints_for_trigger(self, trigger: BaseTrigger) -> None:
361
+ """
362
+ Filter entrypoints to those connected to the specific trigger type.
363
+
364
+ Uses the specific trigger subclass, not the parent class, allowing workflows
365
+ with multiple triggers to route to the correct path.
366
+ """
367
+ trigger_class = type(trigger)
368
+ specific_entrypoints = self._get_entrypoints_for_trigger_type(trigger_class)
369
+ if specific_entrypoints:
370
+ self._entrypoints = specific_entrypoints
371
+
372
+ def _validate_no_trigger_provided(self) -> None:
373
+ """
374
+ Validate that workflow can run without a trigger.
375
+
376
+ If workflow has IntegrationTrigger(s) but no ManualTrigger, it requires a trigger instance.
377
+ If workflow has both, filter entrypoints to ManualTrigger path only.
378
+
379
+ Raises:
380
+ WorkflowInitializationException: If workflow requires trigger but none was provided
381
+ """
382
+ # Collect all IntegrationTrigger types in the workflow
383
+ workflow_integration_triggers = []
384
+ for subgraph in self.workflow.get_subgraphs():
385
+ for trigger_type in subgraph.triggers:
386
+ if issubclass(trigger_type, IntegrationTrigger):
387
+ workflow_integration_triggers.append(trigger_type)
388
+
389
+ @contextmanager
390
+ def _httpx_logger_with_span_id(self) -> Iterator[None]:
391
+ """
392
+ Context manager to append the current execution's span ID to httpx logger messages.
393
+
394
+ This is used when making API requests via the Vellum client to include
395
+ the execution's span ID in the httpx request logs for better traceability.
396
+ """
397
+ httpx_logger = logging.getLogger("httpx")
398
+
399
+ class SpanIdFilter(logging.Filter):
400
+ def filter(self, record: logging.LogRecord) -> bool:
401
+ if record.name == "httpx" and "[span_id=" not in record.msg:
402
+ context = get_execution_context()
403
+ if context.parent_context:
404
+ span_id = str(context.parent_context.span_id)
405
+ record.msg = f"{record.msg} [span_id={span_id}]"
406
+ return True
407
+
408
+ span_filter = SpanIdFilter()
409
+ httpx_logger.addFilter(span_filter)
410
+
411
+ try:
412
+ yield
413
+ finally:
414
+ httpx_logger.removeFilter(span_filter)
415
+
416
+ def _snapshot_state(self, state: StateType, deltas: List[StateDelta]) -> StateType:
417
+ execution = get_execution_context()
418
+ edited_by = None
419
+ if execution.parent_context and hasattr(execution.parent_context, "node_definition"):
420
+ edited_by = execution.parent_context.node_definition
421
+
167
422
  self._workflow_event_inner_queue.put(
168
423
  WorkflowExecutionSnapshottedEvent(
169
424
  trace_id=self._execution_context.trace_id,
@@ -171,10 +426,36 @@ class WorkflowRunner(Generic[StateType]):
171
426
  body=WorkflowExecutionSnapshottedBody(
172
427
  workflow_definition=self.workflow.__class__,
173
428
  state=state,
429
+ edited_by=edited_by,
174
430
  ),
175
431
  parent=self._execution_context.parent_context,
176
432
  )
177
433
  )
434
+
435
+ delta_names = [d.name for d in deltas]
436
+ for descriptor in self._outputs_listening_to_state:
437
+ if not isinstance(descriptor.instance, StateValueReference):
438
+ continue
439
+
440
+ if descriptor.instance.name not in delta_names:
441
+ continue
442
+
443
+ resolved_delta = descriptor.instance.resolve(state)
444
+ if resolved_delta is undefined:
445
+ continue
446
+
447
+ self._workflow_event_outer_queue.put(
448
+ self._stream_workflow_event(
449
+ BaseOutput(
450
+ name=descriptor.name,
451
+ # We may want to switch this to using the delta from the state delta
452
+ # instead of the state value. In the short term, we need to show
453
+ # the full conversation of the tool calling node's delta's.
454
+ delta=resolved_delta,
455
+ )
456
+ )
457
+ )
458
+
178
459
  self.workflow._store.append_state_snapshot(state)
179
460
  self._background_thread_queue.put(state)
180
461
  return state
@@ -185,17 +466,36 @@ class WorkflowRunner(Generic[StateType]):
185
466
  return event
186
467
 
187
468
  def _run_work_item(self, node: BaseNode[StateType], span_id: UUID) -> None:
469
+ for event in self.run_node(node, span_id):
470
+ self._workflow_event_inner_queue.put(event)
471
+
472
+ def run_node(
473
+ self,
474
+ node: "BaseNode[StateType]",
475
+ span_id: UUID,
476
+ ) -> Generator[NodeEvent, None, None]:
477
+ """
478
+ Execute a single node and yield workflow events.
479
+
480
+ Args:
481
+ node: The node instance to execute
482
+ span_id: Unique identifier for this node execution
483
+
484
+ Yields:
485
+ NodeExecutionEvent: Events emitted during node execution (initiated, streaming, fulfilled, rejected)
486
+ """
188
487
  execution = get_execution_context()
189
- self._workflow_event_inner_queue.put(
190
- NodeExecutionInitiatedEvent(
191
- trace_id=execution.trace_id,
192
- span_id=span_id,
193
- body=NodeExecutionInitiatedBody(
194
- node_definition=node.__class__,
195
- inputs=node._inputs,
196
- ),
197
- parent=execution.parent_context,
198
- )
488
+
489
+ node_output_mocks_map = self.workflow.context.node_output_mocks_map
490
+
491
+ yield NodeExecutionInitiatedEvent(
492
+ trace_id=execution.trace_id,
493
+ span_id=span_id,
494
+ body=NodeExecutionInitiatedBody(
495
+ node_definition=node.__class__,
496
+ inputs=node._inputs,
497
+ ),
498
+ parent=execution.parent_context,
199
499
  )
200
500
 
201
501
  logger.debug(f"Started running node: {node.__class__.__name__}")
@@ -208,7 +508,7 @@ class WorkflowRunner(Generic[StateType]):
208
508
  )
209
509
  node_run_response: NodeRunResponse
210
510
  was_mocked: Optional[bool] = None
211
- mock_candidates = self.workflow.context.node_output_mocks_map.get(node.Outputs) or []
511
+ mock_candidates = node_output_mocks_map.get(node.Outputs) or []
212
512
  for mock_candidate in mock_candidates:
213
513
  if mock_candidate.when_condition.resolve(node.state):
214
514
  node_run_response = mock_candidate.then_outputs
@@ -238,8 +538,9 @@ class WorkflowRunner(Generic[StateType]):
238
538
  streaming_output_queues: Dict[str, Queue] = {}
239
539
  outputs = node.Outputs()
240
540
 
241
- def initiate_node_streaming_output(output: BaseOutput) -> None:
242
- execution = get_execution_context()
541
+ def initiate_node_streaming_output(
542
+ output: BaseOutput,
543
+ ) -> Generator[NodeExecutionStreamingEvent, None, None]:
243
544
  streaming_output_queues[output.name] = Queue()
244
545
  output_descriptor = OutputReference(
245
546
  name=output.name,
@@ -251,130 +552,152 @@ class WorkflowRunner(Generic[StateType]):
251
552
  node.state.meta.node_outputs[output_descriptor] = streaming_output_queues[output.name]
252
553
  initiated_output: BaseOutput = BaseOutput(name=output.name)
253
554
  initiated_ports = initiated_output > ports
254
- self._workflow_event_inner_queue.put(
255
- NodeExecutionStreamingEvent(
256
- trace_id=execution.trace_id,
257
- span_id=span_id,
258
- body=NodeExecutionStreamingBody(
259
- node_definition=node.__class__,
260
- output=initiated_output,
261
- invoked_ports=initiated_ports,
262
- ),
263
- parent=execution.parent_context,
555
+ yield NodeExecutionStreamingEvent(
556
+ trace_id=execution.trace_id,
557
+ span_id=span_id,
558
+ body=NodeExecutionStreamingBody(
559
+ node_definition=node.__class__,
560
+ output=initiated_output,
561
+ invoked_ports=initiated_ports,
264
562
  ),
563
+ parent=execution.parent_context,
265
564
  )
266
565
 
267
566
  with execution_context(parent_context=updated_parent_context, trace_id=execution.trace_id):
268
567
  for output in node_run_response:
269
568
  invoked_ports = output > ports
270
569
  if output.is_initiated:
271
- initiate_node_streaming_output(output)
570
+ yield from initiate_node_streaming_output(output)
272
571
  elif output.is_streaming:
273
572
  if output.name not in streaming_output_queues:
274
- initiate_node_streaming_output(output)
573
+ yield from initiate_node_streaming_output(output)
275
574
 
276
575
  streaming_output_queues[output.name].put(output.delta)
277
- self._workflow_event_inner_queue.put(
278
- NodeExecutionStreamingEvent(
279
- trace_id=execution.trace_id,
280
- span_id=span_id,
281
- body=NodeExecutionStreamingBody(
282
- node_definition=node.__class__,
283
- output=output,
284
- invoked_ports=invoked_ports,
285
- ),
286
- parent=execution.parent_context,
576
+ yield NodeExecutionStreamingEvent(
577
+ trace_id=execution.trace_id,
578
+ span_id=span_id,
579
+ body=NodeExecutionStreamingBody(
580
+ node_definition=node.__class__,
581
+ output=output,
582
+ invoked_ports=invoked_ports,
287
583
  ),
584
+ parent=execution.parent_context,
288
585
  )
289
586
  elif output.is_fulfilled:
290
587
  if output.name in streaming_output_queues:
291
588
  streaming_output_queues[output.name].put(undefined)
292
589
 
293
590
  setattr(outputs, output.name, output.value)
294
- self._workflow_event_inner_queue.put(
295
- NodeExecutionStreamingEvent(
296
- trace_id=execution.trace_id,
297
- span_id=span_id,
298
- body=NodeExecutionStreamingBody(
299
- node_definition=node.__class__,
300
- output=output,
301
- invoked_ports=invoked_ports,
302
- ),
303
- parent=execution.parent_context,
304
- )
591
+ yield NodeExecutionStreamingEvent(
592
+ trace_id=execution.trace_id,
593
+ span_id=span_id,
594
+ body=NodeExecutionStreamingBody(
595
+ node_definition=node.__class__,
596
+ output=output,
597
+ invoked_ports=invoked_ports,
598
+ ),
599
+ parent=execution.parent_context,
305
600
  )
306
601
 
307
602
  node.state.meta.node_execution_cache.fulfill_node_execution(node.__class__, span_id)
308
603
 
309
- with node.state.__atomic__():
310
- for descriptor, output_value in outputs:
311
- if output_value is undefined:
312
- if descriptor in node.state.meta.node_outputs:
313
- del node.state.meta.node_outputs[descriptor]
314
- continue
315
-
316
- node.state.meta.node_outputs[descriptor] = output_value
604
+ with execution_context(parent_context=updated_parent_context, trace_id=execution.trace_id):
605
+ with node.state.__atomic__():
606
+ for descriptor, output_value in outputs:
607
+ if output_value is undefined:
608
+ if descriptor in node.state.meta.node_outputs:
609
+ del node.state.meta.node_outputs[descriptor]
610
+ continue
611
+ node.state.meta.node_outputs[descriptor] = output_value
317
612
 
318
613
  invoked_ports = ports(outputs, node.state)
319
- self._workflow_event_inner_queue.put(
320
- NodeExecutionFulfilledEvent(
321
- trace_id=execution.trace_id,
322
- span_id=span_id,
323
- body=NodeExecutionFulfilledBody(
324
- node_definition=node.__class__,
325
- outputs=outputs,
326
- invoked_ports=invoked_ports,
327
- mocked=was_mocked,
328
- ),
329
- parent=execution.parent_context,
330
- )
614
+ yield NodeExecutionFulfilledEvent(
615
+ trace_id=execution.trace_id,
616
+ span_id=span_id,
617
+ body=NodeExecutionFulfilledBody(
618
+ node_definition=node.__class__,
619
+ outputs=outputs,
620
+ invoked_ports=invoked_ports,
621
+ mocked=was_mocked,
622
+ ),
623
+ parent=execution.parent_context,
331
624
  )
332
625
  except NodeException as e:
333
- logger.info(e)
334
- self._workflow_event_inner_queue.put(
335
- NodeExecutionRejectedEvent(
336
- trace_id=execution.trace_id,
337
- span_id=span_id,
338
- body=NodeExecutionRejectedBody(
339
- node_definition=node.__class__,
340
- error=e.error,
341
- ),
342
- parent=execution.parent_context,
343
- )
344
- )
626
+ yield self._handle_run_node_exception(e, "Node Exception", execution, span_id, node)
345
627
  except WorkflowInitializationException as e:
346
- logger.info(e)
347
- self._workflow_event_inner_queue.put(
348
- NodeExecutionRejectedEvent(
349
- trace_id=execution.trace_id,
350
- span_id=span_id,
351
- body=NodeExecutionRejectedBody(
352
- node_definition=node.__class__,
353
- error=e.error,
354
- ),
355
- parent=execution.parent_context,
356
- )
357
- )
628
+ yield self._handle_run_node_exception(e, "Workflow Initialization Exception", execution, span_id, node)
629
+ except InvalidExpressionException as e:
630
+ yield self._handle_run_node_exception(e, "Invalid Expression Exception", execution, span_id, node)
358
631
  except Exception as e:
359
- logger.exception(f"An unexpected error occurred while running node {node.__class__.__name__}")
632
+ error_message = self._parse_error_message(e)
633
+ captured_stacktrace = traceback.format_exc()
634
+ if error_message is None:
635
+ logger.exception(f"An unexpected error occurred while running node {node.__class__.__name__}")
636
+ error_code = WorkflowErrorCode.INTERNAL_ERROR
637
+ error_message = "Internal error"
638
+ else:
639
+ error_code = WorkflowErrorCode.NODE_EXECUTION
360
640
 
361
- self._workflow_event_inner_queue.put(
362
- NodeExecutionRejectedEvent(
363
- trace_id=execution.trace_id,
364
- span_id=span_id,
365
- body=NodeExecutionRejectedBody(
366
- node_definition=node.__class__,
367
- error=WorkflowError(
368
- message=str(e),
369
- code=WorkflowErrorCode.INTERNAL_ERROR,
370
- ),
641
+ yield NodeExecutionRejectedEvent(
642
+ trace_id=execution.trace_id,
643
+ span_id=span_id,
644
+ body=NodeExecutionRejectedBody(
645
+ node_definition=node.__class__,
646
+ error=WorkflowError(
647
+ message=error_message,
648
+ code=error_code,
371
649
  ),
372
- parent=execution.parent_context,
650
+ stacktrace=captured_stacktrace,
373
651
  ),
652
+ parent=execution.parent_context,
374
653
  )
375
654
 
376
655
  logger.debug(f"Finished running node: {node.__class__.__name__}")
377
656
 
657
+ def _handle_run_node_exception(
658
+ self,
659
+ exception: Union[NodeException, WorkflowInitializationException, InvalidExpressionException],
660
+ prefix: str,
661
+ execution: ExecutionContext,
662
+ span_id: UUID,
663
+ node: BaseNode[StateType],
664
+ ) -> NodeExecutionRejectedEvent:
665
+ logger.info(f"{prefix}: {exception}")
666
+ captured_stacktrace = traceback.format_exc()
667
+
668
+ return NodeExecutionRejectedEvent(
669
+ trace_id=execution.trace_id,
670
+ span_id=span_id,
671
+ body=NodeExecutionRejectedBody(
672
+ node_definition=node.__class__,
673
+ error=exception.error,
674
+ stacktrace=captured_stacktrace,
675
+ ),
676
+ parent=execution.parent_context,
677
+ )
678
+
679
+ def _parse_error_message(self, exception: Exception) -> Optional[str]:
680
+ try:
681
+ _, _, tb = sys.exc_info()
682
+ if tb:
683
+ tb_list = traceback.extract_tb(tb)
684
+ if tb_list:
685
+ for frame in reversed(tb_list):
686
+ exception_module = next(
687
+ (
688
+ mod.__name__
689
+ for mod in sys.modules.values()
690
+ if hasattr(mod, "__file__") and mod.__file__ == frame.filename
691
+ ),
692
+ None,
693
+ )
694
+ if exception_module and not exception_module.startswith("vellum."):
695
+ return str(exception)
696
+ except Exception:
697
+ pass
698
+
699
+ return None
700
+
378
701
  def _context_run_work_item(
379
702
  self,
380
703
  node: BaseNode[StateType],
@@ -398,9 +721,7 @@ class WorkflowRunner(Generic[StateType]):
398
721
  return
399
722
 
400
723
  for port in ports:
401
- nodes_to_fork = []
402
724
  for edge in port.edges:
403
- nodes_to_fork.append(edge.to_node)
404
725
  if port.fork_state:
405
726
  next_state = deepcopy(state)
406
727
  self._state_forks.add(next_state)
@@ -411,21 +732,6 @@ class WorkflowRunner(Generic[StateType]):
411
732
  self._concurrency_queue.put((next_state, edge.to_node, invoked_by))
412
733
  else:
413
734
  self._run_node_if_ready(next_state, edge.to_node, invoked_by)
414
- if invoked_by:
415
- previous_node = state.meta.node_execution_cache.__node_execution_lookup__.get(invoked_by)
416
- if previous_node:
417
- previous_node_fork_id = state.meta.node_execution_cache.__node_to_fork_id__.get(previous_node)
418
- if previous_node_fork_id:
419
- state.meta.node_execution_cache.__node_to_fork_id__[edge.to_node] = previous_node_fork_id
420
- # Remove previous node fork in __node_to_fork_id__
421
- state.meta.node_execution_cache.__node_to_fork_id__.pop(previous_node, None)
422
-
423
- # If there are multiple edges, we need to create a fork ID
424
- if len(nodes_to_fork) > 1:
425
- fork_id = uuid4()
426
- state.meta.node_execution_cache.__all_fork_ids__.add(fork_id)
427
- for node in nodes_to_fork:
428
- state.meta.node_execution_cache.__node_to_fork_id__[node] = fork_id
429
735
 
430
736
  if self._max_concurrency:
431
737
  num_nodes_to_run = self._max_concurrency - len(self._active_nodes_by_execution_id)
@@ -453,8 +759,24 @@ class WorkflowRunner(Generic[StateType]):
453
759
 
454
760
  all_deps = self._dependencies[node_class]
455
761
  node_span_id = node_class.Trigger._queue_node_execution(state, all_deps, invoked_by)
456
- if not node_class.Trigger.should_initiate(state, all_deps, node_span_id):
457
- return
762
+
763
+ try:
764
+ if not node_class.Trigger.should_initiate(state, all_deps, node_span_id):
765
+ return
766
+ except NodeException as e:
767
+ execution = get_execution_context()
768
+
769
+ self._workflow_event_outer_queue.put(
770
+ WorkflowExecutionRejectedEvent(
771
+ trace_id=execution.trace_id,
772
+ span_id=node_span_id,
773
+ body=WorkflowExecutionRejectedBody(
774
+ workflow_definition=self.workflow.__class__,
775
+ error=e.error,
776
+ ),
777
+ )
778
+ )
779
+ raise e
458
780
 
459
781
  execution = get_execution_context()
460
782
  node = node_class(state=state, context=self.workflow.context)
@@ -472,7 +794,7 @@ class WorkflowRunner(Generic[StateType]):
472
794
  )
473
795
  worker_thread.start()
474
796
 
475
- def _handle_work_item_event(self, event: WorkflowEvent) -> Optional[WorkflowError]:
797
+ def _handle_work_item_event(self, event: WorkflowEvent) -> Optional[NodeExecutionRejectedEvent]:
476
798
  active_node = self._active_nodes_by_execution_id.get(event.span_id)
477
799
  if not active_node:
478
800
  return None
@@ -480,10 +802,23 @@ class WorkflowRunner(Generic[StateType]):
480
802
  node = active_node.node
481
803
  if event.name == "node.execution.rejected":
482
804
  self._active_nodes_by_execution_id.pop(event.span_id)
483
- return event.error
805
+ return event
484
806
 
485
807
  if event.name == "node.execution.streaming":
486
808
  for workflow_output_descriptor in self.workflow.Outputs:
809
+ if node.__directly_emit_workflow_output__(event, workflow_output_descriptor):
810
+ active_node.was_outputs_streamed = True
811
+ self._workflow_event_outer_queue.put(
812
+ self._stream_workflow_event(
813
+ BaseOutput(
814
+ name=workflow_output_descriptor.name,
815
+ value=event.output.value,
816
+ delta=event.output.delta,
817
+ )
818
+ )
819
+ )
820
+ return None
821
+
487
822
  node_output_descriptor = workflow_output_descriptor.instance
488
823
  if not isinstance(node_output_descriptor, OutputReference):
489
824
  continue
@@ -535,7 +870,67 @@ class WorkflowRunner(Generic[StateType]):
535
870
 
536
871
  return None
537
872
 
873
+ def _emit_node_cancellation_events(
874
+ self,
875
+ error_message: str,
876
+ ) -> None:
877
+ """
878
+ Emit node cancellation events for all active nodes.
879
+
880
+ Args:
881
+ error_message: The error message to include in the cancellation events
882
+ """
883
+ parent_context = WorkflowParentContext(
884
+ span_id=self._initial_state.meta.span_id,
885
+ workflow_definition=self.workflow.__class__,
886
+ parent=self._execution_context.parent_context,
887
+ )
888
+ captured_stacktrace = "".join(traceback.format_stack())
889
+ active_span_ids = list(self._active_nodes_by_execution_id.keys())
890
+ for span_id in active_span_ids:
891
+ active_node = self._active_nodes_by_execution_id.pop(span_id, None)
892
+ if active_node is not None:
893
+ active_node.node.__cancel__(error_message)
894
+
895
+ rejection_event = NodeExecutionRejectedEvent(
896
+ trace_id=self._execution_context.trace_id,
897
+ span_id=span_id,
898
+ body=NodeExecutionRejectedBody(
899
+ node_definition=active_node.node.__class__,
900
+ error=WorkflowError(
901
+ code=WorkflowErrorCode.NODE_CANCELLED,
902
+ message=error_message,
903
+ ),
904
+ stacktrace=captured_stacktrace,
905
+ ),
906
+ parent=parent_context,
907
+ )
908
+ self._workflow_event_outer_queue.put(rejection_event)
909
+
538
910
  def _initiate_workflow_event(self) -> WorkflowExecutionInitiatedEvent:
911
+ links: Optional[List[SpanLink]] = None
912
+
913
+ if self._span_link_info:
914
+ previous_trace_id, previous_span_id, root_trace_id, root_span_id = self._span_link_info
915
+ links = [
916
+ SpanLink(
917
+ trace_id=previous_trace_id,
918
+ type="PREVIOUS_SPAN",
919
+ span_context=WorkflowParentContext(
920
+ workflow_definition=self.workflow.__class__,
921
+ span_id=previous_span_id,
922
+ ),
923
+ ),
924
+ SpanLink(
925
+ trace_id=root_trace_id,
926
+ type="ROOT_SPAN",
927
+ span_context=WorkflowParentContext(
928
+ workflow_definition=self.workflow.__class__,
929
+ span_id=root_span_id,
930
+ ),
931
+ ),
932
+ ]
933
+
539
934
  return WorkflowExecutionInitiatedEvent(
540
935
  trace_id=self._execution_context.trace_id,
541
936
  span_id=self._initial_state.meta.span_id,
@@ -543,8 +938,10 @@ class WorkflowRunner(Generic[StateType]):
543
938
  workflow_definition=self.workflow.__class__,
544
939
  inputs=self._initial_state.meta.workflow_inputs,
545
940
  initial_state=deepcopy(self._initial_state) if self._should_emit_initial_state else None,
941
+ trigger=self._trigger.__class__ if self._trigger else None,
546
942
  ),
547
943
  parent=self._execution_context.parent_context,
944
+ links=links,
548
945
  )
549
946
 
550
947
  def _stream_workflow_event(self, output: BaseOutput) -> WorkflowExecutionStreamingEvent:
@@ -558,24 +955,36 @@ class WorkflowRunner(Generic[StateType]):
558
955
  parent=self._execution_context.parent_context,
559
956
  )
560
957
 
561
- def _fulfill_workflow_event(self, outputs: OutputsType) -> WorkflowExecutionFulfilledEvent:
958
+ def _fulfill_workflow_event(self, outputs: OutputsType, final_state: StateType) -> WorkflowExecutionFulfilledEvent:
562
959
  return WorkflowExecutionFulfilledEvent(
563
960
  trace_id=self._execution_context.trace_id,
564
961
  span_id=self._initial_state.meta.span_id,
565
962
  body=WorkflowExecutionFulfilledBody(
566
963
  workflow_definition=self.workflow.__class__,
567
964
  outputs=outputs,
965
+ final_state=final_state,
568
966
  ),
569
967
  parent=self._execution_context.parent_context,
570
968
  )
571
969
 
572
- def _reject_workflow_event(self, error: WorkflowError) -> WorkflowExecutionRejectedEvent:
970
+ def _reject_workflow_event(
971
+ self, error: WorkflowError, captured_stacktrace: Optional[str] = None
972
+ ) -> WorkflowExecutionRejectedEvent:
973
+ if captured_stacktrace is None:
974
+ try:
975
+ captured_stacktrace = traceback.format_exc()
976
+ if captured_stacktrace.strip() == "NoneType: None":
977
+ captured_stacktrace = None
978
+ except Exception:
979
+ pass
980
+
573
981
  return WorkflowExecutionRejectedEvent(
574
982
  trace_id=self._execution_context.trace_id,
575
983
  span_id=self._initial_state.meta.span_id,
576
984
  body=WorkflowExecutionRejectedBody(
577
985
  workflow_definition=self.workflow.__class__,
578
986
  error=error,
987
+ stacktrace=captured_stacktrace,
579
988
  ),
580
989
  parent=self._execution_context.parent_context,
581
990
  )
@@ -601,6 +1010,11 @@ class WorkflowRunner(Generic[StateType]):
601
1010
  parent=self._execution_context.parent_context,
602
1011
  )
603
1012
 
1013
+ def _wrapped_stream(self) -> None:
1014
+ """Wrapper for _stream that adds httpx logger span ID context."""
1015
+ with self._httpx_logger_with_span_id():
1016
+ self._stream()
1017
+
604
1018
  def _stream(self) -> None:
605
1019
  for edge in self.workflow.get_edges():
606
1020
  self._dependencies[edge.to_node].add(edge.from_port.node_class)
@@ -619,22 +1033,26 @@ class WorkflowRunner(Generic[StateType]):
619
1033
  else:
620
1034
  self._concurrency_queue.put((self._initial_state, node_cls, None))
621
1035
  except NodeException as e:
622
- self._workflow_event_outer_queue.put(self._reject_workflow_event(e.error))
1036
+ captured_stacktrace = traceback.format_exc()
1037
+ self._workflow_event_outer_queue.put(self._reject_workflow_event(e.error, captured_stacktrace))
623
1038
  return
624
1039
  except WorkflowInitializationException as e:
625
- self._workflow_event_outer_queue.put(self._reject_workflow_event(e.error))
1040
+ captured_stacktrace = traceback.format_exc()
1041
+ self._workflow_event_outer_queue.put(self._reject_workflow_event(e.error, captured_stacktrace))
626
1042
  return
627
1043
  except Exception:
628
1044
  err_message = f"An unexpected error occurred while initializing node {node_cls.__name__}"
629
1045
  logger.exception(err_message)
1046
+ captured_stacktrace = traceback.format_exc()
630
1047
  self._workflow_event_outer_queue.put(
631
1048
  self._reject_workflow_event(
632
1049
  WorkflowError(code=WorkflowErrorCode.INTERNAL_ERROR, message=err_message),
1050
+ captured_stacktrace,
633
1051
  )
634
1052
  )
635
1053
  return
636
1054
 
637
- rejection_error: Optional[WorkflowError] = None
1055
+ rejection_event: Optional[NodeExecutionRejectedEvent] = None
638
1056
 
639
1057
  while True:
640
1058
  if not self._active_nodes_by_execution_id:
@@ -645,9 +1063,13 @@ class WorkflowRunner(Generic[StateType]):
645
1063
  self._workflow_event_outer_queue.put(event)
646
1064
 
647
1065
  with execution_context(parent_context=current_parent, trace_id=self._execution_context.trace_id):
648
- rejection_error = self._handle_work_item_event(event)
1066
+ rejection_event = self._handle_work_item_event(event)
649
1067
 
650
- if rejection_error:
1068
+ if rejection_event:
1069
+ failed_node_name = rejection_event.body.node_definition.__name__
1070
+ self._emit_node_cancellation_events(
1071
+ error_message=f"Node execution cancelled due to {failed_node_name} failure",
1072
+ )
651
1073
  break
652
1074
 
653
1075
  # Handle any remaining events
@@ -656,9 +1078,9 @@ class WorkflowRunner(Generic[StateType]):
656
1078
  self._workflow_event_outer_queue.put(event)
657
1079
 
658
1080
  with execution_context(parent_context=current_parent, trace_id=self._execution_context.trace_id):
659
- rejection_error = self._handle_work_item_event(event)
1081
+ rejection_event = self._handle_work_item_event(event)
660
1082
 
661
- if rejection_error:
1083
+ if rejection_event:
662
1084
  break
663
1085
  except Empty:
664
1086
  pass
@@ -678,8 +1100,10 @@ class WorkflowRunner(Generic[StateType]):
678
1100
  )
679
1101
  return
680
1102
 
681
- if rejection_error:
682
- self._workflow_event_outer_queue.put(self._reject_workflow_event(rejection_error))
1103
+ if rejection_event:
1104
+ self._workflow_event_outer_queue.put(
1105
+ self._reject_workflow_event(rejection_event.error, rejection_event.body.stacktrace)
1106
+ )
683
1107
  return
684
1108
 
685
1109
  fulfilled_outputs = self.workflow.Outputs()
@@ -693,7 +1117,7 @@ class WorkflowRunner(Generic[StateType]):
693
1117
  descriptor.instance.resolve(final_state),
694
1118
  )
695
1119
 
696
- self._workflow_event_outer_queue.put(self._fulfill_workflow_event(fulfilled_outputs))
1120
+ self._workflow_event_outer_queue.put(self._fulfill_workflow_event(fulfilled_outputs, final_state))
697
1121
 
698
1122
  def _run_background_thread(self) -> None:
699
1123
  state_class = self.workflow.get_state_class()
@@ -715,16 +1139,44 @@ class WorkflowRunner(Generic[StateType]):
715
1139
 
716
1140
  while not kill_switch.wait(timeout=0.1):
717
1141
  if self._cancel_signal.is_set():
1142
+ self._emit_node_cancellation_events(
1143
+ error_message="Workflow run cancelled",
1144
+ )
1145
+
1146
+ captured_stacktrace = "".join(traceback.format_stack())
718
1147
  self._workflow_event_outer_queue.put(
719
1148
  self._reject_workflow_event(
720
1149
  WorkflowError(
721
1150
  code=WorkflowErrorCode.WORKFLOW_CANCELLED,
722
1151
  message="Workflow run cancelled",
723
- )
1152
+ ),
1153
+ captured_stacktrace,
724
1154
  )
725
1155
  )
726
1156
  return
727
1157
 
1158
+ def _run_timeout_thread(self, kill_switch: ThreadingEvent) -> None:
1159
+ if not self._timeout:
1160
+ return
1161
+
1162
+ if kill_switch.wait(timeout=self._timeout):
1163
+ return
1164
+
1165
+ self._emit_node_cancellation_events(
1166
+ error_message=f"Workflow execution exceeded timeout of {self._timeout} seconds",
1167
+ )
1168
+
1169
+ captured_stacktrace = "".join(traceback.format_stack())
1170
+ self._workflow_event_outer_queue.put(
1171
+ self._reject_workflow_event(
1172
+ WorkflowError(
1173
+ code=WorkflowErrorCode.WORKFLOW_TIMEOUT,
1174
+ message=f"Workflow execution exceeded timeout of {self._timeout} seconds",
1175
+ ),
1176
+ captured_stacktrace,
1177
+ )
1178
+ )
1179
+
728
1180
  def _is_terminal_event(self, event: WorkflowEvent) -> bool:
729
1181
  if (
730
1182
  event.name == "workflow.execution.fulfilled"
@@ -734,21 +1186,30 @@ class WorkflowRunner(Generic[StateType]):
734
1186
  return event.workflow_definition == self.workflow.__class__
735
1187
  return False
736
1188
 
737
- def stream(self) -> WorkflowEventStream:
738
- background_thread = Thread(
1189
+ def _generate_events(self) -> Generator[WorkflowEvent, None, None]:
1190
+ self._background_thread = Thread(
739
1191
  target=self._run_background_thread,
740
1192
  name=f"{self.workflow.__class__.__name__}.background_thread",
741
1193
  )
742
- background_thread.start()
1194
+ self._background_thread.start()
743
1195
 
744
1196
  cancel_thread_kill_switch = ThreadingEvent()
745
1197
  if self._cancel_signal:
746
- cancel_thread = Thread(
1198
+ self._cancel_thread = Thread(
747
1199
  target=self._run_cancel_thread,
748
1200
  name=f"{self.workflow.__class__.__name__}.cancel_thread",
749
1201
  kwargs={"kill_switch": cancel_thread_kill_switch},
750
1202
  )
751
- cancel_thread.start()
1203
+ self._cancel_thread.start()
1204
+
1205
+ timeout_thread_kill_switch = ThreadingEvent()
1206
+ if self._timeout:
1207
+ self._timeout_thread = Thread(
1208
+ target=self._run_timeout_thread,
1209
+ name=f"{self.workflow.__class__.__name__}.timeout_thread",
1210
+ kwargs={"kill_switch": timeout_thread_kill_switch},
1211
+ )
1212
+ self._timeout_thread.start()
752
1213
 
753
1214
  event: WorkflowEvent
754
1215
  if self._is_resuming:
@@ -759,13 +1220,13 @@ class WorkflowRunner(Generic[StateType]):
759
1220
  yield self._emit_event(event)
760
1221
 
761
1222
  # The extra level of indirection prevents the runner from waiting on the caller to consume the event stream
762
- stream_thread = Thread(
763
- target=self._stream,
1223
+ self._stream_thread = Thread(
1224
+ target=self._wrapped_stream,
764
1225
  name=f"{self.workflow.__class__.__name__}.stream_thread",
765
1226
  )
766
- stream_thread.start()
1227
+ self._stream_thread.start()
767
1228
 
768
- while stream_thread.is_alive():
1229
+ while self._stream_thread.is_alive():
769
1230
  try:
770
1231
  event = self._workflow_event_outer_queue.get(timeout=0.1)
771
1232
  except Empty:
@@ -792,3 +1253,24 @@ class WorkflowRunner(Generic[StateType]):
792
1253
 
793
1254
  self._background_thread_queue.put(None)
794
1255
  cancel_thread_kill_switch.set()
1256
+ timeout_thread_kill_switch.set()
1257
+
1258
+ def stream(self) -> WorkflowEventStream:
1259
+ return WorkflowEventGenerator(self._generate_events(), self._initial_state.meta.span_id)
1260
+
1261
+ def join(self) -> None:
1262
+ """
1263
+ Wait for all background threads to complete.
1264
+ This ensures all pending work is finished before the runner terminates.
1265
+ """
1266
+ if self._stream_thread and self._stream_thread.is_alive():
1267
+ self._stream_thread.join()
1268
+
1269
+ if self._background_thread and self._background_thread.is_alive():
1270
+ self._background_thread.join()
1271
+
1272
+ if self._cancel_thread and self._cancel_thread.is_alive():
1273
+ self._cancel_thread.join()
1274
+
1275
+ if self._timeout_thread and self._timeout_thread.is_alive():
1276
+ self._timeout_thread.join()