vellum-ai 0.14.41__py3-none-any.whl → 1.11.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1326) hide show
  1. vellum/__init__.py +281 -8
  2. vellum/client/README.md +70 -17
  3. vellum/client/__init__.py +598 -1371
  4. vellum/client/core/__init__.py +5 -0
  5. vellum/client/core/api_error.py +13 -5
  6. vellum/client/core/client_wrapper.py +31 -5
  7. vellum/client/core/file.py +13 -8
  8. vellum/client/core/force_multipart.py +16 -0
  9. vellum/client/core/http_client.py +76 -20
  10. vellum/client/core/http_response.py +55 -0
  11. vellum/client/core/jsonable_encoder.py +0 -1
  12. vellum/client/core/pydantic_utilities.py +95 -119
  13. vellum/client/core/request_options.py +3 -0
  14. vellum/client/core/serialization.py +7 -3
  15. vellum/client/errors/__init__.py +14 -1
  16. vellum/client/errors/bad_request_error.py +4 -3
  17. vellum/client/errors/forbidden_error.py +4 -3
  18. vellum/client/errors/internal_server_error.py +4 -3
  19. vellum/client/errors/misdirected_request_error.py +11 -0
  20. vellum/client/errors/not_found_error.py +4 -3
  21. vellum/client/errors/too_many_requests_error.py +11 -0
  22. vellum/client/errors/unauthorized_error.py +11 -0
  23. vellum/client/raw_client.py +2725 -0
  24. vellum/client/reference.md +2489 -1038
  25. vellum/client/resources/__init__.py +16 -2
  26. vellum/client/resources/ad_hoc/__init__.py +2 -0
  27. vellum/client/resources/ad_hoc/client.py +173 -365
  28. vellum/client/resources/ad_hoc/raw_client.py +569 -0
  29. vellum/client/resources/container_images/__init__.py +2 -0
  30. vellum/client/resources/container_images/client.py +72 -185
  31. vellum/client/resources/container_images/raw_client.py +407 -0
  32. vellum/client/resources/deployments/__init__.py +2 -0
  33. vellum/client/resources/deployments/client.py +211 -424
  34. vellum/client/resources/deployments/raw_client.py +1002 -0
  35. vellum/client/resources/deployments/types/__init__.py +2 -0
  36. vellum/client/resources/document_indexes/__init__.py +2 -0
  37. vellum/client/resources/document_indexes/client.py +131 -365
  38. vellum/client/resources/document_indexes/raw_client.py +866 -0
  39. vellum/client/resources/document_indexes/types/__init__.py +2 -0
  40. vellum/client/resources/documents/__init__.py +2 -0
  41. vellum/client/resources/documents/client.py +93 -325
  42. vellum/client/resources/documents/raw_client.py +662 -0
  43. vellum/client/resources/{release_reviews → environments}/__init__.py +2 -0
  44. vellum/client/resources/environments/client.py +106 -0
  45. vellum/client/resources/environments/raw_client.py +95 -0
  46. vellum/client/resources/events/__init__.py +4 -0
  47. vellum/client/resources/events/client.py +201 -0
  48. vellum/client/resources/events/raw_client.py +211 -0
  49. vellum/client/resources/folder_entities/__init__.py +2 -0
  50. vellum/client/resources/folder_entities/client.py +56 -89
  51. vellum/client/resources/folder_entities/raw_client.py +276 -0
  52. vellum/client/resources/folder_entities/types/__init__.py +2 -0
  53. vellum/client/resources/integration_auth_configs/__init__.py +4 -0
  54. vellum/client/resources/integration_auth_configs/client.py +186 -0
  55. vellum/client/resources/integration_auth_configs/raw_client.py +171 -0
  56. vellum/client/resources/integration_providers/__init__.py +4 -0
  57. vellum/client/resources/integration_providers/client.py +299 -0
  58. vellum/client/resources/integration_providers/raw_client.py +275 -0
  59. vellum/client/resources/integrations/__init__.py +4 -0
  60. vellum/client/resources/integrations/client.py +466 -0
  61. vellum/client/resources/integrations/raw_client.py +557 -0
  62. vellum/client/resources/metric_definitions/__init__.py +2 -0
  63. vellum/client/resources/metric_definitions/client.py +60 -100
  64. vellum/client/resources/metric_definitions/raw_client.py +224 -0
  65. vellum/client/resources/ml_models/__init__.py +2 -0
  66. vellum/client/resources/ml_models/client.py +37 -46
  67. vellum/client/resources/ml_models/raw_client.py +102 -0
  68. vellum/client/resources/organizations/__init__.py +2 -0
  69. vellum/client/resources/organizations/client.py +37 -45
  70. vellum/client/resources/organizations/raw_client.py +95 -0
  71. vellum/client/resources/prompts/__init__.py +2 -0
  72. vellum/client/resources/prompts/client.py +210 -95
  73. vellum/client/resources/prompts/raw_client.py +353 -0
  74. vellum/client/resources/sandboxes/__init__.py +2 -0
  75. vellum/client/resources/sandboxes/client.py +69 -147
  76. vellum/client/resources/sandboxes/raw_client.py +392 -0
  77. vellum/client/resources/test_suite_runs/__init__.py +2 -0
  78. vellum/client/resources/test_suite_runs/client.py +65 -151
  79. vellum/client/resources/test_suite_runs/raw_client.py +354 -0
  80. vellum/client/resources/test_suites/__init__.py +2 -0
  81. vellum/client/resources/test_suites/client.py +162 -266
  82. vellum/client/resources/test_suites/raw_client.py +530 -0
  83. vellum/client/resources/uploaded_files/__init__.py +4 -0
  84. vellum/client/resources/uploaded_files/client.py +230 -0
  85. vellum/client/resources/uploaded_files/raw_client.py +316 -0
  86. vellum/client/resources/workflow_deployments/__init__.py +2 -0
  87. vellum/client/resources/workflow_deployments/client.py +312 -355
  88. vellum/client/resources/workflow_deployments/raw_client.py +1059 -0
  89. vellum/client/resources/workflow_deployments/types/__init__.py +2 -0
  90. vellum/client/resources/workflow_executions/__init__.py +4 -0
  91. vellum/client/resources/workflow_executions/client.py +140 -0
  92. vellum/client/resources/workflow_executions/raw_client.py +173 -0
  93. vellum/client/resources/workflow_sandboxes/__init__.py +2 -0
  94. vellum/client/resources/workflow_sandboxes/client.py +58 -117
  95. vellum/client/resources/workflow_sandboxes/raw_client.py +291 -0
  96. vellum/client/resources/workflow_sandboxes/types/__init__.py +2 -0
  97. vellum/client/resources/workflows/__init__.py +2 -0
  98. vellum/client/resources/workflows/client.py +258 -141
  99. vellum/client/resources/workflows/raw_client.py +547 -0
  100. vellum/client/resources/workspace_secrets/__init__.py +2 -0
  101. vellum/client/resources/workspace_secrets/client.py +43 -94
  102. vellum/client/resources/workspace_secrets/raw_client.py +219 -0
  103. vellum/client/resources/workspaces/__init__.py +2 -0
  104. vellum/client/resources/workspaces/client.py +37 -45
  105. vellum/client/resources/workspaces/raw_client.py +95 -0
  106. vellum/client/tests/__init__.py +0 -0
  107. vellum/client/tests/test_utils.py +34 -0
  108. vellum/client/types/__init__.py +254 -4
  109. vellum/client/types/ad_hoc_execute_prompt_event.py +3 -2
  110. vellum/client/types/ad_hoc_expand_meta.py +2 -2
  111. vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py +3 -3
  112. vellum/client/types/ad_hoc_initiated_prompt_execution_meta.py +2 -2
  113. vellum/client/types/ad_hoc_rejected_prompt_execution_meta.py +3 -3
  114. vellum/client/types/ad_hoc_streaming_prompt_execution_meta.py +2 -2
  115. vellum/client/types/api_actor_type_enum.py +7 -0
  116. vellum/client/types/api_node_result.py +3 -3
  117. vellum/client/types/api_node_result_data.py +4 -4
  118. vellum/client/types/api_request_parent_context.py +18 -17
  119. vellum/client/types/api_version_enum.py +1 -1
  120. vellum/client/types/array_chat_message_content.py +3 -3
  121. vellum/client/types/array_chat_message_content_item.py +7 -4
  122. vellum/client/types/array_chat_message_content_item_request.py +7 -4
  123. vellum/client/types/array_chat_message_content_request.py +3 -3
  124. vellum/client/types/array_input.py +9 -8
  125. vellum/client/types/array_vellum_value.py +4 -4
  126. vellum/client/types/array_vellum_value_request.py +4 -4
  127. vellum/client/types/audio_chat_message_content.py +3 -3
  128. vellum/client/types/audio_chat_message_content_request.py +3 -3
  129. vellum/client/types/audio_input.py +30 -0
  130. vellum/client/types/audio_input_request.py +30 -0
  131. vellum/client/types/audio_prompt_block.py +4 -4
  132. vellum/client/types/audio_vellum_value.py +3 -3
  133. vellum/client/types/audio_vellum_value_request.py +3 -3
  134. vellum/client/types/auth_type_enum.py +5 -0
  135. vellum/client/types/base_output.py +4 -4
  136. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large.py +2 -2
  137. vellum/client/types/basic_vectorizer_intfloat_multilingual_e_5_large_request.py +2 -2
  138. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1.py +2 -2
  139. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_cos_v_1_request.py +2 -2
  140. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1.py +2 -2
  141. vellum/client/types/basic_vectorizer_sentence_transformers_multi_qa_mpnet_base_dot_v_1_request.py +2 -2
  142. vellum/client/types/build_status_enum.py +5 -0
  143. vellum/client/types/chat_history_input.py +3 -3
  144. vellum/client/types/chat_history_input_request.py +3 -3
  145. vellum/client/types/chat_history_vellum_value.py +3 -3
  146. vellum/client/types/chat_history_vellum_value_request.py +3 -3
  147. vellum/client/types/chat_message.py +4 -4
  148. vellum/client/types/chat_message_content.py +7 -4
  149. vellum/client/types/chat_message_content_request.py +7 -4
  150. vellum/client/types/chat_message_prompt_block.py +7 -7
  151. vellum/client/types/chat_message_request.py +4 -4
  152. vellum/client/types/code_execution_node_array_result.py +8 -7
  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 +7 -6
  159. vellum/client/types/code_execution_node_result_data.py +7 -6
  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_executor_input.py +15 -6
  165. vellum/client/types/code_executor_response.py +8 -7
  166. vellum/client/types/code_executor_secret_input.py +3 -3
  167. vellum/client/types/code_resource_definition.py +3 -3
  168. vellum/client/types/compile_prompt_deployment_expand_meta_request.py +2 -2
  169. vellum/client/types/compile_prompt_meta.py +2 -2
  170. vellum/client/types/components_schemas_composio_execute_tool_request.py +5 -0
  171. vellum/client/types/components_schemas_composio_execute_tool_response.py +5 -0
  172. vellum/client/types/components_schemas_composio_integration_exec_config.py +5 -0
  173. vellum/client/types/components_schemas_composio_tool_definition.py +5 -0
  174. vellum/client/types/components_schemas_prompt_version_build_config_sandbox.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 +24 -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 +30 -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 +21 -0
  183. vellum/client/types/container_image_container_image_tag.py +2 -2
  184. vellum/client/types/container_image_read.py +8 -4
  185. vellum/client/types/create_test_suite_test_case_request.py +6 -5
  186. vellum/client/types/create_workflow_event_request.py +7 -0
  187. vellum/client/types/dataset_row_push_request.py +20 -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 +7 -6
  193. vellum/client/types/deployment_provider_payload_response.py +4 -4
  194. vellum/client/types/deployment_read.py +14 -13
  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 +9 -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_body.py +3 -1
  224. vellum/client/types/execute_api_request_headers_value.py +1 -0
  225. vellum/client/types/execute_api_response.py +6 -7
  226. vellum/client/types/execute_api_response_json.py +7 -0
  227. vellum/client/types/execute_prompt_event.py +3 -2
  228. vellum/client/types/execute_prompt_response.py +1 -0
  229. vellum/client/types/execute_workflow_async_response.py +26 -0
  230. vellum/client/types/execute_workflow_response.py +7 -6
  231. vellum/client/types/execute_workflow_workflow_result_event.py +1 -0
  232. vellum/client/types/execution_array_vellum_value.py +9 -8
  233. vellum/client/types/execution_audio_vellum_value.py +31 -0
  234. vellum/client/types/execution_chat_history_vellum_value.py +3 -3
  235. vellum/client/types/execution_document_vellum_value.py +31 -0
  236. vellum/client/types/execution_error_vellum_value.py +3 -3
  237. vellum/client/types/execution_function_call_vellum_value.py +3 -3
  238. vellum/client/types/execution_image_vellum_value.py +31 -0
  239. vellum/client/types/execution_json_vellum_value.py +3 -3
  240. vellum/client/types/execution_number_vellum_value.py +3 -3
  241. vellum/client/types/execution_search_results_vellum_value.py +3 -3
  242. vellum/client/types/execution_string_vellum_value.py +3 -3
  243. vellum/client/types/execution_thinking_vellum_value.py +31 -0
  244. vellum/client/types/execution_vellum_value.py +16 -5
  245. vellum/client/types/execution_video_vellum_value.py +31 -0
  246. vellum/client/types/external_input_descriptor.py +3 -3
  247. vellum/client/types/external_parent_context.py +38 -0
  248. vellum/client/types/external_test_case_execution.py +7 -6
  249. vellum/client/types/external_test_case_execution_request.py +7 -6
  250. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15.py +23 -0
  251. vellum/client/types/fast_embed_vectorizer_baai_bge_small_en_v_15_request.py +23 -0
  252. vellum/client/types/folder_entity.py +5 -2
  253. vellum/client/types/folder_entity_dataset.py +26 -0
  254. vellum/client/types/folder_entity_dataset_data.py +25 -0
  255. vellum/client/types/folder_entity_document_index.py +3 -3
  256. vellum/client/types/folder_entity_document_index_data.py +5 -3
  257. vellum/client/types/folder_entity_folder.py +3 -3
  258. vellum/client/types/folder_entity_folder_data.py +2 -2
  259. vellum/client/types/folder_entity_prompt_sandbox.py +3 -3
  260. vellum/client/types/folder_entity_prompt_sandbox_data.py +4 -3
  261. vellum/client/types/folder_entity_test_suite.py +3 -3
  262. vellum/client/types/folder_entity_test_suite_data.py +3 -3
  263. vellum/client/types/folder_entity_workflow_sandbox.py +3 -3
  264. vellum/client/types/folder_entity_workflow_sandbox_data.py +6 -3
  265. vellum/client/types/fulfilled_ad_hoc_execute_prompt_event.py +4 -4
  266. vellum/client/types/fulfilled_execute_prompt_event.py +4 -4
  267. vellum/client/types/fulfilled_execute_prompt_response.py +3 -3
  268. vellum/client/types/fulfilled_execute_workflow_workflow_result_event.py +8 -9
  269. vellum/client/types/fulfilled_prompt_execution_meta.py +3 -3
  270. vellum/client/types/fulfilled_workflow_node_result_event.py +9 -8
  271. vellum/client/types/function_call.py +2 -2
  272. vellum/client/types/function_call_chat_message_content.py +3 -3
  273. vellum/client/types/function_call_chat_message_content_request.py +3 -3
  274. vellum/client/types/function_call_chat_message_content_value.py +2 -2
  275. vellum/client/types/function_call_chat_message_content_value_request.py +2 -2
  276. vellum/client/types/function_call_input.py +3 -3
  277. vellum/client/types/function_call_prompt_block.py +4 -4
  278. vellum/client/types/function_call_request.py +2 -2
  279. vellum/client/types/function_call_vellum_value.py +3 -3
  280. vellum/client/types/function_call_vellum_value_request.py +3 -3
  281. vellum/client/types/function_definition.py +9 -4
  282. vellum/client/types/generate_options_request.py +3 -3
  283. vellum/client/types/generate_request.py +2 -2
  284. vellum/client/types/generate_response.py +3 -3
  285. vellum/client/types/generate_result.py +3 -3
  286. vellum/client/types/generate_result_data.py +3 -3
  287. vellum/client/types/generate_result_error.py +3 -3
  288. vellum/client/types/generate_stream_response.py +3 -3
  289. vellum/client/types/generate_stream_result.py +4 -4
  290. vellum/client/types/generate_stream_result_data.py +3 -3
  291. vellum/client/types/google_vertex_ai_vectorizer_config.py +2 -2
  292. vellum/client/types/google_vertex_ai_vectorizer_config_request.py +2 -2
  293. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001.py +21 -0
  294. vellum/client/types/google_vertex_ai_vectorizer_gemini_embedding_001_request.py +21 -0
  295. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004.py +3 -3
  296. vellum/client/types/google_vertex_ai_vectorizer_text_embedding_004_request.py +3 -3
  297. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002.py +3 -3
  298. vellum/client/types/google_vertex_ai_vectorizer_text_multilingual_embedding_002_request.py +3 -3
  299. vellum/client/types/hkunlp_instructor_xl_vectorizer.py +3 -3
  300. vellum/client/types/hkunlp_instructor_xl_vectorizer_request.py +3 -3
  301. vellum/client/types/image_chat_message_content.py +3 -3
  302. vellum/client/types/image_chat_message_content_request.py +3 -3
  303. vellum/client/types/image_input.py +30 -0
  304. vellum/client/types/image_input_request.py +30 -0
  305. vellum/client/types/image_prompt_block.py +4 -4
  306. vellum/client/types/image_vellum_value.py +3 -3
  307. vellum/client/types/image_vellum_value_request.py +3 -3
  308. vellum/client/types/indexing_config_vectorizer.py +11 -4
  309. vellum/client/types/indexing_config_vectorizer_request.py +11 -4
  310. vellum/client/types/initiated_ad_hoc_execute_prompt_event.py +3 -3
  311. vellum/client/types/initiated_execute_prompt_event.py +3 -3
  312. vellum/client/types/initiated_prompt_execution_meta.py +2 -2
  313. vellum/client/types/initiated_workflow_node_result_event.py +9 -8
  314. vellum/client/types/instructor_vectorizer_config.py +2 -2
  315. vellum/client/types/instructor_vectorizer_config_request.py +2 -2
  316. vellum/client/types/integration.py +27 -0
  317. vellum/client/types/integration_auth_config_integration.py +23 -0
  318. vellum/client/types/integration_auth_config_integration_credential.py +19 -0
  319. vellum/client/types/integration_credential_access_type.py +5 -0
  320. vellum/client/types/integration_name.py +85 -0
  321. vellum/client/types/integration_provider.py +5 -0
  322. vellum/client/types/integration_read.py +30 -0
  323. vellum/client/types/integration_trigger_context.py +39 -0
  324. vellum/client/types/invoked_port.py +2 -2
  325. vellum/client/types/jinja_prompt_block.py +4 -4
  326. vellum/client/types/json_input.py +3 -3
  327. vellum/client/types/json_input_request.py +3 -3
  328. vellum/client/types/json_vellum_value.py +2 -2
  329. vellum/client/types/json_vellum_value_request.py +2 -2
  330. vellum/client/types/logical_operator.py +4 -0
  331. vellum/client/types/map_node_result.py +3 -3
  332. vellum/client/types/map_node_result_data.py +3 -3
  333. vellum/client/types/merge_node_result.py +3 -3
  334. vellum/client/types/merge_node_result_data.py +2 -2
  335. vellum/client/types/metadata_filter_config_request.py +9 -8
  336. vellum/client/types/metadata_filter_rule_request.py +5 -5
  337. vellum/client/types/metadata_filters_request.py +1 -0
  338. vellum/client/types/metric_definition_execution.py +7 -6
  339. vellum/client/types/metric_definition_history_item.py +7 -6
  340. vellum/client/types/metric_definition_input.py +3 -2
  341. vellum/client/types/metric_node_result.py +2 -2
  342. vellum/client/types/ml_model_read.py +6 -3
  343. vellum/client/types/ml_model_usage.py +2 -2
  344. vellum/client/types/ml_model_usage_wrapper.py +4 -4
  345. vellum/client/types/named_scenario_input_audio_variable_value_request.py +22 -0
  346. vellum/client/types/named_scenario_input_chat_history_variable_value_request.py +3 -3
  347. vellum/client/types/named_scenario_input_document_variable_value_request.py +22 -0
  348. vellum/client/types/named_scenario_input_image_variable_value_request.py +22 -0
  349. vellum/client/types/named_scenario_input_json_variable_value_request.py +2 -2
  350. vellum/client/types/named_scenario_input_request.py +11 -2
  351. vellum/client/types/named_scenario_input_string_variable_value_request.py +2 -2
  352. vellum/client/types/named_scenario_input_video_variable_value_request.py +22 -0
  353. vellum/client/types/named_test_case_array_variable_value.py +8 -7
  354. vellum/client/types/named_test_case_array_variable_value_request.py +8 -9
  355. vellum/client/types/named_test_case_audio_variable_value.py +26 -0
  356. vellum/client/types/named_test_case_audio_variable_value_request.py +26 -0
  357. vellum/client/types/named_test_case_chat_history_variable_value.py +3 -3
  358. vellum/client/types/named_test_case_chat_history_variable_value_request.py +3 -3
  359. vellum/client/types/named_test_case_document_variable_value.py +22 -0
  360. vellum/client/types/named_test_case_document_variable_value_request.py +22 -0
  361. vellum/client/types/named_test_case_error_variable_value.py +3 -3
  362. vellum/client/types/named_test_case_error_variable_value_request.py +3 -3
  363. vellum/client/types/named_test_case_function_call_variable_value.py +3 -3
  364. vellum/client/types/named_test_case_function_call_variable_value_request.py +3 -3
  365. vellum/client/types/named_test_case_image_variable_value.py +22 -0
  366. vellum/client/types/named_test_case_image_variable_value_request.py +22 -0
  367. vellum/client/types/named_test_case_json_variable_value.py +2 -2
  368. vellum/client/types/named_test_case_json_variable_value_request.py +2 -2
  369. vellum/client/types/named_test_case_number_variable_value.py +2 -2
  370. vellum/client/types/named_test_case_number_variable_value_request.py +2 -2
  371. vellum/client/types/named_test_case_search_results_variable_value.py +3 -3
  372. vellum/client/types/named_test_case_search_results_variable_value_request.py +3 -3
  373. vellum/client/types/named_test_case_string_variable_value.py +2 -2
  374. vellum/client/types/named_test_case_string_variable_value_request.py +2 -2
  375. vellum/client/types/named_test_case_variable_value.py +14 -5
  376. vellum/client/types/named_test_case_variable_value_request.py +14 -5
  377. vellum/client/types/named_test_case_video_variable_value.py +22 -0
  378. vellum/client/types/named_test_case_video_variable_value_request.py +22 -0
  379. vellum/client/types/node_execution_fulfilled_body.py +4 -4
  380. vellum/client/types/node_execution_fulfilled_event.py +21 -23
  381. vellum/client/types/node_execution_initiated_body.py +3 -3
  382. vellum/client/types/node_execution_initiated_event.py +21 -23
  383. vellum/client/types/node_execution_paused_body.py +3 -3
  384. vellum/client/types/node_execution_paused_event.py +21 -23
  385. vellum/client/types/node_execution_rejected_body.py +5 -4
  386. vellum/client/types/node_execution_rejected_event.py +21 -23
  387. vellum/client/types/node_execution_resumed_body.py +3 -3
  388. vellum/client/types/node_execution_resumed_event.py +21 -23
  389. vellum/client/types/node_execution_span.py +20 -20
  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 +21 -23
  393. vellum/client/types/node_input_compiled_array_value.py +8 -7
  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 +9 -8
  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 +15 -18
  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 +7 -6
  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 +7 -6
  442. vellum/client/types/paginated_test_suite_run_execution_list.py +7 -6
  443. vellum/client/types/paginated_test_suite_test_case_list.py +7 -6
  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 +14 -17
  459. vellum/client/types/prompt_deployment_release.py +6 -6
  460. vellum/client/types/prompt_deployment_release_prompt_deployment.py +2 -2
  461. vellum/client/types/prompt_deployment_release_prompt_version.py +7 -2
  462. vellum/client/types/prompt_exec_config.py +12 -12
  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 +20 -0
  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 +3 -2
  479. vellum/client/types/prompt_version_build_config_sandbox.py +22 -0
  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 +9 -8
  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 +6 -5
  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/sandbox_scenario.py +3 -3
  500. vellum/client/types/scenario_input.py +14 -3
  501. vellum/client/types/scenario_input_audio_variable_value.py +22 -0
  502. vellum/client/types/scenario_input_chat_history_variable_value.py +3 -3
  503. vellum/client/types/scenario_input_document_variable_value.py +22 -0
  504. vellum/client/types/scenario_input_image_variable_value.py +22 -0
  505. vellum/client/types/scenario_input_json_variable_value.py +2 -2
  506. vellum/client/types/scenario_input_string_variable_value.py +2 -2
  507. vellum/client/types/scenario_input_video_variable_value.py +22 -0
  508. vellum/client/types/scheduled_trigger_context.py +39 -0
  509. vellum/client/types/search_filters_request.py +8 -9
  510. vellum/client/types/search_node_result.py +3 -3
  511. vellum/client/types/search_node_result_data.py +3 -3
  512. vellum/client/types/search_request_options_request.py +10 -11
  513. vellum/client/types/search_response.py +3 -3
  514. vellum/client/types/search_result.py +3 -3
  515. vellum/client/types/search_result_document.py +2 -2
  516. vellum/client/types/search_result_document_request.py +2 -2
  517. vellum/client/types/search_result_merging_request.py +2 -2
  518. vellum/client/types/search_result_meta.py +3 -3
  519. vellum/client/types/search_result_meta_request.py +3 -3
  520. vellum/client/types/search_result_request.py +3 -3
  521. vellum/client/types/search_results_input.py +3 -3
  522. vellum/client/types/search_results_vellum_value.py +3 -3
  523. vellum/client/types/search_results_vellum_value_request.py +3 -3
  524. vellum/client/types/search_weights_request.py +2 -2
  525. vellum/client/types/secret_type_enum.py +3 -1
  526. vellum/client/types/sentence_chunker_config.py +2 -2
  527. vellum/client/types/sentence_chunker_config_request.py +2 -2
  528. vellum/client/types/sentence_chunking.py +3 -3
  529. vellum/client/types/sentence_chunking_request.py +3 -3
  530. vellum/client/types/slim_composio_tool_definition.py +24 -0
  531. vellum/client/types/slim_deployment_read.py +12 -11
  532. vellum/client/types/slim_document.py +6 -5
  533. vellum/client/types/slim_document_document_to_document_index.py +9 -4
  534. vellum/client/types/slim_integration_auth_config_read.py +36 -0
  535. vellum/client/types/slim_integration_read.py +25 -0
  536. vellum/client/types/slim_release_review.py +4 -4
  537. vellum/client/types/slim_workflow_deployment.py +13 -12
  538. vellum/client/types/slim_workflow_execution_read.py +21 -24
  539. vellum/client/types/span_link.py +16 -19
  540. vellum/client/types/span_link_type_enum.py +1 -1
  541. vellum/client/types/streaming_ad_hoc_execute_prompt_event.py +4 -4
  542. vellum/client/types/streaming_execute_prompt_event.py +3 -3
  543. vellum/client/types/streaming_prompt_execution_meta.py +2 -2
  544. vellum/client/types/streaming_workflow_node_result_event.py +9 -8
  545. vellum/client/types/string_chat_message_content.py +2 -2
  546. vellum/client/types/string_chat_message_content_request.py +2 -2
  547. vellum/client/types/string_input.py +3 -3
  548. vellum/client/types/string_input_request.py +3 -3
  549. vellum/client/types/string_vellum_value.py +2 -2
  550. vellum/client/types/string_vellum_value_request.py +2 -2
  551. vellum/client/types/submit_completion_actual_request.py +3 -3
  552. vellum/client/types/submit_workflow_execution_actual_request.py +3 -2
  553. vellum/client/types/subworkflow_node_result.py +3 -3
  554. vellum/client/types/subworkflow_node_result_data.py +2 -2
  555. vellum/client/types/templating_node_array_result.py +8 -7
  556. vellum/client/types/templating_node_chat_history_result.py +3 -3
  557. vellum/client/types/templating_node_error_result.py +3 -3
  558. vellum/client/types/templating_node_function_call_result.py +3 -3
  559. vellum/client/types/templating_node_json_result.py +2 -2
  560. vellum/client/types/templating_node_number_result.py +2 -2
  561. vellum/client/types/templating_node_result.py +7 -6
  562. vellum/client/types/templating_node_result_data.py +7 -6
  563. vellum/client/types/templating_node_result_output.py +6 -5
  564. vellum/client/types/templating_node_search_results_result.py +3 -3
  565. vellum/client/types/templating_node_string_result.py +2 -2
  566. vellum/client/types/terminal_node_array_result.py +8 -7
  567. vellum/client/types/terminal_node_chat_history_result.py +2 -2
  568. vellum/client/types/terminal_node_error_result.py +2 -2
  569. vellum/client/types/terminal_node_function_call_result.py +2 -2
  570. vellum/client/types/terminal_node_json_result.py +2 -2
  571. vellum/client/types/terminal_node_number_result.py +2 -2
  572. vellum/client/types/terminal_node_result.py +7 -6
  573. vellum/client/types/terminal_node_result_data.py +7 -6
  574. vellum/client/types/terminal_node_result_output.py +6 -5
  575. vellum/client/types/terminal_node_search_results_result.py +2 -2
  576. vellum/client/types/terminal_node_string_result.py +2 -2
  577. vellum/client/types/test_case_array_variable_value.py +8 -7
  578. vellum/client/types/test_case_audio_variable_value.py +27 -0
  579. vellum/client/types/test_case_chat_history_variable_value.py +3 -3
  580. vellum/client/types/test_case_document_variable_value.py +27 -0
  581. vellum/client/types/test_case_error_variable_value.py +3 -3
  582. vellum/client/types/test_case_function_call_variable_value.py +3 -3
  583. vellum/client/types/test_case_image_variable_value.py +27 -0
  584. vellum/client/types/test_case_json_variable_value.py +2 -2
  585. vellum/client/types/test_case_number_variable_value.py +2 -2
  586. vellum/client/types/test_case_search_results_variable_value.py +3 -3
  587. vellum/client/types/test_case_string_variable_value.py +2 -2
  588. vellum/client/types/test_case_variable_value.py +14 -5
  589. vellum/client/types/test_case_video_variable_value.py +27 -0
  590. vellum/client/types/test_suite_run_deployment_release_tag_exec_config.py +3 -3
  591. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data.py +3 -3
  592. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_data_request.py +3 -3
  593. vellum/client/types/test_suite_run_deployment_release_tag_exec_config_request.py +3 -3
  594. vellum/client/types/test_suite_run_exec_config.py +2 -1
  595. vellum/client/types/test_suite_run_exec_config_request.py +2 -1
  596. vellum/client/types/test_suite_run_execution.py +8 -7
  597. vellum/client/types/test_suite_run_execution_array_output.py +8 -7
  598. vellum/client/types/test_suite_run_execution_chat_history_output.py +3 -3
  599. vellum/client/types/test_suite_run_execution_error_output.py +3 -3
  600. vellum/client/types/test_suite_run_execution_function_call_output.py +3 -3
  601. vellum/client/types/test_suite_run_execution_json_output.py +2 -2
  602. vellum/client/types/test_suite_run_execution_metric_definition.py +2 -2
  603. vellum/client/types/test_suite_run_execution_metric_result.py +8 -7
  604. vellum/client/types/test_suite_run_execution_number_output.py +2 -2
  605. vellum/client/types/test_suite_run_execution_output.py +6 -5
  606. vellum/client/types/test_suite_run_execution_search_results_output.py +3 -3
  607. vellum/client/types/test_suite_run_execution_string_output.py +2 -2
  608. vellum/client/types/test_suite_run_external_exec_config.py +7 -6
  609. vellum/client/types/test_suite_run_external_exec_config_data.py +7 -6
  610. vellum/client/types/test_suite_run_external_exec_config_data_request.py +7 -8
  611. vellum/client/types/test_suite_run_external_exec_config_request.py +7 -8
  612. vellum/client/types/test_suite_run_metric_array_output.py +8 -7
  613. vellum/client/types/test_suite_run_metric_error_output.py +3 -3
  614. vellum/client/types/test_suite_run_metric_json_output.py +2 -2
  615. vellum/client/types/test_suite_run_metric_number_output.py +2 -2
  616. vellum/client/types/test_suite_run_metric_output.py +5 -4
  617. vellum/client/types/test_suite_run_metric_string_output.py +2 -2
  618. vellum/client/types/test_suite_run_progress.py +2 -2
  619. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_data_request.py +3 -3
  620. vellum/client/types/test_suite_run_prompt_sandbox_exec_config_request.py +3 -3
  621. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py +3 -3
  622. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py +3 -3
  623. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py +3 -3
  624. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py +3 -3
  625. vellum/client/types/test_suite_run_read.py +9 -8
  626. vellum/client/types/test_suite_run_test_suite.py +2 -2
  627. vellum/client/types/test_suite_run_workflow_release_tag_exec_config.py +3 -3
  628. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data.py +3 -3
  629. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_data_request.py +3 -3
  630. vellum/client/types/test_suite_run_workflow_release_tag_exec_config_request.py +3 -3
  631. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_data_request.py +3 -3
  632. vellum/client/types/test_suite_run_workflow_sandbox_exec_config_request.py +3 -3
  633. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config.py +3 -3
  634. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data.py +3 -3
  635. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data_request.py +3 -3
  636. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_request.py +3 -3
  637. vellum/client/types/test_suite_test_case.py +7 -6
  638. vellum/client/types/test_suite_test_case_bulk_operation_request.py +2 -1
  639. vellum/client/types/test_suite_test_case_bulk_result.py +2 -1
  640. vellum/client/types/test_suite_test_case_create_bulk_operation_request.py +7 -8
  641. vellum/client/types/test_suite_test_case_created_bulk_result.py +3 -3
  642. vellum/client/types/test_suite_test_case_created_bulk_result_data.py +2 -2
  643. vellum/client/types/test_suite_test_case_delete_bulk_operation_data_request.py +2 -2
  644. vellum/client/types/test_suite_test_case_delete_bulk_operation_request.py +3 -3
  645. vellum/client/types/test_suite_test_case_deleted_bulk_result.py +3 -3
  646. vellum/client/types/test_suite_test_case_deleted_bulk_result_data.py +2 -2
  647. vellum/client/types/test_suite_test_case_rejected_bulk_result.py +2 -2
  648. vellum/client/types/test_suite_test_case_replace_bulk_operation_request.py +7 -8
  649. vellum/client/types/test_suite_test_case_replaced_bulk_result.py +3 -3
  650. vellum/client/types/test_suite_test_case_replaced_bulk_result_data.py +2 -2
  651. vellum/client/types/test_suite_test_case_upsert_bulk_operation_request.py +7 -8
  652. vellum/client/types/thinking_vellum_value.py +25 -0
  653. vellum/client/types/thinking_vellum_value_request.py +25 -0
  654. vellum/client/types/token_overlapping_window_chunker_config.py +2 -2
  655. vellum/client/types/token_overlapping_window_chunker_config_request.py +2 -2
  656. vellum/client/types/token_overlapping_window_chunking.py +3 -3
  657. vellum/client/types/token_overlapping_window_chunking_request.py +3 -3
  658. vellum/client/types/update_active_workspace_response.py +32 -0
  659. vellum/client/types/upload_document_response.py +3 -3
  660. vellum/client/types/uploaded_file_read.py +27 -0
  661. vellum/client/types/upsert_test_suite_test_case_request.py +6 -5
  662. vellum/client/types/variable_prompt_block.py +11 -4
  663. vellum/client/types/vellum_audio.py +5 -4
  664. vellum/client/types/vellum_audio_request.py +3 -3
  665. vellum/client/types/vellum_code_resource_definition.py +7 -2
  666. vellum/client/types/vellum_document.py +9 -4
  667. vellum/client/types/vellum_document_request.py +7 -3
  668. vellum/client/types/vellum_error.py +5 -4
  669. vellum/client/types/vellum_error_code_enum.py +6 -0
  670. vellum/client/types/vellum_error_request.py +5 -4
  671. vellum/client/types/vellum_image.py +9 -4
  672. vellum/client/types/vellum_image_request.py +7 -3
  673. vellum/client/types/vellum_node_execution_event.py +4 -3
  674. vellum/client/types/vellum_sdk_error.py +4 -3
  675. vellum/client/types/vellum_sdk_error_code_enum.py +5 -0
  676. vellum/client/types/vellum_secret.py +2 -2
  677. vellum/client/types/vellum_span.py +2 -1
  678. vellum/client/types/vellum_value.py +13 -8
  679. vellum/client/types/vellum_value_logical_condition_group_request.py +6 -9
  680. vellum/client/types/vellum_value_logical_condition_request.py +10 -9
  681. vellum/client/types/vellum_value_logical_expression_request.py +2 -1
  682. vellum/client/types/vellum_value_request.py +13 -8
  683. vellum/client/types/vellum_variable.py +10 -9
  684. vellum/client/types/vellum_variable_extensions.py +3 -2
  685. vellum/client/types/vellum_variable_type.py +3 -1
  686. vellum/client/types/vellum_video.py +25 -0
  687. vellum/client/types/vellum_video_request.py +24 -0
  688. vellum/client/types/vellum_workflow_execution_event.py +4 -3
  689. vellum/client/types/video_chat_message_content.py +25 -0
  690. vellum/client/types/video_chat_message_content_request.py +25 -0
  691. vellum/client/types/video_input.py +30 -0
  692. vellum/client/types/video_input_request.py +30 -0
  693. vellum/client/types/video_prompt_block.py +29 -0
  694. vellum/client/types/video_vellum_value.py +25 -0
  695. vellum/client/types/video_vellum_value_request.py +25 -0
  696. vellum/client/types/workflow_deployment_display_data.py +27 -0
  697. vellum/client/types/workflow_deployment_event_executions_response.py +17 -34
  698. vellum/client/types/workflow_deployment_history_item.py +7 -6
  699. vellum/client/types/workflow_deployment_parent_context.py +14 -17
  700. vellum/client/types/workflow_deployment_read.py +19 -12
  701. vellum/client/types/workflow_deployment_release.py +10 -9
  702. vellum/client/types/workflow_deployment_release_workflow_deployment.py +2 -2
  703. vellum/client/types/workflow_deployment_release_workflow_version.py +7 -6
  704. vellum/client/types/workflow_display_icon.py +24 -0
  705. vellum/client/types/workflow_error.py +1 -0
  706. vellum/client/types/workflow_event.py +37 -0
  707. vellum/client/types/workflow_event_error.py +5 -3
  708. vellum/client/types/workflow_event_execution_read.py +23 -29
  709. vellum/client/types/workflow_execution_actual.py +8 -7
  710. vellum/client/types/workflow_execution_actual_chat_history_request.py +2 -2
  711. vellum/client/types/workflow_execution_actual_json_request.py +2 -2
  712. vellum/client/types/workflow_execution_actual_string_request.py +2 -2
  713. vellum/client/types/workflow_execution_detail.py +51 -0
  714. vellum/client/types/workflow_execution_event_error_code.py +5 -0
  715. vellum/client/types/workflow_execution_fulfilled_body.py +5 -3
  716. vellum/client/types/workflow_execution_fulfilled_event.py +21 -23
  717. vellum/client/types/workflow_execution_initiated_body.py +3 -12
  718. vellum/client/types/workflow_execution_initiated_event.py +21 -27
  719. vellum/client/types/workflow_execution_node_result_event.py +7 -6
  720. vellum/client/types/workflow_execution_paused_body.py +4 -4
  721. vellum/client/types/workflow_execution_paused_event.py +21 -23
  722. vellum/client/types/workflow_execution_rejected_body.py +5 -4
  723. vellum/client/types/workflow_execution_rejected_event.py +21 -23
  724. vellum/client/types/workflow_execution_resumed_body.py +3 -3
  725. vellum/client/types/workflow_execution_resumed_event.py +21 -23
  726. vellum/client/types/workflow_execution_snapshotted_body.py +4 -3
  727. vellum/client/types/workflow_execution_snapshotted_event.py +21 -25
  728. vellum/client/types/workflow_execution_span.py +19 -23
  729. vellum/client/types/workflow_execution_span_attributes.py +3 -2
  730. vellum/client/types/workflow_execution_streaming_body.py +4 -4
  731. vellum/client/types/workflow_execution_streaming_event.py +21 -23
  732. vellum/client/types/workflow_execution_usage_calculation_error.py +21 -0
  733. vellum/client/types/workflow_execution_usage_calculation_error_code_enum.py +7 -0
  734. vellum/client/types/workflow_execution_usage_calculation_fulfilled_body.py +3 -3
  735. vellum/client/types/workflow_execution_usage_result.py +24 -0
  736. vellum/client/types/workflow_execution_view_online_eval_metric_result.py +7 -8
  737. vellum/client/types/workflow_execution_workflow_result_event.py +7 -6
  738. vellum/client/types/workflow_expand_meta_request.py +2 -2
  739. vellum/client/types/workflow_initialization_error.py +2 -2
  740. vellum/client/types/workflow_input.py +31 -0
  741. vellum/client/types/workflow_node_result_data.py +8 -7
  742. vellum/client/types/workflow_node_result_event.py +3 -2
  743. vellum/client/types/workflow_output.py +12 -5
  744. vellum/client/types/workflow_output_array.py +9 -8
  745. vellum/client/types/workflow_output_audio.py +31 -0
  746. vellum/client/types/workflow_output_chat_history.py +3 -3
  747. vellum/client/types/workflow_output_document.py +31 -0
  748. vellum/client/types/workflow_output_error.py +3 -3
  749. vellum/client/types/workflow_output_function_call.py +3 -3
  750. vellum/client/types/workflow_output_image.py +3 -3
  751. vellum/client/types/workflow_output_json.py +3 -3
  752. vellum/client/types/workflow_output_number.py +3 -3
  753. vellum/client/types/workflow_output_search_results.py +3 -3
  754. vellum/client/types/workflow_output_string.py +3 -3
  755. vellum/client/types/workflow_output_video.py +31 -0
  756. vellum/client/types/workflow_parent_context.py +15 -18
  757. vellum/client/types/workflow_push_deployment_config_request.py +3 -2
  758. vellum/client/types/workflow_push_response.py +2 -2
  759. vellum/client/types/workflow_release_tag_read.py +4 -4
  760. vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py +2 -2
  761. vellum/client/types/workflow_request_audio_input_request.py +30 -0
  762. vellum/client/types/workflow_request_chat_history_input_request.py +3 -3
  763. vellum/client/types/workflow_request_document_input_request.py +30 -0
  764. vellum/client/types/workflow_request_image_input_request.py +30 -0
  765. vellum/client/types/workflow_request_input_request.py +11 -2
  766. vellum/client/types/workflow_request_json_input_request.py +3 -3
  767. vellum/client/types/workflow_request_number_input_request.py +3 -3
  768. vellum/client/types/workflow_request_string_input_request.py +3 -3
  769. vellum/client/types/workflow_request_video_input_request.py +30 -0
  770. vellum/client/types/workflow_resolved_state.py +31 -0
  771. vellum/client/types/workflow_result_event.py +11 -10
  772. vellum/client/types/workflow_result_event_output_data.py +7 -6
  773. vellum/client/types/workflow_result_event_output_data_array.py +9 -8
  774. vellum/client/types/workflow_result_event_output_data_chat_history.py +3 -3
  775. vellum/client/types/workflow_result_event_output_data_error.py +3 -3
  776. vellum/client/types/workflow_result_event_output_data_function_call.py +3 -3
  777. vellum/client/types/workflow_result_event_output_data_json.py +3 -3
  778. vellum/client/types/workflow_result_event_output_data_number.py +3 -3
  779. vellum/client/types/workflow_result_event_output_data_search_results.py +3 -3
  780. vellum/client/types/workflow_result_event_output_data_string.py +3 -3
  781. vellum/client/types/workflow_result_event_state.py +7 -0
  782. vellum/client/types/workflow_sandbox_display_data.py +27 -0
  783. vellum/client/types/workflow_sandbox_example.py +4 -2
  784. vellum/client/types/workflow_sandbox_parent_context.py +14 -17
  785. vellum/client/types/workflow_stream_event.py +2 -1
  786. vellum/client/types/workspace_display_config.py +19 -0
  787. vellum/client/types/workspace_read.py +5 -3
  788. vellum/client/types/workspace_secret_read.py +3 -3
  789. vellum/client/utils.py +24 -0
  790. vellum/{types/node_event_display_context.py → core/force_multipart.py} +1 -1
  791. vellum/core/http_response.py +3 -0
  792. vellum/errors/misdirected_request_error.py +3 -0
  793. vellum/errors/too_many_requests_error.py +3 -0
  794. vellum/errors/unauthorized_error.py +3 -0
  795. vellum/evaluations/resources.py +5 -5
  796. vellum/plugins/pydantic.py +14 -3
  797. vellum/plugins/tests/__init__.py +0 -0
  798. vellum/plugins/tests/test_pydantic.py +30 -0
  799. vellum/plugins/vellum_mypy.py +31 -23
  800. vellum/prompts/__init__.py +3 -0
  801. vellum/prompts/blocks/__init__.py +3 -0
  802. vellum/prompts/blocks/compilation.py +29 -11
  803. vellum/prompts/blocks/helpers.py +31 -0
  804. vellum/prompts/blocks/tests/test_compilation.py +64 -0
  805. vellum/raw_client.py +3 -0
  806. vellum/resources/ad_hoc/raw_client.py +3 -0
  807. vellum/resources/container_images/raw_client.py +3 -0
  808. vellum/resources/deployments/raw_client.py +3 -0
  809. vellum/resources/document_indexes/raw_client.py +3 -0
  810. vellum/resources/documents/raw_client.py +3 -0
  811. vellum/resources/{release_reviews → environments}/__init__.py +1 -1
  812. vellum/resources/{release_reviews → environments}/client.py +1 -1
  813. vellum/resources/environments/raw_client.py +3 -0
  814. vellum/resources/events/__init__.py +3 -0
  815. vellum/resources/events/client.py +3 -0
  816. vellum/resources/events/raw_client.py +3 -0
  817. vellum/{types/workflow_event_display_context.py → resources/folder_entities/raw_client.py} +1 -1
  818. vellum/resources/integration_auth_configs/__init__.py +3 -0
  819. vellum/resources/integration_auth_configs/client.py +3 -0
  820. vellum/resources/integration_auth_configs/raw_client.py +3 -0
  821. vellum/resources/integration_providers/__init__.py +3 -0
  822. vellum/resources/integration_providers/client.py +3 -0
  823. vellum/resources/integration_providers/raw_client.py +3 -0
  824. vellum/resources/integrations/__init__.py +3 -0
  825. vellum/resources/integrations/client.py +3 -0
  826. vellum/resources/integrations/raw_client.py +3 -0
  827. vellum/resources/metric_definitions/raw_client.py +3 -0
  828. vellum/resources/ml_models/raw_client.py +3 -0
  829. vellum/resources/organizations/raw_client.py +3 -0
  830. vellum/resources/prompts/raw_client.py +3 -0
  831. vellum/resources/sandboxes/raw_client.py +3 -0
  832. vellum/resources/test_suite_runs/raw_client.py +3 -0
  833. vellum/resources/test_suites/raw_client.py +3 -0
  834. vellum/resources/uploaded_files/__init__.py +3 -0
  835. vellum/resources/uploaded_files/client.py +3 -0
  836. vellum/resources/uploaded_files/raw_client.py +3 -0
  837. vellum/resources/workflow_deployments/raw_client.py +3 -0
  838. vellum/resources/workflow_executions/__init__.py +3 -0
  839. vellum/resources/workflow_executions/client.py +3 -0
  840. vellum/resources/workflow_executions/raw_client.py +3 -0
  841. vellum/resources/workflow_sandboxes/raw_client.py +3 -0
  842. vellum/resources/workflows/raw_client.py +3 -0
  843. vellum/resources/workspace_secrets/raw_client.py +3 -0
  844. vellum/resources/workspaces/raw_client.py +3 -0
  845. vellum/types/api_actor_type_enum.py +3 -0
  846. vellum/types/audio_input.py +3 -0
  847. vellum/types/audio_input_request.py +3 -0
  848. vellum/types/auth_type_enum.py +3 -0
  849. vellum/types/build_status_enum.py +3 -0
  850. vellum/types/components_schemas_composio_execute_tool_request.py +3 -0
  851. vellum/types/components_schemas_composio_execute_tool_response.py +3 -0
  852. vellum/types/components_schemas_composio_integration_exec_config.py +3 -0
  853. vellum/types/components_schemas_composio_tool_definition.py +3 -0
  854. vellum/types/components_schemas_prompt_version_build_config_sandbox.py +3 -0
  855. vellum/types/components_schemas_slim_composio_tool_definition.py +3 -0
  856. vellum/types/composio_execute_tool_request.py +3 -0
  857. vellum/types/composio_execute_tool_response.py +3 -0
  858. vellum/types/composio_integration_exec_config.py +3 -0
  859. vellum/types/composio_tool_definition.py +3 -0
  860. vellum/types/container_image_build_config.py +3 -0
  861. vellum/types/create_workflow_event_request.py +3 -0
  862. vellum/types/dataset_row_push_request.py +3 -0
  863. vellum/types/delimiter_chunker_config.py +3 -0
  864. vellum/types/delimiter_chunker_config_request.py +3 -0
  865. vellum/types/delimiter_chunking.py +3 -0
  866. vellum/types/delimiter_chunking_request.py +3 -0
  867. vellum/types/deprecated_prompt_request_input.py +3 -0
  868. vellum/types/document_input.py +3 -0
  869. vellum/types/document_input_request.py +3 -0
  870. vellum/types/environment_display_config.py +3 -0
  871. vellum/types/environment_read.py +3 -0
  872. vellum/types/error_detail_response.py +3 -0
  873. vellum/types/event_create_response.py +3 -0
  874. vellum/types/execute_api_response_json.py +3 -0
  875. vellum/types/execute_workflow_async_response.py +3 -0
  876. vellum/types/execution_audio_vellum_value.py +3 -0
  877. vellum/types/execution_document_vellum_value.py +3 -0
  878. vellum/types/execution_image_vellum_value.py +3 -0
  879. vellum/types/execution_thinking_vellum_value.py +3 -0
  880. vellum/types/execution_video_vellum_value.py +3 -0
  881. vellum/types/external_parent_context.py +3 -0
  882. vellum/types/fast_embed_vectorizer_baai_bge_small_en_v_15.py +3 -0
  883. vellum/types/fast_embed_vectorizer_baai_bge_small_en_v_15_request.py +3 -0
  884. vellum/types/folder_entity_dataset.py +3 -0
  885. vellum/types/folder_entity_dataset_data.py +3 -0
  886. vellum/types/google_vertex_ai_vectorizer_gemini_embedding_001.py +3 -0
  887. vellum/types/google_vertex_ai_vectorizer_gemini_embedding_001_request.py +3 -0
  888. vellum/types/image_input.py +3 -0
  889. vellum/types/image_input_request.py +3 -0
  890. vellum/types/integration.py +3 -0
  891. vellum/types/integration_auth_config_integration.py +3 -0
  892. vellum/types/integration_auth_config_integration_credential.py +3 -0
  893. vellum/types/integration_credential_access_type.py +3 -0
  894. vellum/types/integration_name.py +3 -0
  895. vellum/types/integration_provider.py +3 -0
  896. vellum/types/integration_read.py +3 -0
  897. vellum/types/integration_trigger_context.py +3 -0
  898. vellum/types/named_scenario_input_audio_variable_value_request.py +3 -0
  899. vellum/types/named_scenario_input_document_variable_value_request.py +3 -0
  900. vellum/types/named_scenario_input_image_variable_value_request.py +3 -0
  901. vellum/types/named_scenario_input_video_variable_value_request.py +3 -0
  902. vellum/types/named_test_case_audio_variable_value.py +3 -0
  903. vellum/types/named_test_case_audio_variable_value_request.py +3 -0
  904. vellum/types/named_test_case_document_variable_value.py +3 -0
  905. vellum/types/named_test_case_document_variable_value_request.py +3 -0
  906. vellum/types/named_test_case_image_variable_value.py +3 -0
  907. vellum/types/named_test_case_image_variable_value_request.py +3 -0
  908. vellum/types/named_test_case_video_variable_value.py +3 -0
  909. vellum/types/named_test_case_video_variable_value_request.py +3 -0
  910. vellum/types/node_input_compiled_audio_value.py +3 -0
  911. vellum/types/node_input_compiled_document_value.py +3 -0
  912. vellum/types/node_input_compiled_image_value.py +3 -0
  913. vellum/types/node_input_compiled_video_value.py +3 -0
  914. vellum/types/node_output_compiled_thinking_value.py +3 -0
  915. vellum/types/paginated_slim_integration_auth_config_read_list.py +3 -0
  916. vellum/types/paginated_slim_integration_read_list.py +3 -0
  917. vellum/types/paginated_slim_tool_definition_list.py +3 -0
  918. vellum/types/paginated_workflow_deployment_release_list.py +3 -0
  919. vellum/types/private_vectorizer.py +3 -0
  920. vellum/types/private_vectorizer_request.py +3 -0
  921. vellum/types/prompt_push_response.py +3 -0
  922. vellum/types/prompt_request_audio_input.py +3 -0
  923. vellum/types/prompt_request_document_input.py +3 -0
  924. vellum/types/prompt_request_image_input.py +3 -0
  925. vellum/types/prompt_request_video_input.py +3 -0
  926. vellum/types/prompt_version_build_config_sandbox.py +3 -0
  927. vellum/types/scenario_input_audio_variable_value.py +3 -0
  928. vellum/types/scenario_input_document_variable_value.py +3 -0
  929. vellum/types/scenario_input_image_variable_value.py +3 -0
  930. vellum/types/scenario_input_video_variable_value.py +3 -0
  931. vellum/types/scheduled_trigger_context.py +3 -0
  932. vellum/types/slim_composio_tool_definition.py +3 -0
  933. vellum/types/slim_integration_auth_config_read.py +3 -0
  934. vellum/types/slim_integration_read.py +3 -0
  935. vellum/types/test_case_audio_variable_value.py +3 -0
  936. vellum/types/test_case_document_variable_value.py +3 -0
  937. vellum/types/test_case_image_variable_value.py +3 -0
  938. vellum/types/test_case_video_variable_value.py +3 -0
  939. vellum/types/thinking_vellum_value.py +3 -0
  940. vellum/types/thinking_vellum_value_request.py +3 -0
  941. vellum/types/update_active_workspace_response.py +3 -0
  942. vellum/types/uploaded_file_read.py +3 -0
  943. vellum/types/vellum_video.py +3 -0
  944. vellum/types/vellum_video_request.py +3 -0
  945. vellum/types/video_chat_message_content.py +3 -0
  946. vellum/types/video_chat_message_content_request.py +3 -0
  947. vellum/types/video_input.py +3 -0
  948. vellum/types/video_input_request.py +3 -0
  949. vellum/types/video_prompt_block.py +3 -0
  950. vellum/types/video_vellum_value.py +3 -0
  951. vellum/types/video_vellum_value_request.py +3 -0
  952. vellum/types/workflow_deployment_display_data.py +3 -0
  953. vellum/types/workflow_display_icon.py +3 -0
  954. vellum/types/workflow_event.py +3 -0
  955. vellum/types/workflow_execution_detail.py +3 -0
  956. vellum/types/workflow_execution_usage_calculation_error.py +3 -0
  957. vellum/types/workflow_execution_usage_calculation_error_code_enum.py +3 -0
  958. vellum/types/workflow_execution_usage_result.py +3 -0
  959. vellum/types/workflow_input.py +3 -0
  960. vellum/types/workflow_output_audio.py +3 -0
  961. vellum/types/workflow_output_document.py +3 -0
  962. vellum/types/workflow_output_video.py +3 -0
  963. vellum/types/workflow_request_audio_input_request.py +3 -0
  964. vellum/types/workflow_request_document_input_request.py +3 -0
  965. vellum/types/workflow_request_image_input_request.py +3 -0
  966. vellum/types/workflow_request_video_input_request.py +3 -0
  967. vellum/types/workflow_resolved_state.py +3 -0
  968. vellum/types/workflow_result_event_state.py +3 -0
  969. vellum/types/workflow_sandbox_display_data.py +3 -0
  970. vellum/types/workspace_display_config.py +3 -0
  971. vellum/utils/files/__init__.py +18 -0
  972. vellum/utils/files/constants.py +47 -0
  973. vellum/utils/files/exceptions.py +25 -0
  974. vellum/utils/files/extensions.py +59 -0
  975. vellum/utils/files/mixin.py +109 -0
  976. vellum/utils/files/read.py +41 -0
  977. vellum/utils/files/stream.py +135 -0
  978. vellum/utils/files/tests/__init__.py +0 -0
  979. vellum/utils/files/tests/test_extensions.py +54 -0
  980. vellum/utils/files/tests/test_mixin.py +205 -0
  981. vellum/utils/files/tests/test_read.py +204 -0
  982. vellum/utils/files/tests/test_stream.py +199 -0
  983. vellum/utils/files/tests/test_upload.py +309 -0
  984. vellum/utils/files/tests/test_urls.py +252 -0
  985. vellum/utils/files/types.py +8 -0
  986. vellum/utils/files/upload.py +151 -0
  987. vellum/utils/files/urls.py +71 -0
  988. vellum/utils/json_encoder.py +95 -0
  989. vellum/utils/templating/custom_filters.py +4 -4
  990. vellum/utils/templating/render.py +4 -4
  991. vellum/utils/tests/__init__.py +0 -0
  992. vellum/utils/tests/test_json_encoder.py +92 -0
  993. vellum/utils/vellum_client.py +40 -0
  994. vellum/workflows/__init__.py +78 -0
  995. vellum/workflows/constants.py +7 -0
  996. vellum/workflows/context.py +27 -9
  997. vellum/workflows/descriptors/base.py +83 -2
  998. vellum/workflows/descriptors/exceptions.py +18 -1
  999. vellum/workflows/descriptors/tests/test_utils.py +57 -0
  1000. vellum/workflows/descriptors/utils.py +27 -3
  1001. vellum/workflows/edges/__init__.py +2 -0
  1002. vellum/workflows/edges/trigger_edge.py +67 -0
  1003. vellum/workflows/emitters/__init__.py +2 -0
  1004. vellum/workflows/emitters/base.py +25 -0
  1005. vellum/workflows/emitters/vellum_emitter.py +150 -0
  1006. vellum/workflows/environment/__init__.py +2 -1
  1007. vellum/workflows/environment/environment.py +10 -3
  1008. vellum/workflows/errors/types.py +29 -2
  1009. vellum/workflows/events/__init__.py +2 -0
  1010. vellum/workflows/events/context.py +90 -0
  1011. vellum/workflows/events/exception_handling.py +58 -0
  1012. vellum/workflows/events/node.py +27 -11
  1013. vellum/workflows/events/relational_threads.py +41 -0
  1014. vellum/workflows/events/stream.py +28 -0
  1015. vellum/workflows/events/tests/test_basic_workflow.py +50 -0
  1016. vellum/workflows/events/tests/test_event.py +145 -20
  1017. vellum/workflows/events/types.py +32 -4
  1018. vellum/workflows/events/workflow.py +111 -8
  1019. vellum/workflows/exceptions.py +46 -7
  1020. vellum/workflows/executable.py +9 -0
  1021. vellum/workflows/expressions/accessor.py +65 -11
  1022. vellum/workflows/expressions/add.py +41 -0
  1023. vellum/workflows/expressions/comparison_utils.py +38 -0
  1024. vellum/workflows/expressions/concat.py +35 -0
  1025. vellum/workflows/expressions/contains.py +7 -0
  1026. vellum/workflows/expressions/greater_than.py +8 -1
  1027. vellum/workflows/expressions/greater_than_or_equal_to.py +8 -1
  1028. vellum/workflows/expressions/is_error.py +23 -0
  1029. vellum/workflows/expressions/length.py +46 -0
  1030. vellum/workflows/expressions/less_than.py +8 -1
  1031. vellum/workflows/expressions/less_than_or_equal_to.py +8 -1
  1032. vellum/workflows/expressions/minus.py +41 -0
  1033. vellum/workflows/expressions/tests/test_accessor.py +248 -0
  1034. vellum/workflows/expressions/tests/test_add.py +72 -0
  1035. vellum/workflows/expressions/tests/test_concat.py +108 -0
  1036. vellum/workflows/expressions/tests/test_contains.py +175 -0
  1037. vellum/workflows/expressions/tests/test_expressions.py +145 -32
  1038. vellum/workflows/expressions/tests/test_length.py +38 -0
  1039. vellum/workflows/expressions/tests/test_minus.py +109 -0
  1040. vellum/workflows/graph/graph.py +255 -8
  1041. vellum/workflows/graph/tests/test_graph.py +300 -0
  1042. vellum/workflows/inputs/__init__.py +2 -0
  1043. vellum/workflows/inputs/base.py +75 -18
  1044. vellum/workflows/inputs/dataset_row.py +81 -0
  1045. vellum/workflows/inputs/tests/test_inputs.py +196 -1
  1046. vellum/workflows/integrations/__init__.py +5 -0
  1047. vellum/workflows/integrations/composio_service.py +158 -0
  1048. vellum/workflows/integrations/mcp_service.py +282 -0
  1049. vellum/workflows/integrations/tests/__init__.py +0 -0
  1050. vellum/workflows/integrations/tests/test_mcp_service.py +273 -0
  1051. vellum/workflows/integrations/tests/test_vellum_integration_service.py +299 -0
  1052. vellum/workflows/integrations/vellum_integration_service.py +136 -0
  1053. vellum/workflows/loaders/__init__.py +3 -0
  1054. vellum/workflows/loaders/base.py +36 -0
  1055. vellum/workflows/nodes/__init__.py +2 -0
  1056. vellum/workflows/nodes/bases/base.py +238 -46
  1057. vellum/workflows/nodes/bases/base_adornment_node.py +64 -1
  1058. vellum/workflows/nodes/bases/tests/test_base_adornment_node.py +31 -0
  1059. vellum/workflows/nodes/bases/tests/test_base_node.py +100 -4
  1060. vellum/workflows/nodes/core/error_node/node.py +11 -2
  1061. vellum/workflows/nodes/core/inline_subworkflow_node/node.py +29 -3
  1062. vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +35 -0
  1063. vellum/workflows/nodes/core/map_node/node.py +103 -90
  1064. vellum/workflows/nodes/core/map_node/tests/test_node.py +178 -0
  1065. vellum/workflows/nodes/core/retry_node/node.py +8 -1
  1066. vellum/workflows/nodes/core/retry_node/tests/test_node.py +2 -3
  1067. vellum/workflows/nodes/core/templating_node/node.py +7 -2
  1068. vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py +194 -1
  1069. vellum/workflows/nodes/displayable/__init__.py +6 -0
  1070. vellum/workflows/nodes/displayable/api_node/node.py +17 -1
  1071. vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py +177 -3
  1072. vellum/workflows/nodes/displayable/bases/api_node/node.py +70 -16
  1073. vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py +0 -0
  1074. vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py +150 -0
  1075. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +68 -7
  1076. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +299 -27
  1077. vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py +663 -20
  1078. vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +84 -14
  1079. vellum/workflows/nodes/displayable/bases/search_node.py +26 -3
  1080. vellum/workflows/nodes/displayable/bases/tests/test_prompt_deployment_node.py +90 -0
  1081. vellum/workflows/nodes/displayable/bases/utils.py +82 -5
  1082. vellum/workflows/nodes/displayable/code_execution_node/node.py +46 -15
  1083. vellum/workflows/nodes/displayable/code_execution_node/tests/{test_code_execution_node.py → test_node.py} +646 -5
  1084. vellum/workflows/nodes/displayable/code_execution_node/utils.py +28 -74
  1085. vellum/workflows/nodes/displayable/conditional_node/node.py +8 -4
  1086. vellum/workflows/nodes/displayable/final_output_node/node.py +80 -1
  1087. vellum/workflows/nodes/displayable/final_output_node/tests/test_node.py +96 -1
  1088. vellum/workflows/nodes/displayable/guardrail_node/node.py +25 -5
  1089. vellum/workflows/nodes/displayable/guardrail_node/test_node.py +29 -0
  1090. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +9 -36
  1091. vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +3 -0
  1092. vellum/workflows/nodes/displayable/merge_node/node.py +8 -1
  1093. vellum/workflows/nodes/displayable/note_node/node.py +8 -1
  1094. vellum/workflows/nodes/displayable/prompt_deployment_node/node.py +7 -23
  1095. vellum/workflows/nodes/displayable/search_node/node.py +18 -0
  1096. vellum/workflows/nodes/displayable/search_node/tests/test_node.py +76 -0
  1097. vellum/workflows/nodes/displayable/set_state_node/__init__.py +5 -0
  1098. vellum/workflows/nodes/displayable/set_state_node/node.py +71 -0
  1099. vellum/workflows/nodes/displayable/set_state_node/tests/__init__.py +0 -0
  1100. vellum/workflows/nodes/displayable/set_state_node/tests/test_node.py +212 -0
  1101. vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +220 -59
  1102. vellum/workflows/nodes/displayable/subworkflow_deployment_node/tests/test_node.py +26 -1
  1103. vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +4 -1
  1104. vellum/workflows/nodes/displayable/tests/test_search_node_error_handling.py +329 -0
  1105. vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +10 -16
  1106. vellum/workflows/nodes/displayable/tool_calling_node/__init__.py +3 -0
  1107. vellum/workflows/nodes/displayable/tool_calling_node/node.py +225 -0
  1108. vellum/workflows/nodes/displayable/tool_calling_node/state.py +11 -0
  1109. vellum/workflows/nodes/displayable/tool_calling_node/tests/__init__.py +0 -0
  1110. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py +219 -0
  1111. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +802 -0
  1112. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +316 -0
  1113. vellum/workflows/nodes/displayable/tool_calling_node/utils.py +633 -0
  1114. vellum/workflows/nodes/displayable/web_search_node/__init__.py +3 -0
  1115. vellum/workflows/nodes/displayable/web_search_node/node.py +136 -0
  1116. vellum/workflows/nodes/displayable/web_search_node/tests/__init__.py +0 -0
  1117. vellum/workflows/nodes/displayable/web_search_node/tests/test_node.py +246 -0
  1118. vellum/workflows/nodes/experimental/__init__.py +1 -0
  1119. vellum/workflows/nodes/mocks.py +40 -9
  1120. vellum/workflows/nodes/tests/test_mocks.py +2 -2
  1121. vellum/workflows/nodes/tests/test_utils.py +42 -26
  1122. vellum/workflows/nodes/utils.py +70 -7
  1123. vellum/workflows/outputs/base.py +53 -12
  1124. vellum/workflows/ports/node_ports.py +6 -2
  1125. vellum/workflows/ports/port.py +28 -3
  1126. vellum/workflows/ports/tests/test_port.py +45 -0
  1127. vellum/workflows/ports/utils.py +70 -17
  1128. vellum/workflows/references/__init__.py +2 -0
  1129. vellum/workflows/references/constant.py +4 -1
  1130. vellum/workflows/references/environment_variable.py +27 -9
  1131. vellum/workflows/references/output.py +3 -5
  1132. vellum/workflows/references/trigger.py +77 -0
  1133. vellum/workflows/references/workflow_input.py +5 -1
  1134. vellum/workflows/resolvers/base.py +19 -1
  1135. vellum/workflows/resolvers/resolver.py +71 -0
  1136. vellum/workflows/resolvers/tests/test_resolver.py +168 -0
  1137. vellum/workflows/resolvers/types.py +11 -0
  1138. vellum/workflows/runner/runner.py +659 -154
  1139. vellum/workflows/sandbox.py +55 -9
  1140. vellum/workflows/state/base.py +192 -64
  1141. vellum/workflows/state/context.py +225 -6
  1142. vellum/workflows/state/delta.py +20 -0
  1143. vellum/workflows/state/encoder.py +2 -62
  1144. vellum/workflows/state/tests/test_state.py +24 -9
  1145. vellum/workflows/tests/test_dataset_row.py +190 -0
  1146. vellum/workflows/tests/test_sandbox.py +137 -0
  1147. vellum/workflows/tests/triggers/test_integration_trigger.py +156 -0
  1148. vellum/workflows/triggers/__init__.py +6 -0
  1149. vellum/workflows/triggers/base.py +391 -0
  1150. vellum/workflows/triggers/integration.py +186 -0
  1151. vellum/workflows/triggers/manual.py +37 -0
  1152. vellum/workflows/triggers/schedule.py +18 -0
  1153. vellum/workflows/triggers/tests/__init__.py +1 -0
  1154. vellum/workflows/triggers/tests/test_base_trigger_display.py +147 -0
  1155. vellum/workflows/triggers/tests/test_integration.py +155 -0
  1156. vellum/workflows/types/__init__.py +2 -1
  1157. vellum/workflows/types/code_execution_node_wrappers.py +105 -0
  1158. vellum/workflows/types/core.py +5 -0
  1159. vellum/workflows/types/definition.py +168 -2
  1160. vellum/workflows/types/generics.py +5 -0
  1161. vellum/workflows/types/tests/test_definition.py +183 -0
  1162. vellum/workflows/types/tests/test_utils.py +14 -3
  1163. vellum/workflows/types/utils.py +64 -13
  1164. vellum/workflows/utils/files.py +28 -0
  1165. vellum/workflows/utils/functions.py +284 -17
  1166. vellum/workflows/utils/hmac.py +44 -0
  1167. vellum/workflows/utils/names.py +32 -4
  1168. vellum/workflows/utils/pydantic_schema.py +38 -0
  1169. vellum/workflows/utils/tests/test_functions.py +516 -5
  1170. vellum/workflows/utils/tests/test_names.py +9 -0
  1171. vellum/workflows/utils/tests/test_vellum_variables.py +32 -2
  1172. vellum/workflows/utils/uuids.py +35 -0
  1173. vellum/workflows/utils/vellum_variables.py +131 -7
  1174. vellum/workflows/utils/zip.py +46 -0
  1175. vellum/workflows/vellum_client.py +3 -21
  1176. vellum/workflows/workflows/base.py +363 -39
  1177. vellum/workflows/workflows/event_filters.py +13 -0
  1178. vellum/workflows/workflows/tests/test_base_workflow.py +122 -10
  1179. vellum/workflows/workflows/tests/test_event_filters.py +126 -0
  1180. {vellum_ai-0.14.41.dist-info → vellum_ai-1.11.2.dist-info}/METADATA +12 -13
  1181. vellum_ai-1.11.2.dist-info/RECORD +2177 -0
  1182. vellum_ai-1.11.2.dist-info/entry_points.txt +4 -0
  1183. vellum_cli/__init__.py +42 -4
  1184. vellum_cli/config.py +12 -5
  1185. vellum_cli/image_push.py +120 -10
  1186. vellum_cli/logger.py +11 -0
  1187. vellum_cli/move.py +56 -0
  1188. vellum_cli/ping.py +6 -0
  1189. vellum_cli/pull.py +78 -14
  1190. vellum_cli/push.py +149 -61
  1191. vellum_cli/tests/conftest.py +6 -0
  1192. vellum_cli/tests/test_image_push.py +295 -8
  1193. vellum_cli/tests/test_image_push_error_handling.py +258 -0
  1194. vellum_cli/tests/test_init.py +7 -24
  1195. vellum_cli/tests/test_move.py +154 -0
  1196. vellum_cli/tests/test_ping.py +15 -0
  1197. vellum_cli/tests/test_pull.py +133 -57
  1198. vellum_cli/tests/test_push.py +708 -19
  1199. vellum_ee/assets/node-definitions.json +1135 -0
  1200. vellum_ee/scripts/generate_node_definitions.py +89 -0
  1201. vellum_ee/workflows/display/base.py +29 -55
  1202. vellum_ee/workflows/display/editor/types.py +3 -0
  1203. vellum_ee/workflows/display/exceptions.py +3 -0
  1204. vellum_ee/workflows/display/nodes/base_node_display.py +211 -218
  1205. vellum_ee/workflows/display/nodes/get_node_display_class.py +1 -25
  1206. vellum_ee/workflows/display/nodes/tests/test_base_node_display.py +149 -3
  1207. vellum_ee/workflows/display/nodes/vellum/__init__.py +2 -0
  1208. vellum_ee/workflows/display/nodes/vellum/api_node.py +37 -12
  1209. vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +3 -3
  1210. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +30 -8
  1211. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +19 -7
  1212. vellum_ee/workflows/display/nodes/vellum/error_node.py +23 -19
  1213. vellum_ee/workflows/display/nodes/vellum/final_output_node.py +9 -19
  1214. vellum_ee/workflows/display/nodes/vellum/function_node.py +14 -0
  1215. vellum_ee/workflows/display/nodes/vellum/guardrail_node.py +4 -4
  1216. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +114 -29
  1217. vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +35 -9
  1218. vellum_ee/workflows/display/nodes/vellum/map_node.py +44 -25
  1219. vellum_ee/workflows/display/nodes/vellum/merge_node.py +2 -4
  1220. vellum_ee/workflows/display/nodes/vellum/note_node.py +2 -3
  1221. vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +28 -17
  1222. vellum_ee/workflows/display/nodes/vellum/retry_node.py +6 -7
  1223. vellum_ee/workflows/display/nodes/vellum/search_node.py +84 -18
  1224. vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +26 -14
  1225. vellum_ee/workflows/display/nodes/vellum/templating_node.py +5 -5
  1226. vellum_ee/workflows/display/nodes/vellum/tests/test_api_node.py +65 -0
  1227. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +219 -3
  1228. vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py +4 -0
  1229. vellum_ee/workflows/display/nodes/vellum/tests/test_final_output_node.py +80 -0
  1230. vellum_ee/workflows/display/nodes/vellum/tests/test_inline_subworkflow_node.py +88 -0
  1231. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_deployment_node.py +177 -0
  1232. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +207 -6
  1233. vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py +1 -1
  1234. vellum_ee/workflows/display/nodes/vellum/tests/test_search_node.py +104 -0
  1235. vellum_ee/workflows/display/nodes/vellum/tests/test_subworkflow_deployment_node.py +110 -0
  1236. vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +2 -2
  1237. vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py +694 -0
  1238. vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py +2 -2
  1239. vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +8 -9
  1240. vellum_ee/workflows/display/nodes/vellum/try_node.py +6 -7
  1241. vellum_ee/workflows/display/tests/test_base_workflow_display.py +427 -8
  1242. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +2 -2
  1243. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +150 -125
  1244. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +277 -87
  1245. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +21 -17
  1246. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +76 -64
  1247. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +69 -12
  1248. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +68 -46
  1249. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +92 -80
  1250. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +320 -170
  1251. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +14 -15
  1252. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +14 -12
  1253. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +28 -18
  1254. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +20 -16
  1255. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +621 -5
  1256. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +73 -43
  1257. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +51 -32
  1258. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +37 -33
  1259. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +367 -36
  1260. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +40 -36
  1261. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_set_state_node_serialization.py +86 -0
  1262. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +25 -21
  1263. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +22 -18
  1264. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +14 -10
  1265. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py +87 -0
  1266. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py +313 -0
  1267. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_mcp_serialization.py +65 -0
  1268. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_parent_input.py +89 -0
  1269. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +224 -0
  1270. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_vellum_integration_serialization.py +68 -0
  1271. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_workflow_deployment_serialization.py +107 -0
  1272. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +2 -3
  1273. vellum_ee/workflows/display/tests/workflow_serialization/test_chat_message_dict_reference_serialization.py +108 -0
  1274. vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +20 -65
  1275. vellum_ee/workflows/display/tests/workflow_serialization/test_final_output_node_map_reference_serialization.py +88 -0
  1276. vellum_ee/workflows/display/tests/workflow_serialization/test_integration_trigger_serialization.py +306 -0
  1277. vellum_ee/workflows/display/tests/workflow_serialization/test_integration_trigger_with_entrypoint_node_id.py +88 -0
  1278. vellum_ee/workflows/display/tests/workflow_serialization/test_list_vellum_document_serialization.py +65 -0
  1279. vellum_ee/workflows/display/tests/workflow_serialization/test_manual_trigger_serialization.py +110 -0
  1280. vellum_ee/workflows/display/tests/workflow_serialization/test_map_node_with_terminal_nodes_serialization.py +62 -0
  1281. vellum_ee/workflows/display/tests/workflow_serialization/test_multi_trigger_same_node_serialization.py +99 -0
  1282. vellum_ee/workflows/display/tests/workflow_serialization/test_scheduled_trigger_serialization.py +267 -0
  1283. vellum_ee/workflows/display/tests/workflow_serialization/test_terminal_node_any_serialization.py +49 -0
  1284. vellum_ee/workflows/display/tests/workflow_serialization/test_trigger_display_from_display_class.py +153 -0
  1285. vellum_ee/workflows/display/tests/workflow_serialization/test_web_search_node_serialization.py +72 -0
  1286. vellum_ee/workflows/display/tests/workflow_serialization/test_workflow_input_parameterization_error.py +37 -0
  1287. vellum_ee/workflows/display/types.py +32 -2
  1288. vellum_ee/workflows/display/utils/auto_layout.py +130 -0
  1289. vellum_ee/workflows/display/utils/events.py +57 -0
  1290. vellum_ee/workflows/display/utils/exceptions.py +19 -0
  1291. vellum_ee/workflows/display/utils/expressions.py +487 -2
  1292. vellum_ee/workflows/display/utils/metadata.py +146 -0
  1293. vellum_ee/workflows/display/utils/registry.py +46 -0
  1294. vellum_ee/workflows/display/utils/tests/__init__.py +0 -0
  1295. vellum_ee/workflows/display/utils/tests/test_auto_layout.py +56 -0
  1296. vellum_ee/workflows/display/utils/tests/test_events.py +185 -0
  1297. vellum_ee/workflows/display/utils/tests/test_expressions.py +92 -0
  1298. vellum_ee/workflows/display/utils/vellum.py +49 -86
  1299. vellum_ee/workflows/display/vellum.py +2 -128
  1300. vellum_ee/workflows/display/workflows/__init__.py +0 -1
  1301. vellum_ee/workflows/display/workflows/base_workflow_display.py +778 -129
  1302. vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py +3 -0
  1303. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +752 -2
  1304. vellum_ee/workflows/server/virtual_file_loader.py +131 -6
  1305. vellum_ee/workflows/tests/local_workflow/display/nodes/final_output.py +1 -1
  1306. vellum_ee/workflows/tests/local_workflow/display/nodes/templating_node.py +1 -1
  1307. vellum_ee/workflows/tests/local_workflow/display/workflow.py +11 -14
  1308. vellum_ee/workflows/tests/test_display_meta.py +89 -0
  1309. vellum_ee/workflows/tests/test_registry.py +169 -0
  1310. vellum_ee/workflows/tests/test_serialize_module.py +265 -0
  1311. vellum_ee/workflows/tests/test_server.py +619 -44
  1312. vellum_ee/workflows/tests/test_virtual_files.py +48 -0
  1313. vellum/client/resources/release_reviews/client.py +0 -254
  1314. vellum/client/types/node_event_display_context.py +0 -30
  1315. vellum/client/types/workflow_event_display_context.py +0 -28
  1316. vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py +0 -5
  1317. vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py +0 -266
  1318. vellum/workflows/nodes/experimental/tool_calling_node/__init__.py +0 -3
  1319. vellum/workflows/nodes/experimental/tool_calling_node/node.py +0 -125
  1320. vellum/workflows/nodes/experimental/tool_calling_node/utils.py +0 -128
  1321. vellum_ai-0.14.41.dist-info/RECORD +0 -1704
  1322. vellum_ai-0.14.41.dist-info/entry_points.txt +0 -3
  1323. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +0 -9
  1324. /vellum/{workflows/nodes/displayable/bases/inline_prompt_node → prompts}/constants.py +0 -0
  1325. {vellum_ai-0.14.41.dist-info → vellum_ai-1.11.2.dist-info}/LICENSE +0 -0
  1326. {vellum_ai-0.14.41.dist-info → vellum_ai-1.11.2.dist-info}/WHEEL +0 -0
