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