vellum-ai 0.13.0__py3-none-any.whl → 0.13.2__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- vellum/client/core/client_wrapper.py +1 -1
- vellum/client/core/pydantic_utilities.py +5 -0
- vellum/client/resources/workflows/client.py +8 -0
- vellum/client/types/logical_operator.py +2 -0
- vellum/workflows/descriptors/base.py +1 -1
- vellum/workflows/descriptors/tests/test_utils.py +3 -0
- vellum/workflows/expressions/accessor.py +8 -2
- vellum/workflows/nodes/core/map_node/node.py +49 -24
- vellum/workflows/nodes/core/map_node/tests/test_node.py +4 -4
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +1 -1
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +5 -3
- vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +3 -0
- vellum/workflows/nodes/displayable/bases/search_node.py +37 -2
- vellum/workflows/nodes/displayable/bases/tests/__init__.py +0 -0
- vellum/workflows/nodes/displayable/bases/tests/test_utils.py +61 -0
- vellum/workflows/nodes/displayable/bases/types.py +42 -0
- vellum/workflows/nodes/displayable/bases/utils.py +112 -0
- vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +0 -1
- vellum/workflows/nodes/displayable/search_node/tests/__init__.py +0 -0
- vellum/workflows/nodes/displayable/search_node/tests/test_node.py +164 -0
- vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +2 -3
- vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +0 -1
- vellum/workflows/runner/runner.py +37 -4
- vellum/workflows/types/tests/test_utils.py +5 -2
- vellum/workflows/types/utils.py +4 -0
- vellum/workflows/workflows/base.py +14 -0
- {vellum_ai-0.13.0.dist-info → vellum_ai-0.13.2.dist-info}/METADATA +1 -1
- {vellum_ai-0.13.0.dist-info → vellum_ai-0.13.2.dist-info}/RECORD +53 -42
- vellum_cli/__init__.py +24 -0
- vellum_cli/ping.py +28 -0
- vellum_cli/push.py +62 -12
- vellum_cli/tests/test_ping.py +47 -0
- vellum_cli/tests/test_push.py +76 -0
- vellum_ee/workflows/display/nodes/vellum/base_node.py +59 -11
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +3 -0
- vellum_ee/workflows/display/nodes/vellum/map_node.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +14 -10
- vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/utils.py +8 -1
- vellum_ee/workflows/display/tests/test_vellum_workflow_display.py +48 -0
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +67 -0
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +286 -0
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +177 -0
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +666 -14
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +7 -8
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +35 -2
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +29 -2
- vellum_ee/workflows/display/utils/vellum.py +4 -42
- vellum_ee/workflows/display/vellum.py +7 -36
- vellum_ee/workflows/display/workflows/vellum_workflow_display.py +5 -2
- {vellum_ai-0.13.0.dist-info → vellum_ai-0.13.2.dist-info}/LICENSE +0 -0
- {vellum_ai-0.13.0.dist-info → vellum_ai-0.13.2.dist-info}/WHEEL +0 -0
- {vellum_ai-0.13.0.dist-info → vellum_ai-0.13.2.dist-info}/entry_points.txt +0 -0
vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py
CHANGED
@@ -10,8 +10,7 @@ class Inputs(BaseInputs):
|
|
10
10
|
|
11
11
|
|
12
12
|
class BasicGenericNode(BaseNode):
|
13
|
-
|
14
|
-
output = Inputs.input
|
13
|
+
pass
|
15
14
|
|
16
15
|
|
17
16
|
def test_serialize_node__basic(serialize_node):
|
@@ -39,11 +38,13 @@ def test_serialize_node__basic(serialize_node):
|
|
39
38
|
"ports": [
|
40
39
|
{
|
41
40
|
"id": "4fbf0fff-a42e-4410-852a-238b5059198e",
|
41
|
+
"name": "default",
|
42
42
|
"type": "DEFAULT",
|
43
43
|
}
|
44
44
|
],
|
45
45
|
"adornments": None,
|
46
46
|
"attributes": [],
|
47
|
+
"outputs": [],
|
47
48
|
},
|
48
49
|
serialized_node,
|
49
50
|
ignore_order=True,
|
@@ -51,9 +52,6 @@ def test_serialize_node__basic(serialize_node):
|
|
51
52
|
|
52
53
|
|
53
54
|
class AwaitAnyGenericNode(BaseNode):
|
54
|
-
class Outputs(BaseNode.Outputs):
|
55
|
-
output = Inputs.input
|
56
|
-
|
57
55
|
class Trigger(BaseNode.Trigger):
|
58
56
|
merge_behavior = MergeBehavior.AWAIT_ANY
|
59
57
|
|
@@ -83,11 +81,13 @@ def test_serialize_node__await_any(serialize_node):
|
|
83
81
|
"ports": [
|
84
82
|
{
|
85
83
|
"id": "3e219c0a-e5f8-443a-ac78-1a458b189009",
|
84
|
+
"name": "default",
|
86
85
|
"type": "DEFAULT",
|
87
86
|
}
|
88
87
|
],
|
89
88
|
"adornments": None,
|
90
89
|
"attributes": [],
|
90
|
+
"outputs": [],
|
91
91
|
},
|
92
92
|
serialized_node,
|
93
93
|
ignore_order=True,
|
@@ -95,9 +95,6 @@ def test_serialize_node__await_any(serialize_node):
|
|
95
95
|
|
96
96
|
|
97
97
|
class AwaitAllGenericNode(BaseNode):
|
98
|
-
class Outputs(BaseNode.Outputs):
|
99
|
-
output = Inputs.input
|
100
|
-
|
101
98
|
class Trigger(BaseNode.Trigger):
|
102
99
|
merge_behavior = MergeBehavior.AWAIT_ALL
|
103
100
|
|
@@ -127,11 +124,13 @@ def test_serialize_node__await_all(serialize_node):
|
|
127
124
|
"ports": [
|
128
125
|
{
|
129
126
|
"id": "9797e93f-9fe6-48b2-a48e-476abbd20e32",
|
127
|
+
"name": "default",
|
130
128
|
"type": "DEFAULT",
|
131
129
|
}
|
132
130
|
],
|
133
131
|
"adornments": None,
|
134
132
|
"attributes": [],
|
133
|
+
"outputs": [],
|
135
134
|
},
|
136
135
|
serialized_node,
|
137
136
|
ignore_order=True,
|
@@ -141,9 +141,42 @@ def test_serialize_workflow():
|
|
141
141
|
"module": ["tests", "workflows", "basic_inline_subworkflow", "workflow"],
|
142
142
|
},
|
143
143
|
"trigger": {"id": "a95a34f2-e894-4fb6-a2c9-15d12c1e3135", "merge_behavior": "AWAIT_ANY"},
|
144
|
-
"ports": [
|
144
|
+
"ports": [
|
145
|
+
{"id": "4a62dea3-6a4a-4390-88d8-4af5d2c81474", "type": "DEFAULT", "name": "default"}
|
146
|
+
],
|
145
147
|
"adornments": None,
|
146
|
-
"attributes": [
|
148
|
+
"attributes": [
|
149
|
+
{
|
150
|
+
"id": "b0ac6b50-22a8-42ba-a707-1aa09a653205",
|
151
|
+
"name": "metro",
|
152
|
+
"value": {
|
153
|
+
"type": "WORKFLOW_INPUT",
|
154
|
+
"input_variable_id": "f2f5da15-026d-4905-bfe7-7d16bda20eed",
|
155
|
+
},
|
156
|
+
},
|
157
|
+
{
|
158
|
+
"id": "c5f2d66c-5bb6-4d2a-8e4d-5356318cd3ba",
|
159
|
+
"name": "date",
|
160
|
+
"value": {
|
161
|
+
"type": "WORKFLOW_INPUT",
|
162
|
+
"input_variable_id": "aba1e6e0-dfa7-4c15-a4e6-aec6feebfaca",
|
163
|
+
},
|
164
|
+
},
|
165
|
+
],
|
166
|
+
"outputs": [
|
167
|
+
{
|
168
|
+
"id": "3f4c753e-f057-47bb-9748-7968283cc8aa",
|
169
|
+
"name": "temperature",
|
170
|
+
"type": "NUMBER",
|
171
|
+
"value": None,
|
172
|
+
},
|
173
|
+
{
|
174
|
+
"id": "2a4a62b3-cd26-4d2c-b3f1-eaa5f9dd22dd",
|
175
|
+
"name": "reasoning",
|
176
|
+
"type": "STRING",
|
177
|
+
"value": None,
|
178
|
+
},
|
179
|
+
],
|
147
180
|
},
|
148
181
|
{
|
149
182
|
"id": "a773c3a5-78cb-4250-8d29-7282e8a579d3",
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py
CHANGED
@@ -130,9 +130,36 @@ def test_serialize_workflow():
|
|
130
130
|
"module": ["tests", "workflows", "basic_map_node", "workflow"],
|
131
131
|
},
|
132
132
|
"trigger": {"id": "01324747-9bc0-4ecd-a8ab-40dca5a94e2e", "merge_behavior": "AWAIT_ANY"},
|
133
|
-
"ports": [
|
133
|
+
"ports": [
|
134
|
+
{"id": "36791877-95b0-4390-a794-10accd8f548e", "type": "DEFAULT", "name": "default"}
|
135
|
+
],
|
134
136
|
"adornments": None,
|
135
|
-
"attributes": [
|
137
|
+
"attributes": [
|
138
|
+
{
|
139
|
+
"id": "4306b0ce-f31c-4c8f-8122-659d40e60ffe",
|
140
|
+
"name": "item",
|
141
|
+
"value": {
|
142
|
+
"type": "WORKFLOW_INPUT",
|
143
|
+
"input_variable_id": "b29bb546-9bc8-4136-857d-8c7a464ba9d4",
|
144
|
+
},
|
145
|
+
},
|
146
|
+
{
|
147
|
+
"id": "bca02056-0fd9-44c6-8aa9-743dd1180d48",
|
148
|
+
"name": "index",
|
149
|
+
"value": {
|
150
|
+
"type": "WORKFLOW_INPUT",
|
151
|
+
"input_variable_id": "17e7ca49-668f-450d-a792-e1f97d13db67",
|
152
|
+
},
|
153
|
+
},
|
154
|
+
],
|
155
|
+
"outputs": [
|
156
|
+
{
|
157
|
+
"id": "a7bcb362-a2b8-4476-b0de-a361efeec204",
|
158
|
+
"name": "count",
|
159
|
+
"type": "NUMBER",
|
160
|
+
"value": None,
|
161
|
+
}
|
162
|
+
],
|
136
163
|
},
|
137
164
|
{
|
138
165
|
"id": "6f4883b2-70b1-4e1c-ae15-7d0f5aec810b",
|
@@ -1,10 +1,8 @@
|
|
1
|
-
import
|
2
|
-
import json
|
3
|
-
import typing
|
4
|
-
from typing import Any, List, Union, cast
|
1
|
+
from typing import Any, TypeVar
|
5
2
|
|
6
|
-
from vellum import
|
3
|
+
from vellum.client.types.vellum_variable_type import VellumVariableType
|
7
4
|
from vellum.workflows.descriptors.base import BaseDescriptor
|
5
|
+
from vellum.workflows.nodes.displayable.bases.utils import primitive_to_vellum_value
|
8
6
|
from vellum.workflows.references import OutputReference, WorkflowInputReference
|
9
7
|
from vellum.workflows.references.execution_count import ExecutionCountReference
|
10
8
|
from vellum.workflows.references.node import NodeReference
|
@@ -13,25 +11,19 @@ from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_var
|
|
13
11
|
from vellum.workflows.vellum_client import create_vellum_client
|
14
12
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
15
13
|
from vellum_ee.workflows.display.vellum import (
|
16
|
-
ChatHistoryVellumValue,
|
17
14
|
ConstantValuePointer,
|
18
15
|
ExecutionCounterData,
|
19
16
|
ExecutionCounterPointer,
|
20
17
|
InputVariableData,
|
21
18
|
InputVariablePointer,
|
22
|
-
JsonVellumValue,
|
23
19
|
NodeInputValuePointerRule,
|
24
20
|
NodeOutputData,
|
25
21
|
NodeOutputPointer,
|
26
|
-
NumberVellumValue,
|
27
|
-
SearchResultsVellumValue,
|
28
|
-
StringVellumValue,
|
29
|
-
VellumValue,
|
30
22
|
WorkspaceSecretData,
|
31
23
|
WorkspaceSecretPointer,
|
32
24
|
)
|
33
25
|
|
34
|
-
_T =
|
26
|
+
_T = TypeVar("_T")
|
35
27
|
|
36
28
|
|
37
29
|
def infer_vellum_variable_type(value: Any) -> VellumVariableType:
|
@@ -90,33 +82,3 @@ def create_node_input_value_pointer_rule(
|
|
90
82
|
return ConstantValuePointer(type="CONSTANT_VALUE", data=vellum_value)
|
91
83
|
|
92
84
|
raise ValueError(f"Unsupported descriptor type: {value.__class__.__name__}")
|
93
|
-
|
94
|
-
|
95
|
-
def primitive_to_vellum_value(value: Any) -> VellumValue:
|
96
|
-
"""Converts a python primitive to a VellumVariableValue"""
|
97
|
-
|
98
|
-
if isinstance(value, str):
|
99
|
-
return StringVellumValue(value=value)
|
100
|
-
elif isinstance(value, enum.Enum):
|
101
|
-
return StringVellumValue(value=value.value)
|
102
|
-
elif isinstance(value, (int, float)):
|
103
|
-
return NumberVellumValue(value=value)
|
104
|
-
elif isinstance(value, list) and (
|
105
|
-
all(isinstance(message, ChatMessage) for message in value)
|
106
|
-
or all(isinstance(message, ChatMessage) for message in value)
|
107
|
-
):
|
108
|
-
chat_messages = cast(Union[List[ChatMessage], List[ChatMessage]], value)
|
109
|
-
return ChatHistoryVellumValue(value=chat_messages)
|
110
|
-
elif isinstance(value, list) and (
|
111
|
-
all(isinstance(search_result, SearchResultRequest) for search_result in value)
|
112
|
-
or all(isinstance(search_result, SearchResult) for search_result in value)
|
113
|
-
):
|
114
|
-
search_results = cast(Union[List[SearchResultRequest], List[SearchResult]], value)
|
115
|
-
return SearchResultsVellumValue(value=search_results)
|
116
|
-
|
117
|
-
try:
|
118
|
-
json_value = json.dumps(value)
|
119
|
-
except json.JSONDecodeError:
|
120
|
-
raise ValueError(f"Unsupported variable type: {value.__class__.__name__}")
|
121
|
-
|
122
|
-
return JsonVellumValue(value=json.loads(json_value))
|
@@ -1,11 +1,13 @@
|
|
1
1
|
from dataclasses import dataclass, field
|
2
2
|
from enum import Enum
|
3
3
|
from uuid import UUID
|
4
|
-
from typing import
|
4
|
+
from typing import List, Literal, Optional, Union
|
5
5
|
|
6
6
|
from pydantic import Field
|
7
7
|
|
8
|
-
from vellum import
|
8
|
+
from vellum import PromptParameters, VellumVariable, VellumVariableType
|
9
|
+
from vellum.client.types.array_vellum_value import ArrayVellumValue
|
10
|
+
from vellum.client.types.vellum_value import VellumValue
|
9
11
|
from vellum.core import UniversalBaseModel
|
10
12
|
from vellum_ee.workflows.display.base import (
|
11
13
|
EdgeDisplay,
|
@@ -140,45 +142,14 @@ class WorkflowNodeType(str, Enum):
|
|
140
142
|
ERROR = "ERROR"
|
141
143
|
|
142
144
|
|
143
|
-
class StringVellumValue(UniversalBaseModel):
|
144
|
-
type: Literal["STRING"] = "STRING"
|
145
|
-
value: str
|
146
|
-
|
147
|
-
|
148
|
-
class NumberVellumValue(UniversalBaseModel):
|
149
|
-
type: Literal["NUMBER"] = "NUMBER"
|
150
|
-
value: Union[int, float]
|
151
|
-
|
152
|
-
|
153
|
-
class ChatHistoryVellumValue(UniversalBaseModel):
|
154
|
-
type: Literal["CHAT_HISTORY"] = "CHAT_HISTORY"
|
155
|
-
value: Union[List[ChatMessage], List[ChatMessage]]
|
156
|
-
|
157
|
-
|
158
|
-
class SearchResultsVellumValue(UniversalBaseModel):
|
159
|
-
type: Literal["SEARCH_RESULTS"] = "SEARCH_RESULTS"
|
160
|
-
value: Union[List[SearchResultRequest], List[SearchResult]]
|
161
|
-
|
162
|
-
|
163
|
-
class JsonVellumValue(UniversalBaseModel):
|
164
|
-
type: Literal["JSON"] = "JSON"
|
165
|
-
value: Optional[Any] = None
|
166
|
-
|
167
|
-
|
168
|
-
VellumValue = Union[
|
169
|
-
StringVellumValue,
|
170
|
-
NumberVellumValue,
|
171
|
-
ChatHistoryVellumValue,
|
172
|
-
SearchResultsVellumValue,
|
173
|
-
JsonVellumValue,
|
174
|
-
]
|
175
|
-
|
176
|
-
|
177
145
|
class ConstantValuePointer(UniversalBaseModel):
|
178
146
|
type: Literal["CONSTANT_VALUE"] = "CONSTANT_VALUE"
|
179
147
|
data: VellumValue
|
180
148
|
|
181
149
|
|
150
|
+
ArrayVellumValue.model_rebuild()
|
151
|
+
|
152
|
+
|
182
153
|
class NodeOutputData(UniversalBaseModel):
|
183
154
|
node_id: str
|
184
155
|
output_id: str
|
@@ -5,6 +5,7 @@ from typing import Dict, List, Optional, Type, cast
|
|
5
5
|
from vellum.workflows.descriptors.base import BaseDescriptor
|
6
6
|
from vellum.workflows.edges import Edge
|
7
7
|
from vellum.workflows.nodes.bases import BaseNode
|
8
|
+
from vellum.workflows.nodes.displayable.bases.utils import primitive_to_vellum_value
|
8
9
|
from vellum.workflows.nodes.displayable.final_output_node import FinalOutputNode
|
9
10
|
from vellum.workflows.nodes.utils import get_unadorned_node, get_unadorned_port, get_wrapped_node, has_wrapped_node
|
10
11
|
from vellum.workflows.ports import Port
|
@@ -16,7 +17,7 @@ from vellum.workflows.utils.uuids import uuid4_from_hash
|
|
16
17
|
from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
|
17
18
|
from vellum_ee.workflows.display.nodes.types import PortDisplay
|
18
19
|
from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
|
19
|
-
from vellum_ee.workflows.display.utils.vellum import infer_vellum_variable_type
|
20
|
+
from vellum_ee.workflows.display.utils.vellum import infer_vellum_variable_type
|
20
21
|
from vellum_ee.workflows.display.vellum import (
|
21
22
|
EdgeVellumDisplay,
|
22
23
|
EdgeVellumDisplayOverrides,
|
@@ -264,16 +265,18 @@ class VellumWorkflowDisplay(
|
|
264
265
|
self, workflow_input: WorkflowInputReference, overrides: Optional[WorkflowInputsVellumDisplayOverrides] = None
|
265
266
|
) -> WorkflowInputsVellumDisplay:
|
266
267
|
workflow_input_id: UUID
|
268
|
+
name = None
|
267
269
|
required = None
|
268
270
|
color = None
|
269
271
|
if overrides:
|
270
272
|
workflow_input_id = overrides.id
|
273
|
+
name = overrides.name
|
271
274
|
required = overrides.required
|
272
275
|
color = overrides.color
|
273
276
|
else:
|
274
277
|
workflow_input_id = uuid4_from_hash(f"{self.workflow_id}|inputs|id|{workflow_input.name}")
|
275
278
|
|
276
|
-
return WorkflowInputsVellumDisplay(id=workflow_input_id, required=required, color=color)
|
279
|
+
return WorkflowInputsVellumDisplay(id=workflow_input_id, name=name, required=required, color=color)
|
277
280
|
|
278
281
|
def _generate_entrypoint_display(
|
279
282
|
self,
|
File without changes
|
File without changes
|
File without changes
|