@@ -1,26 +1,42 @@
1
1
  from copy import copy
2
+ from enum import Enum
3
+ import fnmatch
2
4
  from functools import cached_property
3
5
  import importlib
4
6
  import inspect
7
+ import json
5
8
  import logging
9
+ import os
10
+ import traceback
6
11
  from uuid import UUID
7
- from typing import Any, Dict, ForwardRef, Generic, Iterator, List, Optional, Tuple, Type, TypeVar, Union, cast, get_args
12
+ from typing import Any, Dict, ForwardRef, Generic, List, Optional, Set, Tuple, Type, TypeVar, Union, cast, get_args
8
13
 
14
+ from vellum.client import Vellum as VellumClient
15
+ from vellum.client.core.pydantic_utilities import UniversalBaseModel
16
+ from vellum.utils.json_encoder import VellumJsonEncoder
9
17
  from vellum.workflows import BaseWorkflow
10
18
  from vellum.workflows.constants import undefined
11
19
  from vellum.workflows.descriptors.base import BaseDescriptor
12
20
  from vellum.workflows.edges import Edge
21
+ from vellum.workflows.edges.trigger_edge import TriggerEdge
13
22
  from vellum.workflows.events.workflow import NodeEventDisplayContext, WorkflowEventDisplayContext
23
+ from vellum.workflows.inputs.base import BaseInputs
24
+ from vellum.workflows.inputs.dataset_row import DatasetRow
14
25
  from vellum.workflows.nodes.bases import BaseNode
