vellum-ai 0.12.15__py3-none-any.whl → 0.12.16__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/client/core/client_wrapper.py +1 -1
 - vellum/prompts/blocks/compilation.py +43 -0
 - vellum/workflows/nodes/core/inline_subworkflow_node/node.py +10 -2
 - vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +16 -0
 - {vellum_ai-0.12.15.dist-info → vellum_ai-0.12.16.dist-info}/METADATA +10 -8
 - {vellum_ai-0.12.15.dist-info → vellum_ai-0.12.16.dist-info}/RECORD +39 -36
 - vellum_cli/__init__.py +14 -0
 - vellum_cli/push.py +26 -4
 - vellum_cli/tests/test_push.py +63 -0
 - vellum_ee/workflows/display/nodes/vellum/api_node.py +3 -3
 - vellum_ee/workflows/display/nodes/vellum/base_node.py +17 -0
 - vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +2 -2
 - vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +2 -2
 - vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +20 -6
 - vellum_ee/workflows/display/nodes/vellum/map_node.py +1 -0
 - vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +2 -2
 - vellum_ee/workflows/display/nodes/vellum/search_node.py +4 -2
 - vellum_ee/workflows/display/nodes/vellum/templating_node.py +1 -1
 - vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +3 -3
 - vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py +0 -0
 - vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +28 -0
 - vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +123 -0
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +2 -11
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +2 -14
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +1 -7
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +17 -1
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +17 -1
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +1 -9
 - vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +1 -1
 - vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +1 -4
 - vellum_ee/workflows/display/types.py +5 -1
 - vellum_ee/workflows/display/utils/vellum.py +3 -3
 - vellum_ee/workflows/display/vellum.py +4 -0
 - vellum_ee/workflows/display/workflows/base_workflow_display.py +44 -16
 - vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py +3 -0
 - vellum_ee/workflows/display/workflows/vellum_workflow_display.py +7 -8
 - {vellum_ai-0.12.15.dist-info → vellum_ai-0.12.16.dist-info}/LICENSE +0 -0
 - {vellum_ai-0.12.15.dist-info → vellum_ai-0.12.16.dist-info}/WHEEL +0 -0
 - {vellum_ai-0.12.15.dist-info → vellum_ai-0.12.16.dist-info}/entry_points.txt +0 -0
 
| 
         @@ -18,7 +18,7 @@ class BaseClientWrapper: 
     | 
|
| 
       18 
18 
     | 
    
         
             
                    headers: typing.Dict[str, str] = {
         
     | 
| 
       19 
19 
     | 
    
         
             
                        "X-Fern-Language": "Python",
         
     | 
| 
       20 
20 
     | 
    
         
             
                        "X-Fern-SDK-Name": "vellum-ai",
         
     | 
| 
       21 
     | 
    
         
            -
                        "X-Fern-SDK-Version": "0.12. 
     | 
| 
      
 21 
     | 
    
         
            +
                        "X-Fern-SDK-Version": "0.12.16",
         
     | 
| 
       22 
22 
     | 
    
         
             
                    }
         
     | 
| 
       23 
23 
     | 
    
         
             
                    headers["X_API_KEY"] = self.api_key
         
     | 
| 
       24 
24 
     | 
    
         
             
                    return headers
         
     | 
| 
         @@ -10,6 +10,12 @@ from vellum import ( 
     | 
|
| 
       10 
10 
     | 
    
         
             
                StringVellumValue,
         
     | 
| 
       11 
11 
     | 
    
         
             
                VellumVariable,
         
     | 
| 
       12 
12 
     | 
    
         
             
            )
         
     | 
| 
      
 13 
     | 
    
         
            +
            from vellum.client.types.audio_vellum_value import AudioVellumValue
         
     | 
| 
      
 14 
     | 
    
         
            +
            from vellum.client.types.function_call import FunctionCall
         
     | 
| 
      
 15 
     | 
    
         
            +
            from vellum.client.types.function_call_vellum_value import FunctionCallVellumValue
         
     | 
| 
      
 16 
     | 
    
         
            +
            from vellum.client.types.image_vellum_value import ImageVellumValue
         
     | 
| 
      
 17 
     | 
    
         
            +
            from vellum.client.types.vellum_audio import VellumAudio
         
     | 
| 
      
 18 
     | 
    
         
            +
            from vellum.client.types.vellum_image import VellumImage
         
     | 
| 
       13 
19 
     | 
    
         
             
            from vellum.prompts.blocks.exceptions import PromptCompilationError
         
     | 
| 
       14 
20 
     | 
    
         
             
            from vellum.prompts.blocks.types import CompiledChatMessagePromptBlock, CompiledPromptBlock, CompiledValuePromptBlock
         
     | 
| 
       15 
21 
     | 
    
         
             
            from vellum.utils.templating.constants import DEFAULT_JINJA_CUSTOM_FILTERS
         
     | 
