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