15
26
  from vellum.workflows.nodes.displayable.bases.utils import primitive_to_vellum_value
16
27
  from vellum.workflows.nodes.displayable.final_output_node.node import FinalOutputNode
17
28
  from vellum.workflows.nodes.utils import get_unadorned_node, get_unadorned_port, get_wrapped_node
18
29
  from vellum.workflows.ports import Port
19
30
  from vellum.workflows.references import OutputReference, WorkflowInputReference
20
- from vellum.workflows.types.core import JsonArray, JsonObject
31
+ from vellum.workflows.triggers.integration import IntegrationTrigger
32
+ from vellum.workflows.triggers.manual import ManualTrigger
33
+ from vellum.workflows.triggers.schedule import ScheduleTrigger
34
+ from vellum.workflows.types.core import Json, JsonArray, JsonObject
21
35
  from vellum.workflows.types.generics import WorkflowType
22
36
  from vellum.workflows.types.utils import get_original_base
23
37
  from vellum.workflows.utils.uuids import uuid4_from_hash
38
+ from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
39
+ from vellum.workflows.vellum_client import create_vellum_client
24
40
  from vellum_ee.workflows.display.base import (
25
41
  EdgeDisplay,
26
42
  EntrypointDisplay,
@@ -28,8 +44,10 @@ from vellum_ee.workflows.display.base import (
28
44
  WorkflowInputsDisplay,
29
45
  WorkflowMetaDisplay,
30
46
  WorkflowOutputDisplay,
47
+ WorkflowTriggerType,
48
+ get_trigger_type_mapping,
31
49
  )
32
- from vellum_ee.workflows.display.editor.types import NodeDisplayData
50
+ from vellum_ee.workflows.display.editor.types import NodeDisplayData, NodeDisplayPosition
33
51
  from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
34
52
  from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
35
53
  from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay, PortDisplay
@@ -46,12 +64,41 @@ from vellum_ee.workflows.display.types import (
46
64
  WorkflowInputsDisplays,
47
65
  WorkflowOutputDisplays,
48
66
  )
67
+ from vellum_ee.workflows.display.utils.auto_layout import auto_layout_nodes
68
+ from vellum_ee.workflows.display.utils.exceptions import UserFacingException
69
+ from vellum_ee.workflows.display.utils.expressions import serialize_value
70
+ from vellum_ee.workflows.display.utils.metadata import (
71
+ get_entrypoint_edge_id,
72
+ get_regular_edge_id,
73
+ get_trigger_edge_id,
74
+ load_dataset_row_index_to_id_mapping,
75
+ )
49
76
  from vellum_ee.workflows.display.utils.registry import register_workflow_display_class
50
77
  from vellum_ee.workflows.display.utils.vellum import infer_vellum_variable_type
51
78
  from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
52
79
 
53
80
  logger = logging.getLogger(__name__)
54
81
 
82
+ IGNORE_PATTERNS = [
83
+ "*.pyc",
84
+ "__pycache__",
85
+ ".*",
86
+ "node_modules/*",
87
+ "*.log",
88
+ "metadata.json",
89
+ ]
90
+
91
+
92
+ class WorkflowSerializationError(UniversalBaseModel):
93
+ message: str
94
+ stacktrace: str
95
+
96
+
97
+ class WorkflowSerializationResult(UniversalBaseModel):
98
+ exec_config: Dict[str, Any]
99
+ errors: List[WorkflowSerializationError]
100
+ dataset: Optional[List[Dict[str, Any]]] = None
101
+
55
102
 
56
103
  class BaseWorkflowDisplay(Generic[WorkflowType]):
57
104
  # Used to specify the display data for a workflow.
@@ -75,7 +122,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
75
122
  # Used to explicitly specify display data for a workflow's ports.
76
123
  port_displays: PortDisplays = {}
77
124
 
78
- _errors: List[Exception]
125
+ _serialized_files: List[str]
79
126
 
80
127
  _dry_run: bool
81
128
 
@@ -83,27 +130,47 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
83
130
  self,
84
131
  *,
85
132
  parent_display_context: Optional[WorkflowDisplayContext] = None,
133
+ client: Optional[VellumClient] = None,
86
134
  dry_run: bool = False,
87
135
  ):