| 
         @@ -112,6 +118,43 @@ def compile_prompt_blocks( 
     | 
|
| 
       112 
118 
     | 
    
         | 
| 
       113 
119 
     | 
    
         
             
                    elif block.block_type == "FUNCTION_DEFINITION":
         
     | 
| 
       114 
120 
     | 
    
         
             
                        raise PromptCompilationError("Function definitions shouldn't go through compilation process")
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                    elif block.block_type == "FUNCTION_CALL":
         
     | 
| 
      
 123 
     | 
    
         
            +
                        function_call_block = CompiledValuePromptBlock(
         
     | 
| 
      
 124 
     | 
    
         
            +
                            content=FunctionCallVellumValue(
         
     | 
| 
      
 125 
     | 
    
         
            +
                                value=FunctionCall(
         
     | 
| 
      
 126 
     | 
    
         
            +
                                    id=block.id,
         
     | 
| 
      
 127 
     | 
    
         
            +
                                    name=block.name,
         
     | 
| 
      
 128 
     | 
    
         
            +
                                    arguments=block.arguments,
         
     | 
| 
      
 129 
     | 
    
         
            +
                                ),
         
     | 
| 
      
 130 
     | 
    
         
            +
                            ),
         
     | 
| 
      
 131 
     | 
    
         
            +
                            cache_config=block.cache_config,
         
     | 
| 
      
 132 
     | 
    
         
            +
                        )
         
     | 
| 
      
 133 
     | 
    
         
            +
                        compiled_blocks.append(function_call_block)
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                    elif block.block_type == "IMAGE":
         
     | 
| 
      
 136 
     | 
    
         
            +
                        image_block = CompiledValuePromptBlock(
         
     | 
| 
      
 137 
     | 
    
         
            +
                            content=ImageVellumValue(
         
     | 
| 
      
 138 
     | 
    
         
            +
                                value=VellumImage(
         
     | 
| 
      
 139 
     | 
    
         
            +
                                    src=block.src,
         
     | 
| 
      
 140 
     | 
    
         
            +
                                    metadata=block.metadata,
         
     | 
| 
      
 141 
     | 
    
         
            +
                                ),
         
     | 
| 
      
 142 
     | 
    
         
            +
                            ),
         
     | 
| 
      
 143 
     | 
    
         
            +
                            cache_config=block.cache_config,
         
     | 
| 
      
 144 
     | 
    
         
            +
                        )
         
     | 
| 
      
 145 
     | 
    
         
            +
                        compiled_blocks.append(image_block)
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                    elif block.block_type == "AUDIO":
         
     | 
| 
      
 148 
     | 
    
         
            +
                        audio_block = CompiledValuePromptBlock(
         
     | 
| 
      
 149 
     | 
    
         
            +
                            content=AudioVellumValue(
         
     | 
| 
      
 150 
     | 
    
         
            +
                                value=VellumAudio(
         
     | 
| 
      
 151 
     | 
    
         
            +
                                    src=block.src,
         
     | 
| 
      
 152 
     | 
    
         
            +
                                    metadata=block.metadata,
         
     | 
| 
      
 153 
     | 
    
         
            +
                                ),
         
     | 
| 
      
 154 
     | 
    
         
            +
                            ),
         
     | 
| 
      
 155 
     | 
    
         
            +
                            cache_config=block.cache_config,
         
     | 
| 
      
 156 
     | 
    
         
            +
                        )
         
     | 
| 
      
 157 
     | 
    
         
            +
                        compiled_blocks.append(audio_block)
         
     | 
| 
       115 
158 
     | 
    
         
             
                    else:
         
     | 
| 
       116 
159 
     | 
    
         
             
                        raise PromptCompilationError(f"Unknown block_type: {block.block_type}")
         
     | 
| 
       117 
160 
     | 
    
         | 
| 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            from typing import TYPE_CHECKING, ClassVar, Generic, Iterator, Optional, Set, Type, TypeVar, Union
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            from vellum.workflows.constants import UNDEF
         
     | 
| 
       3 
4 
     | 
    
         
             
            from vellum.workflows.context import execution_context, get_parent_context
         
     | 
| 
       4 
5 
     | 
    
         
             
            from vellum.workflows.errors.types import WorkflowErrorCode
         
     | 
| 
       5 
6 
     | 
    
         
             
            from vellum.workflows.exceptions import NodeException
         
     | 
| 
         @@ -27,7 +28,7 @@ class InlineSubworkflowNode(BaseNode[StateType], Generic[StateType, WorkflowInpu 
     | 
|
| 
       27 
28 
     | 
    
         
             
                """
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         
             
                subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"]
         
     | 
| 
       30 
     | 
    
         
            -
                subworkflow_inputs: ClassVar[Union[EntityInputsInterface, BaseInputs]] =  
     | 
| 
      
 31 
     | 
    
         
            +
                subworkflow_inputs: ClassVar[Union[EntityInputsInterface, BaseInputs, Type[UNDEF]]] = UNDEF
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
33 
     | 
    
         
             
                def run(self) -> Iterator[BaseOutput]:
         
     | 
| 
       33 
34 
     | 
    
         
             
                    with execution_context(parent_context=get_parent_context() or self._context.parent_context):
         
     | 
| 
         @@ -71,7 +72,14 @@ class InlineSubworkflowNode(BaseNode[StateType], Generic[StateType, WorkflowInpu 
     | 
|
| 
       71 
72 
     | 
    
         | 
| 
       72 
73 
     | 
    
         
             
                def _compile_subworkflow_inputs(self) -> WorkflowInputsType:
         
     | 
| 
       73 
74 
     | 
    
         
             
                    inputs_class = self.subworkflow.get_inputs_class()
         
     | 
| 
       74 
     | 
    
         
            -
                    if  
     | 
| 
      
 75 
     | 
    
         
            +
                    if self.subworkflow_inputs is UNDEF:
         
     | 
| 
      
 76 
     | 
    
         
            +
                        inputs_dict = {}
         
     | 
| 
      
 77 
     | 
    
         
            +
                        for descriptor in inputs_class:
         
     | 
| 
      
 78 
     | 
    
         
            +
                            if hasattr(self, descriptor.name):
         
     | 
| 
      
 79 
     | 
    
         
            +
                                inputs_dict[descriptor.name] = getattr(self, descriptor.name)
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                        return inputs_class(**inputs_dict)
         
     | 
| 
      
 82 
     | 
    
         
            +
                    elif isinstance(self.subworkflow_inputs, dict):
         
     | 
| 
       75 
83 
     | 
    
         
             
                        return inputs_class(**self.subworkflow_inputs)
         
     | 
| 
       76 
84 
     | 
    
         
             
                    elif isinstance(self.subworkflow_inputs, inputs_class):
         
     | 
| 
       77 
85 
     | 
    
         
             
                        return self.subworkflow_inputs
         
     | 
| 
         @@ -39,3 +39,19 @@ def test_inline_subworkflow_node__inputs(inputs): 
     | 
|
| 
       39 
39 
     | 
    
         
             
                assert events == [
         
     | 
| 
       40 
40 
     | 
    
         
             
                    BaseOutput(name="out", value="bar"),
         
     | 
| 
       41 
41 
     | 
    
         
             
                ]
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            def test_inline_subworkflow_node__support_inputs_as_attributes():
         
     | 
| 
      
 45 
     | 
    
         
            +
                # GIVEN a node setup with subworkflow inputs
         
     | 
| 
      
 46 
     | 
    
         
            +
                class MyNode(InlineSubworkflowNode):
         
     | 
| 
      
 47 
     | 
    
         
            +
                    subworkflow = MySubworkflow
         
     | 
| 
      
 48 
     | 
    
         
            +
                    foo = "bar"
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                # WHEN the node is run
         
     | 
| 
      
 51 
     | 
    
         
            +
                node = MyNode()
         
     | 
| 
      
 52 
     | 
    
         
            +
                events = list(node.run())
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                # THEN the output is as expected
         
     | 
| 
      
 55 
     | 
    
         
            +
                assert events == [
         
     | 
| 
      
 56 
     | 
    
         
            +
                    BaseOutput(name="out", value="bar"),
         
     | 
| 
      
 57 
     | 
    
         
            +
                ]
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Metadata-Version: 2.1
         
     | 
| 
       2 
2 
     | 
    
         
             
            Name: vellum-ai
         
     | 
| 
       3 
     | 
    
         
            -
            Version: 0.12. 
     | 
| 
      
 3 
     | 
    
         
            +
            Version: 0.12.16
         
     | 
| 
       4 
4 
     | 
    
         
             
            Summary: 
         
     | 
| 
       5 
5 
     | 
    
         
             
            License: MIT
         
     | 
| 
       6 
6 
     | 
    
         
             
            Requires-Python: >=3.9,<4.0
         
     | 
| 
         @@ -40,9 +40,11 @@ Requires-Dist: typing_extensions (>=4.0.0) 
     | 
|
| 
       40 
40 
     | 
    
         
             
            Description-Content-Type: text/markdown
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
            <p align="center">
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
               <a href="https://vellum.ai">
         
     | 
| 
      
 44 
     | 
    
         
            +
                <picture>
         
     | 
| 
      
 45 
     | 
    
         
            +
                  <img alt="Vellum README banner" src="https://storage.googleapis.com/vellum-public/assets/github-readme-banner.png" height="128">
         
     | 
| 
      
 46 
     | 
    
         
            +
                </picture>
         
     | 
| 
      
 47 
     | 
    
         
            +
              </a>
         
     | 
| 
       46 
48 
     | 
    
         
             
              <p align="center">
         
     | 
| 
       47 
49 
     | 
    
         
             
                <a href="https://vellum.ai">Learn more</a>
         
     | 
| 
       48 
50 
     | 
    
         
             
                ·
         
     | 
| 
         @@ -64,13 +66,13 @@ Description-Content-Type: text/markdown 
     | 
|
| 
       64 
66 
     | 
    
         | 
| 
       65 
67 
     | 
    
         
             
            # Introduction
         
     | 
| 
       66 
68 
     | 
    
         | 
| 
       67 
     | 
    
         
            -
            [Vellum](https://www.vellum.ai/) is the end-to-end development platform for building production-grade AI applications
         
     | 
| 
      
 69 
     | 
    
         
            +
            [Vellum](https://www.vellum.ai/) is the end-to-end development platform for building production-grade AI applications.
         
     | 
| 
       68 
70 
     | 
    
         | 
| 
       69 
71 
     | 
    
         
             
            ### Core Features
         
     | 
| 
       70 
72 
     | 
    
         | 
| 
       71 
73 
     | 
    
         
             
            - **Orchestration:** A powerful SDK and IDE for defining and debugging the control flow of your AI applications
         
     | 
| 
       72 
74 
     | 
    
         
             
            - **Prompting:** A best-in-class prompt playground for iterating on and refining prompts between models from any provider
         
     | 
| 
       73 
     | 
    
         
            -
            - **Evaluations**: An evaluations framework that makes it easy to measure the quality of your AI systems at scale 
     | 
| 
      
 75 
     | 
    
         
            +
            - **Evaluations**: An evaluations framework that makes it easy to measure the quality of your AI systems at scale
         
     | 
| 
       74 
76 
     | 
    
         
             
            - **Retrieval:** A ready-to-go service for turning unstructured content into intelligent, context-aware solutions
         
     | 
| 
       75 
77 
     | 
    
         
             
              optimized for AI systems
         
     | 
| 
       76 
78 
     | 
    
         
             
            - **Deployment:** Decouple updates to your AI systems from your application code with an easy integration +
         
     | 
| 
         @@ -87,7 +89,7 @@ Description-Content-Type: text/markdown 
     | 
|
| 
       87 
89 
     | 
    
         | 
| 
       88 
90 
     | 
    
         
             
            ## Get Started
         
     | 
| 
       89 
91 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
            Most functionality within the  
     | 
| 
      
 92 
     | 
    
         
            +
            Most functionality within the SDK requires a Vellum account and API key. To sign up, [talk to us](https://www.vellum.ai/landing-pages/request-demo)
         
     | 
| 
       91 
93 
     | 
    
         
             
            or visit our [pricing page](https://www.vellum.ai/pricing).
         
     | 
| 
       92 
94 
     | 
    
         | 
| 
       93 
95 
     | 
    
         
             
            Even without a Vellum account, you can use the Workflows SDK to define the control flow of your AI systems. [Learn
         
     | 
| 
         @@ -101,7 +103,7 @@ Learn more and get started by visiting the [Vellum Client SDK README](/src/vellu 
     | 
|
| 
       101 
103 
     | 
    
         
             
            ## Workflows SDK
         
     | 
| 
       102 
104 
     | 
    
         | 
| 
       103 
105 
     | 
    
         
             
            The Vellum Workflows SDK is a high-level framework for defining and debugging the control flow of AI systems. At
         
     | 
| 
       104 
     | 
    
         
            -
            it's core, it's a powerful workflow engine with syntactic sugar for  
     | 
| 
      
 106 
     | 
    
         
            +
            it's core, it's a powerful workflow engine with syntactic sugar for declaratively defining graphs, the nodes within,
         
     | 
| 
       105 
107 
     | 
    
         
             
            and the relationships between them.
         
     | 
| 
       106 
108 
     | 
    
         | 
| 
       107 
109 
     | 
    
         
             
            The Workflows SDK can be used with or without a Vellum account, but a Vellum account is required to use certain
         
     | 
| 
         @@ -1,18 +1,18 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            vellum_cli/CONTRIBUTING.md,sha256=FtDC7BGxSeMnwCXAUssFsAIElXtmJE-O5Z7BpolcgvI,2935
         
     | 
| 
       2 
2 
     | 
    
         
             
            vellum_cli/README.md,sha256=2NudRoLzWxNKqnuVy1JuQ7DerIaxWGYkrH8kMd-asIE,90
         
     | 
| 
       3 
     | 
    
         
            -
            vellum_cli/__init__.py,sha256= 
     | 
| 
      
 3 
     | 
    
         
            +
            vellum_cli/__init__.py,sha256=7liY2AX5t51Vd_usohIU6QSLjAsF6MaHD30L6ng9SSg,8926
         
     | 
| 
       4 
4 
     | 
    
         
             
            vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
         
     | 
| 
       5 
5 
     | 
    
         
             
            vellum_cli/config.py,sha256=998IZbvkrw2avjbvs8bw6NrbEgGz5UBKRbvKAcastJg,5493
         
     | 
| 
       6 
6 
     | 
    
         
             
            vellum_cli/image_push.py,sha256=SJwhwWJsLjwGNezNVd_oCVpFMfPsAB3dfLWmriZZUtw,4419
         
     | 
| 
       7 
7 
     | 
    
         
             
            vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
         
     | 
| 
       8 
8 
     | 
    
         
             
            vellum_cli/pull.py,sha256=hYQBe2_-Y4Ieh_Jo54EwBUpqPYq6UYitUBPgqyOVba0,7499
         
     | 
| 
       9 
     | 
    
         
            -
            vellum_cli/push.py,sha256= 
     | 
| 
      
 9 
     | 
    
         
            +
            vellum_cli/push.py,sha256=iQ2H-vY8njqiYgIifGooqopqkb1BUUA3I7IN7VIHKv8,6149
         
     | 
| 
       10 
10 
     | 
    
         
             
            vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       11 
11 
     | 
    
         
             
            vellum_cli/tests/conftest.py,sha256=eFGwBxib3Nki830lIFintB0b6r4x8T_KMnmzhlTY5x0,1337
         
     | 
| 
       12 
12 
     | 
    
         
             
            vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
         
     | 
| 
       13 
13 
     | 
    
         
             
            vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
         
     | 
| 
       14 
14 
     | 
    
         
             
            vellum_cli/tests/test_pull.py,sha256=6gbASF6ASy5YcdWjOCt6b5K0u2VWsFegdrTWu6sEVKs,19613
         
     | 
| 
       15 
     | 
    
         
            -
            vellum_cli/tests/test_push.py,sha256= 
     | 
| 
      
 15 
     | 
    
         
            +
            vellum_cli/tests/test_push.py,sha256=sqPy1N9TOa0Wwk4tfEZm18BnfcwRSoQboTWW_PHQA-E,8145
         
     | 
| 
       16 
16 
     | 
    
         
             
            vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       17 
17 
     | 
    
         
             
            vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       18 
18 
     | 
    
         
             
            vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
         @@ -27,53 +27,56 @@ vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=QqR3Ly0 
     | 
|
| 
       27 
27 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
         
     | 
| 
       28 
28 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
         
     | 
| 
       29 
29 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=_raKY9eKi_OvIFn6nGvf9xKSboKtYLHCWaWCwDQFbOc,1567
         
     | 
| 
       30 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256= 
     | 
| 
       31 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/base_node.py,sha256= 
     | 
| 
       32 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256= 
     | 
| 
      
 30 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=zucBb2neqTig5Q3HCiMrksRdg-WISnR2prFxYzk3WL0,8527
         
     | 
| 
      
 31 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/base_node.py,sha256=M59-Kwz6bQ_j8yWLAtJikye-iOl5WtMI8eMnTtvb8SQ,1508
         
     | 
| 
      
 32 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=Kp-0YRZoy_Pi7HdwUgBxV57a6BzyoxotsvFsfoSGg40,4244
         
     | 
| 
       33 
33 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=EtdqJfhYw03PuT2iyJ6mSAZK4RsQqDie_2AnJAtMelk,13625
         
     | 
| 
       34 
34 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=ygTjSjYDI4DtkxADWub5rhBnRWItMKWF6fezBrgpOKA,1979
         
     | 
| 
       35 
35 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=t5iJQVoRT5g-v2IiUb4kFYdvUVKch0zn27016pzDZoo,2761
         
     | 
| 
       36 
36 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=3TJvHX_Uuf_gr94VkYc_zmNH8I5p71ChIeoAbJZ3ddY,2158
         
     | 
| 
       37 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256= 
     | 
| 
       38 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256= 
     | 
| 
       39 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256= 
     | 
| 
      
 37 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=dcrCIIWeL5RDHEmc9eyHEdDvxrzQddm71TUtLVcVH8I,7203
         
     | 
| 
      
 38 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=_cdCzwbwB3gvcLz3UOgvmpz_AZwhXaU8CsOj9nuHB0M,5566
         
     | 
| 
      
 39 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=y05CB-Pa5-H22YYSjqKnwGyUnuFqjiawbmjVPoElIQw,3692
         
     | 
| 
       40 
40 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=jzO63B9KiEAncnBqmz2ZTcxjmEHozMEe7WnfpcpsQYg,3195
         
     | 
| 
       41 
41 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=9VpC3h0RYOxJuRbjDwidBYlLKakkmlEnDMBh2C7lHcY,1107
         
     | 
| 
       42 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256= 
     | 
| 
       43 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256= 
     | 
| 
      
 42 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=3uvSVvNNwVhqxsEh4moW_gIQss1bIuw9Do8XPWr9XLA,3120
         
     | 
| 
      
 43 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=sSO7n-UXoIdolRAqyKy6MdpdC-hrrt83ntSWe_qLKEM,9071
         
     | 
| 
       44 
44 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=zOp4voBSgB3MR1R93wTOrsiiara_hxEAYFupLl_SvTA,2657
         
     | 
| 
       45 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256= 
     | 
| 
      
 45 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=l_QDDTxHxmnwGKr6IwZZvwUMXAjSHJPNE8hf5tY75b4,3380
         
     | 
| 
       46 
46 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       47 
     | 
    
         
            -
            vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256= 
     | 
| 
      
 47 
     | 
    
         
            +
            vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=JPZKf7irQ38Dus5bWV_ysKkG97z0oeqP57lOptA-dPk,3881
         
     | 
| 
       48 
48 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=hB8dcGMGkuC95kk9hmZUgHsCLwEA37fHTFXj0JzbRjM,4692
         
     | 
| 
       49 
49 
     | 
    
         
             
            vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=6mPg9QilJfLw9Sgk_h9LRSyKZpKgRu06mr3X1AmmDCA,4691
         
     | 
| 
       50 
50 
     | 
    
         
             
            vellum_ee/workflows/display/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       51 
51 
     | 
    
         
             
            vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=TEg3QbdE7rLbEhml9pMWmay--phsekGlfGVhTblxCGE,1727
         
     | 
| 
       52 
52 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 53 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
      
 54 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=5UTzBUKC1H5ve9MJGJMMLGhQ-1ZV4NPn6wYYEdreNxM,1172
         
     | 
| 
      
 55 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=nhqi4D_6R9WtQG2WYyPy9RdoollwriWc-72BgOBY9BM,4035
         
     | 
| 
       53 
56 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py,sha256=e__ae2yepB5vlgVT08sr1DDB8pYjax6VQLo5FtRk-nA,17934
         
     | 
| 
       54 
57 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py,sha256=F822H2tM3Fvmc2PvunrVCRhtSKQLLpi5y2L1gyJKa78,31576
         
     | 
| 
       55 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256= 
     | 
| 
       56 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256= 
     | 
| 
       57 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256= 
     | 
| 
      
 58 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=88z_dRc2sARwH73KqyZy6KXJCFPULdPKCeTJ2QJAODY,52192
         
     | 
| 
      
 59 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256=KNcZR9PhkXYUl-OFKc2XK9qG-C_28K01Le7ecpwPUfU,6143
         
     | 
| 
      
 60 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=ZcKpGLZ-RyqfWzvVEsFywSYEqLHrIjFjx5RJmxJT_u4,6091
         
     | 
| 
       58 
61 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py,sha256=vA8cd7PJYhf949OUGeYP_moKtMogSyfHN2Z-qzNQLwM,8294
         
     | 
| 
       59 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256= 
     | 
| 
       60 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256= 
     | 
| 
       61 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256= 
     | 
| 
      
 62 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=7XaPhlX4TU7Ehq62opb_1vGHvynjxJLP_pYqyMt6IOI,22621
         
     | 
| 
      
 63 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=lukNCF0w45X2i5SCT5KDMGFn0C0acBNY8t78sC4mBXQ,16485
         
     | 
| 
      
 64 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=qXEVZ_OZUUvHZvQyXgVrjvhmvFp5As3DrHZWIvlhGsc,9345
         
     | 
| 
       62 
65 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=NkpgaTbu6nLr3iwgsSNtiHyiNDCUaFakd1JaoW6CC6Y,9489
         
     | 
| 
       63 
66 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=9R6ELHBn9tsp3cy15q1qp1OByyCxFOVdrM67EwCYY50,12984
         
     | 
| 
       64 
67 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=8bz0vm_EyQKSjnwS5vqqgnjE9ygvm-CaPKcwCfeOrlo,12704
         
     | 
| 
       65 
68 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=6LrGPS7e9CWpjFq2hpliSzP9kDpZ9KqvBNlNO3sq8cs,8063
         
     | 
| 
       66 
69 
     | 
    
         
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=xG8nKA1iKXxUe1fnD2X6qm7cUGW14iq2P-L16zhcKC8,4271
         
     | 
| 
       67 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256= 
     | 
| 
       68 
     | 
    
         
            -
            vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256= 
     | 
| 
       69 
     | 
    
         
            -
            vellum_ee/workflows/display/types.py,sha256 
     | 
| 
      
 70 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=cE6dmre7LRfUV2sZReDhES1zHpYcNH07cDZCrXQsRDw,2638
         
     | 
| 
      
 71 
     | 
    
         
            +
            vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=stOOF7n7oZvZby9Zyk0vr7dK3OG6bx9TEaIXFEZjX0o,8478
         
     | 
| 
      
 72 
     | 
    
         
            +
            vellum_ee/workflows/display/types.py,sha256=-ninso8Yf2EBn_RkFhpOEOjRhX2bYgCeMWssHoEgPRg,2248
         
     | 
| 
       70 
73 
     | 
    
         
             
            vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       71 
     | 
    
         
            -
            vellum_ee/workflows/display/utils/vellum.py,sha256 
     | 
| 
       72 
     | 
    
         
            -
            vellum_ee/workflows/display/vellum.py,sha256= 
     | 
| 
      
 74 
     | 
    
         
            +
            vellum_ee/workflows/display/utils/vellum.py,sha256=72wyR_ngYjirPYT8kFDxVPtRdHT7FpzBpsjoGMh1q0c,5053
         
     | 
| 
      
 75 
     | 
    
         
            +
            vellum_ee/workflows/display/vellum.py,sha256=FHf2GXJ-KNXstMgRg5Prp7BL_dbUt8BSrPxg_QgJmxM,8945
         
     | 
| 
       73 
76 
     | 
    
         
             
            vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
         
     | 
| 
       74 
     | 
    
         
            -
            vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256= 
     | 
| 
       75 
     | 
    
         
            -
            vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256= 
     | 
| 
       76 
     | 
    
         
            -
            vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256= 
     | 
| 
      
 77 
     | 
    
         
            +
            vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=u5u_KnDp_ktLBlfkT5wiGHIloodSlUT3D3_DQXijtMA,13735
         
     | 
| 
      
 78 
     | 
    
         
            +
            vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=kp0u8LN_2IwshLrhMImhpZx1hRyAcD5gXY-kDuuaGMQ,1269
         
     | 
| 
      
 79 
     | 
    
         
            +
            vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=sUQVEP2te48G97t-au_utKfMhePi4U5nmotzMln7Ga4,16943
         
     | 
| 
       77 
80 
     | 
    
         
             
            vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       78 
81 
     | 
    
         
             
            vellum_ee/workflows/server/virtual_file_loader.py,sha256=sQQFqn7xI0GfUlypWkVFl-X5ShXTh9bXq8N6qlQvSoE,1452
         
     | 
| 
       79 
82 
     | 
    
         
             
            vellum/__init__.py,sha256=wO2rKMEtIjNEb53CstEj-0qkUDiKKmGb_uxXEl-jS8c,35776
         
     | 
| 
         @@ -81,7 +84,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749 
     | 
|
| 
       81 
84 
     | 
    
         
             
            vellum/client/__init__.py,sha256=7yb5YnhvHQUJusa1WyUZcAKGol3z-Lfu07EfD03eEW4,111291
         
     | 
| 
       82 
85 
     | 
    
         
             
            vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
         
     | 
| 
       83 
86 
     | 
    
         
             
            vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
         
     | 
| 
       84 
     | 
    
         
            -
            vellum/client/core/client_wrapper.py,sha256= 
     | 
| 
      
 87 
     | 
    
         
            +
            vellum/client/core/client_wrapper.py,sha256=2N1VoBiQAederYuBKuAwXoDAkbTGPnkciOAPvOv1Xyk,1869
         
     | 
| 
       85 
88 
     | 
    
         
             
            vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
         
     | 
| 
       86 
89 
     | 
    
         
             
            vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
         
     | 
| 
       87 
90 
     | 
    
         
             
            vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
         
     | 
| 
         @@ -668,7 +671,7 @@ vellum/plugins/utils.py,sha256=U9ZY9KdE3RRvbcG01hXxu9CvfJD6Fo7nJDgcHjQn0FI,606 
     | 
|
| 
       668 
671 
     | 
    
         
             
            vellum/plugins/vellum_mypy.py,sha256=VC15EzjTsXOb9uF1bky4rcxePP-0epMVmCsLB2z4Dh8,24816
         
     | 
| 
       669 
672 
     | 
    
         
             
            vellum/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       670 
673 
     | 
    
         
             
            vellum/prompts/blocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       671 
     | 
    
         
            -
            vellum/prompts/blocks/compilation.py,sha256= 
     | 
| 
      
 674 
     | 
    
         
            +
            vellum/prompts/blocks/compilation.py,sha256=ISuvDHaeVCPb1L7l4umORCECkDn0-rvE49hopz6c2gM,9222
         
     | 
| 
       672 
675 
     | 
    
         
             
            vellum/prompts/blocks/exceptions.py,sha256=vmk5PV6Vyw9nKjZYQDUDW0LH8MfQNIgFvFb_mFWdIRI,50
         
     | 
| 
       673 
676 
     | 
    
         
             
            vellum/prompts/blocks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       674 
677 
     | 
    
         
             
            vellum/prompts/blocks/tests/test_compilation.py,sha256=0DhMoc4huHR6YnNL-0aBLmWSyUfw2BpRq_gEdKsQmAc,3693
         
     | 
| 
         @@ -1291,9 +1294,9 @@ vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT 
     | 
|
| 
       1291 
1294 
     | 
    
         
             
            vellum/workflows/nodes/core/error_node/__init__.py,sha256=g7RRnlHhqu4qByfLjBwCunmgGA8dI5gNsjS3h6TwlSI,60
         
     | 
| 
       1292 
1295 
     | 
    
         
             
            vellum/workflows/nodes/core/error_node/node.py,sha256=MFHU5vITYSK-L9CuMZ49In2ZeNLWnhZD0f8r5dWvb5Y,1270
         
     | 
| 
       1293 
1296 
     | 
    
         
             
            vellum/workflows/nodes/core/inline_subworkflow_node/__init__.py,sha256=nKNEH1QTl-1PcvmYoqSWEl0-t6gAur8GLTXHzklRQfM,84
         
     | 
| 
       1294 
     | 
    
         
            -
            vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256= 
     | 
| 
      
 1297 
     | 
    
         
            +
            vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=XJLz7Kkk4OwrM-OcPjiLfF3XC49jDwsVKFPTNXkenvQ,3964
         
     | 
| 
       1295 
1298 
     | 
    
         
             
            vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       1296 
     | 
    
         
            -
            vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256= 
     | 
| 
      
 1299 
     | 
    
         
            +
            vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=n0-821Ov9ZfRFX_lbzLy5o2rX8fEw2qoxz0aFWCOxVg,1547
         
     | 
| 
       1297 
1300 
     | 
    
         
             
            vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
         
     | 
| 
       1298 
1301 
     | 
    
         
             
            vellum/workflows/nodes/core/map_node/node.py,sha256=DTMoGqtR8MyfZ8jy8apNoN-4KFFFHywo87pfpqyBVEw,7322
         
     | 
| 
       1299 
1302 
     | 
    
         
             
            vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
         @@ -1412,8 +1415,8 @@ vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528 
     | 
|
| 
       1412 
1415 
     | 
    
         
             
            vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
         
     | 
| 
       1413 
1416 
     | 
    
         
             
            vellum/workflows/workflows/base.py,sha256=qdZYQq-jjdr0fYT0FCfmFuI5ypE3pANupgYcOqqML0o,18884
         
     | 
| 
       1414 
1417 
     | 
    
         
             
            vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
         
     | 
| 
       1415 
     | 
    
         
            -
            vellum_ai-0.12. 
     | 
| 
       1416 
     | 
    
         
            -
            vellum_ai-0.12. 
     | 
| 
       1417 
     | 
    
         
            -
            vellum_ai-0.12. 
     | 
| 
       1418 
     | 
    
         
            -
            vellum_ai-0.12. 
     | 
| 
       1419 
     | 
    
         
            -
            vellum_ai-0.12. 
     | 
| 
      
 1418 
     | 
    
         
            +
            vellum_ai-0.12.16.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
         
     | 
| 
      
 1419 
     | 
    
         
            +
            vellum_ai-0.12.16.dist-info/METADATA,sha256=dSVFM4nOL_e1hiNJX-uVrRBdO4-1wDtqhA3MZKwMLTM,5328
         
     | 
| 
      
 1420 
     | 
    
         
            +
            vellum_ai-0.12.16.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
         
     | 
| 
      
 1421 
     | 
    
         
            +
            vellum_ai-0.12.16.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
         
     | 
| 
      
 1422 
     | 
    
         
            +
            vellum_ai-0.12.16.dist-info/RECORD,,
         
     | 
    
        vellum_cli/__init__.py
    CHANGED
    
    | 
         @@ -49,6 +49,11 @@ def workflows(): 
     | 
|
| 
       49 
49 
     | 
    
         
             
            @click.option("--deployment-name", type=str, help="Unique name for the Deployment")
         
     | 
| 
       50 
50 
     | 
    
         
             
            @click.option("--deployment-description", type=str, help="Description for the Deployment")
         
     | 
| 
       51 
51 
     | 
    
         
             
            @click.option("--release-tag", type=list, help="Release Tag for the Deployment", multiple=True)
         
     | 
| 
      
 52 
     | 
    
         
            +
            @click.option(
         
     | 
| 
      
 53 
     | 
    
         
            +
                "--dry-run",
         
     | 
| 
      
 54 
     | 
    
         
            +
                is_flag=True,
         
     | 
| 
      
 55 
     | 
    
         
            +
                help="Check the Workflow for errors and expected changes, without updating its state in Vellum.",
         
     | 
| 
      
 56 
     | 
    
         
            +
            )
         
     | 
| 
       52 
57 
     | 
    
         
             
            def workflows_push(
         
     | 
| 
       53 
58 
     | 
    
         
             
                module: Optional[str],
         
     | 
| 
       54 
59 
     | 
    
         
             
                deploy: Optional[bool],
         
     | 
| 
         @@ -56,6 +61,7 @@ def workflows_push( 
     | 
|
| 
       56 
61 
     | 
    
         
             
                deployment_name: Optional[str],
         
     | 
| 
       57 
62 
     | 
    
         
             
                deployment_description: Optional[str],
         
     | 
| 
       58 
63 
     | 
    
         
             
                release_tag: Optional[List[str]],
         
     | 
| 
      
 64 
     | 
    
         
            +
                dry_run: Optional[bool],
         
     | 
| 
       59 
65 
     | 
    
         
             
            ) -> None:
         
     | 
| 
       60 
66 
     | 
    
         
             
                """
         
     | 
| 
       61 
67 
     | 
    
         
             
                Push Workflows to Vellum. If a module is provided, only the Workflow for that module will be pushed.
         
     | 
| 
         @@ -69,6 +75,7 @@ def workflows_push( 
     | 
|
| 
       69 
75 
     | 
    
         
             
                    deployment_name=deployment_name,
         
     | 
| 
       70 
76 
     | 
    
         
             
                    deployment_description=deployment_description,
         
     | 
| 
       71 
77 
     | 
    
         
             
                    release_tags=release_tag,
         
     | 
| 
      
 78 
     | 
    
         
            +
                    dry_run=dry_run,
         
     | 
| 
       72 
79 
     | 
    
         
             
                )
         
     | 
| 
       73 
80 
     | 
    
         | 
| 
       74 
81 
     | 
    
         | 
| 
         @@ -79,6 +86,11 @@ def workflows_push( 
     | 
|
| 
       79 
86 
     | 
    
         
             
            @click.option("--deployment-name", type=str, help="Unique name for the Deployment")
         
     | 
| 
       80 
87 
     | 
    
         
             
            @click.option("--deployment-description", type=str, help="Description for the Deployment")
         
     | 
| 
       81 
88 
     | 
    
         
             
            @click.option("--release-tag", type=list, help="Release Tag for the Deployment", multiple=True)
         
     | 
| 
      
 89 
     | 
    
         
            +
            @click.option(
         
     | 
| 
      
 90 
     | 
    
         
            +
                "--dry-run",
         
     | 
| 
      
 91 
     | 
    
         
            +
                is_flag=True,
         
     | 
| 
      
 92 
     | 
    
         
            +
                help="Check the Workflow for errors and expected changes, without updating its state in Vellum.",
         
     | 
| 
      
 93 
     | 
    
         
            +
            )
         
     | 
| 
       82 
94 
     | 
    
         
             
            def push_module(
         
     | 
| 
       83 
95 
     | 
    
         
             
                ctx: click.Context,
         
     | 
| 
       84 
96 
     | 
    
         
             
                deploy: Optional[bool],
         
     | 
| 
         @@ -86,6 +98,7 @@ def push_module( 
     | 
|
| 
       86 
98 
     | 
    
         
             
                deployment_name: Optional[str],
         
     | 
| 
       87 
99 
     | 
    
         
             
                deployment_description: Optional[str],
         
     | 
| 
       88 
100 
     | 
    
         
             
                release_tag: Optional[List[str]],
         
     | 
| 
      
 101 
     | 
    
         
            +
                dry_run: Optional[bool],
         
     | 
| 
       89 
102 
     | 
    
         
             
            ) -> None:
         
     | 
| 
       90 
103 
     | 
    
         
             
                """Push a specific module to Vellum"""
         
     | 
| 
       91 
104 
     | 
    
         | 
| 
         @@ -97,6 +110,7 @@ def push_module( 
     | 
|
| 
       97 
110 
     | 
    
         
             
                        deployment_name=deployment_name,
         
     | 
| 
       98 
111 
     | 
    
         
             
                        deployment_description=deployment_description,
         
     | 
| 
       99 
112 
     | 
    
         
             
                        release_tags=release_tag,
         
     | 
| 
      
 113 
     | 
    
         
            +
                        dry_run=dry_run,
         
     | 
| 
       100 
114 
     | 
    
         
             
                    )
         
     | 
| 
       101 
115 
     | 
    
         | 
| 
       102 
116 
     | 
    
         | 
    
        vellum_cli/push.py
    CHANGED
    
    | 
         @@ -27,6 +27,7 @@ def push_command( 
     | 
|
| 
       27 
27 
     | 
    
         
             
                deployment_name: Optional[str] = None,
         
     | 
| 
       28 
28 
     | 
    
         
             
                deployment_description: Optional[str] = None,
         
     | 
| 
       29 
29 
     | 
    
         
             
                release_tags: Optional[List[str]] = None,
         
     | 
| 
      
 30 
     | 
    
         
            +
                dry_run: Optional[bool] = None,
         
     | 
| 
       30 
31 
     | 
    
         
             
            ) -> None:
         
     | 
| 
       31 
32 
     | 
    
         
             
                load_dotenv()
         
     | 
| 
       32 
33 
     | 
    
         
             
                logger = load_cli_logger()
         
     | 
| 
         @@ -49,7 +50,11 @@ def push_command( 
     | 
|
| 
       49 
50 
     | 
    
         
             
                # Remove this once we could serialize using the artifact in Vembda
         
     | 
| 
       50 
51 
     | 
    
         
             
                # https://app.shortcut.com/vellum/story/5585
         
     | 
| 
       51 
52 
     | 
    
         
             
                workflow = BaseWorkflow.load_from_module(workflow_config.module)
         
     | 
| 
       52 
     | 
    
         
            -
                workflow_display = get_workflow_display( 
     | 
| 
      
 53 
     | 
    
         
            +
                workflow_display = get_workflow_display(
         
     | 
| 
      
 54 
     | 
    
         
            +
                    base_display_class=VellumWorkflowDisplay,
         
     | 
| 
      
 55 
     | 
    
         
            +
                    workflow_class=workflow,
         
     | 
| 
      
 56 
     | 
    
         
            +
                    dry_run=dry_run or False,
         
     | 
| 
      
 57 
     | 
    
         
            +
                )
         
     | 
| 
       53 
58 
     | 
    
         
             
                exec_config = workflow_display.serialize()
         
     | 
| 
       54 
59 
     | 
    
         | 
| 
       55 
60 
     | 
    
         
             
                container_tag = workflow_config.container_image_tag
         
     | 
| 
         @@ -114,11 +119,28 @@ def push_command( 
     | 
|
| 
       114 
119 
     | 
    
         
             
                    # We should check with fern if we could auto-serialize typed object fields for us
         
     | 
| 
       115 
120 
     | 
    
         
             
                    # https://app.shortcut.com/vellum/story/5568
         
     | 
| 
       116 
121 
     | 
    
         
             
                    deployment_config=deployment_config_serialized,  # type: ignore[arg-type]
         
     | 
| 
      
 122 
     | 
    
         
            +
                    dry_run=dry_run,
         
     | 
| 
       117 
123 
     | 
    
         
             
                )
         
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                if dry_run:
         
     | 
| 
      
 126 
     | 
    
         
            +
                    error_messages = [str(e) for e in workflow_display.errors]
         
     | 
| 
      
 127 
     | 
    
         
            +
                    error_message = "\n".join(error_messages) if error_messages else "No errors found."
         
     | 
| 
      
 128 
     | 
    
         
            +
                    logger.info(
         
     | 
| 
      
 129 
     | 
    
         
            +
                        f"""\
         
     | 
| 
      
 130 
     | 
    
         
            +
            # Workflow Push Report
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
            ## Errors
         
     | 
| 
      
 133 
     | 
    
         
            +
            {error_message}
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
            ## Proposed Diffs
         
     | 
| 
      
 136 
     | 
    
         
            +
            {json.dumps(response.proposed_diffs, indent=2)}
         
     | 
| 
      
 137 
     | 
    
         
            +
            """
         
     | 
| 
      
 138 
     | 
    
         
            +
                    )  # type: ignore[attr-defined]
         
     | 
| 
      
 139 
     | 
    
         
            +
                else:
         
     | 
| 
      
 140 
     | 
    
         
            +
                    logger.info(
         
     | 
| 
      
 141 
     | 
    
         
            +
                        f"""Successfully pushed {label} to Vellum!
         
     | 
| 
       120 
142 
     | 
    
         
             
            Visit at: https://app.vellum.ai/workflow-sandboxes/{response.workflow_sandbox_id}"""
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 143 
     | 
    
         
            +
                    )
         
     | 
| 
       122 
144 
     | 
    
         | 
| 
       123 
145 
     | 
    
         
             
                requires_save = False
         
     | 
| 
       124 
146 
     | 
    
         
             
                if not workflow_config.workflow_sandbox_id:
         
     | 
    
        vellum_cli/tests/test_push.py
    CHANGED
    
    | 
         @@ -171,3 +171,66 @@ class ExampleWorkflow(BaseWorkflow): 
     | 
|
| 
       171 
171 
     | 
    
         | 
| 
       172 
172 
     | 
    
         
             
                extracted_files = _extract_tar_gz(call_args["artifact"].read())
         
     | 
| 
       173 
173 
     | 
    
         
             
                assert extracted_files["workflow.py"] == workflow_py_file_content
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
             
     | 
| 
      
 176 
     | 
    
         
            +
            def test_push__dry_run_option_returns_report(mock_module, vellum_client):
         
     | 
| 
      
 177 
     | 
    
         
            +
                # GIVEN a single workflow configured
         
     | 
| 
      
 178 
     | 
    
         
            +
                temp_dir = mock_module.temp_dir
         
     | 
| 
      
 179 
     | 
    
         
            +
                module = mock_module.module
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                # AND a workflow exists in the module successfully
         
     | 
| 
      
 182 
     | 
    
         
            +
                base_dir = os.path.join(temp_dir, *module.split("."))
         
     | 
| 
      
 183 
     | 
    
         
            +
                os.makedirs(base_dir, exist_ok=True)
         
     | 
| 
      
 184 
     | 
    
         
            +
                workflow_py_file_content = """\
         
     | 
| 
      
 185 
     | 
    
         
            +
            from typing import Dict
         
     | 
| 
      
 186 
     | 
    
         
            +
            from vellum.workflows import BaseWorkflow
         
     | 
| 
      
 187 
     | 
    
         
            +
            from vellum.workflows.nodes import BaseNode
         
     | 
| 
      
 188 
     | 
    
         
            +
            from vellum_ee.workflows.display.nodes import BaseNodeDisplay
         
     | 
| 
      
 189 
     | 
    
         
            +
             
     | 
| 
      
 190 
     | 
    
         
            +
            class NotSupportedNode(BaseNode):
         
     | 
| 
      
 191 
     | 
    
         
            +
                pass
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
            class NotSupportedNodeDisplay(BaseNodeDisplay[NotSupportedNode]):
         
     | 
| 
      
 194 
     | 
    
         
            +
                def serialize(self, display_context, **kwargs) -> Dict:
         
     | 
| 
      
 195 
     | 
    
         
            +
                    raise NotImplementedError(f"Serialization is not supported.")
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
            class ExampleWorkflow(BaseWorkflow):
         
     | 
| 
      
 198 
     | 
    
         
            +
                graph = NotSupportedNode
         
     | 
| 
      
 199 
     | 
    
         
            +
            """
         
     | 
| 
      
 200 
     | 
    
         
            +
                with open(os.path.join(temp_dir, *module.split("."), "workflow.py"), "w") as f:
         
     | 
| 
      
 201 
     | 
    
         
            +
                    f.write(workflow_py_file_content)
         
     | 
| 
      
 202 
     | 
    
         
            +
             
     | 
| 
      
 203 
     | 
    
         
            +
                # AND the push API call returns successfully
         
     | 
| 
      
 204 
     | 
    
         
            +
                vellum_client.workflows.push.return_value = WorkflowPushResponse(
         
     | 
| 
      
 205 
     | 
    
         
            +
                    workflow_sandbox_id=str(uuid4()),
         
     | 
| 
      
 206 
     | 
    
         
            +
                    proposed_diffs={
         
     | 
| 
      
 207 
     | 
    
         
            +
                        "iterable_item_added": {
         
     | 
| 
      
 208 
     | 
    
         
            +
                            "root['raw_data']['nodes'][0]": {
         
     | 
| 
      
 209 
     | 
    
         
            +
                                "id": str(uuid4()),
         
     | 
| 
      
 210 
     | 
    
         
            +
                                "type": "GENERIC",
         
     | 
| 
      
 211 
     | 
    
         
            +
                                "definition": None,
         
     | 
| 
      
 212 
     | 
    
         
            +
                                "display_data": None,
         
     | 
| 
      
 213 
     | 
    
         
            +
                                "trigger": {"id": str(uuid4()), "merge_behavior": "AWAIT_ATTRIBUTES"},
         
     | 
| 
      
 214 
     | 
    
         
            +
                                "ports": [{"id": str(uuid4()), "name": "default", "type": "DEFAULT"}],
         
     | 
| 
      
 215 
     | 
    
         
            +
                            },
         
     | 
| 
      
 216 
     | 
    
         
            +
                        },
         
     | 
| 
      
 217 
     | 
    
         
            +
                    },
         
     | 
| 
      
 218 
     | 
    
         
            +
                )
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
      
 220 
     | 
    
         
            +
                # WHEN calling `vellum push`
         
     | 
| 
      
 221 
     | 
    
         
            +
                runner = CliRunner(mix_stderr=True)
         
     | 
| 
      
 222 
     | 
    
         
            +
                result = runner.invoke(cli_main, ["push", module, "--dry-run"])
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
                # THEN it should succeed
         
     | 
| 
      
 225 
     | 
    
         
            +
                assert result.exit_code == 0
         
     | 
| 
      
 226 
     | 
    
         
            +
             
     | 
| 
      
 227 
     | 
    
         
            +
                # AND we should have called the push API with the dry-run option
         
     | 
| 
      
 228 
     | 
    
         
            +
                vellum_client.workflows.push.assert_called_once()
         
     | 
| 
      
 229 
     | 
    
         
            +
                call_args = vellum_client.workflows.push.call_args.kwargs
         
     | 
| 
      
 230 
     | 
    
         
            +
                assert call_args["dry_run"] is True
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
                # AND the report should be in the output
         
     | 
| 
      
 233 
     | 
    
         
            +
                assert "## Errors" in result.output
         
     | 
| 
      
 234 
     | 
    
         
            +
                # assert "Serialization is not supported." in result.output
         
     | 
| 
      
 235 
     | 
    
         
            +
                assert "## Proposed Diffs" in result.output
         
     | 
| 
      
 236 
     | 
    
         
            +
                assert "iterable_item_added" in result.output
         
     | 
| 
         @@ -161,9 +161,9 @@ class BaseAPINodeDisplay(BaseNodeVellumDisplay[_APINodeType], Generic[_APINodeTy 
     | 
|
| 
       161 
161 
     | 
    
         
             
                    ]
         
     | 
| 
       162 
162 
     | 
    
         
             
                    inputs.extend(additional_header_inputs)
         
     | 
| 
       163 
163 
     | 
    
         | 
| 
       164 
     | 
    
         
            -
                    _, text_output_display = display_context. 
     | 
| 
       165 
     | 
    
         
            -
                    _, json_output_display = display_context. 
     | 
| 
       166 
     | 
    
         
            -
                    _, status_code_output_display = display_context. 
     | 
| 
      
 164 
     | 
    
         
            +
                    _, text_output_display = display_context.global_node_output_displays[cast(OutputReference, node.Outputs.text)]
         
     | 
| 
      
 165 
     | 
    
         
            +
                    _, json_output_display = display_context.global_node_output_displays[cast(OutputReference, node.Outputs.json)]
         
     | 
| 
      
 166 
     | 
    
         
            +
                    _, status_code_output_display = display_context.global_node_output_displays[
         
     | 
| 
       167 
167 
     | 
    
         
             
                        cast(OutputReference, node.Outputs.status_code)
         
     | 
| 
       168 
168 
     | 
    
         
             
                    ]
         
     | 
| 
       169 
169 
     | 
    
         | 
| 
         @@ -2,17 +2,34 @@ from typing import Any, Generic, TypeVar 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            from vellum.workflows.nodes.bases.base import BaseNode
         
     | 
| 
       4 
4 
     | 
    
         
             
            from vellum.workflows.types.core import JsonObject
         
     | 
| 
      
 5 
     | 
    
         
            +
            from vellum.workflows.utils.uuids import uuid4_from_hash
         
     | 
| 
       5 
6 
     | 
    
         
             
            from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
         
     | 
| 
       6 
7 
     | 
    
         
             
            from vellum_ee.workflows.display.types import WorkflowDisplayContext
         
     | 
| 
      
 8 
     | 
    
         
            +
            from vellum_ee.workflows.display.vellum import GenericNodeDisplayData
         
     | 
| 
       7 
9 
     | 
    
         | 
| 
       8 
10 
     | 
    
         
             
            _BaseNodeType = TypeVar("_BaseNodeType", bound=BaseNode)
         
     | 
| 
       9 
11 
     | 
    
         | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            class BaseNodeDisplay(BaseNodeVellumDisplay[_BaseNodeType], Generic[_BaseNodeType]):
         
     | 
| 
       12 
14 
     | 
    
         
             
                def serialize(self, display_context: WorkflowDisplayContext, **kwargs: Any) -> JsonObject:
         
     | 
| 
      
 15 
     | 
    
         
            +
                    node = self._node
         
     | 
| 
       13 
16 
     | 
    
         
             
                    node_id = self.node_id
         
     | 
| 
       14 
17 
     | 
    
         | 
| 
       15 
18 
     | 
    
         
             
                    return {
         
     | 
| 
       16 
19 
     | 
    
         
             
                        "id": str(node_id),
         
     | 
| 
      
 20 
     | 
    
         
            +
                        "label": node.__qualname__,
         
     | 
| 
       17 
21 
     | 
    
         
             
                        "type": "GENERIC",
         
     | 
| 
      
 22 
     | 
    
         
            +
                        "display_data": self.get_generic_node_display_data().dict(),
         
     | 
| 
      
 23 
     | 
    
         
            +
                        "definition": self.get_definition().dict(),
         
     | 
| 
      
 24 
     | 
    
         
            +
                        "trigger": {
         
     | 
| 
      
 25 
     | 
    
         
            +
                            "id": str(uuid4_from_hash(f"{node_id}|trigger")),
         
     | 
| 
      
 26 
     | 
    
         
            +
                            "merge_behavior": node.Trigger.merge_behavior.value,
         
     | 
| 
      
 27 
     | 
    
         
            +
                        },
         
     | 
| 
      
 28 
     | 
    
         
            +
                        "ports": [],
         
     | 
| 
      
 29 
     | 
    
         
            +
                        "adornments": None,
         
     | 
| 
      
 30 
     | 
    
         
            +
                        "attributes": [],
         
     | 
| 
       18 
31 
     | 
    
         
             
                    }
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def get_generic_node_display_data(self) -> GenericNodeDisplayData:
         
     | 
| 
      
 34 
     | 
    
         
            +
                    explicit_value = self._get_explicit_node_display_attr("display_data", GenericNodeDisplayData)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    return explicit_value if explicit_value else GenericNodeDisplayData()
         
     | 
| 
         @@ -70,8 +70,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType] 
     | 
|
| 
       70 
70 
     | 
    
         | 
| 
       71 
71 
     | 
    
         
             
                    packages = raise_if_descriptor(node.packages)
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                    _, output_display = display_context. 
     | 
| 
       74 
     | 
    
         
            -
                    _, log_output_display = display_context. 
     | 
| 
      
 73 
     | 
    
         
            +
                    _, output_display = display_context.global_node_output_displays[node.Outputs.result]
         
     | 
| 
      
 74 
     | 
    
         
            +
                    _, log_output_display = display_context.global_node_output_displays[node.Outputs.log]
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                    output_type = primitive_type_to_vellum_variable_type(node.get_output_type())
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
         @@ -29,8 +29,8 @@ class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType], 
     | 
|
| 
       29 
29 
     | 
    
         
             
                    node_inputs, prompt_inputs = self._generate_node_and_prompt_inputs(node_id, node, display_context)
         
     | 
| 
       30 
30 
     | 
    
         
             
                    input_variable_id_by_name = {prompt_input.key: prompt_input.id for prompt_input in prompt_inputs}
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                    _, output_display = display_context. 
     | 
| 
       33 
     | 
    
         
            -
                    _, array_display = display_context. 
     | 
| 
      
 32 
     | 
    
         
            +
                    _, output_display = display_context.global_node_output_displays[node.Outputs.text]
         
     | 
| 
      
 33 
     | 
    
         
            +
                    _, array_display = display_context.global_node_output_displays[node.Outputs.results]
         
     | 
| 
       34 
34 
     | 
    
         
             
                    node_blocks = raise_if_descriptor(node.blocks)
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
36 
     | 
    
         
             
                    return {
         
     | 
| 
         @@ -2,6 +2,7 @@ from uuid import UUID 
     | 
|
| 
       2 
2 
     | 
    
         
             
            from typing import ClassVar, Dict, Generic, List, Optional, Tuple, Type, TypeVar, cast
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            from vellum import VellumVariable
         
     | 
| 
      
 5 
     | 
    
         
            +
            from vellum.workflows.inputs.base import BaseInputs
         
     | 
| 
       5 
6 
     | 
    
         
             
            from vellum.workflows.nodes import InlineSubworkflowNode
         
     | 
| 
       6 
7 
     | 
    
         
             
            from vellum.workflows.types.core import JsonObject
         
     | 
| 
       7 
8 
     | 
    
         
             
            from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
         
     | 
| 
         @@ -60,12 +61,25 @@ class BaseInlineSubworkflowNodeDisplay( 
     | 
|
| 
       60 
61 
     | 
    
         
             
                    node: Type[InlineSubworkflowNode],
         
     | 
| 
       61 
62 
     | 
    
         
             
                    display_context: WorkflowDisplayContext,
         
     | 
| 
       62 
63 
     | 
    
         
             
                ) -> Tuple[List[NodeInput], List[VellumVariable]]:
         
     | 
| 
      
 64 
     | 
    
         
            +
                    subworkflow = raise_if_descriptor(node.subworkflow)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    subworkflow_inputs_class = subworkflow.get_inputs_class()
         
     | 
| 
       63 
66 
     | 
    
         
             
                    subworkflow_inputs = raise_if_descriptor(node.subworkflow_inputs)
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                    if isinstance(subworkflow_inputs, BaseInputs):
         
     | 
| 
      
 69 
     | 
    
         
            +
                        subworkflow_entries = [
         
     | 
| 
      
 70 
     | 
    
         
            +
                            (variable_ref.name, variable_value) for variable_ref, variable_value in subworkflow_inputs
         
     | 
| 
      
 71 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 72 
     | 
    
         
            +
                    elif isinstance(subworkflow_inputs, dict):
         
     | 
| 
      
 73 
     | 
    
         
            +
                        subworkflow_entries = [
         
     | 
| 
      
 74 
     | 
    
         
            +
                            (variable_name, variable_value) for variable_name, variable_value in subworkflow_inputs.items()
         
     | 
| 
      
 75 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 76 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 77 
     | 
    
         
            +
                        subworkflow_entries = [
         
     | 
| 
      
 78 
     | 
    
         
            +
                            (descriptor.name, getattr(subworkflow_inputs_class, descriptor.name))
         
     | 
| 
      
 79 
     | 
    
         
            +
                            for descriptor in subworkflow_inputs_class
         
     | 
| 
      
 80 
     | 
    
         
            +
                            if hasattr(subworkflow_inputs_class, descriptor.name)
         
     | 
| 
      
 81 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
       69 
83 
     | 
    
         
             
                    node_inputs = [
         
     | 
| 
       70 
84 
     | 
    
         
             
                        create_node_input(
         
     | 
| 
       71 
85 
     | 
    
         
             
                            node_id=node_id,
         
     | 
| 
         @@ -83,7 +97,7 @@ class BaseInlineSubworkflowNodeDisplay( 
     | 
|
| 
       83 
97 
     | 
    
         
             
                            key=descriptor.name,
         
     | 
| 
       84 
98 
     | 
    
         
             
                            type=infer_vellum_variable_type(descriptor),
         
     | 
| 
       85 
99 
     | 
    
         
             
                        )
         
     | 
| 
       86 
     | 
    
         
            -
                        for descriptor in  
     | 
| 
      
 100 
     | 
    
         
            +
                        for descriptor in subworkflow_inputs_class
         
     | 
| 
       87 
101 
     | 
    
         
             
                    ]
         
     | 
| 
       88 
102 
     | 
    
         | 
| 
       89 
103 
     | 
    
         
             
                    return node_inputs, workflow_inputs
         
     | 
| 
         @@ -33,6 +33,7 @@ class BaseMapNodeDisplay(BaseNodeVellumDisplay[_MapNodeType], Generic[_MapNodeTy 
     | 
|
| 
       33 
33 
     | 
    
         
             
                    subworkflow_display = get_workflow_display(
         
     | 
| 
       34 
34 
     | 
    
         
             
                        base_display_class=display_context.workflow_display_class,
         
     | 
| 
       35 
35 
     | 
    
         
             
                        workflow_class=subworkflow,
         
     | 
| 
      
 36 
     | 
    
         
            +
                        parent_display_context=display_context,
         
     | 
| 
       36 
37 
     | 
    
         
             
                    )
         
     | 
| 
       37 
38 
     | 
    
         
             
                    serialized_subworkflow = subworkflow_display.serialize()
         
     | 
| 
       38 
39 
     | 
    
         |