vellum-ai 0.10.7__py3-none-any.whl → 0.10.8__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/workflows/events/types.py +1 -1
- vellum/workflows/nodes/core/inline_subworkflow_node/node.py +1 -0
- vellum/workflows/nodes/core/templating_node/node.py +5 -0
- vellum/workflows/nodes/displayable/api_node/node.py +1 -1
- vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +1 -2
- vellum/workflows/nodes/displayable/code_execution_node/node.py +1 -2
- vellum/workflows/nodes/displayable/code_execution_node/utils.py +13 -2
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py +10 -3
- vellum/workflows/nodes/displayable/prompt_deployment_node/node.py +6 -1
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +1 -2
- vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +1 -2
- vellum/workflows/runner/runner.py +43 -1
- vellum/workflows/types/__init__.py +5 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/METADATA +1 -1
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/RECORD +24 -24
- vellum_cli/__init__.py +23 -4
- vellum_cli/pull.py +28 -13
- vellum_cli/tests/test_pull.py +45 -2
- vellum_ee/workflows/display/nodes/base_node_display.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +17 -2
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/LICENSE +0 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/WHEEL +0 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/entry_points.txt +0 -0
| @@ -17,7 +17,7 @@ class BaseClientWrapper: | |
| 17 17 | 
             
                    headers: typing.Dict[str, str] = {
         | 
| 18 18 | 
             
                        "X-Fern-Language": "Python",
         | 
| 19 19 | 
             
                        "X-Fern-SDK-Name": "vellum-ai",
         | 
| 20 | 
            -
                        "X-Fern-SDK-Version": "0.10. | 
| 20 | 
            +
                        "X-Fern-SDK-Version": "0.10.8",
         | 
| 21 21 | 
             
                    }
         | 
| 22 22 | 
             
                    headers["X_API_KEY"] = self.api_key
         | 
| 23 23 | 
             
                    return headers
         | 
    
        vellum/workflows/events/types.py
    CHANGED
    
    
