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.
Files changed (85) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/client/reference.md +138 -1
  3. vellum/client/resources/ad_hoc/client.py +311 -1
  4. vellum/client/resources/deployments/client.py +2 -2
  5. vellum/workflows/nodes/bases/tests/test_base_node.py +24 -0
  6. vellum/workflows/nodes/core/try_node/node.py +1 -2
  7. vellum/workflows/nodes/experimental/tool_calling_node/__init__.py +3 -0
  8. vellum/workflows/nodes/experimental/tool_calling_node/node.py +125 -0
  9. vellum/workflows/nodes/experimental/tool_calling_node/utils.py +128 -0
  10. vellum/workflows/nodes/utils.py +4 -2
  11. vellum/workflows/outputs/base.py +3 -2
  12. vellum/workflows/references/output.py +20 -0
  13. vellum/workflows/state/base.py +36 -14
  14. vellum/workflows/state/tests/test_state.py +5 -2
  15. vellum/workflows/types/stack.py +11 -0
  16. vellum/workflows/workflows/base.py +5 -0
  17. vellum/workflows/workflows/tests/test_base_workflow.py +96 -9
  18. {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/METADATA +1 -1
  19. {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/RECORD +84 -80
  20. vellum_cli/push.py +0 -2
  21. vellum_ee/workflows/display/base.py +14 -1
  22. vellum_ee/workflows/display/nodes/base_node_display.py +91 -19
  23. vellum_ee/workflows/display/nodes/get_node_display_class.py +9 -15
  24. vellum_ee/workflows/display/nodes/tests/test_base_node_display.py +54 -0
  25. vellum_ee/workflows/display/nodes/vellum/api_node.py +2 -2
  26. vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +4 -4
  27. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +2 -2
  28. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +2 -2
  29. vellum_ee/workflows/display/nodes/vellum/error_node.py +2 -2
  30. vellum_ee/workflows/display/nodes/vellum/final_output_node.py +2 -2
  31. vellum_ee/workflows/display/nodes/vellum/guardrail_node.py +2 -2
  32. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +2 -2
  33. vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +2 -2
  34. vellum_ee/workflows/display/nodes/vellum/merge_node.py +2 -2
  35. vellum_ee/workflows/display/nodes/vellum/note_node.py +2 -2
  36. vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +2 -4
  37. vellum_ee/workflows/display/nodes/vellum/retry_node.py +1 -2
  38. vellum_ee/workflows/display/nodes/vellum/search_node.py +2 -2
  39. vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +2 -2
  40. vellum_ee/workflows/display/nodes/vellum/templating_node.py +2 -2
  41. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +1 -2
  42. vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py +1 -2
  43. vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py +1 -2
  44. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +55 -3
  45. vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py +1 -2
  46. vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +1 -2
  47. vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py +1 -2
  48. vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +4 -4
  49. vellum_ee/workflows/display/nodes/vellum/try_node.py +1 -2
  50. vellum_ee/workflows/display/nodes/vellum/utils.py +7 -1
  51. vellum_ee/workflows/display/tests/{test_vellum_workflow_display.py → test_base_workflow_display.py} +10 -22
  52. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +4 -6
  53. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +7 -16
  54. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +2 -6
  55. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +1 -2
  56. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +3 -10
  57. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +4 -5
  58. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +1 -4
  59. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +1 -4
  60. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +2 -5
  61. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +7 -5
  62. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +1 -4
  63. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +1 -4
  64. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +1 -2
  65. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +1 -4
  66. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +1 -4
  67. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +7 -5
  68. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +1 -4
  69. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +1 -4
  70. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +1 -4
  71. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +2 -5
  72. vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +2 -7
  73. vellum_ee/workflows/display/types.py +5 -4
  74. vellum_ee/workflows/display/utils/exceptions.py +7 -0
  75. vellum_ee/workflows/display/utils/registry.py +37 -0
  76. vellum_ee/workflows/display/utils/vellum.py +2 -1
  77. vellum_ee/workflows/display/workflows/base_workflow_display.py +277 -47
  78. vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py +34 -21
  79. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +58 -20
  80. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +4 -257
  81. vellum_ee/workflows/tests/local_workflow/display/workflow.py +2 -2
  82. vellum_ee/workflows/display/nodes/base_node_vellum_display.py +0 -40
  83. {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/LICENSE +0 -0
  84. {vellum_ai-0.14.39.dist-info → vellum_ai-0.14.41.dist-info}/WHEEL +0 -0
  85. {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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_APINodeType], Generic[_APINodeType]):
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
- wrapped_node_display_class._node_display_registry[wrapped_node_class] = wrapped_node_display_class
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(BaseNodeVellumDisplay[_BaseAdornmentNodeType], Generic[_BaseAdornmentNodeType]):
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(BaseNodeDisplay, wrapped_node)
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_CodeExecutionNodeType], Generic[_CodeExecutionNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_ConditionalNodeType], Generic[_ConditionalNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_ErrorNodeType], Generic[_ErrorNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_FinalOutputNodeType], Generic[_FinalOutputNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_GuardrailNodeType], Generic[_GuardrailNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_InlinePromptNodeType], Generic[_InlinePromptNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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
- BaseNodeVellumDisplay[_InlineSubworkflowNodeType], Generic[_InlineSubworkflowNodeType]
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_MergeNodeType], Generic[_MergeNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_NoteNodeType], Generic[_NoteNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeDisplay, inner_node)
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_SearchNodeType], Generic[_SearchNodeType]):
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.base_node_vellum_display import BaseNodeVellumDisplay
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
- BaseNodeVellumDisplay[_SubworkflowDeploymentNodeType], Generic[_SubworkflowDeploymentNodeType]
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.base_node_vellum_display import BaseNodeVellumDisplay
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(BaseNodeVellumDisplay[_TemplatingNodeType], Generic[_TemplatingNodeType]):
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(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=MyWorkflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=MyWorkflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
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(base_display_class=VellumWorkflowDisplay, workflow_class=MyWorkflow)
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.base_node_vellum_display import BaseNodeVellumDisplay
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.vellum_workflow_display import VellumWorkflowDisplay
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(BaseNodeVellumDisplay[MyNodeA]):
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=VellumWorkflowDisplay,
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(BaseNodeDisplay, inner_node)
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(