vellum-ai 1.2.1__py3-none-any.whl → 1.2.3__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.
- vellum/__init__.py +40 -0
- vellum/client/core/client_wrapper.py +2 -2
- vellum/client/core/pydantic_utilities.py +3 -2
- vellum/client/reference.md +16 -0
- vellum/client/resources/workflow_executions/client.py +28 -4
- vellum/client/resources/workflow_executions/raw_client.py +32 -2
- vellum/client/types/__init__.py +40 -0
- vellum/client/types/audio_input_request.py +30 -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/document_index_chunking.py +4 -1
- vellum/client/types/document_index_chunking_request.py +2 -1
- vellum/client/types/document_input_request.py +30 -0
- vellum/client/types/execution_audio_vellum_value.py +31 -0
- vellum/client/types/execution_document_vellum_value.py +31 -0
- vellum/client/types/execution_image_vellum_value.py +31 -0
- vellum/client/types/execution_vellum_value.py +8 -0
- vellum/client/types/execution_video_vellum_value.py +31 -0
- vellum/client/types/image_input_request.py +30 -0
- vellum/client/types/logical_operator.py +1 -0
- vellum/client/types/node_input_compiled_audio_value.py +23 -0
- vellum/client/types/node_input_compiled_document_value.py +23 -0
- vellum/client/types/node_input_compiled_image_value.py +23 -0
- vellum/client/types/node_input_compiled_video_value.py +23 -0
- vellum/client/types/node_input_variable_compiled_value.py +8 -0
- vellum/client/types/prompt_deployment_input_request.py +13 -1
- vellum/client/types/prompt_request_audio_input.py +26 -0
- 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 +13 -1
- vellum/client/types/prompt_request_video_input.py +26 -0
- vellum/client/types/video_input_request.py +30 -0
- vellum/prompts/blocks/compilation.py +13 -11
- vellum/types/audio_input_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/document_input_request.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_video_vellum_value.py +3 -0
- vellum/types/image_input_request.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/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/video_input_request.py +3 -0
- vellum/workflows/context.py +27 -9
- vellum/workflows/emitters/vellum_emitter.py +16 -69
- vellum/workflows/events/context.py +53 -78
- vellum/workflows/events/node.py +5 -5
- vellum/workflows/events/relational_threads.py +41 -0
- vellum/workflows/events/tests/test_basic_workflow.py +50 -0
- vellum/workflows/events/tests/test_event.py +1 -0
- vellum/workflows/events/workflow.py +15 -1
- vellum/workflows/expressions/contains.py +7 -0
- vellum/workflows/expressions/tests/test_contains.py +175 -0
- vellum/workflows/graph/graph.py +52 -8
- vellum/workflows/graph/tests/test_graph.py +17 -0
- vellum/workflows/integrations/mcp_service.py +35 -5
- vellum/workflows/integrations/tests/test_mcp_service.py +81 -0
- vellum/workflows/nodes/bases/base.py +0 -1
- vellum/workflows/nodes/core/error_node/node.py +4 -0
- vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +35 -0
- vellum/workflows/nodes/core/map_node/node.py +7 -0
- vellum/workflows/nodes/core/map_node/tests/test_node.py +19 -0
- vellum/workflows/nodes/displayable/bases/utils.py +4 -2
- vellum/workflows/nodes/displayable/final_output_node/node.py +4 -0
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +88 -2
- vellum/workflows/nodes/displayable/tool_calling_node/node.py +1 -0
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +85 -1
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +12 -0
- vellum/workflows/nodes/displayable/tool_calling_node/utils.py +5 -2
- vellum/workflows/ports/node_ports.py +3 -0
- vellum/workflows/ports/port.py +8 -11
- vellum/workflows/state/context.py +47 -2
- vellum/workflows/types/definition.py +4 -4
- vellum/workflows/utils/uuids.py +15 -0
- vellum/workflows/utils/vellum_variables.py +5 -3
- vellum/workflows/workflows/base.py +1 -0
- {vellum_ai-1.2.1.dist-info → vellum_ai-1.2.3.dist-info}/METADATA +1 -1
- {vellum_ai-1.2.1.dist-info → vellum_ai-1.2.3.dist-info}/RECORD +128 -82
- vellum_ee/workflows/display/nodes/base_node_display.py +19 -10
- vellum_ee/workflows/display/nodes/vellum/api_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/error_node.py +1 -3
- vellum_ee/workflows/display/nodes/vellum/final_output_node.py +1 -3
- vellum_ee/workflows/display/nodes/vellum/guardrail_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +1 -8
- vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/map_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/merge_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/note_node.py +2 -4
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/search_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/templating_node.py +1 -4
- vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +1 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +12 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +16 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +5 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +12 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +4 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +5 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py +1 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +5 -0
- vellum_ee/workflows/display/utils/events.py +24 -0
- vellum_ee/workflows/display/utils/tests/test_events.py +69 -0
- vellum_ee/workflows/tests/test_server.py +95 -0
- {vellum_ai-1.2.1.dist-info → vellum_ai-1.2.3.dist-info}/LICENSE +0 -0
- {vellum_ai-1.2.1.dist-info → vellum_ai-1.2.3.dist-info}/WHEEL +0 -0
- {vellum_ai-1.2.1.dist-info → vellum_ai-1.2.3.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,7 @@ from vellum.client.types.number_vellum_value import NumberVellumValue
|
|
8
8
|
from vellum.workflows import BaseWorkflow
|
9
9
|
from vellum.workflows.nodes import BaseNode
|
10
10
|
from vellum.workflows.state.context import WorkflowContext
|
11
|
+
from vellum.workflows.utils.uuids import generate_workflow_deployment_prefix
|
11
12
|
from vellum_ee.workflows.display.workflows.base_workflow_display import BaseWorkflowDisplay
|
12
13
|
from vellum_ee.workflows.server.virtual_file_loader import VirtualFileFinder
|
13
14
|
|
@@ -566,3 +567,97 @@ class Workflow(BaseWorkflow[Inputs, BaseState]):
|
|
566
567
|
|
567
568
|
# THEN the serialization should complete successfully
|
568
569
|
assert result is not None
|
570
|
+
|
571
|
+
|
572
|
+
def test_resolve_workflow_deployment__returns_workflow_with_generated_files():
|
573
|
+
"""
|
574
|
+
Test that resolve_workflow_deployment returns a workflow with artifacts
|
575
|
+
in generated_files using the correct prefix format.
|
576
|
+
"""
|
577
|
+
# GIVEN a deployment name and release tag
|
578
|
+
deployment_name = "test_deployment"
|
579
|
+
release_tag = "LATEST"
|
580
|
+
|
581
|
+
expected_prefix = generate_workflow_deployment_prefix(deployment_name, release_tag)
|
582
|
+
|
583
|
+
# Create a simple test node for the resolved workflow
|
584
|
+
test_node_code = """
|
585
|
+
from vellum.workflows.nodes.bases.base import BaseNode
|
586
|
+
from vellum.workflows.outputs import BaseOutputs
|
587
|
+
|
588
|
+
class TestNode(BaseNode):
|
589
|
+
template = "Hello"
|
590
|
+
|
591
|
+
class Outputs(BaseOutputs):
|
592
|
+
result: str
|
593
|
+
|
594
|
+
def run(self):
|
595
|
+
return self.Outputs(result="Hello, {template}")
|
596
|
+
"""
|
597
|
+
|
598
|
+
mock_workflow_code = """
|
599
|
+
from vellum.workflows import BaseWorkflow
|
600
|
+
from .nodes.test_node import TestNode
|
601
|
+
|
602
|
+
class ResolvedWorkflow(BaseWorkflow):
|
603
|
+
graph = TestNode
|
604
|
+
"""
|
605
|
+
|
606
|
+
# Create parent workflow files that reference the subworkflow deployment
|
607
|
+
parent_workflow_code = """
|
608
|
+
from vellum.workflows import BaseWorkflow
|
609
|
+
from .nodes.subworkflow_deployment_node import TestSubworkflowDeploymentNode
|
610
|
+
|
611
|
+
class ParentWorkflow(BaseWorkflow):
|
612
|
+
graph = TestSubworkflowDeploymentNode
|
613
|
+
"""
|
614
|
+
|
615
|
+
parent_node_code = """
|
616
|
+
from vellum.workflows.nodes import SubworkflowDeploymentNode
|
617
|
+
from vellum.workflows.outputs import BaseOutputs
|
618
|
+
|
619
|
+
class TestSubworkflowDeploymentNode(SubworkflowDeploymentNode):
|
620
|
+
deployment = "test_deployment"
|
621
|
+
|
622
|
+
class Outputs(BaseOutputs):
|
623
|
+
result: str
|
624
|
+
|
625
|
+
subworkflow_inputs = {"message": "test"}
|
626
|
+
"""
|
627
|
+
|
628
|
+
files = {
|
629
|
+
"__init__.py": "",
|
630
|
+
"workflow.py": parent_workflow_code,
|
631
|
+
"nodes/__init__.py": """
|
632
|
+
from .subworkflow_deployment_node import TestSubworkflowDeploymentNode
|
633
|
+
|
634
|
+
__all__ = ["TestSubworkflowDeploymentNode"]
|
635
|
+
""",
|
636
|
+
"nodes/subworkflow_deployment_node.py": parent_node_code,
|
637
|
+
f"{expected_prefix}/__init__.py": "",
|
638
|
+
f"{expected_prefix}/workflow.py": mock_workflow_code,
|
639
|
+
f"{expected_prefix}/nodes/__init__.py": """
|
640
|
+
from .test_node import TestNode
|
641
|
+
|
642
|
+
__all__ = ["TestNode"]
|
643
|
+
""",
|
644
|
+
f"{expected_prefix}/nodes/test_node.py": test_node_code,
|
645
|
+
}
|
646
|
+
|
647
|
+
namespace = str(uuid4())
|
648
|
+
|
649
|
+
# AND the virtual file loader is registered
|
650
|
+
finder = VirtualFileFinder(files, namespace)
|
651
|
+
sys.meta_path.append(finder)
|
652
|
+
|
653
|
+
# WHEN we execute the root workflow
|
654
|
+
Workflow = BaseWorkflow.load_from_module(namespace)
|
655
|
+
workflow = Workflow(context=WorkflowContext(generated_files=files, namespace=namespace))
|
656
|
+
|
657
|
+
# THEN the workflow should be successfully initialized
|
658
|
+
assert workflow
|
659
|
+
|
660
|
+
event = workflow.run()
|
661
|
+
|
662
|
+
# AND the method should return a workflow (not None) - this will pass once implemented
|
663
|
+
assert event.name == "workflow.execution.fulfilled"
|
File without changes
|
File without changes
|
File without changes
|