vellum-ai 0.12.8__py3-none-any.whl → 0.12.9__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/evaluations/resources.py +1 -1
- vellum/prompts/blocks/compilation.py +4 -4
- vellum/workflows/nodes/bases/__init__.py +0 -2
- vellum/workflows/nodes/bases/base.py +2 -6
- vellum/workflows/nodes/core/inline_subworkflow_node/node.py +13 -7
- vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py +0 -0
- vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +41 -0
- vellum/workflows/nodes/core/map_node/node.py +1 -1
- vellum/workflows/nodes/core/templating_node/node.py +8 -1
- vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py +66 -0
- vellum/workflows/nodes/core/try_node/node.py +1 -3
- vellum/workflows/nodes/core/try_node/tests/test_node.py +1 -1
- vellum/workflows/nodes/displayable/bases/api_node/node.py +2 -2
- vellum/workflows/nodes/displayable/bases/search_node.py +5 -2
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +4 -2
- vellum/workflows/sandbox.py +4 -5
- vellum/workflows/state/context.py +5 -4
- vellum/workflows/tests/test_sandbox.py +2 -2
- vellum/workflows/utils/tests/test_vellum_variables.py +3 -0
- vellum/workflows/utils/vellum_variables.py +5 -4
- vellum/workflows/workflows/base.py +5 -2
- {vellum_ai-0.12.8.dist-info → vellum_ai-0.12.9.dist-info}/METADATA +1 -1
- {vellum_ai-0.12.8.dist-info → vellum_ai-0.12.9.dist-info}/RECORD +31 -30
- vellum_cli/tests/test_push.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +6 -1
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +207 -0
- vellum/workflows/nodes/bases/base_subworkflow_node/__init__.py +0 -5
- vellum/workflows/nodes/bases/base_subworkflow_node/node.py +0 -10
- /vellum/{evaluations/utils → utils}/uuid.py +0 -0
- {vellum_ai-0.12.8.dist-info → vellum_ai-0.12.9.dist-info}/LICENSE +0 -0
- {vellum_ai-0.12.8.dist-info → vellum_ai-0.12.9.dist-info}/WHEEL +0 -0
- {vellum_ai-0.12.8.dist-info → vellum_ai-0.12.9.dist-info}/entry_points.txt +0 -0
@@ -18,7 +18,7 @@ class BaseClientWrapper:
|
|
18
18
|
headers: typing.Dict[str, str] = {
|
19
19
|
"X-Fern-Language": "Python",
|
20
20
|
"X-Fern-SDK-Name": "vellum-ai",
|
21
|
-
"X-Fern-SDK-Version": "0.12.
|
21
|
+
"X-Fern-SDK-Version": "0.12.9",
|
22
22
|
}
|
23
23
|
headers["X_API_KEY"] = self.api_key
|
24
24
|
return headers
|
vellum/evaluations/resources.py
CHANGED
@@ -12,7 +12,6 @@ from vellum.evaluations.constants import DEFAULT_MAX_POLLING_DURATION_MS, DEFAUL
|
|
12
12
|
from vellum.evaluations.exceptions import TestSuiteRunResultsException
|
13
13
|
from vellum.evaluations.utils.env import get_api_key
|
14
14
|
from vellum.evaluations.utils.paginator import PaginatedResults, get_all_results
|
15
|
-
from vellum.evaluations.utils.uuid import is_valid_uuid
|
16
15
|
from vellum.types import (
|
17
16
|
ExternalTestCaseExecutionRequest,
|
18
17
|
NamedTestCaseVariableValueRequest,
|
@@ -24,6 +23,7 @@ from vellum.types import (
|
|
24
23
|
TestSuiteRunState,
|
25
24
|
)
|
26
25
|
from vellum.utils.typing import cast_not_optional
|
26
|
+
from vellum.utils.uuid import is_valid_uuid
|
27
27
|
|
28
28
|
logger = logging.getLogger(__name__)
|
29
29
|
|
@@ -104,16 +104,16 @@ def compile_prompt_blocks(
|
|
104
104
|
chat_message_blocks = _compile_chat_messages_as_prompt_blocks(compiled_input.value)
|
105
105
|
compiled_blocks.extend(chat_message_blocks)
|
106
106
|
else:
|
107
|
-
raise
|
107
|
+
raise PromptCompilationError(f"Invalid input type for variable block: {compiled_input.type}")
|
108
108
|
|
109
109
|
elif block.block_type == "RICH_TEXT":
|
110
110
|
value_block = _compile_rich_text_block_as_value_block(block=block, inputs=sanitized_inputs)
|
111
111
|
compiled_blocks.append(value_block)
|
112
112
|
|
113
113
|
elif block.block_type == "FUNCTION_DEFINITION":
|
114
|
-
raise
|
114
|
+
raise PromptCompilationError("Function definitions shouldn't go through compilation process")
|
115
115
|
else:
|
116
|
-
raise
|
116
|
+
raise PromptCompilationError(f"Unknown block_type: {block.block_type}")
|
117
117
|
|
118
118
|
return compiled_blocks
|
119
119
|
|
@@ -172,7 +172,7 @@ def _compile_rich_text_block_as_value_block(
|
|
172
172
|
f"Input variable '{child_block.input_variable}' must be of type STRING or JSON"
|
173
173
|
)
|
174
174
|
else:
|
175
|
-
raise
|
175
|
+
raise PromptCompilationError(f"Invalid child block_type for RICH_TEXT: {child_block.block_type}")
|
176
176
|
|
177
177
|
return CompiledValuePromptBlock(content=StringVellumValue(value=value), cache_config=block.cache_config)
|
178
178
|
|
@@ -344,8 +344,8 @@ class BaseNode(Generic[StateType], metaclass=BaseNodeMeta):
|
|
344
344
|
all_inputs = {}
|
345
345
|
for key, value in inputs.items():
|
346
346
|
path_parts = key.split(".")
|
347
|
-
|
348
|
-
inputs_key = reduce(lambda acc, part: acc[part], path_parts[1:],
|
347
|
+
node_attribute_descriptor = getattr(self.__class__, path_parts[0])
|
348
|
+
inputs_key = reduce(lambda acc, part: acc[part], path_parts[1:], node_attribute_descriptor)
|
349
349
|
all_inputs[inputs_key] = value
|
350
350
|
|
351
351
|
self._inputs = MappingProxyType(all_inputs)
|
@@ -355,7 +355,3 @@ class BaseNode(Generic[StateType], metaclass=BaseNodeMeta):
|
|
355
355
|
|
356
356
|
def __repr__(self) -> str:
|
357
357
|
return str(self.__class__)
|
358
|
-
|
359
|
-
|
360
|
-
class MyNode2(BaseNode):
|
361
|
-
pass
|
@@ -1,12 +1,14 @@
|
|
1
|
-
from typing import TYPE_CHECKING, Generic, Iterator, Optional, Set, Type, TypeVar
|
1
|
+
from typing import TYPE_CHECKING, ClassVar, Generic, Iterator, Optional, Set, Type, TypeVar, Union
|
2
2
|
|
3
3
|
from vellum.workflows.context import execution_context, get_parent_context
|
4
4
|
from vellum.workflows.errors.types import WorkflowErrorCode
|
5
5
|
from vellum.workflows.exceptions import NodeException
|
6
|
-
from vellum.workflows.
|
6
|
+
from vellum.workflows.inputs.base import BaseInputs
|
7
|
+
from vellum.workflows.nodes.bases.base import BaseNode
|
7
8
|
from vellum.workflows.outputs.base import BaseOutput, BaseOutputs
|
8
9
|
from vellum.workflows.state.base import BaseState
|
9
10
|
from vellum.workflows.state.context import WorkflowContext
|
11
|
+
from vellum.workflows.types.core import EntityInputsInterface
|
10
12
|
from vellum.workflows.types.generics import StateType, WorkflowInputsType
|
11
13
|
|
12
14
|
if TYPE_CHECKING:
|
@@ -15,7 +17,7 @@ if TYPE_CHECKING:
|
|
15
17
|
InnerStateType = TypeVar("InnerStateType", bound=BaseState)
|
16
18
|
|
17
19
|
|
18
|
-
class InlineSubworkflowNode(
|
20
|
+
class InlineSubworkflowNode(BaseNode[StateType], Generic[StateType, WorkflowInputsType, InnerStateType]):
|
19
21
|
"""
|
20
22
|
Used to execute a Subworkflow defined inline.
|
21
23
|
|
@@ -24,14 +26,13 @@ class InlineSubworkflowNode(BaseSubworkflowNode[StateType], Generic[StateType, W
|
|
24
26
|
"""
|
25
27
|
|
26
28
|
subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"]
|
29
|
+
subworkflow_inputs: ClassVar[Union[EntityInputsInterface, BaseInputs]] = {}
|
27
30
|
|
28
31
|
def run(self) -> Iterator[BaseOutput]:
|
29
32
|
with execution_context(parent_context=get_parent_context() or self._context.parent_context):
|
30
33
|
subworkflow = self.subworkflow(
|
31
34
|
parent_state=self.state,
|
32
|
-
context=WorkflowContext(
|
33
|
-
_vellum_client=self._context._vellum_client,
|
34
|
-
),
|
35
|
+
context=WorkflowContext(vellum_client=self._context.vellum_client),
|
35
36
|
)
|
36
37
|
subworkflow_stream = subworkflow.stream(
|
37
38
|
inputs=self._compile_subworkflow_inputs(),
|
@@ -68,4 +69,9 @@ class InlineSubworkflowNode(BaseSubworkflowNode[StateType], Generic[StateType, W
|
|
68
69
|
|
69
70
|
def _compile_subworkflow_inputs(self) -> WorkflowInputsType:
|
70
71
|
inputs_class = self.subworkflow.get_inputs_class()
|
71
|
-
|
72
|
+
if isinstance(self.subworkflow_inputs, dict):
|
73
|
+
return inputs_class(**self.subworkflow_inputs)
|
74
|
+
elif isinstance(self.subworkflow_inputs, inputs_class):
|
75
|
+
return self.subworkflow_inputs
|
76
|
+
else:
|
77
|
+
raise ValueError(f"Invalid subworkflow inputs type: {type(self.subworkflow_inputs)}")
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import pytest
|
2
|
+
|
3
|
+
from vellum.workflows.inputs.base import BaseInputs
|
4
|
+
from vellum.workflows.nodes.bases.base import BaseNode
|
5
|
+
from vellum.workflows.nodes.core.inline_subworkflow_node.node import InlineSubworkflowNode
|
6
|
+
from vellum.workflows.outputs.base import BaseOutput
|
7
|
+
from vellum.workflows.state.base import BaseState
|
8
|
+
from vellum.workflows.workflows.base import BaseWorkflow
|
9
|
+
|
10
|
+
|
11
|
+
class Inputs(BaseInputs):
|
12
|
+
foo: str
|
13
|
+
|
14
|
+
|
15
|
+
class MyInnerNode(BaseNode):
|
16
|
+
class Outputs(BaseNode.Outputs):
|
17
|
+
out = Inputs.foo
|
18
|
+
|
19
|
+
|
20
|
+
class MySubworkflow(BaseWorkflow[Inputs, BaseState]):
|
21
|
+
graph = MyInnerNode
|
22
|
+
|
23
|
+
class Outputs(BaseWorkflow.Outputs):
|
24
|
+
out = MyInnerNode.Outputs.out
|
25
|
+
|
26
|
+
|
27
|
+
@pytest.mark.parametrize("inputs", [{"foo": "bar"}, Inputs(foo="bar")])
|
28
|
+
def test_inline_subworkflow_node__inputs(inputs):
|
29
|
+
# GIVEN a node setup with subworkflow inputs
|
30
|
+
class MyNode(InlineSubworkflowNode):
|
31
|
+
subworkflow = MySubworkflow
|
32
|
+
subworkflow_inputs = inputs
|
33
|
+
|
34
|
+
# WHEN the node is run
|
35
|
+
node = MyNode()
|
36
|
+
events = list(node.run())
|
37
|
+
|
38
|
+
# THEN the output is as expected
|
39
|
+
assert events == [
|
40
|
+
BaseOutput(name="out", value="bar"),
|
41
|
+
]
|
@@ -108,7 +108,7 @@ class MapNode(BaseNode, Generic[StateType, MapNodeItemType]):
|
|
108
108
|
self._run_subworkflow(item=item, index=index)
|
109
109
|
|
110
110
|
def _run_subworkflow(self, *, item: MapNodeItemType, index: int) -> None:
|
111
|
-
context = WorkflowContext(
|
111
|
+
context = WorkflowContext(vellum_client=self._context.vellum_client)
|
112
112
|
subworkflow = self.subworkflow(parent_state=self.state, context=context)
|
113
113
|
events = subworkflow.stream(
|
114
114
|
inputs=self.SubworkflowInputs(index=index, item=item, all_items=self.items),
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import json
|
1
2
|
from typing import Any, Callable, ClassVar, Dict, Generic, Mapping, Tuple, Type, TypeVar, Union, get_args
|
2
3
|
|
3
4
|
from vellum.utils.templating.constants import DEFAULT_JINJA_CUSTOM_FILTERS, DEFAULT_JINJA_GLOBALS
|
@@ -7,7 +8,7 @@ from vellum.workflows.errors import WorkflowErrorCode
|
|
7
8
|
from vellum.workflows.exceptions import NodeException
|
8
9
|
from vellum.workflows.nodes.bases import BaseNode
|
9
10
|
from vellum.workflows.nodes.bases.base import BaseNodeMeta
|
10
|
-
from vellum.workflows.types.core import EntityInputsInterface
|
11
|
+
from vellum.workflows.types.core import EntityInputsInterface, Json
|
11
12
|
from vellum.workflows.types.generics import StateType
|
12
13
|
from vellum.workflows.types.utils import get_original_base
|
13
14
|
|
@@ -87,6 +88,12 @@ class TemplatingNode(BaseNode[StateType], Generic[StateType, _OutputType], metac
|
|
87
88
|
if output_type is bool:
|
88
89
|
return bool(rendered_template)
|
89
90
|
|
91
|
+
if output_type is Json:
|
92
|
+
try:
|
93
|
+
return json.loads(rendered_template)
|
94
|
+
except json.JSONDecodeError:
|
95
|
+
raise ValueError("Invalid JSON format for rendered_template")
|
96
|
+
|
90
97
|
raise ValueError(f"Unsupported output type: {output_type}")
|
91
98
|
|
92
99
|
def run(self) -> Outputs:
|
@@ -2,6 +2,8 @@ import json
|
|
2
2
|
|
3
3
|
from vellum.workflows.nodes.bases.base import BaseNode
|
4
4
|
from vellum.workflows.nodes.core.templating_node.node import TemplatingNode
|
5
|
+
from vellum.workflows.state import BaseState
|
6
|
+
from vellum.workflows.types.core import Json
|
5
7
|
|
6
8
|
|
7
9
|
def test_templating_node__dict_output():
|
@@ -22,6 +24,70 @@ def test_templating_node__dict_output():
|
|
22
24
|
assert json.loads(outputs.result) == {"key": "value"}
|
23
25
|
|
24
26
|
|
27
|
+
def test_templating_node__int_output():
|
28
|
+
# GIVEN a templating node that outputs an integer
|
29
|
+
class IntTemplateNode(TemplatingNode[BaseState, int]):
|
30
|
+
template = "{{ data }}"
|
31
|
+
inputs = {
|
32
|
+
"data": 42,
|
33
|
+
}
|
34
|
+
|
35
|
+
# WHEN the node is run
|
36
|
+
node = IntTemplateNode()
|
37
|
+
outputs = node.run()
|
38
|
+
|
39
|
+
# THEN the output is the expected integer
|
40
|
+
assert outputs.result == 42
|
41
|
+
|
42
|
+
|
43
|
+
def test_templating_node__float_output():
|
44
|
+
# GIVEN a templating node that outputs a float
|
45
|
+
class FloatTemplateNode(TemplatingNode[BaseState, float]):
|
46
|
+
template = "{{ data }}"
|
47
|
+
inputs = {
|
48
|
+
"data": 42.5,
|
49
|
+
}
|
50
|
+
|
51
|
+
# WHEN the node is run
|
52
|
+
node = FloatTemplateNode()
|
53
|
+
outputs = node.run()
|
54
|
+
|
55
|
+
# THEN the output is the expected float
|
56
|
+
assert outputs.result == 42.5
|
57
|
+
|
58
|
+
|
59
|
+
def test_templating_node__bool_output():
|
60
|
+
# GIVEN a templating node that outputs a bool
|
61
|
+
class BoolTemplateNode(TemplatingNode[BaseState, bool]):
|
62
|
+
template = "{{ data }}"
|
63
|
+
inputs = {
|
64
|
+
"data": True,
|
65
|
+
}
|
66
|
+
|
67
|
+
# WHEN the node is run
|
68
|
+
node = BoolTemplateNode()
|
69
|
+
outputs = node.run()
|
70
|
+
|
71
|
+
# THEN the output is the expected bool
|
72
|
+
assert outputs.result is True
|
73
|
+
|
74
|
+
|
75
|
+
def test_templating_node__json_output():
|
76
|
+
# GIVEN a templating node that outputs JSON
|
77
|
+
class JSONTemplateNode(TemplatingNode[BaseState, Json]):
|
78
|
+
template = "{{ data }}"
|
79
|
+
inputs = {
|
80
|
+
"data": {"key": "value"},
|
81
|
+
}
|
82
|
+
|
83
|
+
# WHEN the node is run
|
84
|
+
node = JSONTemplateNode()
|
85
|
+
outputs = node.run()
|
86
|
+
|
87
|
+
# THEN the output is the expected JSON
|
88
|
+
assert outputs.result == {"key": "value"}
|
89
|
+
|
90
|
+
|
25
91
|
def test_templating_node__execution_count_reference():
|
26
92
|
# GIVEN a random node
|
27
93
|
class OtherNode(BaseNode):
|
@@ -73,9 +73,7 @@ class TryNode(BaseNode[StateType], Generic[StateType], metaclass=_TryNodeMeta):
|
|
73
73
|
def run(self) -> Iterator[BaseOutput]:
|
74
74
|
subworkflow = self.subworkflow(
|
75
75
|
parent_state=self.state,
|
76
|
-
context=WorkflowContext(
|
77
|
-
_vellum_client=self._context._vellum_client,
|
78
|
-
),
|
76
|
+
context=WorkflowContext(vellum_client=self._context.vellum_client),
|
79
77
|
)
|
80
78
|
subworkflow_stream = subworkflow.stream(
|
81
79
|
event_filter=all_workflow_event_filter,
|
@@ -103,7 +103,7 @@ def test_try_node__use_parent_execution_context():
|
|
103
103
|
# WHEN the node is run with a custom vellum client
|
104
104
|
node = TestNode(
|
105
105
|
context=WorkflowContext(
|
106
|
-
|
106
|
+
vellum_client=Vellum(api_key="test-key"),
|
107
107
|
)
|
108
108
|
)
|
109
109
|
outputs = list(node.run())
|
@@ -26,11 +26,11 @@ class BaseAPINode(BaseNode, Generic[StateType]):
|
|
26
26
|
url: str
|
27
27
|
method: APIRequestMethod
|
28
28
|
data: Optional[str] = None
|
29
|
-
json: Optional[
|
29
|
+
json: Optional[Json] = None
|
30
30
|
headers: Optional[Dict[str, Union[str, VellumSecret]]] = None
|
31
31
|
|
32
32
|
class Outputs(BaseOutputs):
|
33
|
-
json: Optional[
|
33
|
+
json: Optional[Json]
|
34
34
|
headers: Dict[str, str]
|
35
35
|
status_code: int
|
36
36
|
text: str
|
@@ -12,6 +12,7 @@ from vellum import (
|
|
12
12
|
SearchWeightsRequest,
|
13
13
|
)
|
14
14
|
from vellum.core import ApiError, RequestOptions
|
15
|
+
from vellum.utils.uuid import is_valid_uuid
|
15
16
|
from vellum.workflows.errors import WorkflowErrorCode
|
16
17
|
from vellum.workflows.exceptions import NodeException
|
17
18
|
from vellum.workflows.nodes.bases import BaseNode
|
@@ -73,11 +74,13 @@ class BaseSearchNode(BaseNode[StateType], Generic[StateType]):
|
|
73
74
|
results: List[SearchResult]
|
74
75
|
|
75
76
|
def _perform_search(self) -> SearchResponse:
|
77
|
+
index_is_uuid = True if isinstance(self.document_index, UUID) else is_valid_uuid(self.document_index)
|
78
|
+
|
76
79
|
try:
|
77
80
|
return self._context.vellum_client.search(
|
78
81
|
query=self.query,
|
79
|
-
index_id=str(self.document_index) if
|
80
|
-
index_name=self.document_index if
|
82
|
+
index_id=str(self.document_index) if index_is_uuid else None,
|
83
|
+
index_name=str(self.document_index) if not index_is_uuid else None,
|
81
84
|
options=self.options,
|
82
85
|
)
|
83
86
|
except NotFoundError:
|
@@ -17,12 +17,13 @@ from vellum.workflows.context import get_parent_context
|
|
17
17
|
from vellum.workflows.errors import WorkflowErrorCode
|
18
18
|
from vellum.workflows.errors.types import workflow_event_error_to_workflow_error
|
19
19
|
from vellum.workflows.exceptions import NodeException
|
20
|
-
from vellum.workflows.nodes.bases.
|
20
|
+
from vellum.workflows.nodes.bases.base import BaseNode
|
21
21
|
from vellum.workflows.outputs.base import BaseOutput
|
22
|
+
from vellum.workflows.types.core import EntityInputsInterface
|
22
23
|
from vellum.workflows.types.generics import StateType
|
23
24
|
|
24
25
|
|
25
|
-
class SubworkflowDeploymentNode(
|
26
|
+
class SubworkflowDeploymentNode(BaseNode[StateType], Generic[StateType]):
|
26
27
|
"""
|
27
28
|
Used to execute a Workflow Deployment.
|
28
29
|
|
@@ -38,6 +39,7 @@ class SubworkflowDeploymentNode(BaseSubworkflowNode[StateType], Generic[StateTyp
|
|
38
39
|
|
39
40
|
# Either the Workflow Deployment's UUID or its name.
|
40
41
|
deployment: ClassVar[Union[UUID, str]]
|
42
|
+
subworkflow_inputs: ClassVar[EntityInputsInterface] = {}
|
41
43
|
|
42
44
|
release_tag: str = LATEST_RELEASE_TAG
|
43
45
|
external_id: Optional[str] = OMIT
|
vellum/workflows/sandbox.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Generic, Sequence
|
1
|
+
from typing import Generic, Sequence
|
2
2
|
|
3
3
|
import dotenv
|
4
4
|
|
@@ -9,8 +9,8 @@ from vellum.workflows.types.generics import WorkflowType
|
|
9
9
|
from vellum.workflows.workflows.event_filters import root_workflow_event_filter
|
10
10
|
|
11
11
|
|
12
|
-
class
|
13
|
-
def __init__(self, workflow:
|
12
|
+
class WorkflowSandboxRunner(Generic[WorkflowType]):
|
13
|
+
def __init__(self, workflow: WorkflowType, inputs: Sequence[BaseInputs]):
|
14
14
|
if not inputs:
|
15
15
|
raise ValueError("Inputs are required to have at least one defined inputs")
|
16
16
|
|
@@ -30,8 +30,7 @@ class SandboxRunner(Generic[WorkflowType]):
|
|
30
30
|
|
31
31
|
selected_inputs = self._inputs[index]
|
32
32
|
|
33
|
-
|
34
|
-
events = workflow.stream(
|
33
|
+
events = self._workflow.stream(
|
35
34
|
inputs=selected_inputs,
|
36
35
|
event_filter=root_workflow_event_filter,
|
37
36
|
)
|
@@ -13,11 +13,12 @@ if TYPE_CHECKING:
|
|
13
13
|
class WorkflowContext:
|
14
14
|
def __init__(
|
15
15
|
self,
|
16
|
-
|
17
|
-
|
16
|
+
*,
|
17
|
+
vellum_client: Optional[Vellum] = None,
|
18
|
+
parent_context: Optional[ParentContext] = None,
|
18
19
|
):
|
19
|
-
self._vellum_client =
|
20
|
-
self._parent_context =
|
20
|
+
self._vellum_client = vellum_client
|
21
|
+
self._parent_context = parent_context
|
21
22
|
self._event_queue: Optional[Queue["WorkflowEvent"]] = None
|
22
23
|
|
23
24
|
@cached_property
|
@@ -3,7 +3,7 @@ from typing import List
|
|
3
3
|
|
4
4
|
from vellum.workflows.inputs.base import BaseInputs
|
5
5
|
from vellum.workflows.nodes.bases.base import BaseNode
|
6
|
-
from vellum.workflows.sandbox import
|
6
|
+
from vellum.workflows.sandbox import WorkflowSandboxRunner
|
7
7
|
from vellum.workflows.state.base import BaseState
|
8
8
|
from vellum.workflows.workflows.base import BaseWorkflow
|
9
9
|
|
@@ -49,7 +49,7 @@ def test_sandbox_runner__happy_path(mock_logger, run_kwargs, expected_last_log):
|
|
49
49
|
]
|
50
50
|
|
51
51
|
# WHEN we run the sandbox
|
52
|
-
runner =
|
52
|
+
runner = WorkflowSandboxRunner(workflow=Workflow(), inputs=inputs)
|
53
53
|
runner.run(**run_kwargs)
|
54
54
|
|
55
55
|
# THEN we see the logs
|
@@ -2,6 +2,7 @@ import pytest
|
|
2
2
|
from typing import List, Optional
|
3
3
|
|
4
4
|
from vellum import ChatMessage, SearchResult
|
5
|
+
from vellum.workflows.types.core import Json
|
5
6
|
from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
|
6
7
|
|
7
8
|
|
@@ -18,6 +19,8 @@ from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_var
|
|
18
19
|
(Optional[List[ChatMessage]], "CHAT_HISTORY"),
|
19
20
|
(List[SearchResult], "SEARCH_RESULTS"),
|
20
21
|
(Optional[List[SearchResult]], "SEARCH_RESULTS"),
|
22
|
+
(Json, "JSON"),
|
23
|
+
(Optional[Json], "JSON"),
|
21
24
|
],
|
22
25
|
)
|
23
26
|
def test_primitive_type_to_vellum_variable_type(type_, expected):
|
@@ -35,14 +35,15 @@ def primitive_type_to_vellum_variable_type(type_: Union[Type, BaseDescriptor]) -
|
|
35
35
|
if len(types) != 1:
|
36
36
|
# Check explicitly for our internal JSON type.
|
37
37
|
# Matches the type found at vellum.workflows.utils.vellum_variables.Json
|
38
|
-
|
38
|
+
actual_types_with_explicit_ref = [
|
39
39
|
bool,
|
40
40
|
int,
|
41
41
|
float,
|
42
42
|
str,
|
43
|
-
typing.List[
|
44
|
-
typing.Dict[str,
|
45
|
-
]
|
43
|
+
typing.List[Json],
|
44
|
+
typing.Dict[str, Json],
|
45
|
+
]
|
46
|
+
if types == actual_types_with_explicit_ref:
|
46
47
|
return "JSON"
|
47
48
|
raise ValueError(f"Expected Descriptor to only have one type, got {types}")
|
48
49
|
|
@@ -121,10 +121,11 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
|
|
121
121
|
|
122
122
|
def __init__(
|
123
123
|
self,
|
124
|
+
*,
|
125
|
+
context: Optional[WorkflowContext] = None,
|
124
126
|
parent_state: Optional[BaseState] = None,
|
125
127
|
emitters: Optional[List[BaseWorkflowEmitter]] = None,
|
126
128
|
resolvers: Optional[List[BaseWorkflowResolver]] = None,
|
127
|
-
context: Optional[WorkflowContext] = None,
|
128
129
|
):
|
129
130
|
self._parent_state = parent_state
|
130
131
|
self.emitters = emitters or (self.emitters if hasattr(self, "emitters") else [])
|
@@ -188,6 +189,7 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
|
|
188
189
|
def run(
|
189
190
|
self,
|
190
191
|
inputs: Optional[WorkflowInputsType] = None,
|
192
|
+
*,
|
191
193
|
state: Optional[StateType] = None,
|
192
194
|
entrypoint_nodes: Optional[RunFromNodeArg] = None,
|
193
195
|
external_inputs: Optional[ExternalInputsArg] = None,
|
@@ -281,8 +283,9 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
|
|
281
283
|
|
282
284
|
def stream(
|
283
285
|
self,
|
284
|
-
event_filter: Optional[Callable[[Type["BaseWorkflow"], WorkflowEvent], bool]] = None,
|
285
286
|
inputs: Optional[WorkflowInputsType] = None,
|
287
|
+
*,
|
288
|
+
event_filter: Optional[Callable[[Type["BaseWorkflow"], WorkflowEvent], bool]] = None,
|
286
289
|
state: Optional[StateType] = None,
|
287
290
|
entrypoint_nodes: Optional[RunFromNodeArg] = None,
|
288
291
|
external_inputs: Optional[ExternalInputsArg] = None,
|
@@ -12,7 +12,7 @@ vellum_cli/tests/conftest.py,sha256=eFGwBxib3Nki830lIFintB0b6r4x8T_KMnmzhlTY5x0,
|
|
12
12
|
vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
|
13
13
|
vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
|
14
14
|
vellum_cli/tests/test_pull.py,sha256=Bnf21VjfiRb_j495idz5N8afucagtiktNCtVMvU8tGs,18977
|
15
|
-
vellum_cli/tests/test_push.py,sha256=
|
15
|
+
vellum_cli/tests/test_push.py,sha256=NpwGXuZSzrR7B6hBO1UF9O8im13_LlpSqncVSdzYDiQ,5812
|
16
16
|
vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
17
|
vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
18
18
|
vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -34,7 +34,7 @@ vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=ygTjSjYDI4DtkxADWu
|
|
34
34
|
vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=t5iJQVoRT5g-v2IiUb4kFYdvUVKch0zn27016pzDZoo,2761
|
35
35
|
vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=3TJvHX_Uuf_gr94VkYc_zmNH8I5p71ChIeoAbJZ3ddY,2158
|
36
36
|
vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=DYhxHgFT06CNCpovO4Z-wFPqCjFKxyl89ygFs8AucRQ,7189
|
37
|
-
vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=
|
37
|
+
vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=IqPQdlxLdaMirgDbOSxq17d8bolqqjjRPy4t3YCBhmc,5028
|
38
38
|
vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=AqUlItgSZij12qRKguKVmDbbaLuDy3Cdom5uOlJPqrc,3640
|
39
39
|
vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=jzO63B9KiEAncnBqmz2ZTcxjmEHozMEe7WnfpcpsQYg,3195
|
40
40
|
vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=9VpC3h0RYOxJuRbjDwidBYlLKakkmlEnDMBh2C7lHcY,1107
|
@@ -60,6 +60,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_s
|
|
60
60
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=NkpgaTbu6nLr3iwgsSNtiHyiNDCUaFakd1JaoW6CC6Y,9489
|
61
61
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=9R6ELHBn9tsp3cy15q1qp1OByyCxFOVdrM67EwCYY50,12984
|
62
62
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=8bz0vm_EyQKSjnwS5vqqgnjE9ygvm-CaPKcwCfeOrlo,12704
|
63
|
+
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=6LrGPS7e9CWpjFq2hpliSzP9kDpZ9KqvBNlNO3sq8cs,8063
|
63
64
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=xG8nKA1iKXxUe1fnD2X6qm7cUGW14iq2P-L16zhcKC8,4271
|
64
65
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=1_02RbghUwhKMr8VtRaPjHOXAX59hgWw1rJ2EDyKs-E,2880
|
65
66
|
vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=BGCgJ3WWiYK5fWJp_Yz-aWQPli5sIKOhLTVYfG9Tpq8,9177
|
@@ -76,7 +77,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
|
|
76
77
|
vellum/client/__init__.py,sha256=o4m7iRZWEV8rP3GkdaztHAjNmjxjWERlarviFoHzuKI,110927
|
77
78
|
vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
|
78
79
|
vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
|
79
|
-
vellum/client/core/client_wrapper.py,sha256=
|
80
|
+
vellum/client/core/client_wrapper.py,sha256=W6xaTM0O9LGmf_593EW5mnu33zCfMxGoWxp7zMTtbok,1868
|
80
81
|
vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
|
81
82
|
vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
|
82
83
|
vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
|
@@ -649,19 +650,18 @@ vellum/errors/not_found_error.py,sha256=gC71YBdPyHR46l3RNTs0v9taVvAY0gWRFrcKpKzb
|
|
649
650
|
vellum/evaluations/__init__.py,sha256=hNsLoHSykqXDJP-MwFvu2lExImxo9KEyEJjt_fdAzpE,77
|
650
651
|
vellum/evaluations/constants.py,sha256=Vteml4_csZsMgo_q3-71E3JRCAoN6308TXLu5nfLhmU,116
|
651
652
|
vellum/evaluations/exceptions.py,sha256=6Xacoyv43fJvVf6Dt6Io5a-f9vF12Tx51jzsQRNSqhY,56
|
652
|
-
vellum/evaluations/resources.py,sha256=
|
653
|
+
vellum/evaluations/resources.py,sha256=7xS4eYeRLLz44KLMDL0wwIY80wMy2carFREB85k_Avk,12664
|
653
654
|
vellum/evaluations/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
654
655
|
vellum/evaluations/utils/env.py,sha256=Xj_nxsoU5ox06EOTjRopR4lrigQI6Le6qbWGltYoEGU,276
|
655
656
|
vellum/evaluations/utils/exceptions.py,sha256=dXMAkzqbHV_AP5FjjbegPlfUE0zQDlpA3qOsoOJUxfg,49
|
656
657
|
vellum/evaluations/utils/paginator.py,sha256=rEED_BJAXAM6tM1yMwHePNzszjq_tTq4NbQvi1jWQ_Q,697
|
657
|
-
vellum/evaluations/utils/uuid.py,sha256=Ch6wWRgwICxLxJCTl5iE3EdRlZj2zADR-zUMUtjcMWM,214
|
658
658
|
vellum/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
659
659
|
vellum/plugins/pydantic.py,sha256=EbI0pJMhUS9rLPSkzmAELfnCHrWCJzOrU06T8ommwdw,2334
|
660
660
|
vellum/plugins/utils.py,sha256=U9ZY9KdE3RRvbcG01hXxu9CvfJD6Fo7nJDgcHjQn0FI,606
|
661
661
|
vellum/plugins/vellum_mypy.py,sha256=VC15EzjTsXOb9uF1bky4rcxePP-0epMVmCsLB2z4Dh8,24816
|
662
662
|
vellum/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
663
663
|
vellum/prompts/blocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
664
|
-
vellum/prompts/blocks/compilation.py,sha256=
|
664
|
+
vellum/prompts/blocks/compilation.py,sha256=GVxV0iaVp72RCNMlLtUasfg25jBjbeEu3u97QUSbrQo,7506
|
665
665
|
vellum/prompts/blocks/exceptions.py,sha256=vmk5PV6Vyw9nKjZYQDUDW0LH8MfQNIgFvFb_mFWdIRI,50
|
666
666
|
vellum/prompts/blocks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
667
667
|
vellum/prompts/blocks/tests/test_compilation.py,sha256=0DhMoc4huHR6YnNL-0aBLmWSyUfw2BpRq_gEdKsQmAc,3693
|
@@ -1210,6 +1210,7 @@ vellum/utils/templating/custom_filters.py,sha256=Q0DahYRHP4KfaUXDt9XxN-DFLBrAxlv
|
|
1210
1210
|
vellum/utils/templating/exceptions.py,sha256=cDp140PP4OnInW4qAvg3KqiSiF70C71UyEAKRBR1Abo,46
|
1211
1211
|
vellum/utils/templating/render.py,sha256=0vgkwhu2A6o64aT4fUdTSLFCEMbeRjAKAuvv2k2LYGY,1772
|
1212
1212
|
vellum/utils/typing.py,sha256=wx_daFqD69cYkuJTVnvNrpjhqC3uuhbnyJ9_bIwC9OU,327
|
1213
|
+
vellum/utils/uuid.py,sha256=Ch6wWRgwICxLxJCTl5iE3EdRlZj2zADR-zUMUtjcMWM,214
|
1213
1214
|
vellum/version.py,sha256=jq-1PlAYxN9AXuaZqbYk9ak27SgE2lw9Ia5gx1b1gVI,76
|
1214
1215
|
vellum/workflows/README.md,sha256=MLNm-ihc0ao6I8gwwOhXQQBf0jOf-EsA9C519ALYI1o,3610
|
1215
1216
|
vellum/workflows/__init__.py,sha256=CssPsbNvN6rDhoLuqpEv7MMKGa51vE6dvAh6U31Pcio,71
|
@@ -1271,19 +1272,19 @@ vellum/workflows/inputs/__init__.py,sha256=AbFEteIYEvCb14fM3EK7bhM-40-6s494rSlIh
|
|
1271
1272
|
vellum/workflows/inputs/base.py,sha256=1kMgr0WqCYdWUqgFvgSoAMw2067FAlgwhGXLgbIOrLY,2391
|
1272
1273
|
vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
|
1273
1274
|
vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
|
1274
|
-
vellum/workflows/nodes/bases/__init__.py,sha256=
|
1275
|
-
vellum/workflows/nodes/bases/base.py,sha256=
|
1276
|
-
vellum/workflows/nodes/bases/base_subworkflow_node/__init__.py,sha256=0nkHQiFC4IpA1ZGx60XG0BLUWF6hwUpgqmS3ZrlFGhg,80
|
1277
|
-
vellum/workflows/nodes/bases/base_subworkflow_node/node.py,sha256=vC0gUBQewAUNtP3i2G0-LUpE_kY-r_ijBD_tS1XkQ1E,383
|
1275
|
+
vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
|
1276
|
+
vellum/workflows/nodes/bases/base.py,sha256=_Ms_Yov6sIsgWnKb0OWnOG7liqgjFSat0y1OIX36hFA,14235
|
1278
1277
|
vellum/workflows/nodes/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1279
1278
|
vellum/workflows/nodes/bases/tests/test_base_node.py,sha256=ghpLm_ljNBxWs43GlvIId47hOVwKU50XpvZxmlg6_8g,3439
|
1280
1279
|
vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT9JL18-mRR4,455
|
1281
1280
|
vellum/workflows/nodes/core/error_node/__init__.py,sha256=g7RRnlHhqu4qByfLjBwCunmgGA8dI5gNsjS3h6TwlSI,60
|
1282
1281
|
vellum/workflows/nodes/core/error_node/node.py,sha256=MFHU5vITYSK-L9CuMZ49In2ZeNLWnhZD0f8r5dWvb5Y,1270
|
1283
1282
|
vellum/workflows/nodes/core/inline_subworkflow_node/__init__.py,sha256=nKNEH1QTl-1PcvmYoqSWEl0-t6gAur8GLTXHzklRQfM,84
|
1284
|
-
vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=
|
1283
|
+
vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=btscTP3T5VzvuNpbzaUlRZ1ahMkTox0Vyv17tI7YFUw,3467
|
1284
|
+
vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1285
|
+
vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=99LLPgHMqohGL-G4KqOSjeVlDR_FH8Rv1gtRii85MC4,1143
|
1285
1286
|
vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
|
1286
|
-
vellum/workflows/nodes/core/map_node/node.py,sha256=
|
1287
|
+
vellum/workflows/nodes/core/map_node/node.py,sha256=5Bqi0co1T9Ex_sTlyTDMGahwsUWd9NCO0vTY6UqsZeQ,7286
|
1287
1288
|
vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1288
1289
|
vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=RHSZs7t6mW3UWvRrXnHZqaXVdRT2ZquOK_YHJ-gzXsU,1871
|
1289
1290
|
vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
|
@@ -1291,25 +1292,25 @@ vellum/workflows/nodes/core/retry_node/node.py,sha256=IjNcpzFmHyBUjOHEoULLbKf85B
|
|
1291
1292
|
vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1292
1293
|
vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=QXTnHwmJHISxXjvZMeuuEo0iVugVMJyaJoggI8yKXfI,3132
|
1293
1294
|
vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
|
1294
|
-
vellum/workflows/nodes/core/templating_node/node.py,sha256=
|
1295
|
-
vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=
|
1295
|
+
vellum/workflows/nodes/core/templating_node/node.py,sha256=N-NOBd-UY91qO9orCcW4KEbhNvDQivZPA-PCxs-M0RM,4204
|
1296
|
+
vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=nW_kyJ9RAqz45_kJE_rlhOOvbV4OO3hecP-P-ydQpkw,2845
|
1296
1297
|
vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
|
1297
|
-
vellum/workflows/nodes/core/try_node/node.py,sha256=
|
1298
|
+
vellum/workflows/nodes/core/try_node/node.py,sha256=e4gavIJ9AHM0JCKOrBIeKC4aHxmJK3j17XTBaipqfpc,6637
|
1298
1299
|
vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1299
|
-
vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=
|
1300
|
+
vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=Wc2kLl-MkffsBxl3IiFaqLd16e2Iosxhk7qBnojPvQg,4092
|
1300
1301
|
vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
|
1301
1302
|
vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
|
1302
1303
|
vellum/workflows/nodes/displayable/api_node/node.py,sha256=ehvJNkI-L_WLn8pszCaRkQuhRDgioCLaX6TT72KM_9E,2111
|
1303
1304
|
vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
|
1304
1305
|
vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
|
1305
|
-
vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=
|
1306
|
+
vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=ywPwCxDesgnE86Wjyf2ZyG2Dr2O7xW8D4tPHZB5Se_s,2477
|
1306
1307
|
vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
|
1307
1308
|
vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=EvylK1rGKpd4iiooEW9O5A9Q8DMTtBwETe_GtQT8M-E,2139
|
1308
1309
|
vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
|
1309
1310
|
vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
|
1310
1311
|
vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=fypgmZHgaDtGqSBC8rjYiyryJ0H58LPt_CafLfAprO0,6341
|
1311
1312
|
vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=zdpNJoawB5PedsCCfgOGDDoWuif0jNtlV-K9sFL6cNQ,4968
|
1312
|
-
vellum/workflows/nodes/displayable/bases/search_node.py,sha256=
|
1313
|
+
vellum/workflows/nodes/displayable/bases/search_node.py,sha256=Gq6CqvTxg4TPm7OBbAA9wnuSwtiKoxFINjMHX-_oNdE,3687
|
1313
1314
|
vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
|
1314
1315
|
vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=JgyTgZRSb-gSXL4ccHn4VkPcPZFOkVK5ohPazPqSWFw,8652
|
1315
1316
|
vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -1336,7 +1337,7 @@ vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=cpOrqQQ
|
|
1336
1337
|
vellum/workflows/nodes/displayable/search_node/__init__.py,sha256=hpBpvbrDYf43DElRZFLzieSn8weXiwNiiNOJurERQbs,62
|
1337
1338
|
vellum/workflows/nodes/displayable/search_node/node.py,sha256=yhFWulbNmSQoDAwtTSGD4AtKmBbcykezRGRG16xga_0,1311
|
1338
1339
|
vellum/workflows/nodes/displayable/subworkflow_deployment_node/__init__.py,sha256=9yYM6001YZeqI1VOk1QuEM_yrffk_EdsO7qaPzINKds,92
|
1339
|
-
vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=
|
1340
|
+
vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=FgS1ZMnIBliqEMNKX2ChE80bw4IVHEQ6IGiTDvF0RZw,7226
|
1340
1341
|
vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1341
1342
|
vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=UI_RMmXn9qwB-StnFPvkDd9FctBQAg43wrfouqvPepk,4701
|
1342
1343
|
vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=4CMwDtXwTaEvFfDpA6j2iLqc7S6IICSkvVZOobEpeps,6954
|
@@ -1367,16 +1368,16 @@ vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPyc
|
|
1367
1368
|
vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
|
1368
1369
|
vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
|
1369
1370
|
vellum/workflows/runner/runner.py,sha256=RXnLEmSJFbp0u4vKF7rvD2fscuYfcRYkspIJINnvFAI,27607
|
1370
|
-
vellum/workflows/sandbox.py,sha256=
|
1371
|
+
vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2235
|
1371
1372
|
vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
|
1372
1373
|
vellum/workflows/state/base.py,sha256=jpSzF1OQd3-fqi6dMGlNsQl-7JnJxCdzWIigmX8Wz-I,14425
|
1373
|
-
vellum/workflows/state/context.py,sha256=
|
1374
|
+
vellum/workflows/state/context.py,sha256=_NeGQpYo8yNuh0Tfh3OvcB_bG_-GC8b3ZLLl83Pf8-I,1279
|
1374
1375
|
vellum/workflows/state/encoder.py,sha256=kRrqwD0vFCiSRZR3rg8Sjkh8sDEerQQhlvmdSYQAOl8,1741
|
1375
1376
|
vellum/workflows/state/store.py,sha256=VYGBQgN1bpd1as5eGiouV_7scg8QsRs4_1aqZAGIsRQ,793
|
1376
1377
|
vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1377
1378
|
vellum/workflows/state/tests/test_state.py,sha256=BQjcdREIK1MPuGhivRUgpynVJLftjEpH9RG3cRKxQEY,3310
|
1378
1379
|
vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1379
|
-
vellum/workflows/tests/test_sandbox.py,sha256=
|
1380
|
+
vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
|
1380
1381
|
vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
|
1381
1382
|
vellum/workflows/types/core.py,sha256=D2NcSBwGgWj_mtXZqe3KnEQcb5qd5HzqAwnxwmlCfCw,899
|
1382
1383
|
vellum/workflows/types/generics.py,sha256=ZkfoRhWs042i5IjA99v2wIhmh1u-Wieo3LzosgGWJVk,600
|
@@ -1391,15 +1392,15 @@ vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
1391
1392
|
vellum/workflows/utils/tests/test_functions.py,sha256=ytdruS55aO2egsb5sAv8_9jf68L1cJoZu2uKV2iamrg,8083
|
1392
1393
|
vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
|
1393
1394
|
vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
|
1394
|
-
vellum/workflows/utils/tests/test_vellum_variables.py,sha256=
|
1395
|
+
vellum/workflows/utils/tests/test_vellum_variables.py,sha256=6H-BpmbIEmVRO75QQ3Rfy4bEUMMP2qwGzx2Gp1uXbfw,879
|
1395
1396
|
vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrgTY,739
|
1396
|
-
vellum/workflows/utils/vellum_variables.py,sha256=
|
1397
|
+
vellum/workflows/utils/vellum_variables.py,sha256=g5xHYB8etfHE32ek19nP6Anf8NyjhmUtOwO2KmQ5xZU,3111
|
1397
1398
|
vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
|
1398
1399
|
vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
|
1399
|
-
vellum/workflows/workflows/base.py,sha256=
|
1400
|
+
vellum/workflows/workflows/base.py,sha256=FxK6ZNrQtuqcgZxWXy4_ole1LeeTiZI8VlxavRd3VbA,17119
|
1400
1401
|
vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
|
1401
|
-
vellum_ai-0.12.
|
1402
|
-
vellum_ai-0.12.
|
1403
|
-
vellum_ai-0.12.
|
1404
|
-
vellum_ai-0.12.
|
1405
|
-
vellum_ai-0.12.
|
1402
|
+
vellum_ai-0.12.9.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
|
1403
|
+
vellum_ai-0.12.9.dist-info/METADATA,sha256=XnLz57ZnuFRq6HV_sXjLRLt2cBE7jKWY0HoCKn7G1Fs,5160
|
1404
|
+
vellum_ai-0.12.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
1405
|
+
vellum_ai-0.12.9.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
|
1406
|
+
vellum_ai-0.12.9.dist-info/RECORD,,
|
vellum_cli/tests/test_push.py
CHANGED
@@ -8,7 +8,7 @@ from uuid import uuid4
|
|
8
8
|
from click.testing import CliRunner
|
9
9
|
|
10
10
|
from vellum.client.types.workflow_push_response import WorkflowPushResponse
|
11
|
-
from vellum.
|
11
|
+
from vellum.utils.uuid import is_valid_uuid
|
12
12
|
from vellum_cli import main as cli_main
|
13
13
|
|
14
14
|
|
@@ -61,6 +61,11 @@ class BaseInlineSubworkflowNodeDisplay(
|
|
61
61
|
display_context: WorkflowDisplayContext,
|
62
62
|
) -> Tuple[List[NodeInput], List[VellumVariable]]:
|
63
63
|
subworkflow_inputs = raise_if_descriptor(node.subworkflow_inputs)
|
64
|
+
subworkflow_entries = (
|
65
|
+
[(variable_name, variable_value) for variable_name, variable_value in subworkflow_inputs.items()]
|
66
|
+
if isinstance(subworkflow_inputs, dict)
|
67
|
+
else [(variable_ref.name, variable_value) for variable_ref, variable_value in subworkflow_inputs]
|
68
|
+
)
|
64
69
|
node_inputs = [
|
65
70
|
create_node_input(
|
66
71
|
node_id=node_id,
|
@@ -69,7 +74,7 @@ class BaseInlineSubworkflowNodeDisplay(
|
|
69
74
|
display_context=display_context,
|
70
75
|
input_id=self.workflow_input_ids_by_name.get(variable_name),
|
71
76
|
)
|
72
|
-
for variable_name, variable_value in
|
77
|
+
for variable_name, variable_value in subworkflow_entries
|
73
78
|
]
|
74
79
|
node_inputs_by_key = {node_input.key: node_input for node_input in node_inputs}
|
75
80
|
workflow_inputs = [
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py
ADDED
@@ -0,0 +1,207 @@
|
|
1
|
+
from deepdiff import DeepDiff
|
2
|
+
|
3
|
+
from vellum_ee.workflows.display.workflows import VellumWorkflowDisplay
|
4
|
+
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
|
5
|
+
|
6
|
+
from tests.workflows.basic_templating_node.workflow_with_json_input import BasicTemplatingNodeWorkflowWithJson
|
7
|
+
|
8
|
+
|
9
|
+
def test_serialize_workflow():
|
10
|
+
# GIVEN a Workflow that uses a vellum templating node",
|
11
|
+
|
12
|
+
# WHEN we serialize it
|
13
|
+
workflow_display = get_workflow_display(
|
14
|
+
base_display_class=VellumWorkflowDisplay, workflow_class=BasicTemplatingNodeWorkflowWithJson
|
15
|
+
)
|
16
|
+
|
17
|
+
serialized_workflow: dict = workflow_display.serialize()
|
18
|
+
|
19
|
+
# THEN we should get a serialized representation of the Workflow
|
20
|
+
assert serialized_workflow.keys() == {
|
21
|
+
"workflow_raw_data",
|
22
|
+
"input_variables",
|
23
|
+
"output_variables",
|
24
|
+
}
|
25
|
+
|
26
|
+
# AND its input variables should be what we expect
|
27
|
+
input_variables = serialized_workflow["input_variables"]
|
28
|
+
assert len(input_variables) == 1
|
29
|
+
assert input_variables == [
|
30
|
+
{
|
31
|
+
"id": "f4435f88-703f-40e5-9197-d39b0e43ab72",
|
32
|
+
"key": "info",
|
33
|
+
"type": "JSON",
|
34
|
+
"default": None,
|
35
|
+
"required": True,
|
36
|
+
"extensions": {"color": None},
|
37
|
+
}
|
38
|
+
]
|
39
|
+
|
40
|
+
# AND its output variables should be what we expect
|
41
|
+
output_variables = serialized_workflow["output_variables"]
|
42
|
+
assert len(output_variables) == 1
|
43
|
+
assert not DeepDiff(
|
44
|
+
[{"id": "62ec9b08-6437-4f8d-bc20-983d317bc348", "key": "result", "type": "JSON"}],
|
45
|
+
output_variables,
|
46
|
+
ignore_order=True,
|
47
|
+
)
|
48
|
+
|
49
|
+
# AND its raw data should be what we expect
|
50
|
+
workflow_raw_data = serialized_workflow["workflow_raw_data"]
|
51
|
+
assert workflow_raw_data.keys() == {"edges", "nodes", "display_data", "definition"}
|
52
|
+
assert len(workflow_raw_data["edges"]) == 2
|
53
|
+
assert len(workflow_raw_data["nodes"]) == 3
|
54
|
+
|
55
|
+
# AND each node should be serialized correctly
|
56
|
+
entrypoint_node = workflow_raw_data["nodes"][0]
|
57
|
+
assert entrypoint_node == {
|
58
|
+
"id": "09579c0a-acbf-4e04-8724-2230a8aa6534",
|
59
|
+
"type": "ENTRYPOINT",
|
60
|
+
"inputs": [],
|
61
|
+
"data": {"label": "Entrypoint Node", "source_handle_id": "34069190-0942-4e0c-8700-b33b9dea4ea0"},
|
62
|
+
"display_data": {"position": {"x": 0.0, "y": 0.0}},
|
63
|
+
"definition": {"name": "BaseNode", "module": ["vellum", "workflows", "nodes", "bases", "base"], "bases": []},
|
64
|
+
}
|
65
|
+
|
66
|
+
templating_node = workflow_raw_data["nodes"][1]
|
67
|
+
assert not DeepDiff(
|
68
|
+
{
|
69
|
+
"id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
|
70
|
+
"type": "TEMPLATING",
|
71
|
+
"inputs": [
|
72
|
+
{
|
73
|
+
"id": "7c775379-d589-4d79-b876-dcd224d72966",
|
74
|
+
"key": "template",
|
75
|
+
"value": {
|
76
|
+
"rules": [
|
77
|
+
{
|
78
|
+
"type": "CONSTANT_VALUE",
|
79
|
+
"data": {"type": "STRING", "value": "The meaning of {{ info }} is not known"},
|
80
|
+
}
|
81
|
+
],
|
82
|
+
"combinator": "OR",
|
83
|
+
},
|
84
|
+
},
|
85
|
+
{
|
86
|
+
"id": "bb712499-4265-4d71-bc14-0c3d8ca6a7de",
|
87
|
+
"key": "info",
|
88
|
+
"value": {
|
89
|
+
"rules": [
|
90
|
+
{
|
91
|
+
"type": "INPUT_VARIABLE",
|
92
|
+
"data": {"input_variable_id": "f4435f88-703f-40e5-9197-d39b0e43ab72"},
|
93
|
+
}
|
94
|
+
],
|
95
|
+
"combinator": "OR",
|
96
|
+
},
|
97
|
+
},
|
98
|
+
],
|
99
|
+
"data": {
|
100
|
+
"label": "Example Templating Node",
|
101
|
+
"output_id": "6834cae4-8173-4fa6-88f7-bc09d335bdd1",
|
102
|
+
"error_output_id": None,
|
103
|
+
"source_handle_id": "39317827-df43-4f5a-bfbc-20bffc839748",
|
104
|
+
"target_handle_id": "58427684-3848-498a-8299-c6b0fc70265d",
|
105
|
+
"template_node_input_id": "7c775379-d589-4d79-b876-dcd224d72966",
|
106
|
+
"output_type": "JSON",
|
107
|
+
},
|
108
|
+
"display_data": {"position": {"x": 0.0, "y": 0.0}},
|
109
|
+
"definition": {
|
110
|
+
"name": "ExampleTemplatingNode",
|
111
|
+
"module": ["tests", "workflows", "basic_templating_node", "workflow_with_json_input"],
|
112
|
+
"bases": [
|
113
|
+
{
|
114
|
+
"name": "TemplatingNode",
|
115
|
+
"module": ["vellum", "workflows", "nodes", "core", "templating_node", "node"],
|
116
|
+
}
|
117
|
+
],
|
118
|
+
},
|
119
|
+
},
|
120
|
+
templating_node,
|
121
|
+
)
|
122
|
+
|
123
|
+
final_output_node = workflow_raw_data["nodes"][-1]
|
124
|
+
assert not DeepDiff(
|
125
|
+
{
|
126
|
+
"id": "9f75228b-1d5b-4c30-a581-6087e6a1b738",
|
127
|
+
"type": "TERMINAL",
|
128
|
+
"data": {
|
129
|
+
"label": "Final Output",
|
130
|
+
"name": "result",
|
131
|
+
"target_handle_id": "16ba108e-61a8-4338-8a5b-4f1278d7fd7b",
|
132
|
+
"output_id": "62ec9b08-6437-4f8d-bc20-983d317bc348",
|
133
|
+
"output_type": "JSON",
|
134
|
+
"node_input_id": "310072db-6d07-4d29-8e5c-9c6909300925",
|
135
|
+
},
|
136
|
+
"inputs": [
|
137
|
+
{
|
138
|
+
"id": "310072db-6d07-4d29-8e5c-9c6909300925",
|
139
|
+
"key": "node_input",
|
140
|
+
"value": {
|
141
|
+
"rules": [
|
142
|
+
{
|
143
|
+
"type": "NODE_OUTPUT",
|
144
|
+
"data": {
|
145
|
+
"node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
|
146
|
+
"output_id": "6834cae4-8173-4fa6-88f7-bc09d335bdd1",
|
147
|
+
},
|
148
|
+
}
|
149
|
+
],
|
150
|
+
"combinator": "OR",
|
151
|
+
},
|
152
|
+
}
|
153
|
+
],
|
154
|
+
"display_data": {"position": {"x": 0.0, "y": 0.0}},
|
155
|
+
"definition": {
|
156
|
+
"name": "FinalOutputNode",
|
157
|
+
"module": ["vellum", "workflows", "nodes", "displayable", "final_output_node", "node"],
|
158
|
+
"bases": [
|
159
|
+
{"name": "BaseNode", "module": ["vellum", "workflows", "nodes", "bases", "base"], "bases": []}
|
160
|
+
],
|
161
|
+
},
|
162
|
+
},
|
163
|
+
final_output_node,
|
164
|
+
ignore_order=True,
|
165
|
+
)
|
166
|
+
|
167
|
+
# AND each edge should be serialized correctly
|
168
|
+
serialized_edges = workflow_raw_data["edges"]
|
169
|
+
assert not DeepDiff(
|
170
|
+
[
|
171
|
+
{
|
172
|
+
"id": "9f753b40-68de-4186-838e-806a14853935",
|
173
|
+
"source_node_id": "09579c0a-acbf-4e04-8724-2230a8aa6534",
|
174
|
+
"source_handle_id": "34069190-0942-4e0c-8700-b33b9dea4ea0",
|
175
|
+
"target_node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
|
176
|
+
"target_handle_id": "58427684-3848-498a-8299-c6b0fc70265d",
|
177
|
+
"type": "DEFAULT",
|
178
|
+
},
|
179
|
+
{
|
180
|
+
"id": "00cbff5c-5cce-4ef4-81b2-1a11d9b42597",
|
181
|
+
"source_node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
|
182
|
+
"source_handle_id": "39317827-df43-4f5a-bfbc-20bffc839748",
|
183
|
+
"target_node_id": "9f75228b-1d5b-4c30-a581-6087e6a1b738",
|
184
|
+
"target_handle_id": "16ba108e-61a8-4338-8a5b-4f1278d7fd7b",
|
185
|
+
"type": "DEFAULT",
|
186
|
+
},
|
187
|
+
],
|
188
|
+
serialized_edges,
|
189
|
+
ignore_order=True,
|
190
|
+
)
|
191
|
+
|
192
|
+
# AND the display data should be what we expect
|
193
|
+
display_data = workflow_raw_data["display_data"]
|
194
|
+
assert display_data == {
|
195
|
+
"viewport": {
|
196
|
+
"x": 0.0,
|
197
|
+
"y": 0.0,
|
198
|
+
"zoom": 1.0,
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
# AND the definition should be what we expect
|
203
|
+
definition = workflow_raw_data["definition"]
|
204
|
+
assert definition == {
|
205
|
+
"name": "BasicTemplatingNodeWorkflowWithJson",
|
206
|
+
"module": ["tests", "workflows", "basic_templating_node", "workflow_with_json_input"],
|
207
|
+
}
|
@@ -1,10 +0,0 @@
|
|
1
|
-
from typing import ClassVar, Generic
|
2
|
-
|
3
|
-
from vellum.workflows.nodes.bases import BaseNode
|
4
|
-
from vellum.workflows.types.core import EntityInputsInterface
|
5
|
-
from vellum.workflows.types.generics import StateType
|
6
|
-
|
7
|
-
|
8
|
-
class BaseSubworkflowNode(BaseNode[StateType], Generic[StateType]):
|
9
|
-
# Inputs that are passed to the Subworkflow
|
10
|
-
subworkflow_inputs: ClassVar[EntityInputsInterface] = {}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|