88
136
  self._parent_display_context = parent_display_context
89
- self._errors: List[Exception] = []
137
+ self._client = client or (
138
+ # propagate the client from the parent display context if it is not provided
139
+ self._parent_display_context.client
140
+ if self._parent_display_context
141
+ else create_vellum_client()
142
+ )
143
+ self._serialized_files = []
90
144
  self._dry_run = dry_run
91
145
 
92
146
  def serialize(self) -> JsonObject:
147
+ self._serialized_files = [
148
+ "__init__.py",
149
+ "display/*",
150
+ "inputs.py",
151
+ "nodes/*",
152
+ "state.py",
153
+ "workflow.py",
154
+ "triggers/*",
155
+ ]
156
+
93
157
  input_variables: JsonArray = []
94
158
  for workflow_input_reference, workflow_input_display in self.display_context.workflow_input_displays.items():
95
159
  default = (
96
160
  primitive_to_vellum_value(workflow_input_reference.instance)
97
- if workflow_input_reference.instance
161
+ if workflow_input_reference.instance is not None and workflow_input_reference.instance is not undefined
98
162
  else None
99
163
  )
164
+
165
+ is_required = self._is_reference_required(workflow_input_reference)
166
+
100
167
  input_variables.append(
101
168
  {
102
169
  "id": str(workflow_input_display.id),
103
170
  "key": workflow_input_display.name or workflow_input_reference.name,
104
171
  "type": infer_vellum_variable_type(workflow_input_reference),
105
172
  "default": default.dict() if default else None,
106
- "required": workflow_input_reference.instance is undefined,
173
+ "required": is_required,
107
174
  "extensions": {"color": workflow_input_display.color},
108
175
  }
109
176
  )
@@ -111,27 +178,47 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
111
178
  state_variables: JsonArray = []
112
179
  for state_value_reference, state_value_display in self.display_context.state_value_displays.items():
113
180
  default = (
114
- primitive_to_vellum_value(state_value_reference.instance) if state_value_reference.instance else None
181
+ primitive_to_vellum_value(state_value_reference.instance)
182
+ if state_value_reference.instance is not None and state_value_reference.instance is not undefined
183
+ else None
115
184
  )
185
+
186
+ is_required = self._is_reference_required(state_value_reference)
187
+
116
188
  state_variables.append(
117
189
  {
118
190
  "id": str(state_value_display.id),
119
191
  "key": state_value_display.name or state_value_reference.name,
120
192
  "type": infer_vellum_variable_type(state_value_reference),
121
193
  "default": default.dict() if default else None,
122
- "required": state_value_reference.instance is undefined,
194
+ "required": is_required,
123
195
  "extensions": {"color": state_value_display.color},
124
196
  }
125
197
  )
126
198
 
127
- nodes: JsonArray = []
199
+ serialized_nodes: Dict[UUID, JsonObject] = {}
128
200
  edges: JsonArray = []
129
201
 
130
- # Add a single synthetic node for the workflow entrypoint
131
- entrypoint_node_id = self.display_context.workflow_display.entrypoint_node_id
132
- entrypoint_node_source_handle_id = self.display_context.workflow_display.entrypoint_node_source_handle_id
133
- nodes.append(
134
- {
202
+ # Get all trigger edges from the workflow's subgraphs to check if trigger exists
203
+ trigger_edges: List[TriggerEdge] = []
204
+ for subgraph in self._workflow.get_subgraphs():
205
+ trigger_edges.extend(list(subgraph.trigger_edges))
206
+
207
+ # Determine if we need an ENTRYPOINT node and what ID to use
208
+ manual_trigger_edges = [edge for edge in trigger_edges if issubclass(edge.trigger_class, ManualTrigger)]
209
+ has_manual_trigger = len(manual_trigger_edges) > 0
210
+
211
+ entrypoint_node_id: Optional[UUID] = None
212
+ entrypoint_node_source_handle_id: Optional[UUID] = None
213
+
214
+ if has_manual_trigger:
215
+ # ManualTrigger: use trigger ID for ENTRYPOINT node (backward compatibility)
216
+ trigger_class = manual_trigger_edges[0].trigger_class
217
+ entrypoint_node_id = trigger_class.__id__
218
+ entrypoint_node_source_handle_id = self.display_context.workflow_display.entrypoint_node_source_handle_id
219
+
220
+ # Add ENTRYPOINT node for ManualTrigger workflows
221
+ serialized_nodes[entrypoint_node_id] = {
135
222
  "id": str(entrypoint_node_id),
136
223
  "type": "ENTRYPOINT",
137
224
  "inputs": [],
@@ -142,35 +229,56 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
142
229
  "display_data": self.display_context.workflow_display.entrypoint_node_display.dict(),
143
230
  "base": None,
144
231
  "definition": None,
145
- },
146
- )
147
-
148
- # Add all the nodes in the workflow
149
- for node in self._workflow.get_nodes():
150
- node_display = self.display_context.node_displays[node]
151
-
152
- try:
153
- serialized_node = node_display.serialize(self.display_context)
154
- except NotImplementedError as e:
155
- self.add_error(e)
156
- continue
232
+ }
233
+ else:
234
+ # All other cases: use workflow_display ENTRYPOINT node
235
+ entrypoint_node_id = self.display_context.workflow_display.entrypoint_node_id
236
+ entrypoint_node_source_handle_id = self.display_context.workflow_display.entrypoint_node_source_handle_id
157
237
 
158
- nodes.append(serialized_node)
238
+ serialized_nodes[entrypoint_node_id] = {
239
+ "id": str(entrypoint_node_id),
240
+ "type": "ENTRYPOINT",
241
+ "inputs": [],
242
+ "data": {
243
+ "label": "Entrypoint Node",
244
+ "source_handle_id": str(entrypoint_node_source_handle_id),
245
+ },
246
+ "display_data": self.display_context.workflow_display.entrypoint_node_display.dict(),
247
+ "base": None,
248
+ "definition": None,
249
+ }
250
+ # else: has_only_integration_trigger without explicit entrypoint - no ENTRYPOINT node needed
159
251
 
160
- # Add all unused nodes in the workflow
161
- for node in self._workflow.get_unused_nodes():
252
+ # Add all the nodes in the workflows
253
+ for node in self._workflow.get_all_nodes():
162
254
  node_display = self.display_context.node_displays[node]
163
255
 
164
256
  try:
257
+ try:
258
+ node.__validate__()
259
+ except ValueError as validation_error:
260
+ # Only collect node validation errors directly to errors list, don't raise them
261
+ self.display_context.add_validation_error(validation_error)
262
+
165
263
  serialized_node = node_display.serialize(self.display_context)
166
- except NotImplementedError as e:
167
- self.add_error(e)
264
+ except (NotImplementedError, UserFacingException) as e:
265
+ self.display_context.add_error(e)
266
+ self.display_context.add_invalid_node(node)
168
267
  continue
169
268
 
170
- nodes.append(serialized_node)
269
+ # Use wrapped node's ID as dict key for adornment wrappers to prevent overwrites
270
+ wrapped_node = get_wrapped_node(node)
271
+ if wrapped_node:
272
+ wrapped_node_display = self.display_context.node_displays[wrapped_node]
273
+ dict_key = wrapped_node_display.node_id
274
+ else:
275
+ dict_key = node_display.node_id
276
+
277
+ serialized_nodes[dict_key] = serialized_node
171
278
 
172
279
  synthetic_output_edges: JsonArray = []
173
280
  output_variables: JsonArray = []
281
+ output_values: JsonArray = []
174
282
  final_output_nodes = [
175
283
  node for node in self.display_context.node_displays.keys() if issubclass(node, FinalOutputNode)
176
284
  ]
@@ -185,9 +293,9 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
185
293
  for workflow_output, workflow_output_display in self.display_context.workflow_output_displays.items():
186
294
  final_output_node_id = uuid4_from_hash(f"{self.workflow_id}|node_id|{workflow_output.name}")
187
295
  inferred_type = infer_vellum_variable_type(workflow_output)
188
-
189
296
  # Remove the terminal node output from the unreferenced set
190
- unreferenced_final_output_node_outputs.discard(cast(OutputReference, workflow_output.instance))
297
+ if isinstance(workflow_output.instance, OutputReference):
298
+ unreferenced_final_output_node_outputs.discard(workflow_output.instance)
191
299
 
192
300
  if workflow_output.instance not in final_output_node_outputs:
193
301
  # Create a synthetic terminal node only if there is no terminal node for this output
@@ -203,16 +311,21 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
203
311
  raise ValueError(f"Failed to serialize output '{workflow_output.name}': {str(e)}") from e
204
312
 
205
313
  source_node_display: Optional[BaseNodeDisplay]
206
- first_rule = node_input.value.rules[0]
207
- if first_rule.type == "NODE_OUTPUT":
208
- source_node_id = UUID(first_rule.data.node_id)
209
- try:
210
- source_node_display = [
211
- node_display
212
- for node_display in self.display_context.node_displays.values()
213
- if node_display.node_id == source_node_id
214
- ][0]
215
- except IndexError:
314
+ if not node_input.value.rules:
315
+ source_node_display = None
316
+ else:
317
+ first_rule = node_input.value.rules[0]
318
+ if first_rule.type == "NODE_OUTPUT":
319
+ source_node_id = UUID(first_rule.data.node_id)
320
+ try:
321
+ source_node_display = [
322
+ node_display
323
+ for node_display in self.display_context.node_displays.values()
324
+ if node_display.node_id == source_node_id
325
+ ][0]
326
+ except IndexError:
327
+ source_node_display = None
328
+ else:
216
329
  source_node_display = None
217
330
 
218
331
  synthetic_target_handle_id = str(
@@ -220,24 +333,22 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
220
333
  )
221
334
  synthetic_display_data = NodeDisplayData().dict()
222
335
  synthetic_node_label = "Final Output"
223
- nodes.append(
224
- {
225
- "id": str(final_output_node_id),
226
- "type": "TERMINAL",
227
- "data": {
228
- "label": synthetic_node_label,
229
- "name": workflow_output_display.name,
230
- "target_handle_id": synthetic_target_handle_id,
231
- "output_id": str(workflow_output_display.id),
232
- "output_type": inferred_type,
233
- "node_input_id": str(node_input.id),
234
- },
235
- "inputs": [node_input.dict()],
236
- "display_data": synthetic_display_data,
237
- "base": final_output_node_base,
238
- "definition": None,
239
- }
240
- )
336
+ serialized_nodes[final_output_node_id] = {
337
+ "id": str(final_output_node_id),
338
+ "type": "TERMINAL",
339
+ "data": {
340
+ "label": synthetic_node_label,
341
+ "name": workflow_output_display.name,
342
+ "target_handle_id": synthetic_target_handle_id,
343
+ "output_id": str(workflow_output_display.id),
344
+ "output_type": inferred_type,
345
+ "node_input_id": str(node_input.id),
346
+ },
347
+ "inputs": [node_input.dict()],
348
+ "display_data": synthetic_display_data,
349
+ "base": final_output_node_base,
350
+ "definition": None,
351
+ }
241
352
 
242
353
  if source_node_display:
243
354
  source_handle_id = source_node_display.get_source_handle_id(
@@ -255,6 +366,19 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
255
366
  }
256
367
  )
257
368
 
369
+ elif isinstance(workflow_output.instance, OutputReference):
370
+ terminal_node_id = workflow_output.instance.outputs_class.__parent_class__.__id__
371
+ serialized_terminal_node = serialized_nodes.get(terminal_node_id)
372
+ if serialized_terminal_node and isinstance(serialized_terminal_node["data"], dict):
373
+ serialized_terminal_node["data"]["name"] = workflow_output_display.name
374
+
375
+ output_values.append(
376
+ {
377
+ "output_variable_id": str(workflow_output_display.id),
378
+ "value": serialize_value(self.workflow_id, self.display_context, workflow_output.instance),
379
+ }
380
+ )
381
+
258
382
  output_variables.append(
259
383
  {
260
384
  "id": str(workflow_output_display.id),
@@ -266,83 +390,456 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
266
390
  # If there are terminal nodes with no workflow output reference,
267
391
  # raise a serialization error
268
392
  if len(unreferenced_final_output_node_outputs) > 0:
269
- self.add_error(
393
+ self.display_context.add_error(
270
394
  ValueError("Unable to serialize terminal nodes that are not referenced by workflow outputs.")
271
395
  )
272
396
 
273
- # Add an edge for each edge in the workflow
397
+ # Identify nodes that already have trigger edges so we can avoid duplicating entrypoint edges
398
+ nodes_with_trigger_edges: Set[Type[BaseNode]] = set()
399
+ for trigger_edge in trigger_edges:
400
+ try:
401
+ nodes_with_trigger_edges.add(get_unadorned_node(trigger_edge.to_node))
402
+ except Exception:
403
+ continue
404
+
405
+ # Determine which nodes have explicit non-trigger entrypoints in the graph
406
+ non_trigger_entrypoint_nodes: Set[Type[BaseNode]] = set()
407
+ for subgraph in self._workflow.get_subgraphs():
408
+ # If the subgraph contains trigger edges, its entrypoints were derived from triggers
409
+ if any(True for _ in subgraph.trigger_edges):
410
+ continue
411
+ for entrypoint in subgraph.entrypoints:
412
+ try:
413
+ non_trigger_entrypoint_nodes.add(get_unadorned_node(entrypoint))
414
+ except Exception:
415
+ continue
416
+
417
+ # Add edges from entrypoint first to preserve expected ordering
418
+
274
419
  for target_node, entrypoint_display in self.display_context.entrypoint_displays.items():
275
420
  unadorned_target_node = get_unadorned_node(target_node)
421
+
422
+ # Skip the auto-generated entrypoint edge when a trigger already targets this node,
423
+ # unless the graph explicitly defines a non-trigger entrypoint for it.
424
+ if (
425
+ unadorned_target_node in nodes_with_trigger_edges
426
+ and unadorned_target_node not in non_trigger_entrypoint_nodes
427
+ ):
428
+ continue
429
+
430
+ # Skip edges to invalid nodes
431
+ if self._is_node_invalid(unadorned_target_node):
432
+ continue
433
+
434
+ if entrypoint_node_id is None:
435
+ continue
436
+
276
437
  target_node_display = self.display_context.node_displays[unadorned_target_node]
277
- edges.append(
278
- {
279
- "id": str(entrypoint_display.edge_display.id),
280
- "source_node_id": str(entrypoint_node_id),
281
- "source_handle_id": str(entrypoint_node_source_handle_id),
282
- "target_node_id": str(target_node_display.node_id),
283
- "target_handle_id": str(target_node_display.get_trigger_id()),
284
- "type": "DEFAULT",
285
- }
286
- )
438
+
439
+ stable_edge_id = get_entrypoint_edge_id(unadorned_target_node, self._workflow.__module__)
440
+
441
+ entrypoint_edge_dict: Dict[str, Json] = {
442
+ "id": str(stable_edge_id) if stable_edge_id else str(entrypoint_display.edge_display.id),
443
+ "source_node_id": str(entrypoint_node_id),
444
+ "source_handle_id": str(entrypoint_node_source_handle_id),
445
+ "target_node_id": str(target_node_display.node_id),
446
+ "target_handle_id": str(target_node_display.get_trigger_id()),
447
+ "type": "DEFAULT",
448
+ }
449
+ display_data = self._serialize_edge_display_data(entrypoint_display.edge_display)
450
+ if display_data is not None:
451
+ entrypoint_edge_dict["display_data"] = display_data
452
+ edges.append(entrypoint_edge_dict)
453
+
454
+ # Then add trigger edges
455
+ for trigger_edge in trigger_edges:
456
+ target_node = trigger_edge.to_node
457
+ unadorned_target_node = get_unadorned_node(target_node)
458
+ nodes_with_trigger_edges.add(unadorned_target_node)
459
+
460
+ # Skip edges to invalid nodes
461
+ if self._is_node_invalid(unadorned_target_node):
462
+ continue
463
+
464
+ target_node_display = self.display_context.node_displays[unadorned_target_node]
465
+
466
+ # Get the entrypoint display for this target node (if it exists)
467
+ target_entrypoint_display = self.display_context.entrypoint_displays.get(target_node)
468
+ if target_entrypoint_display is None:
469
+ continue
470
+
471
+ trigger_class = trigger_edge.trigger_class
472
+ trigger_id = trigger_class.__id__
473
+
474
+ # Determine source node ID and handle ID based on trigger type
475
+ if issubclass(trigger_class, ManualTrigger):
476
+ source_node_id = entrypoint_node_id
477
+ source_handle_id = entrypoint_node_source_handle_id
478
+ else:
479
+ source_node_id = trigger_id
480
+ source_handle_id = trigger_id
481
+
482
+ # Prefer stable id from metadata mapping if present
483
+ stable_edge_id = get_trigger_edge_id(trigger_class, unadorned_target_node, self._workflow.__module__)
484
+
485
+ trigger_edge_dict: Dict[str, Json] = {
486
+ "id": str(stable_edge_id) if stable_edge_id else str(target_entrypoint_display.edge_display.id),
487
+ "source_node_id": str(source_node_id),
488
+ "source_handle_id": str(source_handle_id),
489
+ "target_node_id": str(target_node_display.node_id),
490
+ "target_handle_id": str(target_node_display.get_trigger_id()),
491
+ "type": "DEFAULT",
492
+ }
493
+ display_data = self._serialize_edge_display_data(target_entrypoint_display.edge_display)
494
+ if display_data is not None:
495
+ trigger_edge_dict["display_data"] = display_data
496
+ edges.append(trigger_edge_dict)
287
497
 
288
498
  for (source_node_port, target_node), edge_display in self.display_context.edge_displays.items():
289
499
  unadorned_source_node_port = get_unadorned_port(source_node_port)
290
500
  unadorned_target_node = get_unadorned_node(target_node)
291
501
 
502
+ # Skip edges that reference invalid nodes
503
+ if self._is_node_invalid(unadorned_target_node) or self._is_node_invalid(
504
+ unadorned_source_node_port.node_class
505
+ ):
506
+ continue
507
+
292
508
  source_node_port_display = self.display_context.port_displays[unadorned_source_node_port]
293
509
  target_node_display = self.display_context.node_displays[unadorned_target_node]
294
510
 
295
- edges.append(
296
- {
297
- "id": str(edge_display.id),
298
- "source_node_id": str(source_node_port_display.node_id),
299
- "source_handle_id": str(source_node_port_display.id),
300
- "target_node_id": str(target_node_display.node_id),
301
- "target_handle_id": str(
302
- target_node_display.get_target_handle_id_by_source_node_id(source_node_port_display.node_id)
303
- ),
304
- "type": "DEFAULT",
305
- }
511
+ stable_edge_id = get_regular_edge_id(
512
+ unadorned_source_node_port.node_class,
513
+ source_node_port_display.id,
514
+ unadorned_target_node,
515
+ self._workflow.__module__,
306
516
  )
307
517
 
518
+ regular_edge_dict: Dict[str, Json] = {
519
+ "id": str(stable_edge_id) if stable_edge_id else str(edge_display.id),
520
+ "source_node_id": str(source_node_port_display.node_id),
521
+ "source_handle_id": str(source_node_port_display.id),
522
+ "target_node_id": str(target_node_display.node_id),
523
+ "target_handle_id": str(
524
+ target_node_display.get_target_handle_id_by_source_node_id(source_node_port_display.node_id)
525
+ ),
526
+ "type": "DEFAULT",
527
+ }
528
+ display_data = self._serialize_edge_display_data(edge_display)
529
+ if display_data is not None:
530
+ regular_edge_dict["display_data"] = display_data
531
+ edges.append(regular_edge_dict)
532
+
308
533
  edges.extend(synthetic_output_edges)
309
534
 
310
- return {
311
- "workflow_raw_data": {
312
- "nodes": nodes,
313
- "edges": edges,
314
- "display_data": self.display_context.workflow_display.display_data.dict(),
315
- "definition": {
316
- "name": self._workflow.__name__,
317
- "module": cast(JsonArray, self._workflow.__module__.split(".")),
318
- },
535
+ nodes_list = list(serialized_nodes.values())
536
+ nodes_dict_list = [cast(Dict[str, Any], node) for node in nodes_list if isinstance(node, dict)]
537
+
538
+ all_nodes_at_zero = all(
539
+ (
540
+ isinstance(node.get("display_data"), dict)
541
+ and isinstance(node["display_data"].get("position"), dict)
542
+ and node["display_data"]["position"].get("x", 0) == 0.0
543
+ and node["display_data"]["position"].get("y", 0) == 0.0
544
+ )
545
+ for node in nodes_dict_list
546
+ )
547
+
548
+ should_apply_auto_layout = all_nodes_at_zero and len(nodes_dict_list) > 0
549
+
550
+ if should_apply_auto_layout:
551
+ try:
552
+ self._apply_auto_layout(nodes_dict_list, edges)
553
+ except Exception as e:
554
+ self.display_context.add_error(e)
555
+
556
+ # Serialize workflow-level trigger if present
557
+ triggers: Optional[JsonArray] = self._serialize_workflow_trigger()
558
+
559
+ workflow_raw_data: JsonObject = {
560
+ "nodes": cast(JsonArray, nodes_dict_list),
561
+ "edges": edges,
562
+ "display_data": self.display_context.workflow_display.display_data.dict(),
563
+ "definition": {
564
+ "name": self._workflow.__name__,
565
+ "module": cast(JsonArray, self._workflow.__module__.split(".")),
319
566
  },
567
+ "output_values": output_values,
568
+ }
569
+
570
+ result: JsonObject = {
571
+ "workflow_raw_data": workflow_raw_data,
320
572
  "input_variables": input_variables,
321
573
  "state_variables": state_variables,
322
574
  "output_variables": output_variables,
323
575
  }
324
576
 
577
+ if triggers is not None:
578
+ result["triggers"] = triggers
579
+
580
+ return result
581
+
582
+ def _serialize_workflow_trigger(self) -> Optional[JsonArray]:
583
+ """
584
+ Serialize workflow-level trigger information.
585
+
586
+ Returns:
587
+ JsonArray with trigger data if a trigger is present, None otherwise.
588
+ Each trigger in the array has: id (UUID), type (str), attributes (list)
589
+ """
590
+ # Get all trigger edges from the workflow's subgraphs
591
+ trigger_edges = []
592
+ for subgraph in self._workflow.get_subgraphs():
593
+ trigger_edges.extend(list(subgraph.trigger_edges))
594
+
595
+ if not trigger_edges:
596
+ # No workflow-level trigger defined
597
+ return None
598
+
599
+ unique_trigger_classes = list(dict.fromkeys(edge.trigger_class for edge in trigger_edges))
600
+
601
+ trigger_type_mapping = get_trigger_type_mapping()
602
+ serialized_triggers: List[JsonObject] = []
603
+
604
+ for trigger_class in unique_trigger_classes:
605
+ # Get the trigger type from the mapping, or check if it's a subclass
606
+ trigger_type = trigger_type_mapping.get(trigger_class)
607
+ if trigger_type is None:
608
+ # Check if it's a subclass of a known trigger type
609
+ if issubclass(trigger_class, ManualTrigger):
610
+ trigger_type = WorkflowTriggerType.MANUAL
611
+ elif issubclass(trigger_class, IntegrationTrigger):
612
+ trigger_type = WorkflowTriggerType.INTEGRATION
613
+ elif issubclass(trigger_class, ScheduleTrigger):
614
+ trigger_type = WorkflowTriggerType.SCHEDULED
615
+ else:
616
+ raise ValueError(
617
+ f"Unknown trigger type: {trigger_class.__name__}. "
618
+ f"Please add it to the trigger type mapping in get_trigger_type_mapping()."
619
+ )
620
+
621
+ trigger_id = trigger_class.__id__
622
+
623
+ # Serialize trigger attributes like node outputs
624
+ trigger_data: JsonObject
625
+ if trigger_type == WorkflowTriggerType.SCHEDULED:
626
+ # For scheduled triggers, attributes should be empty
627
+ # and cron/timezone should be top level
628
+
629
+ config_class = trigger_class.Config
630
+ cron_value = getattr(config_class, "cron", None)
631
+ timezone_value = getattr(config_class, "timezone", None)
632
+
633
+ trigger_data = {
634
+ "id": str(trigger_id),
635
+ "type": trigger_type.value,
636
+ "cron": cron_value,
637
+ "timezone": timezone_value,
638
+ "attributes": [],
639
+ }
640
+ else:
641
+ # For other triggers, serialize attributes from attribute_references as VellumVariables
642
+ attribute_references = trigger_class.attribute_references().values()
643
+ trigger_attributes: JsonArray = cast(
644
+ JsonArray,
645
+ [
646
+ cast(
647
+ JsonObject,
648
+ {
649
+ "id": str(reference.id),
650
+ "key": reference.name,
651
+ "type": primitive_type_to_vellum_variable_type(reference),
652
+ "required": True,
653
+ "default": None,
654
+ "extensions": None,
655
+ },
656
+ )
657
+ for reference in sorted(attribute_references, key=lambda ref: ref.name)
658
+ ],
659
+ )
660
+
661
+ trigger_data = {
662
+ "id": str(trigger_id),
663
+ "type": trigger_type.value,
664
+ "attributes": trigger_attributes,
665
+ }
666
+
667
+ if trigger_type == WorkflowTriggerType.INTEGRATION and issubclass(trigger_class, IntegrationTrigger):
668
+ exec_config = self._serialize_integration_trigger_exec_config(trigger_class)
669
+ trigger_data["exec_config"] = exec_config
670
+
671
+ # Serialize display_data from trigger's Display class
672
+ display_class = trigger_class.Display
673
+ display_data: JsonObject = {}
674
+
675
+ # Add label if present
676
+ if hasattr(display_class, "label") and display_class.label is not None:
677
+ display_data["label"] = display_class.label
678
+
679
+ # Add x and y coordinates if present
680
+ if (
681
+ hasattr(display_class, "x")
682
+ and display_class.x is not None
683
+ and hasattr(display_class, "y")
684
+ and display_class.y is not None
685
+ ):
686
+ display_data["position"] = {
687
+ "x": display_class.x,
688
+ "y": display_class.y,
689
+ }
690
+
691
+ # Add z index if present
692
+ if hasattr(display_class, "z_index") and display_class.z_index is not None:
693
+ display_data["z_index"] = display_class.z_index
694
+
695
+ # Add icon if present
696
+ if hasattr(display_class, "icon") and display_class.icon is not None:
697
+ display_data["icon"] = display_class.icon
698
+
699
+ # Add color if present
700
+ if hasattr(display_class, "color") and display_class.color is not None:
701
+ display_data["color"] = display_class.color
702
+
703
+ # Add comment if present
704
+ if hasattr(display_class, "comment") and display_class.comment is not None:
705
+ display_data["comment"] = {
706
+ "value": display_class.comment.value,
707
+ "expanded": display_class.comment.expanded,
708
+ }
709
+
710
+ # Don't include display_data for manual triggers
711
+ if display_data and trigger_type != WorkflowTriggerType.MANUAL:
712
+ trigger_data["display_data"] = display_data
713
+
714
+ serialized_triggers.append(trigger_data)
715
+
716
+ return cast(JsonArray, serialized_triggers)
717
+
718
+ def _serialize_edge_display_data(self, edge_display: EdgeDisplay) -> Optional[JsonObject]:
719
+ """Serialize edge display data, returning None if no display data is present."""
720
+ if edge_display.z_index is not None:
721
+ return {"z_index": edge_display.z_index}
722
+ return None
723
+
724
+ def _serialize_integration_trigger_exec_config(self, trigger_class: Type[IntegrationTrigger]) -> JsonObject:
725
+ config_class = trigger_class.Config
726
+
727
+ provider = getattr(config_class, "provider", None)
728
+ if isinstance(provider, Enum):
729
+ provider = provider.value
730
+ elif provider is not None:
731
+ provider = str(provider)
732
+ slug = getattr(config_class, "slug", None)
733
+ integration_name = getattr(config_class, "integration_name", None)
734
+
735
+ setup_attributes: List[JsonObject] = []
736
+ raw_setup_attributes = getattr(config_class, "setup_attributes", None)
737
+
738
+ if isinstance(raw_setup_attributes, dict):
739
+ for key, value in raw_setup_attributes.items():
740
+ attribute_id = str(uuid4_from_hash(f"{trigger_class.__id__}|setup_attribute|{key}"))
741
+
742
+ default_json: Optional[JsonObject] = None
743
+ attribute_type = "STRING"
744
+
745
+ if value is not None:
746
+ try:
747
+ vellum_value = primitive_to_vellum_value(value)
748
+ default_json = cast(JsonObject, self._model_dump(vellum_value))
749
+ attribute_type = cast(str, default_json.get("type", attribute_type))
750
+ except ValueError:
751
+ default_json = None
752
+
753
+ setup_attributes.append(
754
+ cast(
755
+ JsonObject,
756
+ {
757
+ "id": attribute_id,
758
+ "key": str(key),
759
+ "type": attribute_type,
760
+ "required": True,
761
+ "default": default_json,
762
+ "extensions": {"color": None, "description": None},
763
+ },
764
+ )
765
+ )
766
+
767
+ return cast(
768
+ JsonObject,
769
+ {
770
+ "type": provider,
771
+ "slug": slug,
772
+ "integration_name": integration_name,
773
+ "setup_attributes": setup_attributes,
774
+ },
775
+ )
776
+
777
+ @staticmethod
778
+ def _model_dump(value: Any) -> Any:
779
+ if hasattr(value, "model_dump"):
780
+ return value.model_dump(mode="json")
781
+ if hasattr(value, "dict"):
782
+ return value.dict()
783
+ return value
784
+
785
+ def _apply_auto_layout(self, nodes_dict_list: List[Dict[str, Any]], edges: List[Json]) -> None:
786
+ """Apply auto-layout to nodes that are all positioned at (0,0)."""
787
+ nodes_for_layout: List[Tuple[str, NodeDisplayData]] = []
788
+ for node_dict in nodes_dict_list:
789
+ if isinstance(node_dict.get("id"), str) and isinstance(node_dict.get("display_data"), dict):
790
+ display_data = node_dict["display_data"]
791
+ position = display_data.get("position", {})
792
+ if isinstance(position, dict):
793
+ nodes_for_layout.append(
794
+ (
795
+ str(node_dict["id"]),
796
+ NodeDisplayData(
797
+ position=NodeDisplayPosition(
798
+ x=float(position.get("x", 0.0)), y=float(position.get("y", 0.0))
799
+ ),
800
+ width=display_data.get("width"),
801
+ height=display_data.get("height"),
802
+ comment=display_data.get("comment"),
803
+ ),
804
+ )
805
+ )
806
+
807
+ edges_for_layout: List[Tuple[str, str, EdgeDisplay]] = []
808
+ for edge in edges:
809
+ if isinstance(edge, dict):
810
+ edge_dict = cast(Dict[str, Any], edge)
811
+ edge_source_node_id: Optional[Any] = edge_dict.get("source_node_id")
812
+ edge_target_node_id: Optional[Any] = edge_dict.get("target_node_id")
813
+ edge_id_raw: Optional[Any] = edge_dict.get("id")
814
+ if (
815
+ isinstance(edge_source_node_id, str)
816
+ and isinstance(edge_target_node_id, str)
817
+ and isinstance(edge_id_raw, str)
818
+ ):
819
+ edges_for_layout.append(
820
+ (edge_source_node_id, edge_target_node_id, EdgeDisplay(id=UUID(edge_id_raw)))
821
+ )
822
+
823
+ positioned_nodes = auto_layout_nodes(nodes_for_layout, edges_for_layout)
824
+
825
+ for node_id, positioned_data in positioned_nodes:
826
+ for node_dict in nodes_dict_list:
827
+ node_id_val = node_dict.get("id")
828
+ display_data = node_dict.get("display_data")
829
+ if isinstance(node_id_val, str) and node_id_val == node_id and isinstance(display_data, dict):
830
+ display_data_dict = cast(Dict[str, Any], display_data)
831
+ display_data_dict["position"] = positioned_data.position.dict()
832
+
325
833
  @cached_property
326
834
  def workflow_id(self) -> UUID:
327
835
  """Can be overridden as a class attribute to specify a custom workflow id."""
328
836
  return self._workflow.__id__
329
837
 
330
- def add_error(self, error: Exception) -> None:
331
- if self._dry_run:
332
- self._errors.append(error)
333
- return
334
-
335
- raise error
336
-
337
- @property
338
- def errors(self) -> Iterator[Exception]:
339
- return iter(self._errors)
340
-
341
838
  def _enrich_global_node_output_displays(
342
839
  self,
343
840
  node: Type[BaseNode],
344
841
  node_display: BaseNodeDisplay,
345
- node_output_displays: Dict[OutputReference, Tuple[Type[BaseNode], NodeOutputDisplay]],
842
+ node_output_displays: Dict[OutputReference, NodeOutputDisplay],
346
843
  ):
347
844
  """This method recursively adds nodes wrapped in decorators to the node_output_displays dictionary."""
348
845
 
@@ -396,16 +893,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
396
893
 
397
894
  port_displays: PortDisplays = {}
398
895
 
399
- for node in self._workflow.get_nodes():
400
- self._enrich_node_displays(
401
- node=node,
402
- node_displays=node_displays,
403
- global_node_displays=global_node_displays,
404
- global_node_output_displays=global_node_output_displays,
405
- port_displays=port_displays,
406
- )
407
-
408
- for node in self._workflow.get_unused_nodes():
896
+ for node in self._workflow.get_all_nodes():
409
897
  self._enrich_node_displays(
410
898
  node=node,
411
899
  node_displays=node_displays,
@@ -417,7 +905,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
417
905
  workflow_input_displays: WorkflowInputsDisplays = {}
418
906
  # If we're dealing with a nested workflow, then it should have access to the inputs of its parents.
419
907
  global_workflow_input_displays = (
420
- copy(self._parent_display_context.workflow_input_displays) if self._parent_display_context else {}
908
+ copy(self._parent_display_context.global_workflow_input_displays) if self._parent_display_context else {}
421
909
  )
422
910
  for workflow_input in self._workflow.get_inputs_class():
423
911
  workflow_input_display_overrides = self.inputs_display.get(workflow_input)
@@ -482,6 +970,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
482
970
  )
483
971
 
484
972
  return WorkflowDisplayContext(
973
+ client=self._client,
485
974
  workflow_display=workflow_meta_display,
486
975
  workflow_input_displays=workflow_input_displays,
487
976
  global_workflow_input_displays=global_workflow_input_displays,
@@ -495,6 +984,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
495
984
  edge_displays=edge_displays,
496
985
  port_displays=port_displays,
497
986
  workflow_display_class=self.__class__,
987
+ dry_run=self._dry_run,
498
988
  )
499
989
 
500
990
  def _generate_workflow_meta_display(self) -> WorkflowMetaDisplay:
@@ -565,10 +1055,8 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
565
1055
 
566
1056
  return EntrypointDisplay(id=entrypoint_id, edge_display=edge_display)
567
1057
 
568
- def _generate_workflow_output_display(self, output: BaseDescriptor) -> WorkflowOutputDisplay:
569
- output_id = uuid4_from_hash(f"{self.workflow_id}|id|{output.name}")
570
-
571
- return WorkflowOutputDisplay(id=output_id, name=output.name)
1058
+ def _generate_workflow_output_display(self, output: OutputReference) -> WorkflowOutputDisplay:
1059
+ return WorkflowOutputDisplay(id=output.id, name=output.name)
572
1060
 
573
1061
  def __init_subclass__(cls, **kwargs: Any) -> None:
574
1062
  super().__init_subclass__(**kwargs)
@@ -582,17 +1070,47 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
582
1070
  # DEPRECATED: This will be removed in the 0.15.0 release
583
1071
  workflow_class: Optional[Type[BaseWorkflow]] = None,
584
1072
  ) -> Union[WorkflowEventDisplayContext, None]:
585
- workflow_display_module = f"{module_path}.display.workflow"
1073
+ full_workflow_display_module_path = f"{module_path}.display.workflow"
586
1074
  try:
587
- display_class = importlib.import_module(workflow_display_module)
1075
+ display_module = importlib.import_module(full_workflow_display_module_path)
588
1076
  except ModuleNotFoundError:
589
- return None
1077
+ return BaseWorkflowDisplay._gather_event_display_context_from_workflow_crawling(module_path, workflow_class)
590
1078
 
591
- WorkflowDisplayClass = display_class.WorkflowDisplay
592
- if not isinstance(WorkflowDisplayClass, type) or not issubclass(WorkflowDisplayClass, BaseWorkflowDisplay):
593
- return None
1079
+ WorkflowDisplayClass: Optional[Type[BaseWorkflowDisplay]] = None
1080
+ for name, definition in display_module.__dict__.items():
1081
+ if name.startswith("_"):
1082
+ continue
1083
+
1084
+ if (
1085
+ not isinstance(definition, type)
1086
+ or not issubclass(definition, BaseWorkflowDisplay)
1087
+ or definition == BaseWorkflowDisplay
1088
+ ):
1089
+ continue
1090
+
1091
+ WorkflowDisplayClass = definition
1092
+ break
1093
+
1094
+ if WorkflowDisplayClass:
1095
+ return WorkflowDisplayClass().get_event_display_context()
1096
+
1097
+ return BaseWorkflowDisplay._gather_event_display_context_from_workflow_crawling(module_path, workflow_class)
1098
+
1099
+ @staticmethod
1100
+ def _gather_event_display_context_from_workflow_crawling(
1101
+ module_path: str,
1102
+ workflow_class: Optional[Type[BaseWorkflow]] = None,
1103
+ ) -> Union[WorkflowEventDisplayContext, None]:
1104
+ try:
1105
+ if workflow_class is None:
1106
+ workflow_class = BaseWorkflow.load_from_module(module_path)
1107
+
1108
+ workflow_display = get_workflow_display(workflow_class=workflow_class)
1109
+ return workflow_display.get_event_display_context()
594
1110
 
595
- return WorkflowDisplayClass().get_event_display_context()
1111
+ except ModuleNotFoundError:
1112
+ logger.exception("Failed to load workflow from module %s", module_path)
1113
+ return None
596
1114
 
597
1115
  def get_event_display_context(self):
598
1116
  display_context = self.display_context
@@ -722,5 +1240,136 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
722
1240
  def _workflow(self) -> Type[WorkflowType]:
723
1241
  return cast(Type[WorkflowType], self.__class__.infer_workflow_class())
724
1242
 
1243
+ @staticmethod
1244
+ def serialize_module(
1245
+ module: str,
1246
+ *,
1247
+ client: Optional[VellumClient] = None,
1248
+ dry_run: bool = False,
1249
+ ) -> WorkflowSerializationResult:
1250
+ """
1251
+ Load a workflow from a module and serialize it to JSON.
1252
+
1253
+ Args:
1254
+ module: The module path to load the workflow from
1255
+ client: Optional Vellum client to use for serialization
1256
+ dry_run: Whether to run in dry-run mode
1257
+
1258
+ Returns:
1259
+ WorkflowSerializationResult containing exec_config and errors
1260
+ """
1261
+ workflow = BaseWorkflow.load_from_module(module)
1262
+ workflow_display = get_workflow_display(
1263
+ workflow_class=workflow,
1264
+ client=client,
1265
+ dry_run=dry_run,
1266
+ )
1267
+
1268
+ exec_config = workflow_display.serialize()
1269
+ additional_files = workflow_display._gather_additional_module_files(module)
1270
+
1271
+ if additional_files:
1272
+ exec_config["module_data"] = {"additional_files": cast(JsonObject, additional_files)}
1273
+
1274
+ dataset = None
1275
+ try:
1276
+ sandbox_module_path = f"{module}.sandbox"
1277
+ sandbox_module = importlib.import_module(sandbox_module_path)
1278
+ if hasattr(sandbox_module, "dataset"):
1279
+ dataset_attr = getattr(sandbox_module, "dataset")
1280
+ if dataset_attr and isinstance(dataset_attr, list):
1281
+ dataset = []
1282
+ dataset_row_index_to_id = load_dataset_row_index_to_id_mapping(module)
1283
+ for i, inputs_obj in enumerate(dataset_attr):
1284
+ if isinstance(inputs_obj, DatasetRow):
1285
+ serialized_inputs = json.loads(json.dumps(inputs_obj.inputs, cls=VellumJsonEncoder))
1286
+ row_data = {"label": inputs_obj.label, "inputs": serialized_inputs}
1287
+ trigger_class = inputs_obj.workflow_trigger
1288
+ if trigger_class is not None:
1289
+ row_data["workflow_trigger_id"] = str(trigger_class.__id__)
1290
+ elif isinstance(inputs_obj, BaseInputs):
1291
+ serialized_inputs = json.loads(json.dumps(inputs_obj, cls=VellumJsonEncoder))
1292
+ row_data = {"label": f"Scenario {i + 1}", "inputs": serialized_inputs}
1293
+ else:
1294
+ continue
1295
+
1296
+ if i in dataset_row_index_to_id:
1297
+ row_data["id"] = dataset_row_index_to_id[i]
1298
+ elif isinstance(inputs_obj, DatasetRow) and inputs_obj.id is not None:
1299
+ row_data["id"] = inputs_obj.id
1300
+
1301
+ dataset.append(row_data)
1302
+ except (ImportError, AttributeError):
1303
+ pass
1304
+
1305
+ return WorkflowSerializationResult(
1306
+ exec_config=exec_config,
1307
+ errors=[
1308
+ WorkflowSerializationError(
1309
+ message=str(error),
1310
+ stacktrace="".join(traceback.format_exception(type(error), error, error.__traceback__)),
1311
+ )
1312
+ for error in workflow_display.display_context.errors
1313
+ ],
1314
+ dataset=dataset,
1315
+ )
1316
+
1317
+ def _gather_additional_module_files(self, module_path: str) -> Dict[str, str]:
1318
+ workflow_module_path = f"{module_path}.workflow"
1319
+ workflow_module = importlib.import_module(workflow_module_path)
1320
+
1321
+ workflow_file_path = workflow_module.__file__
1322
+ if not workflow_file_path:
1323
+ return {}
1324
+
1325
+ module_dir = os.path.dirname(workflow_file_path)
1326
+ additional_files = {}
1327
+
1328
+ for root, _, filenames in os.walk(module_dir):
1329
+ for filename in filenames:
1330
+ file_path = os.path.join(root, filename)
1331
+ relative_path = os.path.relpath(file_path, start=module_dir)
1332
+
1333
+ should_ignore = False
1334
+ for ignore_pattern in IGNORE_PATTERNS:
1335
+ if fnmatch.fnmatch(filename, ignore_pattern) or fnmatch.fnmatch(relative_path, ignore_pattern):
1336
+ should_ignore = True
1337
+ break
1338
+
1339
+ if not should_ignore:
1340
+ for serialized_pattern in self._serialized_files:
1341
+ if "*" in serialized_pattern:
1342
+ if fnmatch.fnmatch(relative_path, serialized_pattern) or fnmatch.fnmatch(
1343
+ filename, serialized_pattern
1344
+ ):
1345
+ should_ignore = True
1346
+ break
1347
+ else:
1348
+ if relative_path == serialized_pattern:
1349
+ should_ignore = True
1350
+ break
1351
+
1352
+ if should_ignore:
1353
+ continue
1354
+
1355
+ try:
1356
+ with open(file_path, encoding="utf-8") as f:
1357
+ additional_files[relative_path] = f.read()
1358
+ except (UnicodeDecodeError, PermissionError):
1359
+ continue
1360
+
1361
+ return additional_files
1362
+
1363
+ @staticmethod
1364
+ def _is_reference_required(reference: BaseDescriptor) -> bool:
1365
+ has_default = reference.instance is not undefined
1366
+ is_optional = type(None) in reference.types
1367
+ is_required = not has_default and not is_optional
1368
+ return is_required
1369
+
1370
+ def _is_node_invalid(self, node: Type[BaseNode]) -> bool:
1371
+ """Check if a node failed to serialize and should be considered invalid."""
1372
+ return node in self.display_context.invalid_nodes
1373
+
725
1374
 
726
1375
  register_workflow_display_class(workflow_class=BaseWorkflow, workflow_display_class=BaseWorkflowDisplay)