vellum-ai 0.14.39__py3-none-any.whl → 0.14.41__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/client/reference.md +138 -1
- vellum/client/resources/ad_hoc/client.py +311 -1
- vellum/client/resources/deployments/client.py +2 -2
- vellum/workflows/nodes/bases/tests/test_base_node.py +24 -0
- vellum/workflows/nodes/core/try_node/node.py +1 -2
- vellum/workflows/nodes/experimental/tool_calling_node/__init__.py +3 -0
- vellum/workflows/nodes/experimental/tool_calling_node/node.py +125 -0
- vellum/workflows/nodes/experimental/tool_calling_node/utils.py +128 -0
- vellum/workflows/nodes/utils.py +4 -2
- vellum/workflows/outputs/base.py +3 -2
- vellum/workflows/references/output.py +20 -0
- vellum/workflows/state/base.py +36 -14
- vellum/workflows/state/tests/test_state.py +5 -2
- vellum/workflows/types/stack.py +11 -0
- vellum/workflows/workflows/base.py +5 -0
- vellum/workflows/workflows/tests/test_base_workflow.py +96 -9
- {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/METADATA +1 -1
- {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/RECORD +84 -80
- vellum_cli/push.py +0 -2
- vellum_ee/workflows/display/base.py +14 -1
- vellum_ee/workflows/display/nodes/base_node_display.py +91 -19
- vellum_ee/workflows/display/nodes/get_node_display_class.py +9 -15
- vellum_ee/workflows/display/nodes/tests/test_base_node_display.py +54 -0
- vellum_ee/workflows/display/nodes/vellum/api_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +4 -4
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/error_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/final_output_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/guardrail_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 +2 -2
- vellum_ee/workflows/display/nodes/vellum/merge_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/note_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +2 -4
- vellum_ee/workflows/display/nodes/vellum/retry_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/search_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/templating_node.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +55 -3
- vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +4 -4
- vellum_ee/workflows/display/nodes/vellum/try_node.py +1 -2
- vellum_ee/workflows/display/nodes/vellum/utils.py +7 -1
- vellum_ee/workflows/display/tests/{test_vellum_workflow_display.py → test_base_workflow_display.py} +10 -22
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +4 -6
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +7 -16
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +2 -6
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +1 -2
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +3 -10
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +4 -5
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +2 -5
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +7 -5
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +1 -2
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +7 -5
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +1 -4
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +2 -5
- vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +2 -7
- vellum_ee/workflows/display/types.py +5 -4
- vellum_ee/workflows/display/utils/exceptions.py +7 -0
- vellum_ee/workflows/display/utils/registry.py +37 -0
- vellum_ee/workflows/display/utils/vellum.py +2 -1
- vellum_ee/workflows/display/workflows/base_workflow_display.py +277 -47
- vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py +34 -21
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +58 -20
- vellum_ee/workflows/display/workflows/vellum_workflow_display.py +4 -257
- vellum_ee/workflows/tests/local_workflow/display/workflow.py +2 -2
- vellum_ee/workflows/display/nodes/base_node_vellum_display.py +0 -40
- {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/LICENSE +0 -0
- {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/WHEEL +0 -0
- {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/entry_points.txt +0 -0
@@ -2,7 +2,11 @@ import pytest
|
|
2
2
|
from uuid import UUID
|
3
3
|
|
4
4
|
from vellum.workflows.nodes.bases import BaseNode
|
5
|
+
from vellum.workflows.ports.port import Port
|
6
|
+
from vellum.workflows.references.constant import ConstantValueReference
|
5
7
|
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
|
+
from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
|
9
|
+
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
6
10
|
|
7
11
|
|
8
12
|
@pytest.fixture
|
@@ -46,3 +50,53 @@ def test_get_id(node_info):
|
|
46
50
|
|
47
51
|
assert node_display().node_id == expected_id
|
48
52
|
assert node_display.infer_node_class().__id__ == expected_id
|
53
|
+
|
54
|
+
|
55
|
+
def test_serialize_condition__accessor_expression():
|
56
|
+
# GIVEN a node with an accessor expression in a Port
|
57
|
+
class MyNode(BaseNode):
|
58
|
+
class Ports(BaseNode.Ports):
|
59
|
+
foo = Port.on_if(ConstantValueReference({"hello": "world"})["hello"])
|
60
|
+
|
61
|
+
# WHEN we serialize the node
|
62
|
+
node_display_class = get_node_display_class(MyNode)
|
63
|
+
data = node_display_class().serialize(WorkflowDisplayContext())
|
64
|
+
|
65
|
+
# THEN the condition should be serialized correctly
|
66
|
+
assert data["ports"] == [
|
67
|
+
{
|
68
|
+
"id": "7de6ea94-7f6c-475e-8f38-ec8ac317fd19",
|
69
|
+
"name": "foo",
|
70
|
+
"type": "IF",
|
71
|
+
"expression": {
|
72
|
+
"type": "BINARY_EXPRESSION",
|
73
|
+
"lhs": {
|
74
|
+
"type": "CONSTANT_VALUE",
|
75
|
+
"value": {
|
76
|
+
"type": "JSON",
|
77
|
+
"value": {"hello": "world"},
|
78
|
+
},
|
79
|
+
},
|
80
|
+
"operator": "accessField",
|
81
|
+
"rhs": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "hello"}},
|
82
|
+
},
|
83
|
+
}
|
84
|
+
]
|
85
|
+
|
86
|
+
|
87
|
+
def test_serialize_display_data():
|
88
|
+
# GIVEN a node with an accessor expression in a Port
|
89
|
+
class MyNode(BaseNode):
|
90
|
+
"""I hope this works"""
|
91
|
+
|
92
|
+
pass
|
93
|
+
|
94
|
+
# WHEN we serialize the node
|
95
|
+
node_display_class = get_node_display_class(MyNode)
|
96
|
+
data = node_display_class().serialize(WorkflowDisplayContext())
|
97
|
+
|
98
|
+
# THEN the condition should be serialized correctly
|
99
|
+
assert data["display_data"] == {
|
100
|
+
"position": {"x": 0.0, "y": 0.0},
|
101
|
+
"comment": {"value": "I hope this works"},
|
102
|
+
}
|
@@ -4,7 +4,7 @@ from typing import Any, ClassVar, Dict, Generic, Optional, TypeVar, cast
|
|
4
4
|
from vellum.workflows.nodes.displayable import APINode
|
5
5
|
from vellum.workflows.references.output import OutputReference
|
6
6
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
7
|
-
from vellum_ee.workflows.display.nodes.
|
7
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
9
9
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
10
10
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -13,7 +13,7 @@ from vellum_ee.workflows.display.utils.vellum import WorkspaceSecretPointer
|
|
13
13
|
_APINodeType = TypeVar("_APINodeType", bound=APINode)
|
14
14
|
|
15
15
|
|
16
|
-
class BaseAPINodeDisplay(
|
16
|
+
class BaseAPINodeDisplay(BaseNodeDisplay[_APINodeType], Generic[_APINodeType]):
|
17
17
|
# A mapping between node input keys and their ids for inputs representing additional header keys
|
18
18
|
additional_header_key_input_ids: ClassVar[Optional[Dict[str, UUID]]] = None
|
19
19
|
|
@@ -10,10 +10,10 @@ from vellum.workflows.types.core import JsonArray, JsonObject
|
|
10
10
|
from vellum.workflows.types.utils import get_original_base
|
11
11
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
12
12
|
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
13
|
-
from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
|
14
13
|
from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
|
15
14
|
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
16
15
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
16
|
+
from vellum_ee.workflows.display.utils.registry import register_node_display_class
|
17
17
|
|
18
18
|
_BaseAdornmentNodeType = TypeVar("_BaseAdornmentNodeType", bound=BaseAdornmentNode)
|
19
19
|
|
@@ -31,7 +31,7 @@ def _recursively_replace_wrapped_node(node_class: Type[BaseNode], wrapped_node_d
|
|
31
31
|
# 1. The node display class' parameterized type
|
32
32
|
original_base_node_display = get_original_base(wrapped_node_display_class)
|
33
33
|
original_base_node_display.__args__ = (wrapped_node_class,)
|
34
|
-
|
34
|
+
register_node_display_class(node_class=wrapped_node_class, node_display_class=wrapped_node_display_class)
|
35
35
|
wrapped_node_display_class.__annotate_node__()
|
36
36
|
|
37
37
|
# 2. The node display class' output displays
|
@@ -71,7 +71,7 @@ def _recursively_replace_wrapped_node(node_class: Type[BaseNode], wrapped_node_d
|
|
71
71
|
)
|
72
72
|
|
73
73
|
|
74
|
-
class BaseAdornmentNodeDisplay(
|
74
|
+
class BaseAdornmentNodeDisplay(BaseNodeDisplay[_BaseAdornmentNodeType], Generic[_BaseAdornmentNodeType]):
|
75
75
|
__wrapped_node_display__: Optional[Type[BaseNodeDisplay]] = None
|
76
76
|
|
77
77
|
def serialize(
|
@@ -89,7 +89,7 @@ class BaseAdornmentNodeDisplay(BaseNodeVellumDisplay[_BaseAdornmentNodeType], Ge
|
|
89
89
|
"Unable to serialize standalone adornment nodes. Please use adornment nodes as a decorator."
|
90
90
|
)
|
91
91
|
|
92
|
-
wrapped_node_display_class = get_node_display_class(
|
92
|
+
wrapped_node_display_class = get_node_display_class(wrapped_node)
|
93
93
|
wrapped_node_display = wrapped_node_display_class()
|
94
94
|
additional_kwargs = get_additional_kwargs(wrapped_node_display.node_id) if get_additional_kwargs else {}
|
95
95
|
serialized_wrapped_node = wrapped_node_display.serialize(display_context, **kwargs, **additional_kwargs)
|
@@ -6,7 +6,7 @@ from vellum.workflows.nodes.displayable.code_execution_node import CodeExecution
|
|
6
6
|
from vellum.workflows.nodes.displayable.code_execution_node.utils import read_file_from_path
|
7
7
|
from vellum.workflows.types.core import JsonObject
|
8
8
|
from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
|
9
|
-
from vellum_ee.workflows.display.nodes.
|
9
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
10
10
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
11
11
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
12
12
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -14,7 +14,7 @@ from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
|
14
14
|
_CodeExecutionNodeType = TypeVar("_CodeExecutionNodeType", bound=CodeExecutionNode)
|
15
15
|
|
16
16
|
|
17
|
-
class BaseCodeExecutionNodeDisplay(
|
17
|
+
class BaseCodeExecutionNodeDisplay(BaseNodeDisplay[_CodeExecutionNodeType], Generic[_CodeExecutionNodeType]):
|
18
18
|
output_id: ClassVar[Optional[UUID]] = None
|
19
19
|
log_output_id: ClassVar[Optional[UUID]] = None
|
20
20
|
|
@@ -16,7 +16,7 @@ from vellum.workflows.expressions.or_ import OrExpression
|
|
16
16
|
from vellum.workflows.nodes.displayable import ConditionalNode
|
17
17
|
from vellum.workflows.types.core import ConditionType, JsonObject
|
18
18
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
19
|
-
from vellum_ee.workflows.display.nodes.
|
19
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
20
20
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
21
21
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
22
22
|
from vellum_ee.workflows.display.utils.vellum import convert_descriptor_to_operator
|
@@ -40,7 +40,7 @@ class ConditionId:
|
|
40
40
|
rule_group_id: Optional[str]
|
41
41
|
|
42
42
|
|
43
|
-
class BaseConditionalNodeDisplay(
|
43
|
+
class BaseConditionalNodeDisplay(BaseNodeDisplay[_ConditionalNodeType], Generic[_ConditionalNodeType]):
|
44
44
|
source_handle_ids: ClassVar[Dict[int, UUID]]
|
45
45
|
rule_ids: ClassVar[List[RuleIdMap]]
|
46
46
|
condition_ids: ClassVar[list[ConditionId]]
|
@@ -3,7 +3,7 @@ from typing import ClassVar, Generic, Optional, TypeVar
|
|
3
3
|
|
4
4
|
from vellum.workflows.nodes import ErrorNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
|
-
from vellum_ee.workflows.display.nodes.
|
6
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
7
7
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
8
8
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
9
9
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -11,7 +11,7 @@ from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
|
11
11
|
_ErrorNodeType = TypeVar("_ErrorNodeType", bound=ErrorNode)
|
12
12
|
|
13
13
|
|
14
|
-
class BaseErrorNodeDisplay(
|
14
|
+
class BaseErrorNodeDisplay(BaseNodeDisplay[_ErrorNodeType], Generic[_ErrorNodeType]):
|
15
15
|
error_output_id: ClassVar[Optional[UUID]] = None
|
16
16
|
|
17
17
|
name: ClassVar[str] = "error-node"
|
@@ -4,7 +4,7 @@ from typing import Any, ClassVar, Generic, Optional, TypeVar
|
|
4
4
|
from vellum.workflows.nodes.displayable.final_output_node import FinalOutputNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
6
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
7
|
-
from vellum_ee.workflows.display.nodes.
|
7
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.nodes.utils import to_kebab_case
|
9
9
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
10
10
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -13,7 +13,7 @@ from vellum_ee.workflows.display.utils.vellum import infer_vellum_variable_type
|
|
13
13
|
_FinalOutputNodeType = TypeVar("_FinalOutputNodeType", bound=FinalOutputNode)
|
14
14
|
|
15
15
|
|
16
|
-
class BaseFinalOutputNodeDisplay(
|
16
|
+
class BaseFinalOutputNodeDisplay(BaseNodeDisplay[_FinalOutputNodeType], Generic[_FinalOutputNodeType]):
|
17
17
|
output_id: ClassVar[Optional[UUID]] = None
|
18
18
|
output_name: ClassVar[Optional[str]] = None
|
19
19
|
node_input_id: ClassVar[Optional[UUID]] = None
|
@@ -3,7 +3,7 @@ from typing import Generic, Optional, TypeVar
|
|
3
3
|
|
4
4
|
from vellum.workflows.nodes import GuardrailNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
|
-
from vellum_ee.workflows.display.nodes.
|
6
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
7
7
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
8
8
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
9
9
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -11,7 +11,7 @@ from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
|
11
11
|
_GuardrailNodeType = TypeVar("_GuardrailNodeType", bound=GuardrailNode)
|
12
12
|
|
13
13
|
|
14
|
-
class BaseGuardrailNodeDisplay(
|
14
|
+
class BaseGuardrailNodeDisplay(BaseNodeDisplay[_GuardrailNodeType], Generic[_GuardrailNodeType]):
|
15
15
|
def serialize(
|
16
16
|
self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
|
17
17
|
) -> JsonObject:
|
@@ -6,7 +6,7 @@ from vellum.workflows.nodes import InlinePromptNode
|
|
6
6
|
from vellum.workflows.types.core import JsonObject
|
7
7
|
from vellum.workflows.utils.functions import compile_function_definition
|
8
8
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
9
|
-
from vellum_ee.workflows.display.nodes.
|
9
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
10
10
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
11
11
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
12
12
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -16,7 +16,7 @@ from vellum_ee.workflows.display.vellum import NodeInput
|
|
16
16
|
_InlinePromptNodeType = TypeVar("_InlinePromptNodeType", bound=InlinePromptNode)
|
17
17
|
|
18
18
|
|
19
|
-
class BaseInlinePromptNodeDisplay(
|
19
|
+
class BaseInlinePromptNodeDisplay(BaseNodeDisplay[_InlinePromptNodeType], Generic[_InlinePromptNodeType]):
|
20
20
|
def serialize(
|
21
21
|
self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
|
22
22
|
) -> JsonObject:
|
@@ -5,7 +5,7 @@ from vellum import VellumVariable
|
|
5
5
|
from vellum.workflows.inputs.base import BaseInputs
|
6
6
|
from vellum.workflows.nodes import InlineSubworkflowNode
|
7
7
|
from vellum.workflows.types.core import JsonObject
|
8
|
-
from vellum_ee.workflows.display.nodes.
|
8
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
9
9
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
10
10
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
11
11
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -17,7 +17,7 @@ _InlineSubworkflowNodeType = TypeVar("_InlineSubworkflowNodeType", bound=InlineS
|
|
17
17
|
|
18
18
|
|
19
19
|
class BaseInlineSubworkflowNodeDisplay(
|
20
|
-
|
20
|
+
BaseNodeDisplay[_InlineSubworkflowNodeType], Generic[_InlineSubworkflowNodeType]
|
21
21
|
):
|
22
22
|
workflow_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
|
23
23
|
|
@@ -4,13 +4,13 @@ from typing import Any, ClassVar, Generic, List, Optional, TypeVar
|
|
4
4
|
from vellum.workflows.nodes.displayable import MergeNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
6
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
7
|
-
from vellum_ee.workflows.display.nodes.
|
7
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
9
9
|
|
10
10
|
_MergeNodeType = TypeVar("_MergeNodeType", bound=MergeNode)
|
11
11
|
|
12
12
|
|
13
|
-
class BaseMergeNodeDisplay(
|
13
|
+
class BaseMergeNodeDisplay(BaseNodeDisplay[_MergeNodeType], Generic[_MergeNodeType]):
|
14
14
|
target_handle_ids: ClassVar[List[UUID]]
|
15
15
|
|
16
16
|
def __init__(self):
|
@@ -2,13 +2,13 @@ from typing import Any, ClassVar, Dict, Generic, TypeVar, Union
|
|
2
2
|
|
3
3
|
from vellum.workflows.nodes import NoteNode
|
4
4
|
from vellum.workflows.types.core import JsonObject
|
5
|
-
from vellum_ee.workflows.display.nodes.
|
5
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
6
6
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
7
7
|
|
8
8
|
_NoteNodeType = TypeVar("_NoteNodeType", bound=NoteNode)
|
9
9
|
|
10
10
|
|
11
|
-
class BaseNoteNodeDisplay(
|
11
|
+
class BaseNoteNodeDisplay(BaseNodeDisplay[_NoteNodeType], Generic[_NoteNodeType]):
|
12
12
|
text: ClassVar[str] = ""
|
13
13
|
style: ClassVar[Union[Dict[str, Any], None]] = None
|
14
14
|
|
@@ -5,7 +5,7 @@ from vellum.workflows.nodes.displayable.prompt_deployment_node import PromptDepl
|
|
5
5
|
from vellum.workflows.references import OutputReference
|
6
6
|
from vellum.workflows.types.core import JsonObject
|
7
7
|
from vellum.workflows.vellum_client import create_vellum_client
|
8
|
-
from vellum_ee.workflows.display.nodes.
|
8
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
9
9
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
10
10
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
11
11
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -13,9 +13,7 @@ from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
|
13
13
|
_PromptDeploymentNodeType = TypeVar("_PromptDeploymentNodeType", bound=PromptDeploymentNode)
|
14
14
|
|
15
15
|
|
16
|
-
class BasePromptDeploymentNodeDisplay(
|
17
|
-
BaseNodeVellumDisplay[_PromptDeploymentNodeType], Generic[_PromptDeploymentNodeType]
|
18
|
-
):
|
16
|
+
class BasePromptDeploymentNodeDisplay(BaseNodeDisplay[_PromptDeploymentNodeType], Generic[_PromptDeploymentNodeType]):
|
19
17
|
def serialize(
|
20
18
|
self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
|
21
19
|
) -> JsonObject:
|
@@ -9,7 +9,6 @@ from vellum.workflows.references.output import OutputReference
|
|
9
9
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
10
10
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
11
11
|
from vellum.workflows.workflows.base import BaseWorkflow
|
12
|
-
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
13
12
|
from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
|
14
13
|
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
15
14
|
from vellum_ee.workflows.display.nodes.vellum.base_adornment_node import BaseAdornmentNodeDisplay
|
@@ -72,7 +71,7 @@ class BaseRetryNodeDisplay(BaseAdornmentNodeDisplay[_RetryNodeType], Generic[_Re
|
|
72
71
|
if not inner_node:
|
73
72
|
return super().get_node_output_display(output)
|
74
73
|
|
75
|
-
node_display_class = get_node_display_class(
|
74
|
+
node_display_class = get_node_display_class(inner_node)
|
76
75
|
node_display = node_display_class()
|
77
76
|
|
78
77
|
inner_output = getattr(inner_node.Outputs, output.name)
|
@@ -11,7 +11,7 @@ from vellum.workflows.nodes.displayable.search_node import SearchNode
|
|
11
11
|
from vellum.workflows.references import OutputReference
|
12
12
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
13
13
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
14
|
-
from vellum_ee.workflows.display.nodes.
|
14
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
15
15
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
16
16
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
17
17
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -28,7 +28,7 @@ class VariableIdMap:
|
|
28
28
|
rhs: Optional["VariableIdMap"]
|
29
29
|
|
30
30
|
|
31
|
-
class BaseSearchNodeDisplay(
|
31
|
+
class BaseSearchNodeDisplay(BaseNodeDisplay[_SearchNodeType], Generic[_SearchNodeType]):
|
32
32
|
# A mapping between the id of the operand (e.g. "lhs_variable_id" or "rhs_variable_id") and the id of the node input
|
33
33
|
# that the operand is pointing to.
|
34
34
|
metadata_filter_input_id_by_operand_id: Dict[UUID, UUID] = {}
|
@@ -4,7 +4,7 @@ from typing import Generic, Optional, TypeVar
|
|
4
4
|
from vellum.workflows.nodes import SubworkflowDeploymentNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
6
|
from vellum.workflows.vellum_client import create_vellum_client
|
7
|
-
from vellum_ee.workflows.display.nodes.
|
7
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
9
9
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
10
10
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -13,7 +13,7 @@ _SubworkflowDeploymentNodeType = TypeVar("_SubworkflowDeploymentNodeType", bound
|
|
13
13
|
|
14
14
|
|
15
15
|
class BaseSubworkflowDeploymentNodeDisplay(
|
16
|
-
|
16
|
+
BaseNodeDisplay[_SubworkflowDeploymentNodeType], Generic[_SubworkflowDeploymentNodeType]
|
17
17
|
):
|
18
18
|
|
19
19
|
def serialize(
|
@@ -4,7 +4,7 @@ from typing import Generic, Optional, TypeVar
|
|
4
4
|
from vellum.workflows.nodes.core.templating_node import TemplatingNode
|
5
5
|
from vellum.workflows.types.core import JsonObject
|
6
6
|
from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
|
7
|
-
from vellum_ee.workflows.display.nodes.
|
7
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
|
9
9
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
10
10
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -14,7 +14,7 @@ _TemplatingNodeType = TypeVar("_TemplatingNodeType", bound=TemplatingNode)
|
|
14
14
|
TEMPLATE_INPUT_NAME = TemplatingNode.template.name
|
15
15
|
|
16
16
|
|
17
|
-
class BaseTemplatingNodeDisplay(
|
17
|
+
class BaseTemplatingNodeDisplay(BaseNodeDisplay[_TemplatingNodeType], Generic[_TemplatingNodeType]):
|
18
18
|
def serialize(
|
19
19
|
self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
|
20
20
|
) -> JsonObject:
|
@@ -6,7 +6,6 @@ from vellum.workflows.nodes.displayable.code_execution_node.node import CodeExec
|
|
6
6
|
from vellum.workflows.workflows.base import BaseWorkflow
|
7
7
|
from vellum_ee.workflows.display.nodes.vellum.code_execution_node import BaseCodeExecutionNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
9
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
10
9
|
|
11
10
|
|
12
11
|
def _no_display_class(Node: Type[CodeExecutionNode]):
|
@@ -53,7 +52,7 @@ def test_serialize_node__code_node_inputs(GetDisplayClass, expected_input_id):
|
|
53
52
|
GetDisplayClass(MyCodeExecutionNode)
|
54
53
|
|
55
54
|
# WHEN the workflow is serialized
|
56
|
-
workflow_display = get_workflow_display(
|
55
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
57
56
|
serialized_workflow: dict = workflow_display.serialize()
|
58
57
|
|
59
58
|
# THEN the node should properly serialize the inputs
|
@@ -4,7 +4,6 @@ from vellum.client.types.vellum_error import VellumError
|
|
4
4
|
from vellum.workflows import BaseWorkflow
|
5
5
|
from vellum.workflows.nodes.core.error_node.node import ErrorNode
|
6
6
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
7
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
8
7
|
|
9
8
|
|
10
9
|
def test_error_node_display__serialize_with_vellum_error() -> None:
|
@@ -20,7 +19,7 @@ def test_error_node_display__serialize_with_vellum_error() -> None:
|
|
20
19
|
graph = MyNode
|
21
20
|
|
22
21
|
# WHEN we serialize the workflow
|
23
|
-
workflow_display = get_workflow_display(
|
22
|
+
workflow_display = get_workflow_display(workflow_class=MyWorkflow)
|
24
23
|
serialized_workflow = cast(Dict[str, Any], workflow_display.serialize())
|
25
24
|
|
26
25
|
# THEN the correct inputs should be serialized on the node
|
@@ -2,7 +2,6 @@ from vellum.workflows import BaseWorkflow
|
|
2
2
|
from vellum.workflows.nodes.displayable.note_node.node import NoteNode
|
3
3
|
from vellum_ee.workflows.display.nodes.vellum.note_node import BaseNoteNodeDisplay
|
4
4
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
5
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
6
5
|
|
7
6
|
|
8
7
|
def test_serialize_node__note_node():
|
@@ -22,7 +21,7 @@ def test_serialize_node__note_node():
|
|
22
21
|
graph = MyNoteNode
|
23
22
|
|
24
23
|
# WHEN the workflow is serialized
|
25
|
-
workflow_display = get_workflow_display(
|
24
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
26
25
|
serialized_workflow: dict = workflow_display.serialize()
|
27
26
|
|
28
27
|
# THEN the node should properly serialize the inputs
|
@@ -6,9 +6,9 @@ from vellum.workflows import BaseWorkflow
|
|
6
6
|
from vellum.workflows.nodes import BaseNode
|
7
7
|
from vellum.workflows.nodes.displayable.inline_prompt_node.node import InlinePromptNode
|
8
8
|
from vellum.workflows.references.lazy import LazyReference
|
9
|
+
from vellum.workflows.state.base import BaseState
|
9
10
|
from vellum_ee.workflows.display.nodes.vellum.inline_prompt_node import BaseInlinePromptNodeDisplay
|
10
11
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
11
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
12
12
|
|
13
13
|
|
14
14
|
def test_serialize_node__lazy_reference_in_prompt_inputs():
|
@@ -27,7 +27,7 @@ def test_serialize_node__lazy_reference_in_prompt_inputs():
|
|
27
27
|
graph = LazyReferencePromptNode >> OtherNode
|
28
28
|
|
29
29
|
# WHEN the workflow is serialized
|
30
|
-
workflow_display = get_workflow_display(
|
30
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
31
31
|
serialized_workflow: dict = workflow_display.serialize()
|
32
32
|
|
33
33
|
# THEN the node should properly serialize the attribute reference
|
@@ -103,7 +103,7 @@ def test_serialize_node__prompt_inputs(GetDisplayClass, expected_input_id):
|
|
103
103
|
GetDisplayClass(MyPromptNode)
|
104
104
|
|
105
105
|
# WHEN the workflow is serialized
|
106
|
-
workflow_display = get_workflow_display(
|
106
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
107
107
|
serialized_workflow: dict = workflow_display.serialize()
|
108
108
|
|
109
109
|
# THEN the node should properly serialize the inputs
|
@@ -129,3 +129,55 @@ def test_serialize_node__prompt_inputs(GetDisplayClass, expected_input_id):
|
|
129
129
|
},
|
130
130
|
}
|
131
131
|
]
|
132
|
+
|
133
|
+
|
134
|
+
def test_serialize_node__prompt_inputs__state_reference():
|
135
|
+
# GIVEN a state definition
|
136
|
+
class MyState(BaseState):
|
137
|
+
foo: str
|
138
|
+
|
139
|
+
# AND a prompt node with inputs
|
140
|
+
class MyPromptNode(InlinePromptNode):
|
141
|
+
prompt_inputs = {"foo": MyState.foo, "bar": "baz"}
|
142
|
+
blocks = []
|
143
|
+
ml_model = "gpt-4o"
|
144
|
+
|
145
|
+
# AND a workflow with the prompt node
|
146
|
+
class Workflow(BaseWorkflow):
|
147
|
+
graph = MyPromptNode
|
148
|
+
|
149
|
+
# WHEN the workflow is serialized
|
150
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
151
|
+
serialized_workflow: dict = workflow_display.serialize()
|
152
|
+
|
153
|
+
# THEN the node should skip the state reference input rule
|
154
|
+
my_prompt_node = next(
|
155
|
+
node for node in serialized_workflow["workflow_raw_data"]["nodes"] if node["id"] == str(MyPromptNode.__id__)
|
156
|
+
)
|
157
|
+
|
158
|
+
assert my_prompt_node["inputs"] == [
|
159
|
+
{
|
160
|
+
"id": "e47e0a80-afbb-4888-b06b-8dc78edd8572",
|
161
|
+
"key": "foo",
|
162
|
+
"value": {
|
163
|
+
"rules": [],
|
164
|
+
"combinator": "OR",
|
165
|
+
},
|
166
|
+
},
|
167
|
+
{
|
168
|
+
"id": "3750feb9-5d5c-4150-b62d-a9924f466888",
|
169
|
+
"key": "bar",
|
170
|
+
"value": {
|
171
|
+
"rules": [
|
172
|
+
{
|
173
|
+
"type": "CONSTANT_VALUE",
|
174
|
+
"data": {
|
175
|
+
"type": "STRING",
|
176
|
+
"value": "baz",
|
177
|
+
},
|
178
|
+
}
|
179
|
+
],
|
180
|
+
"combinator": "OR",
|
181
|
+
},
|
182
|
+
},
|
183
|
+
]
|
@@ -5,7 +5,6 @@ from vellum.workflows.errors.types import WorkflowErrorCode
|
|
5
5
|
from vellum.workflows.nodes.bases.base import BaseNode
|
6
6
|
from vellum.workflows.nodes.core.retry_node.node import RetryNode
|
7
7
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
8
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
9
8
|
|
10
9
|
|
11
10
|
def test_retry_node_parameters():
|
@@ -21,7 +20,7 @@ def test_retry_node_parameters():
|
|
21
20
|
graph = MyRetryNode
|
22
21
|
|
23
22
|
# WHEN we serialize the workflow
|
24
|
-
workflow_display = get_workflow_display(
|
23
|
+
workflow_display = get_workflow_display(workflow_class=MyWorkflow)
|
25
24
|
serialized_workflow = cast(Dict[str, Any], workflow_display.serialize())
|
26
25
|
|
27
26
|
# THEN the correct inputs should be serialized on the node
|
@@ -6,7 +6,6 @@ from vellum.workflows import BaseWorkflow
|
|
6
6
|
from vellum.workflows.nodes.core.templating_node.node import TemplatingNode
|
7
7
|
from vellum_ee.workflows.display.nodes.vellum.templating_node import BaseTemplatingNodeDisplay
|
8
8
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
9
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
10
9
|
|
11
10
|
|
12
11
|
def _no_display_class(Node: Type[TemplatingNode]):
|
@@ -53,7 +52,7 @@ def test_serialize_node__templating_node_inputs(GetDisplayClass, expected_input_
|
|
53
52
|
GetDisplayClass(MyTemplatingNode)
|
54
53
|
|
55
54
|
# WHEN the workflow is serialized
|
56
|
-
workflow_display = get_workflow_display(
|
55
|
+
workflow_display = get_workflow_display(workflow_class=Workflow)
|
57
56
|
serialized_workflow: dict = workflow_display.serialize()
|
58
57
|
|
59
58
|
# THEN the node should properly serialize the inputs
|
@@ -5,7 +5,6 @@ from vellum.workflows.nodes.bases.base import BaseNode
|
|
5
5
|
from vellum.workflows.nodes.core.templating_node.node import TemplatingNode
|
6
6
|
from vellum.workflows.nodes.core.try_node.node import TryNode
|
7
7
|
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
8
|
-
from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
|
9
8
|
|
10
9
|
|
11
10
|
def test_try_node_display__serialize_with_error_output() -> None:
|
@@ -28,7 +27,7 @@ def test_try_node_display__serialize_with_error_output() -> None:
|
|
28
27
|
graph = MyNode >> OtherNode
|
29
28
|
|
30
29
|
# WHEN we serialize the workflow
|
31
|
-
workflow_display = get_workflow_display(
|
30
|
+
workflow_display = get_workflow_display(workflow_class=MyWorkflow)
|
32
31
|
serialized_workflow = cast(Dict[str, Any], workflow_display.serialize())
|
33
32
|
|
34
33
|
# THEN the correct inputs should be serialized on the node
|
@@ -9,7 +9,7 @@ from vellum.workflows.nodes.bases import BaseNode
|
|
9
9
|
from vellum.workflows.outputs import BaseOutputs
|
10
10
|
from vellum.workflows.references import LazyReference
|
11
11
|
from vellum_ee.workflows.display.editor.types import NodeDisplayData
|
12
|
-
from vellum_ee.workflows.display.nodes.
|
12
|
+
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
13
13
|
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
14
14
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input_value_pointer_rules
|
15
15
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
@@ -22,7 +22,7 @@ from vellum_ee.workflows.display.utils.vellum import (
|
|
22
22
|
NodeOutputPointer,
|
23
23
|
)
|
24
24
|
from vellum_ee.workflows.display.vellum import WorkflowInputsVellumDisplayOverrides, WorkflowMetaVellumDisplay
|
25
|
-
from vellum_ee.workflows.display.workflows.
|
25
|
+
from vellum_ee.workflows.display.workflows.base_workflow_display import BaseWorkflowDisplay
|
26
26
|
|
27
27
|
|
28
28
|
class Inputs(BaseInputs):
|
@@ -36,7 +36,7 @@ class MyNodeA(BaseNode):
|
|
36
36
|
output: str
|
37
37
|
|
38
38
|
|
39
|
-
class MyNodeADisplay(
|
39
|
+
class MyNodeADisplay(BaseNodeDisplay[MyNodeA]):
|
40
40
|
pass
|
41
41
|
|
42
42
|
|
@@ -109,7 +109,7 @@ def test_create_node_input_value_pointer_rules(
|
|
109
109
|
rules = create_node_input_value_pointer_rules(
|
110
110
|
descriptor,
|
111
111
|
WorkflowDisplayContext(
|
112
|
-
workflow_display_class=
|
112
|
+
workflow_display_class=BaseWorkflowDisplay,
|
113
113
|
workflow_display=WorkflowMetaVellumDisplay(
|
114
114
|
entrypoint_node_id=uuid4(),
|
115
115
|
entrypoint_node_source_handle_id=uuid4(),
|
@@ -10,7 +10,6 @@ from vellum.workflows.references.output import OutputReference
|
|
10
10
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
11
11
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
12
12
|
from vellum.workflows.workflows.base import BaseWorkflow
|
13
|
-
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
14
13
|
from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
|
15
14
|
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
16
15
|
from vellum_ee.workflows.display.nodes.vellum.base_adornment_node import BaseAdornmentNodeDisplay
|
@@ -82,7 +81,7 @@ class BaseTryNodeDisplay(BaseAdornmentNodeDisplay[_TryNodeType], Generic[_TryNod
|
|
82
81
|
if not inner_node:
|
83
82
|
return super().get_node_output_display(output)
|
84
83
|
|
85
|
-
node_display_class = get_node_display_class(
|
84
|
+
node_display_class = get_node_display_class(inner_node)
|
86
85
|
node_display = node_display_class()
|
87
86
|
if output.name == "error":
|
88
87
|
return inner_node, NodeOutputDisplay(
|