| @@ -18,6 +18,7 @@ class InlineSubworkflowNode(BaseSubworkflowNode[StateType], Generic[StateType, W | |
| 18 18 | 
             
                Used to execute a Subworkflow defined inline.
         | 
| 19 19 |  | 
| 20 20 | 
             
                subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"] - The Subworkflow to execute
         | 
| 21 | 
            +
                subworkflow_inputs: ClassVar[EntityInputsInterface] = {}
         | 
| 21 22 | 
             
                """
         | 
| 22 23 |  | 
| 23 24 | 
             
                subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"]
         | 
| @@ -82,6 +82,11 @@ class TemplatingNode(BaseNode[StateType], Generic[StateType, _OutputType], metac | |
| 82 82 | 
             
                jinja_custom_filters: Mapping[str, Callable[[Union[str, bytes]], bool]] = _DEFAULT_JINJA_CUSTOM_FILTERS
         | 
| 83 83 |  | 
| 84 84 | 
             
                class Outputs(BaseNode.Outputs):
         | 
| 85 | 
            +
                    """
         | 
| 86 | 
            +
                    The outputs of the TemplatingNode.
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    result: _OutputType - The result of the template rendering
         | 
| 89 | 
            +
                    """
         | 
| 85 90 | 
             
                    # We use our mypy plugin to override the _OutputType with the actual output type
         | 
| 86 91 | 
             
                    # for downstream references to this output.
         | 
| 87 92 | 
             
                    result: _OutputType  # type: ignore[valid-type]
         | 
| @@ -8,7 +8,7 @@ from vellum.workflows.references.vellum_secret import VellumSecretReference | |
| 8 8 | 
             
            class APINode(BaseAPINode):
         | 
| 9 9 | 
             
                """
         | 
| 10 10 | 
             
                Used to execute an API call. This node exists to be backwards compatible with Vellum's API Node, and for most cases,
         | 
| 11 | 
            -
                you should extend from ` | 
| 11 | 
            +
                you should extend from `BaseAPINode` directly.
         | 
| 12 12 |  | 
| 13 13 | 
             
                url: str - The URL to send the request to.
         | 
| 14 14 | 
             
                method: APIRequestMethod - The HTTP method to use for the request.
         | 
| @@ -11,7 +11,6 @@ from vellum import ( | |
| 11 11 | 
             
                RawPromptExecutionOverridesRequest,
         | 
| 12 12 | 
             
                StringInputRequest,
         | 
| 13 13 | 
             
            )
         | 
| 14 | 
            -
             | 
| 15 14 | 
             
            from vellum.workflows.constants import LATEST_RELEASE_TAG, OMIT
         | 
| 16 15 | 
             
            from vellum.workflows.errors import VellumErrorCode
         | 
| 17 16 | 
             
            from vellum.workflows.exceptions import NodeException
         | 
| @@ -26,7 +25,7 @@ class BasePromptDeploymentNode(BasePromptNode, Generic[StateType]): | |
| 26 25 | 
             
                prompt_inputs: EntityInputsInterface - The inputs for the Prompt
         | 
| 27 26 | 
             
                deployment: Union[UUID, str] - Either the Prompt Deployment's UUID or its name.
         | 
| 28 27 | 
             
                release_tag: str - The release tag to use for the Prompt Execution
         | 
| 29 | 
            -
                external_id: Optional[str] -  | 
| 28 | 
            +
                external_id: Optional[str] - Optionally include a unique identifier for tracking purposes. Must be unique within a given Prompt Deployment.
         | 
| 30 29 | 
             
                expand_meta: Optional[PromptDeploymentExpandMetaRequest] - Expandable execution fields to include in the response
         | 
| 31 30 | 
             
                raw_overrides: Optional[RawPromptExecutionOverridesRequest] - The raw overrides to use for the Prompt Execution
         | 
| 32 31 | 
             
                expand_raw: Optional[Sequence[str]] - Expandable raw fields to include in the response
         | 
| @@ -67,9 +67,8 @@ class CodeExecutionNode(BaseNode[StateType], Generic[StateType, _OutputType], me | |
| 67 67 |  | 
| 68 68 | 
             
                filepath: str - The path to the script to execute.
         | 
| 69 69 | 
             
                code_inputs: EntityInputsInterface - The inputs for the custom script.
         | 
| 70 | 
            -
                output_type: VellumVariableType = "STRING" - The type of the output from the custom script.
         | 
| 71 70 | 
             
                runtime: CodeExecutionRuntime = "PYTHON_3_12" - The runtime to use for the custom script.
         | 
| 72 | 
            -
                packages: Optional[Sequence[ | 
| 71 | 
            +
                packages: Optional[Sequence[CodeExecutionPackage]] = None - The packages to use for the custom script.
         | 
| 73 72 | 
             
                request_options: Optional[RequestOptions] = None - The request options to use for the custom script.
         | 
| 74 73 | 
             
                """
         | 
| 75 74 |  | 
| @@ -2,9 +2,20 @@ import os | |
| 2 2 | 
             
            from typing import Union
         | 
| 3 3 |  | 
| 4 4 |  | 
| 5 | 
            +
            def get_project_root() -> str:
         | 
| 6 | 
            +
                current_dir = os.getcwd()
         | 
| 7 | 
            +
                while current_dir != '/':
         | 
| 8 | 
            +
                    if ".git" in os.listdir(current_dir):
         | 
| 9 | 
            +
                        return current_dir
         | 
| 10 | 
            +
                    current_dir = os.path.dirname(current_dir)
         | 
| 11 | 
            +
                raise FileNotFoundError("Project root not found.")
         | 
| 12 | 
            +
             | 
| 5 13 | 
             
            def read_file_from_path(filepath: str) -> Union[str, None]:
         | 
| 6 | 
            -
                 | 
| 14 | 
            +
                project_root = get_project_root()
         | 
| 15 | 
            +
                relative_filepath = os.path.join(project_root, filepath)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                if not os.path.exists(relative_filepath):
         | 
| 7 18 | 
             
                    return None
         | 
| 8 19 |  | 
| 9 | 
            -
                with open( | 
| 20 | 
            +
                with open(relative_filepath, 'r') as file:
         | 
| 10 21 | 
             
                    return file.read()
         | 
| @@ -9,16 +9,23 @@ from vellum.workflows.types.generics import StateType | |
| 9 9 |  | 
| 10 10 | 
             
            class InlinePromptNode(BaseInlinePromptNode[StateType]):
         | 
| 11 11 | 
             
                """
         | 
| 12 | 
            -
                Used to execute  | 
| 12 | 
            +
                Used to execute a Prompt defined inline.
         | 
| 13 13 |  | 
| 14 14 | 
             
                prompt_inputs: EntityInputsInterface - The inputs for the Prompt
         | 
| 15 15 | 
             
                ml_model: str - Either the ML Model's UUID or its name.
         | 
| 16 | 
            -
                blocks: List[ | 
| 16 | 
            +
                blocks: List[PromptBlock] - The blocks that make up the Prompt
         | 
| 17 | 
            +
                functions: Optional[List[FunctionDefinition]] - The functions to include in the Prompt
         | 
| 17 18 | 
             
                parameters: PromptParameters - The parameters for the Prompt
         | 
| 18 | 
            -
                expand_meta: Optional[ | 
| 19 | 
            +
                expand_meta: Optional[AdHocExpandMeta] - Expandable execution fields to include in the response
         | 
| 20 | 
            +
                request_options: Optional[RequestOptions] - The request options to use for the Prompt Execution
         | 
| 19 21 | 
             
                """
         | 
| 20 22 |  | 
| 21 23 | 
             
                class Outputs(BaseInlinePromptNode.Outputs):
         | 
| 24 | 
            +
                    """
         | 
| 25 | 
            +
                    The outputs of the InlinePromptNode.
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    text: str - The result of the Prompt Execution
         | 
| 28 | 
            +
                    """
         | 
| 22 29 | 
             
                    text: str
         | 
| 23 30 |  | 
| 24 31 | 
             
                def run(self) -> Iterator[BaseOutput]:
         | 
| @@ -14,7 +14,7 @@ class PromptDeploymentNode(BasePromptDeploymentNode[StateType]): | |
| 14 14 | 
             
                prompt_inputs: EntityInputsInterface - The inputs for the Prompt
         | 
| 15 15 | 
             
                deployment: Union[UUID, str] - Either the Prompt Deployment's UUID or its name.
         | 
| 16 16 | 
             
                release_tag: str - The release tag to use for the Prompt Execution
         | 
| 17 | 
            -
                external_id: Optional[str] -  | 
| 17 | 
            +
                external_id: Optional[str] - Optionally include a unique identifier for tracking purposes. Must be unique within a given Prompt Deployment.
         | 
| 18 18 | 
             
                expand_meta: Optional[PromptDeploymentExpandMetaRequest] - Expandable execution fields to include in the response
         | 
| 19 19 | 
             
                raw_overrides: Optional[RawPromptExecutionOverridesRequest] - The raw overrides to use for the Prompt Execution
         | 
| 20 20 | 
             
                expand_raw: Optional[Sequence[str]] - Expandable raw fields to include in the response
         | 
| @@ -23,6 +23,11 @@ class PromptDeploymentNode(BasePromptDeploymentNode[StateType]): | |
| 23 23 | 
             
                """
         | 
| 24 24 |  | 
| 25 25 | 
             
                class Outputs(BasePromptDeploymentNode.Outputs):
         | 
| 26 | 
            +
                    """
         | 
| 27 | 
            +
                    The outputs of the PromptDeploymentNode.
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    text: str - The result of the Prompt Execution
         | 
| 30 | 
            +
                    """
         | 
| 26 31 | 
             
                    text: str
         | 
| 27 32 |  | 
| 28 33 | 
             
                def run(self) -> Iterator[BaseOutput]:
         | 
| @@ -12,7 +12,6 @@ from vellum import ( | |
| 12 12 | 
             
                WorkflowRequestStringInputRequest,
         | 
| 13 13 | 
             
            )
         | 
| 14 14 | 
             
            from vellum.core import RequestOptions
         | 
| 15 | 
            -
             | 
| 16 15 | 
             
            from vellum.workflows.constants import LATEST_RELEASE_TAG, OMIT
         | 
| 17 16 | 
             
            from vellum.workflows.errors import VellumErrorCode
         | 
| 18 17 | 
             
            from vellum.workflows.exceptions import NodeException
         | 
| @@ -28,7 +27,7 @@ class SubworkflowDeploymentNode(BaseSubworkflowNode[StateType], Generic[StateTyp | |
| 28 27 | 
             
                subworkflow_inputs: EntityInputsInterface - The inputs for the Subworkflow
         | 
| 29 28 | 
             
                deployment: Union[UUID, str] - Either the Workflow Deployment's UUID or its name.
         | 
| 30 29 | 
             
                release_tag: str = LATEST_RELEASE_TAG - The release tag to use for the Workflow Execution
         | 
| 31 | 
            -
                external_id: Optional[str] = OMIT -  | 
| 30 | 
            +
                external_id: Optional[str] = OMIT - Optionally include a unique identifier for tracking purposes. Must be unique within a given Workflow Deployment.
         | 
| 32 31 | 
             
                expand_meta: Optional[WorkflowExpandMetaRequest] = OMIT - Expandable execution fields to include in the respownse
         | 
| 33 32 | 
             
                metadata: Optional[Dict[str, Optional[Any]]] = OMIT - The metadata to use for the Workflow Execution
         | 
| 34 33 | 
             
                request_options: Optional[RequestOptions] = None - The request options to use for the Workflow Execution
         | 
| @@ -8,7 +8,6 @@ from vellum import ( | |
| 8 8 | 
             
                PromptOutput,
         | 
| 9 9 | 
             
                StringVellumValue,
         | 
| 10 10 | 
             
            )
         | 
| 11 | 
            -
             | 
| 12 11 | 
             
            from vellum.workflows.constants import OMIT
         | 
| 13 12 | 
             
            from vellum.workflows.inputs import BaseInputs
         | 
| 14 13 | 
             
            from vellum.workflows.nodes import PromptDeploymentNode
         | 
| @@ -65,7 +64,7 @@ def test_text_prompt_deployment_node__basic(vellum_client): | |
| 65 64 | 
             
                assert text_output.name == "text"
         | 
| 66 65 | 
             
                assert text_output.value == "Hello, world!"
         | 
| 67 66 |  | 
| 68 | 
            -
                # AND we should have made the expected call to  | 
| 67 | 
            +
                # AND we should have made the expected call to stream the prompt execution
         | 
| 69 68 | 
             
                vellum_client.execute_prompt_stream.assert_called_once_with(
         | 
| 70 69 | 
             
                    expand_meta=OMIT,
         | 
| 71 70 | 
             
                    expand_raw=OMIT,
         | 
| @@ -28,7 +28,7 @@ from vellum.workflows.events.node import ( | |
| 28 28 | 
             
                NodeExecutionRejectedBody,
         | 
| 29 29 | 
             
                NodeExecutionStreamingBody,
         | 
| 30 30 | 
             
            )
         | 
| 31 | 
            -
            from vellum.workflows.events.types import BaseEvent
         | 
| 31 | 
            +
            from vellum.workflows.events.types import BaseEvent, ParentContext, WorkflowParentContext
         | 
| 32 32 | 
             
            from vellum.workflows.events.utils import is_terminal_event
         | 
| 33 33 | 
             
            from vellum.workflows.events.workflow import (
         | 
| 34 34 | 
             
                WorkflowExecutionFulfilledBody,
         | 
| @@ -71,6 +71,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 71 71 | 
             
                    entrypoint_nodes: Optional[RunFromNodeArg] = None,
         | 
| 72 72 | 
             
                    external_inputs: Optional[ExternalInputsArg] = None,
         | 
| 73 73 | 
             
                    cancel_signal: Optional[ThreadingEvent] = None,
         | 
| 74 | 
            +
                    parent_context: Optional[ParentContext] = None,
         | 
| 74 75 | 
             
                ):
         | 
| 75 76 | 
             
                    if state and external_inputs:
         | 
| 76 77 | 
             
                        raise ValueError("Can only run a Workflow providing one of state or external inputs, not both")
         | 
| @@ -115,6 +116,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 115 116 |  | 
| 116 117 | 
             
                    self._active_nodes_by_execution_id: Dict[UUID, BaseNode[StateType]] = {}
         | 
| 117 118 | 
             
                    self._cancel_signal = cancel_signal
         | 
| 119 | 
            +
                    self._parent_context = parent_context
         | 
| 118 120 |  | 
| 119 121 | 
             
                    setattr(
         | 
| 120 122 | 
             
                        self._initial_state,
         | 
| @@ -143,6 +145,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 143 145 | 
             
                                    node_definition=node.__class__,
         | 
| 144 146 | 
             
                                    inputs=node._inputs,
         | 
| 145 147 | 
             
                                ),
         | 
| 148 | 
            +
                                parent=WorkflowParentContext(
         | 
| 149 | 
            +
                                    span_id=span_id,
         | 
| 150 | 
            +
                                    workflow_definition=self.workflow.__class__,
         | 
| 151 | 
            +
                                    parent=self._parent_context
         | 
| 152 | 
            +
                                )
         | 
| 146 153 | 
             
                            ),
         | 
| 147 154 | 
             
                        )
         | 
| 148 155 | 
             
                    )
         | 
| @@ -190,6 +197,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 190 197 | 
             
                                                output=BaseOutput(name=output.name),
         | 
| 191 198 | 
             
                                                invoked_ports=invoked_ports,
         | 
| 192 199 | 
             
                                            ),
         | 
| 200 | 
            +
                                            parent=WorkflowParentContext(
         | 
| 201 | 
            +
                                                span_id=span_id,
         | 
| 202 | 
            +
                                                workflow_definition=self.workflow.__class__,
         | 
| 203 | 
            +
                                                parent=self._parent_context
         | 
| 204 | 
            +
                                            )
         | 
| 193 205 | 
             
                                        ),
         | 
| 194 206 | 
             
                                    )
         | 
| 195 207 | 
             
                                )
         | 
| @@ -214,6 +226,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 214 226 | 
             
                                                    output=output,
         | 
| 215 227 | 
             
                                                    invoked_ports=invoked_ports,
         | 
| 216 228 | 
             
                                                ),
         | 
| 229 | 
            +
                                                parent=WorkflowParentContext(
         | 
| 230 | 
            +
                                                    span_id=span_id,
         | 
| 231 | 
            +
                                                    workflow_definition=self.workflow.__class__,
         | 
| 232 | 
            +
                                                    parent=self._parent_context,
         | 
| 233 | 
            +
                                                )
         | 
| 217 234 | 
             
                                            ),
         | 
| 218 235 | 
             
                                        )
         | 
| 219 236 | 
             
                                    )
         | 
| @@ -233,6 +250,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 233 250 | 
             
                                                    output=output,
         | 
| 234 251 | 
             
                                                    invoked_ports=invoked_ports,
         | 
| 235 252 | 
             
                                                ),
         | 
| 253 | 
            +
                                                parent=WorkflowParentContext(
         | 
| 254 | 
            +
                                                    span_id=span_id,
         | 
| 255 | 
            +
                                                    workflow_definition=self.workflow.__class__,
         | 
| 256 | 
            +
                                                    parent=self._parent_context,
         | 
| 257 | 
            +
                                                )
         | 
| 236 258 | 
             
                                            ),
         | 
| 237 259 | 
             
                                        )
         | 
| 238 260 | 
             
                                    )
         | 
| @@ -259,6 +281,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 259 281 | 
             
                                        outputs=outputs,
         | 
| 260 282 | 
             
                                        invoked_ports=invoked_ports,
         | 
| 261 283 | 
             
                                    ),
         | 
| 284 | 
            +
                                    parent=WorkflowParentContext(
         | 
| 285 | 
            +
                                        span_id=span_id,
         | 
| 286 | 
            +
                                        workflow_definition=self.workflow.__class__,
         | 
| 287 | 
            +
                                        parent=self._parent_context,
         | 
| 288 | 
            +
                                    )
         | 
| 262 289 | 
             
                                ),
         | 
| 263 290 | 
             
                            )
         | 
| 264 291 | 
             
                        )
         | 
| @@ -273,6 +300,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 273 300 | 
             
                                        node_definition=node.__class__,
         | 
| 274 301 | 
             
                                        error=e.error,
         | 
| 275 302 | 
             
                                    ),
         | 
| 303 | 
            +
                                    parent=WorkflowParentContext(
         | 
| 304 | 
            +
                                        span_id=span_id,
         | 
| 305 | 
            +
                                        workflow_definition=self.workflow.__class__,
         | 
| 306 | 
            +
                                        parent=self._parent_context,
         | 
| 307 | 
            +
                                    )
         | 
| 276 308 | 
             
                                ),
         | 
| 277 309 | 
             
                            )
         | 
| 278 310 | 
             
                        )
         | 
| @@ -292,6 +324,11 @@ class WorkflowRunner(Generic[StateType]): | |
| 292 324 | 
             
                                            code=VellumErrorCode.INTERNAL_ERROR,
         | 
| 293 325 | 
             
                                        ),
         | 
| 294 326 | 
             
                                    ),
         | 
| 327 | 
            +
                                    parent=WorkflowParentContext(
         | 
| 328 | 
            +
                                        span_id=span_id,
         | 
| 329 | 
            +
                                        workflow_definition=self.workflow.__class__,
         | 
| 330 | 
            +
                                        parent=self._parent_context
         | 
| 331 | 
            +
                                    )
         | 
| 295 332 | 
             
                                ),
         | 
| 296 333 | 
             
                            )
         | 
| 297 334 | 
             
                        )
         | 
| @@ -387,6 +424,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 387 424 | 
             
                            workflow_definition=self.workflow.__class__,
         | 
| 388 425 | 
             
                            inputs=self._initial_state.meta.workflow_inputs,
         | 
| 389 426 | 
             
                        ),
         | 
| 427 | 
            +
                        parent=self._parent_context,
         | 
| 390 428 | 
             
                    )
         | 
| 391 429 |  | 
| 392 430 | 
             
                def _stream_workflow_event(self, output: BaseOutput) -> WorkflowExecutionStreamingEvent:
         | 
| @@ -397,6 +435,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 397 435 | 
             
                            workflow_definition=self.workflow.__class__,
         | 
| 398 436 | 
             
                            output=output,
         | 
| 399 437 | 
             
                        ),
         | 
| 438 | 
            +
                        parent=self._parent_context
         | 
| 400 439 | 
             
                    )
         | 
| 401 440 |  | 
| 402 441 | 
             
                def _fulfill_workflow_event(self, outputs: OutputsType) -> WorkflowExecutionFulfilledEvent:
         | 
| @@ -407,6 +446,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 407 446 | 
             
                            workflow_definition=self.workflow.__class__,
         | 
| 408 447 | 
             
                            outputs=outputs,
         | 
| 409 448 | 
             
                        ),
         | 
| 449 | 
            +
                        parent=self._parent_context,
         | 
| 410 450 | 
             
                    )
         | 
| 411 451 |  | 
| 412 452 | 
             
                def _reject_workflow_event(self, error: VellumError) -> WorkflowExecutionRejectedEvent:
         | 
| @@ -417,6 +457,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 417 457 | 
             
                            workflow_definition=self.workflow.__class__,
         | 
| 418 458 | 
             
                            error=error,
         | 
| 419 459 | 
             
                        ),
         | 
| 460 | 
            +
                        parent=self._parent_context,
         | 
| 420 461 | 
             
                    )
         | 
| 421 462 |  | 
| 422 463 | 
             
                def _resume_workflow_event(self) -> WorkflowExecutionResumedEvent:
         | 
| @@ -436,6 +477,7 @@ class WorkflowRunner(Generic[StateType]): | |
| 436 477 | 
             
                            workflow_definition=self.workflow.__class__,
         | 
| 437 478 | 
             
                            external_inputs=external_inputs,
         | 
| 438 479 | 
             
                        ),
         | 
| 480 | 
            +
                        parent=self._parent_context,
         | 
| 439 481 | 
             
                    )
         | 
| 440 482 |  | 
| 441 483 | 
             
                def _stream(self) -> None:
         | 
| @@ -1,21 +1,21 @@ | |
| 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=E2_T4MuUkfobYqla03ci2tRWQ7ZsaZA6wU340OCWRJ4,2788
         | 
| 4 4 | 
             
            vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
         | 
| 5 5 | 
             
            vellum_cli/config.py,sha256=urqMGQUkTntzdx-JV0P32FZVbqRZqgI-yFVmGPVblNI,3613
         | 
| 6 6 | 
             
            vellum_cli/image_push.py,sha256=lCQhkQu-IlIMHNSynmEl5KUzO_dHW27NTAFWnyvPpcs,4419
         | 
| 7 7 | 
             
            vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
         | 
| 8 | 
            -
            vellum_cli/pull.py,sha256= | 
| 8 | 
            +
            vellum_cli/pull.py,sha256=UApkIEq5BVq8Si_ZePyv5MMFUAspFetpec5Ix88WFOQ,3866
         | 
| 9 9 | 
             
            vellum_cli/push.py,sha256=HhXHqLvWKf3CUZJ3yIm-KeoBkgk73EXqVtGgWYcBcVk,5089
         | 
| 10 10 | 
             
            vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
         | 
| 11 | 
            -
            vellum_cli/tests/test_pull.py,sha256= | 
| 11 | 
            +
            vellum_cli/tests/test_pull.py,sha256=gIkbpd4l_yUmIoW8k3wrTpp6h7OFbB0KXdijIjAgffU,7416
         | 
| 12 12 | 
             
            vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 13 13 | 
             
            vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 14 14 | 
             
            vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 15 15 | 
             
            vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 16 16 | 
             
            vellum_ee/workflows/display/base.py,sha256=yYH86aTPfOy7Zbzj9YBzU-yLUX3GBHVNxKqJFy7_wxk,1797
         | 
| 17 17 | 
             
            vellum_ee/workflows/display/nodes/__init__.py,sha256=5XOcZJXYUgaLS55QgRJzyQ_W1tpeprjnYAeYVezqoGw,160
         | 
| 18 | 
            -
            vellum_ee/workflows/display/nodes/base_node_display.py,sha256= | 
| 18 | 
            +
            vellum_ee/workflows/display/nodes/base_node_display.py,sha256=gmGGOXHydc158aS55JOHZtYvta6jj4ZCuue-9n8KvFY,5942
         | 
| 19 19 | 
             
            vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=a62tpKcX0LdyZM2clwoGwpUfH3HMBbX1qiA0FFb_nk4,1649
         | 
| 20 20 | 
             
            vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=A036wKuBjhtBGJKdkQSq4v1Rcm0cXHropJxKPuGWAsk,907
         | 
| 21 21 | 
             
            vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| @@ -24,7 +24,7 @@ vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6m | |
| 24 24 | 
             
            vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
         | 
| 25 25 | 
             
            vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=jQgm0dsQAlxZ0tYR_cv5pX-6wHMPQfFwmhI3DQ29S9Y,1432
         | 
| 26 26 | 
             
            vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=awjKut2m7HoEmqewRfdR1dw8ufA0Q5mVG8V8jhaHlKw,8572
         | 
| 27 | 
            -
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256= | 
| 27 | 
            +
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=MASV7u0X4eiS3SzRWeBcbWZ_YgNlwwg5cM2vaFWjpqk,3915
         | 
| 28 28 | 
             
            vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=v9g263oEtyL6ejp5ZfLrVfrcqU9gZwzuUI4yBuOScbI,12983
         | 
| 29 29 | 
             
            vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=2HsghUtPBOQ-4sN-2jDOnbEuIwcsilDKO3f2o1WlYgw,2897
         | 
| 30 30 | 
             
            vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=lr4d2uV3Lq8d22b5LCKbWMz_nU7Q0fvffcNQ7zx5Ygc,2163
         | 
| @@ -71,7 +71,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749 | |
| 71 71 | 
             
            vellum/client/__init__.py,sha256=o4m7iRZWEV8rP3GkdaztHAjNmjxjWERlarviFoHzuKI,110927
         | 
| 72 72 | 
             
            vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
         | 
| 73 73 | 
             
            vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
         | 
| 74 | 
            -
            vellum/client/core/client_wrapper.py,sha256 | 
| 74 | 
            +
            vellum/client/core/client_wrapper.py,sha256=-M3uhAr1iTDcPBsJsI4SD1DfT1LMZ1qdWYe2eEbN-N4,1890
         | 
| 75 75 | 
             
            vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
         | 
| 76 76 | 
             
            vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
         | 
| 77 77 | 
             
            vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
         | 
| @@ -1194,7 +1194,7 @@ vellum/workflows/events/__init__.py,sha256=vLwQuykMmbv0izdUvsamouRQKbmKX_r9Poo77 | |
| 1194 1194 | 
             
            vellum/workflows/events/node.py,sha256=YQVWrE8LD5IxRTz_e0-0bXMhk3RZ75ZKTvAJZqH8dP0,5270
         | 
| 1195 1195 | 
             
            vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1196 1196 | 
             
            vellum/workflows/events/tests/test_event.py,sha256=BbAeTohMdfAdpBea9fbi5nDXX6UQ7xASMv9jNuwOmDU,12704
         | 
| 1197 | 
            -
            vellum/workflows/events/types.py,sha256= | 
| 1197 | 
            +
            vellum/workflows/events/types.py,sha256=9apSwzmjVtuSDxEP2NhF8HbGGOP2BkMaqnOy__YH-oY,2863
         | 
| 1198 1198 | 
             
            vellum/workflows/events/utils.py,sha256=OwtE8dHOCX01jvLyoS1l18tYQ4ob0YJcUhUorKWLJh0,232
         | 
| 1199 1199 | 
             
            vellum/workflows/events/workflow.py,sha256=kPjZTh5hzCsSrVKLkXQNwzxhnUp3X4GkFA5veGatGlQ,4353
         | 
| 1200 1200 | 
             
            vellum/workflows/exceptions.py,sha256=Dc7mxstsaMDRmS91QEOiZCbZ1ZIRacnm0l5lQmC6WkA,401
         | 
| @@ -1243,7 +1243,7 @@ vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT | |
| 1243 1243 | 
             
            vellum/workflows/nodes/core/error_node/__init__.py,sha256=g7RRnlHhqu4qByfLjBwCunmgGA8dI5gNsjS3h6TwlSI,60
         | 
| 1244 1244 | 
             
            vellum/workflows/nodes/core/error_node/node.py,sha256=hqBPHoLnhNrK9ITIaEzpnk47XYDbG6cmObz7oe78Ceg,944
         | 
| 1245 1245 | 
             
            vellum/workflows/nodes/core/inline_subworkflow_node/__init__.py,sha256=nKNEH1QTl-1PcvmYoqSWEl0-t6gAur8GLTXHzklRQfM,84
         | 
| 1246 | 
            -
            vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256= | 
| 1246 | 
            +
            vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=mWugLOYnVmji-dSf8Rfizs_XKKfKWSskMbn6TRMDbaY,3063
         | 
| 1247 1247 | 
             
            vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
         | 
| 1248 1248 | 
             
            vellum/workflows/nodes/core/map_node/node.py,sha256=aPhV3niv_jWSwrZ2CwiRg0CDOM-09Fa6QqOPYNJMgRc,6206
         | 
| 1249 1249 | 
             
            vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| @@ -1255,7 +1255,7 @@ vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=zANiu9-d-uIOP9t | |
| 1255 1255 | 
             
            vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
         | 
| 1256 1256 | 
             
            vellum/workflows/nodes/core/templating_node/custom_filters.py,sha256=Q0DahYRHP4KfaUXDt9XxN-DFLBrAxlv90yaVqxScoUw,264
         | 
| 1257 1257 | 
             
            vellum/workflows/nodes/core/templating_node/exceptions.py,sha256=cDp140PP4OnInW4qAvg3KqiSiF70C71UyEAKRBR1Abo,46
         | 
| 1258 | 
            -
            vellum/workflows/nodes/core/templating_node/node.py,sha256= | 
| 1258 | 
            +
            vellum/workflows/nodes/core/templating_node/node.py,sha256=uxdOk_vyb5ONoOWG4xMDo3_eAZS_JxnZi-cMlq2Fc4k,4499
         | 
| 1259 1259 | 
             
            vellum/workflows/nodes/core/templating_node/render.py,sha256=OpJp0NAH6qcEL6K9lxR0qjpFb75TYNttJR5iCos8tmg,1792
         | 
| 1260 1260 | 
             
            vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=L6F3Gw9doguj1TSKmAns-mzXvoRuRivaCFe3mhjo13E,551
         | 
| 1261 1261 | 
             
            vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
         | 
| @@ -1264,7 +1264,7 @@ vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW | |
| 1264 1264 | 
             
            vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=u06GmVGln5lg-65YYFAmjlKwxuXbP8bKA8Qf_Zbq7ak,3764
         | 
| 1265 1265 | 
             
            vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
         | 
| 1266 1266 | 
             
            vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
         | 
| 1267 | 
            -
            vellum/workflows/nodes/displayable/api_node/node.py,sha256 | 
| 1267 | 
            +
            vellum/workflows/nodes/displayable/api_node/node.py,sha256=mnoncJtxo5YhuFCR3_axpvCqrGQKLShvfU6xJO7Fa8I,2047
         | 
| 1268 1268 | 
             
            vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
         | 
| 1269 1269 | 
             
            vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
         | 
| 1270 1270 | 
             
            vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=YQNoO5xgjd44EzOTe0EVAxWgMLoaWGx_68fxgoEBqto,2487
         | 
| @@ -1273,15 +1273,15 @@ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=et_cMMc | |
| 1273 1273 | 
             
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
         | 
| 1274 1274 | 
             
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
         | 
| 1275 1275 | 
             
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=vbl6LRCrmlxFURcFGFMAEBJjgNGPB5q9AnQ8UITxYuI,4869
         | 
| 1276 | 
            -
            vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256= | 
| 1276 | 
            +
            vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=KsKU9SNgjd1feiylSNS33DE0jKsJbYsaepF5wpCUzRU,4440
         | 
| 1277 1277 | 
             
            vellum/workflows/nodes/displayable/bases/search_node.py,sha256=z8IQg-J46AbRMgFi92M08A220Wf7gU0xE3634ii3T1E,3565
         | 
| 1278 1278 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
         | 
| 1279 | 
            -
            vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256= | 
| 1279 | 
            +
            vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=zK-gxWmox8QZ84J11faUmasRozNKDIBv_86Gjq8uj7M,7975
         | 
| 1280 1280 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1281 1281 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1282 1282 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
         | 
| 1283 1283 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=pvkvMOIL94vDP3KUrQh0OF1lELjEFJ6HIDEz5kUqbzo,3377
         | 
| 1284 | 
            -
            vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256= | 
| 1284 | 
            +
            vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=JAoa0AUIDUHKuNVlsxlTD0RT5rX9K_7GAEACGz4XJas,613
         | 
| 1285 1285 | 
             
            vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
         | 
| 1286 1286 | 
             
            vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=SWfsEQ7G_y3yEnxzMhjtjHF4xZvFdFTds77LrFZHGUU,1020
         | 
| 1287 1287 | 
             
            vellum/workflows/nodes/displayable/final_output_node/__init__.py,sha256=G7VXM4OWpubvSJtVkGmMNeqgb9GkM7qZT838eL18XU4,72
         | 
| @@ -1289,21 +1289,21 @@ vellum/workflows/nodes/displayable/final_output_node/node.py,sha256=iH3ZPOstPku_ | |
| 1289 1289 | 
             
            vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
         | 
| 1290 1290 | 
             
            vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=vctOgn1gUYGIClknGciUjmDRFKlcEbIRZYvzgBaMiVo,3918
         | 
| 1291 1291 | 
             
            vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
         | 
| 1292 | 
            -
            vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256= | 
| 1292 | 
            +
            vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=M4pUl2RO0a_094oCrtCmgo0rr_wKT_F3KN4y1eDFm4Y,2112
         | 
| 1293 1293 | 
             
            vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
         | 
| 1294 1294 | 
             
            vellum/workflows/nodes/displayable/merge_node/node.py,sha256=ZyPvcTgfPOneOm5Dc2kUOoPkwNJqwRPZSj232akXynA,324
         | 
| 1295 1295 | 
             
            vellum/workflows/nodes/displayable/note_node/__init__.py,sha256=KWA3P4fyYJ-fOTky8qNGlcOotQ-HeHJ9AjZt6mRQmCE,58
         | 
| 1296 1296 | 
             
            vellum/workflows/nodes/displayable/note_node/node.py,sha256=8rwP7RS1OOyQJ-ZuZBXTCtT2ZW8J6eGD59iKmq_pB24,258
         | 
| 1297 1297 | 
             
            vellum/workflows/nodes/displayable/prompt_deployment_node/__init__.py,sha256=krX1Hds-TSVYZsx0wJFX4wsAKkEFYOX1ifwRGiIM-EA,82
         | 
| 1298 | 
            -
            vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256= | 
| 1298 | 
            +
            vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=1GzSTUFiqjly7Uz-xSsEI5a4NZNv8ZEI_1C2oYwQKEg,2513
         | 
| 1299 1299 | 
             
            vellum/workflows/nodes/displayable/search_node/__init__.py,sha256=hpBpvbrDYf43DElRZFLzieSn8weXiwNiiNOJurERQbs,62
         | 
| 1300 1300 | 
             
            vellum/workflows/nodes/displayable/search_node/node.py,sha256=k7_S5yWFGZrIV1R5BsFIFSkOvmnbJK39pNmZD8XLCX4,1310
         | 
| 1301 1301 | 
             
            vellum/workflows/nodes/displayable/subworkflow_deployment_node/__init__.py,sha256=9yYM6001YZeqI1VOk1QuEM_yrffk_EdsO7qaPzINKds,92
         | 
| 1302 | 
            -
            vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256= | 
| 1302 | 
            +
            vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=JcMRX0dFYj3OETzkB7u3J6VFfRftYygHlFvrY266GYc,6776
         | 
| 1303 1303 | 
             
            vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1304 1304 | 
             
            vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=UwNCIrq2gDpObcosrpiIHFdHZLWarmlS7ez8GanIBDc,4649
         | 
| 1305 1305 | 
             
            vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=AZtodUoX_Fl_ZXDinutAxlsDsfcxEYS0nFL0mcBylW8,6955
         | 
| 1306 | 
            -
            vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256= | 
| 1306 | 
            +
            vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=t4ctc6MCwtvOOV4MG-xm-1w1A-ik0--_1es6yJ1qklU,2510
         | 
| 1307 1307 | 
             
            vellum/workflows/nodes/utils.py,sha256=zY0b5WjJtGwVPPLY3ffHUdRREPvyoNwmJDigz5jQRAI,812
         | 
| 1308 1308 | 
             
            vellum/workflows/outputs/__init__.py,sha256=AyZ4pRh_ACQIGvkf0byJO46EDnSix1ZCAXfvh-ms1QE,94
         | 
| 1309 1309 | 
             
            vellum/workflows/outputs/base.py,sha256=aOll71CH_g1RaVO1wl038BqpWH70cD3XXSRxzH0YoRA,8002
         | 
| @@ -1325,7 +1325,7 @@ vellum/workflows/references/workflow_input.py,sha256=epspVRZ9n_nxoTxI5Am3GDd2fpU | |
| 1325 1325 | 
             
            vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
         | 
| 1326 1326 | 
             
            vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
         | 
| 1327 1327 | 
             
            vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
         | 
| 1328 | 
            -
            vellum/workflows/runner/runner.py,sha256= | 
| 1328 | 
            +
            vellum/workflows/runner/runner.py,sha256=zqVjt4r7BuMou5oVFUglMPGshmQitUPfASBvATsfxGk,26770
         | 
| 1329 1329 | 
             
            vellum/workflows/runner/types.py,sha256=UQIGqOuCDgxEQpoJr4ut3wAnAjp4scDWhNhEhYFyLrw,466
         | 
| 1330 1330 | 
             
            vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
         | 
| 1331 1331 | 
             
            vellum/workflows/state/base.py,sha256=gm4pun9BzYaZbW8I1j7EriUIlAzqQkKT3IBbXPh3FkA,12663
         | 
| @@ -1334,7 +1334,7 @@ vellum/workflows/state/encoder.py,sha256=kRrqwD0vFCiSRZR3rg8Sjkh8sDEerQQhlvmdSYQ | |
| 1334 1334 | 
             
            vellum/workflows/state/store.py,sha256=VYGBQgN1bpd1as5eGiouV_7scg8QsRs4_1aqZAGIsRQ,793
         | 
| 1335 1335 | 
             
            vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1336 1336 | 
             
            vellum/workflows/state/tests/test_state.py,sha256=BQjcdREIK1MPuGhivRUgpynVJLftjEpH9RG3cRKxQEY,3310
         | 
| 1337 | 
            -
            vellum/workflows/types/__init__.py,sha256= | 
| 1337 | 
            +
            vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
         | 
| 1338 1338 | 
             
            vellum/workflows/types/core.py,sha256=llsHFE3XKnVEk_pYoK0s9WUdeninSU5Kmoi7dU4GX0c,1804
         | 
| 1339 1339 | 
             
            vellum/workflows/types/generics.py,sha256=ZkfoRhWs042i5IjA99v2wIhmh1u-Wieo3LzosgGWJVk,600
         | 
| 1340 1340 | 
             
            vellum/workflows/types/stack.py,sha256=RDSGLkcV612ge8UuAH9TZiEGXxJt0Av2-H5rfzrTVVI,1014
         | 
| @@ -1350,8 +1350,8 @@ vellum/workflows/utils/vellum_variables.py,sha256=wbYejKwjy23ITDRfdGW4d181buvCbZ | |
| 1350 1350 | 
             
            vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
         | 
| 1351 1351 | 
             
            vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
         | 
| 1352 1352 | 
             
            vellum/workflows/workflows/base.py,sha256=QxIm0zCic8P-y0NNLdqgC1YKTu-3TmMJ-wH1nUylguA,13689
         | 
| 1353 | 
            -
            vellum_ai-0.10. | 
| 1354 | 
            -
            vellum_ai-0.10. | 
| 1355 | 
            -
            vellum_ai-0.10. | 
| 1356 | 
            -
            vellum_ai-0.10. | 
| 1357 | 
            -
            vellum_ai-0.10. | 
| 1353 | 
            +
            vellum_ai-0.10.8.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
         | 
| 1354 | 
            +
            vellum_ai-0.10.8.dist-info/METADATA,sha256=n5dQCMNsh-FaCOh5YMeDVzfusigZuus_UEjWSmFnK2Q,5128
         | 
| 1355 | 
            +
            vellum_ai-0.10.8.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
         | 
| 1356 | 
            +
            vellum_ai-0.10.8.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
         | 
| 1357 | 
            +
            vellum_ai-0.10.8.dist-info/RECORD,,
         | 
    
        vellum_cli/__init__.py
    CHANGED
    
    | @@ -42,11 +42,30 @@ def push( | |
| 42 42 |  | 
| 43 43 | 
             
            @main.command()
         | 
| 44 44 | 
             
            @click.argument("module", required=False)
         | 
| 45 | 
            -
            @click.option( | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 45 | 
            +
            @click.option(
         | 
| 46 | 
            +
                "--include-json",
         | 
| 47 | 
            +
                is_flag=True,
         | 
| 48 | 
            +
                help="Include the JSON representation of the Workflow in the pull response. Should only be used for debugging purposes.",
         | 
| 49 | 
            +
            )
         | 
| 50 | 
            +
            @click.option("--workflow-sandbox-id", type=str, help="Pull the Workflow from a specific Sandbox ID")
         | 
| 51 | 
            +
            @click.option(
         | 
| 52 | 
            +
                "--exclude-code",
         | 
| 53 | 
            +
                is_flag=True,
         | 
| 54 | 
            +
                help="Exclude the code definition of the Workflow from the pull response. Should only be used for debugging purposes.",
         | 
| 55 | 
            +
            )
         | 
| 56 | 
            +
            def pull(
         | 
| 57 | 
            +
                module: Optional[str],
         | 
| 58 | 
            +
                include_json: Optional[bool],
         | 
| 59 | 
            +
                workflow_sandbox_id: Optional[str],
         | 
| 60 | 
            +
                exclude_code: Optional[bool],
         | 
| 61 | 
            +
            ) -> None:
         | 
| 48 62 | 
             
                """Pull Workflow from Vellum"""
         | 
| 49 | 
            -
                pull_command( | 
| 63 | 
            +
                pull_command(
         | 
| 64 | 
            +
                    module=module,
         | 
| 65 | 
            +
                    include_json=include_json,
         | 
| 66 | 
            +
                    workflow_sandbox_id=workflow_sandbox_id,
         | 
| 67 | 
            +
                    exclude_code=exclude_code,
         | 
| 68 | 
            +
                )
         | 
| 50 69 |  | 
| 51 70 |  | 
| 52 71 | 
             
            @main.group(aliases=["images", "image"])
         | 
    
        vellum_cli/pull.py
    CHANGED
    
    | @@ -7,28 +7,38 @@ from typing import Optional | |
| 7 7 | 
             
            from dotenv import load_dotenv
         | 
| 8 8 |  | 
| 9 9 | 
             
            from vellum.workflows.vellum_client import create_vellum_client
         | 
| 10 | 
            -
            from vellum_cli.config import load_vellum_cli_config
         | 
| 10 | 
            +
            from vellum_cli.config import WorkflowConfig, load_vellum_cli_config
         | 
| 11 11 | 
             
            from vellum_cli.logger import load_cli_logger
         | 
| 12 12 |  | 
| 13 13 |  | 
| 14 14 | 
             
            def pull_command(
         | 
| 15 | 
            -
                module: Optional[str] | 
| 15 | 
            +
                module: Optional[str] = None,
         | 
| 16 | 
            +
                workflow_sandbox_id: Optional[str] = None,
         | 
| 17 | 
            +
                include_json: Optional[bool] = None,
         | 
| 18 | 
            +
                exclude_code: Optional[bool] = None,
         | 
| 16 19 | 
             
            ) -> None:
         | 
| 17 20 | 
             
                load_dotenv()
         | 
| 18 21 | 
             
                logger = load_cli_logger()
         | 
| 19 22 | 
             
                config = load_vellum_cli_config()
         | 
| 20 23 |  | 
| 21 | 
            -
                if not config.workflows:
         | 
| 22 | 
            -
                    raise ValueError("No Workflows found in project to pull.")
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                if len(config.workflows) > 1 and not module:
         | 
| 25 | 
            -
                    raise ValueError("Multiple workflows found in project to pull. Pulling only a single workflow is supported.")
         | 
| 26 | 
            -
             | 
| 27 24 | 
             
                workflow_config = (
         | 
| 28 | 
            -
                    next((w for w in config.workflows if w.module == module), None) | 
| 25 | 
            +
                    next((w for w in config.workflows if w.module == module), None)
         | 
| 26 | 
            +
                    if module
         | 
| 27 | 
            +
                    else (config.workflows[0] if config.workflows else None)
         | 
| 29 28 | 
             
                )
         | 
| 29 | 
            +
                save_lock_file = False
         | 
| 30 30 | 
             
                if workflow_config is None:
         | 
| 31 | 
            -
                     | 
| 31 | 
            +
                    if module:
         | 
| 32 | 
            +
                        raise ValueError(f"No workflow config for '{module}' found in project to pull.")
         | 
| 33 | 
            +
                    elif workflow_sandbox_id:
         | 
| 34 | 
            +
                        workflow_config = WorkflowConfig(
         | 
| 35 | 
            +
                            workflow_sandbox_id=workflow_sandbox_id,
         | 
| 36 | 
            +
                            module=f"workflow_{workflow_sandbox_id.split('-')[0]}",
         | 
| 37 | 
            +
                        )
         | 
| 38 | 
            +
                        config.workflows.append(workflow_config)
         | 
| 39 | 
            +
                        save_lock_file = True
         | 
| 40 | 
            +
                    else:
         | 
| 41 | 
            +
                        raise ValueError("No workflow config found in project to pull from.")
         | 
| 32 42 |  | 
| 33 43 | 
             
                if not workflow_config.workflow_sandbox_id:
         | 
| 34 44 | 
             
                    raise ValueError("No workflow sandbox ID found in project to pull from.")
         | 
| @@ -36,10 +46,10 @@ def pull_command( | |
| 36 46 | 
             
                logger.info(f"Pulling workflow into {workflow_config.module}")
         | 
| 37 47 | 
             
                client = create_vellum_client()
         | 
| 38 48 | 
             
                query_parameters = {}
         | 
| 39 | 
            -
                if legacy_module:
         | 
| 40 | 
            -
                    query_parameters["legacyModule"] = legacy_module
         | 
| 41 49 | 
             
                if include_json:
         | 
| 42 50 | 
             
                    query_parameters["include_json"] = include_json
         | 
| 51 | 
            +
                if exclude_code:
         | 
| 52 | 
            +
                    query_parameters["exclude_code"] = exclude_code
         | 
| 43 53 |  | 
| 44 54 | 
             
                response = client.workflows.pull(
         | 
| 45 55 | 
             
                    workflow_config.workflow_sandbox_id,
         | 
| @@ -81,6 +91,11 @@ def pull_command( | |
| 81 91 | 
             
                            target.write(source.read().decode("utf-8"))
         | 
| 82 92 |  | 
| 83 93 | 
             
                if include_json:
         | 
| 84 | 
            -
                    logger.warning( | 
| 94 | 
            +
                    logger.warning(
         | 
| 95 | 
            +
                        "The pulled JSON representation of the Workflow should be used for debugging purposely only. Its schema should be considered unstable and subject to change at any time."
         | 
| 96 | 
            +
                    )
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                if save_lock_file:
         | 
| 99 | 
            +
                    config.save()
         | 
| 85 100 |  | 
| 86 101 | 
             
                logger.info(f"Successfully pulled Workflow into {workflow_config.module}")
         | 
    
        vellum_cli/tests/test_pull.py
    CHANGED
    
    | @@ -69,8 +69,33 @@ def test_pull(vellum_client, mock_module): | |
| 69 69 | 
             
                pull_command(module)
         | 
| 70 70 |  | 
| 71 71 | 
             
                # THEN the workflow.py file is written to the module directory
         | 
| 72 | 
            -
                 | 
| 73 | 
            -
                 | 
| 72 | 
            +
                workflow_py = os.path.join(temp_dir, *module.split("."), "workflow.py")
         | 
| 73 | 
            +
                assert os.path.exists(workflow_py)
         | 
| 74 | 
            +
                with open(workflow_py) as f:
         | 
| 75 | 
            +
                    assert f.read() == "print('hello')"
         | 
| 76 | 
            +
             | 
| 77 | 
            +
             | 
| 78 | 
            +
            def test_pull__sandbox_id_with_no_config(vellum_client):
         | 
| 79 | 
            +
                # GIVEN a workflow sandbox id
         | 
| 80 | 
            +
                workflow_sandbox_id = "87654321-0000-0000-0000-000000000000"
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                # AND the workflow pull API call returns a zip file
         | 
| 83 | 
            +
                vellum_client.workflows.pull.return_value = iter([zip_file_map({"workflow.py": "print('hello')"})])
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                # AND we are currently in a new directory
         | 
| 86 | 
            +
                current_dir = os.getcwd()
         | 
| 87 | 
            +
                temp_dir = tempfile.mkdtemp()
         | 
| 88 | 
            +
                os.chdir(temp_dir)
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                # WHEN the user runs the pull command with the workflow sandbox id and no module
         | 
| 91 | 
            +
                pull_command(workflow_sandbox_id=workflow_sandbox_id)
         | 
| 92 | 
            +
                os.chdir(current_dir)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                # THEN the pull api is called with exclude_code=True
         | 
| 95 | 
            +
                vellum_client.workflows.pull.assert_called_once()
         | 
| 96 | 
            +
                workflow_py = os.path.join(temp_dir, "workflow_87654321", "workflow.py")
         | 
| 97 | 
            +
                assert os.path.exists(workflow_py)
         | 
| 98 | 
            +
                with open(workflow_py) as f:
         | 
| 74 99 | 
             
                    assert f.read() == "print('hello')"
         | 
| 75 100 |  | 
| 76 101 |  | 
| @@ -168,3 +193,21 @@ def test_pull__include_json(vellum_client, mock_module): | |
| 168 193 | 
             
                vellum_client.workflows.pull.assert_called_once()
         | 
| 169 194 | 
             
                call_args = vellum_client.workflows.pull.call_args.kwargs
         | 
| 170 195 | 
             
                assert call_args["request_options"]["additional_query_parameters"] == {"include_json": True}
         | 
| 196 | 
            +
             | 
| 197 | 
            +
             | 
| 198 | 
            +
            def test_pull__exclude_code(vellum_client, mock_module):
         | 
| 199 | 
            +
                # GIVEN a module on the user's filesystem
         | 
| 200 | 
            +
                _, module = mock_module
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                # AND the workflow pull API call returns a zip file
         | 
| 203 | 
            +
                vellum_client.workflows.pull.return_value = iter(
         | 
| 204 | 
            +
                    [zip_file_map({"workflow.py": "print('hello')", "workflow.json": "{}"})]
         | 
| 205 | 
            +
                )
         | 
| 206 | 
            +
             | 
| 207 | 
            +
                # WHEN the user runs the pull command
         | 
| 208 | 
            +
                pull_command(module, exclude_code=True)
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                # THEN the pull api is called with exclude_code=True
         | 
| 211 | 
            +
                vellum_client.workflows.pull.assert_called_once()
         | 
| 212 | 
            +
                call_args = vellum_client.workflows.pull.call_args.kwargs
         | 
| 213 | 
            +
                assert call_args["request_options"]["additional_query_parameters"] == {"exclude_code": True}
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            from functools import cached_property
         | 
| 2 2 | 
             
            import inspect
         | 
| 3 3 | 
             
            from uuid import UUID
         | 
| 4 | 
            -
            from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar, get_args, get_origin | 
| 4 | 
            +
            from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar, cast, get_args, get_origin
         | 
| 5 5 |  | 
| 6 6 | 
             
            from vellum.workflows.nodes.bases.base import BaseNode
         | 
| 7 7 | 
             
            from vellum.workflows.nodes.utils import get_wrapped_node, has_wrapped_node
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            from uuid import UUID
         | 
| 2 | 
            -
            from typing import ClassVar, Generic, Optional, TypeVar
         | 
| 2 | 
            +
            from typing import ClassVar, Dict, Generic, Optional, TypeVar
         | 
| 3 3 |  | 
| 4 4 | 
             
            from vellum.workflows.nodes.displayable.code_execution_node import CodeExecutionNode
         | 
| 5 5 | 
             
            from vellum.workflows.nodes.displayable.code_execution_node.utils import read_file_from_path
         | 
| @@ -20,6 +20,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType] | |
| 20 20 | 
             
                output_id: ClassVar[Optional[UUID]] = None
         | 
| 21 21 | 
             
                log_output_id: ClassVar[Optional[UUID]] = None
         | 
| 22 22 |  | 
| 23 | 
            +
                node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
         | 
| 24 | 
            +
             | 
| 23 25 | 
             
                def serialize(
         | 
| 24 26 | 
             
                    self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
         | 
| 25 27 | 
             
                ) -> JsonObject:
         | 
| @@ -27,6 +29,19 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType] | |
| 27 29 | 
             
                    node_id = self.node_id
         | 
| 28 30 |  | 
| 29 31 | 
             
                    code = read_file_from_path(raise_if_descriptor(node.filepath))
         | 
| 32 | 
            +
                    code_inputs = raise_if_descriptor(node.code_inputs)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    inputs = [
         | 
| 35 | 
            +
                        create_node_input(
         | 
| 36 | 
            +
                            node_id=node_id,
         | 
| 37 | 
            +
                            input_name=variable_name,
         | 
| 38 | 
            +
                            value=variable_value,
         | 
| 39 | 
            +
                            display_context=display_context,
         | 
| 40 | 
            +
                            input_id=self.node_input_ids_by_name.get(variable_name),
         | 
| 41 | 
            +
                        )
         | 
| 42 | 
            +
                        for variable_name, variable_value in code_inputs.items()
         | 
| 43 | 
            +
                    ]
         | 
| 44 | 
            +
             | 
| 30 45 | 
             
                    code_node_input = create_node_input(
         | 
| 31 46 | 
             
                        node_id=node_id,
         | 
| 32 47 | 
             
                        input_name="code",
         | 
| @@ -41,7 +56,7 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType] | |
| 41 56 | 
             
                        display_context=display_context,
         | 
| 42 57 | 
             
                        input_id=self.runtime_input_id,
         | 
| 43 58 | 
             
                    )
         | 
| 44 | 
            -
                    inputs | 
| 59 | 
            +
                    inputs.extend([code_node_input, runtime_node_input])
         | 
| 45 60 |  | 
| 46 61 | 
             
                    packages = raise_if_descriptor(node.packages)
         | 
| 47 62 |  | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |