vellum-ai 0.14.19__py3-none-any.whl → 0.14.21__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 (44) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/workflows/nodes/displayable/api_node/node.py +1 -1
  3. vellum/workflows/nodes/displayable/bases/api_node/node.py +7 -2
  4. vellum/workflows/nodes/displayable/code_execution_node/node.py +1 -1
  5. vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py +41 -0
  6. vellum/workflows/nodes/displayable/code_execution_node/utils.py +6 -1
  7. vellum/workflows/nodes/tests/test_utils.py +34 -2
  8. vellum/workflows/nodes/utils.py +26 -0
  9. vellum/workflows/references/lazy.py +9 -1
  10. vellum/workflows/references/tests/test_lazy.py +30 -0
  11. {vellum_ai-0.14.19.dist-info → vellum_ai-0.14.21.dist-info}/METADATA +1 -1
  12. {vellum_ai-0.14.19.dist-info → vellum_ai-0.14.21.dist-info}/RECORD +44 -42
  13. vellum_ee/workflows/display/base.py +6 -6
  14. vellum_ee/workflows/display/nodes/base_node_display.py +27 -2
  15. vellum_ee/workflows/display/nodes/base_node_vellum_display.py +0 -20
  16. vellum_ee/workflows/display/nodes/get_node_display_class.py +3 -3
  17. vellum_ee/workflows/display/nodes/vellum/api_node.py +9 -16
  18. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +7 -3
  19. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +2 -6
  20. vellum_ee/workflows/display/nodes/vellum/merge_node.py +8 -5
  21. vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +2 -6
  22. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +113 -0
  23. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +2 -2
  24. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +4 -4
  25. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +8 -8
  26. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +3 -3
  27. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +14 -14
  28. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +3 -3
  29. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +5 -5
  30. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +1 -1
  31. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +1 -1
  32. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +2 -2
  33. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +2 -2
  34. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +3 -3
  35. vellum_ee/workflows/display/types.py +4 -7
  36. vellum_ee/workflows/display/vellum.py +11 -3
  37. vellum_ee/workflows/display/workflows/base_workflow_display.py +45 -34
  38. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +33 -80
  39. vellum_ee/workflows/server/virtual_file_loader.py +52 -22
  40. vellum_ee/workflows/tests/local_workflow/display/workflow.py +3 -5
  41. vellum_ee/workflows/tests/test_server.py +61 -0
  42. {vellum_ai-0.14.19.dist-info → vellum_ai-0.14.21.dist-info}/LICENSE +0 -0
  43. {vellum_ai-0.14.19.dist-info → vellum_ai-0.14.21.dist-info}/WHEEL +0 -0
  44. {vellum_ai-0.14.19.dist-info → vellum_ai-0.14.21.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.14.19",
21
+ "X-Fern-SDK-Version": "0.14.21",
22
22
  }
23
23
  headers["X_API_KEY"] = self.api_key
24
24
  return headers
@@ -50,7 +50,7 @@ class APINode(BaseAPINode):
50
50
  return self._run(
51
51
  method=self.method,
52
52
  url=self.url,
53
- data=self.data or self.json,
53
+ data=self.data,
54
54
  json=self.json,
55
55
  headers={**headers, **header_overrides},
56
56
  bearer_token=bearer_token,
@@ -28,7 +28,7 @@ class BaseAPINode(BaseNode, Generic[StateType]):
28
28
  class Trigger(BaseNode.Trigger):
29
29
  merge_behavior = MergeBehavior.AWAIT_ANY
30
30
 
31
- url: str
31
+ url: str = ""
32
32
  method: Optional[APIRequestMethod] = APIRequestMethod.GET
33
33
  data: Optional[str] = None
34
34
  json: Optional[Json] = None
@@ -63,7 +63,12 @@ class BaseAPINode(BaseNode, Generic[StateType]):
63
63
 
64
64
  def _local_execute_api(self, data, headers, json, method, url):
65
65
  try:
66
- prepped = Request(method=method.value, url=url, data=data, json=json, headers=headers).prepare()
66
+ if data is not None:
67
+ prepped = Request(method=method.value, url=url, data=data, headers=headers).prepare()
68
+ elif json is not None:
69
+ prepped = Request(method=method.value, url=url, json=json, headers=headers).prepare()
70
+ else:
71
+ prepped = Request(method=method.value, url=url, headers=headers).prepare()
67
72
  except Exception as e:
68
73
  raise NodeException(f"Failed to prepare HTTP request: {e}", code=WorkflowErrorCode.PROVIDER_ERROR)
69
74
  try:
@@ -78,7 +78,7 @@ class CodeExecutionNode(BaseNode[StateType], Generic[StateType, _OutputType], me
78
78
  filepath: ClassVar[Optional[str]] = None
79
79
  code: ClassVar[Optional[str]] = None
80
80
 
81
- code_inputs: ClassVar[EntityInputsInterface]
81
+ code_inputs: ClassVar[EntityInputsInterface] = {}
82
82
  runtime: CodeExecutionRuntime = "PYTHON_3_11_6"
83
83
  packages: Optional[Sequence[CodeExecutionPackage]] = None
84
84
 
@@ -777,3 +777,44 @@ def main():
777
777
 
778
778
  # AND the result should be the correct output
779
779
  assert outputs == {"result": "hello", "log": "<class 'int'>\n"}
780
+
781
+
782
+ def test_run_node__execute_code__invalid_key_access():
783
+ # GIVEN a node that will access an invalid key
784
+ class ExampleCodeExecutionNode(CodeExecutionNode[BaseState, str]):
785
+ code = """\
786
+ def main(arg1: list) -> str:
787
+ return arg1["invalid"]
788
+ """
789
+ code_inputs = {
790
+ "arg1": {"foo": "bar"},
791
+ }
792
+ runtime = "PYTHON_3_11_6"
793
+
794
+ # WHEN we run the node
795
+ with pytest.raises(NodeException) as exc_info:
796
+ node = ExampleCodeExecutionNode()
797
+ node.run()
798
+
799
+ # AND the result should be the correct output
800
+ assert exc_info.value.message == "dict has no key: 'invalid'"
801
+
802
+
803
+ def test_run_node__execute_code__value_key_access():
804
+ # GIVEN a node that will access the value key before the nested key
805
+ class ExampleCodeExecutionNode(CodeExecutionNode[BaseState, str]):
806
+ code = """\
807
+ def main(arg1: list) -> str:
808
+ return arg1["value"]["foo"]
809
+ """
810
+ code_inputs = {
811
+ "arg1": {"foo": "bar"},
812
+ }
813
+ runtime = "PYTHON_3_11_6"
814
+
815
+ # WHEN we run the node
816
+ node = ExampleCodeExecutionNode()
817
+ outputs = node.run()
818
+
819
+ # AND the result should be the correct output
820
+ assert outputs == {"result": "bar", "log": ""}
@@ -41,7 +41,12 @@ class DictWrapper(dict):
41
41
 
42
42
  def __getattr__(self, attr):
43
43
  if attr not in self:
44
- raise AttributeError(f"Vellum object has no attribute '{attr}'")
44
+ if attr == "value":
45
+ # In order to be backwards compatible with legacy Workflows, which wrapped
46
+ # several values as VellumValue objects, we use the "value" key to return itself
47
+ return self
48
+
49
+ raise AttributeError(f"dict has no key: '{attr}'")
45
50
 
46
51
  item = super().__getitem__(attr)
47
52
  if not isinstance(item, DictWrapper) and not isinstance(item, ListWrapper):
@@ -1,11 +1,14 @@
1
1
  import pytest
2
- from typing import List, Union
2
+ from typing import Any, List, Union
3
3
 
4
4
  from pydantic import BaseModel
5
5
 
6
+ from vellum.client.types.chat_message import ChatMessage
7
+ from vellum.client.types.function_call import FunctionCall as FunctionCallType
8
+ from vellum.client.types.vellum_value import VellumValue
6
9
  from vellum.workflows.errors.types import WorkflowErrorCode
7
10
  from vellum.workflows.exceptions import NodeException
8
- from vellum.workflows.nodes.utils import parse_type_from_str
11
+ from vellum.workflows.nodes.utils import cast_to_output_type, parse_type_from_str
9
12
  from vellum.workflows.types.core import Json
10
13
 
11
14
 
@@ -131,3 +134,32 @@ def test_parse_type_from_str_error_cases(input_str, output_type, expected_except
131
134
  assert excinfo.value.code == expected_code
132
135
 
133
136
  assert expected_message in str(excinfo.value)
137
+
138
+
139
+ @pytest.mark.parametrize(
140
+ "output_type,expected_result",
141
+ [
142
+ (str, ""), # String
143
+ (int, 0), # Number
144
+ (float, 0.0), # Number
145
+ (Any, None), # Json
146
+ (FunctionCallType, {}), # FunctionCall
147
+ (List[ChatMessage], []), # Chat History
148
+ (List[VellumValue], []), # Array
149
+ (Union[float, int], 0.0), # Union
150
+ ],
151
+ ids=[
152
+ "string",
153
+ "integer",
154
+ "float",
155
+ "json",
156
+ "function_call",
157
+ "chat_history",
158
+ "array",
159
+ "union",
160
+ ],
161
+ )
162
+ def test_cast_to_output_type_none_value(output_type, expected_result):
163
+ """Test that cast_to_output_type returns appropriate default values when None is provided."""
164
+ result = cast_to_output_type(None, output_type)
165
+ assert result == expected_result
@@ -6,6 +6,7 @@ from typing import Any, Callable, Dict, ForwardRef, List, Optional, Type, TypeVa
6
6
 
7
7
  from pydantic import BaseModel, create_model
8
8
 
9
+ from vellum.client.types.function_call import FunctionCall
9
10
  from vellum.workflows.errors.types import WorkflowErrorCode
10
11
  from vellum.workflows.exceptions import NodeException
11
12
  from vellum.workflows.nodes import BaseNode
@@ -195,7 +196,32 @@ def _clean_output_type(output_type: Any) -> Any:
195
196
  return output_type
196
197
 
197
198
 
199
+ def _get_default_value(output_type: Any) -> Any:
200
+ origin = get_origin(output_type)
201
+ args = get_args(output_type)
202
+
203
+ if output_type is int or output_type is float:
204
+ return 0.0
205
+ elif output_type is str:
206
+ return ""
207
+ elif origin is list:
208
+ return []
209
+ elif output_type is FunctionCall:
210
+ return {}
211
+ elif origin is Union:
212
+ # Always use the first argument type's default value
213
+ if args:
214
+ return _get_default_value(args[0])
215
+ return None
216
+ else:
217
+ # We defined Json as Any now which is why it returns None
218
+ return None
219
+
220
+
198
221
  def cast_to_output_type(result: Any, output_type: Any) -> Any:
222
+ if result is None:
223
+ return _get_default_value(output_type)
224
+
199
225
  clean_output_type = _clean_output_type(output_type)
200
226
  DynamicModel = create_model("Output", output_type=(clean_output_type, ...))
201
227
 
@@ -1,5 +1,6 @@
1
1
  import ast
2
2
  import inspect
3
+ import logging
3
4
  from typing import TYPE_CHECKING, Callable, Generic, TypeVar, Union, get_args
4
5
 
5
6
  from vellum.workflows.constants import undefined
@@ -10,6 +11,8 @@ if TYPE_CHECKING:
10
11
 
11
12
  _T = TypeVar("_T")
12
13
 
14
+ logger = logging.getLogger(__name__)
15
+
13
16
 
14
17
  class LazyReference(BaseDescriptor[_T], Generic[_T]):
15
18
  def __init__(
@@ -50,7 +53,12 @@ class LazyReference(BaseDescriptor[_T], Generic[_T]):
50
53
  if isinstance(self._get, str):
51
54
  return self._get
52
55
 
53
- source = inspect.getsource(self._get).strip()
56
+ try:
57
+ source = inspect.getsource(self._get).strip()
58
+ except Exception:
59
+ logger.exception("Error getting source for lazy reference")
60
+ return self._get.__name__
61
+
54
62
  try:
55
63
  parsed = ast.parse(source)
56
64
  assignment = parsed.body[0]
@@ -0,0 +1,30 @@
1
+ import pytest
2
+
3
+ from vellum.workflows.nodes import BaseNode
4
+ from vellum.workflows.references.lazy import LazyReference
5
+
6
+
7
+ @pytest.fixture
8
+ def mock_inspect_getsource(mocker):
9
+ return mocker.patch("inspect.getsource")
10
+
11
+
12
+ @pytest.fixture
13
+ def mock_logger(mocker):
14
+ return mocker.patch("vellum.workflows.references.lazy.logger")
15
+
16
+
17
+ def test_lazy_reference__inspect_getsource_fails(mock_inspect_getsource, mock_logger):
18
+ # GIVEN getsource fails to resolve the lambda's source code
19
+ mock_inspect_getsource.side_effect = Exception("test")
20
+
21
+ # WHEN a node with a lazy reference is defined
22
+ class MyNode(BaseNode):
23
+ lazy_reference = LazyReference(lambda: MyNode.Outputs.foo)
24
+
25
+ # THEN the name is the lambda function's name
26
+ assert MyNode.lazy_reference.instance
27
+ assert MyNode.lazy_reference.instance.name == "<lambda>"
28
+
29
+ # AND sentry is notified
30
+ assert mock_logger.exception.call_count == 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.19
3
+ Version: 0.14.21
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -22,34 +22,35 @@ vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- vellum_ee/workflows/display/base.py,sha256=ak29FIsawhaFa9_paZUHThlZRFJ1xB486JWKuSt1PYY,1965
25
+ vellum_ee/workflows/display/base.py,sha256=xhrMfirVLBuIeDuxdOUmtJ6CcfCx8DChFo-4HfMY6uc,1883
26
26
  vellum_ee/workflows/display/nodes/__init__.py,sha256=436iSAh_Ex5tC68oEYvNgPu05ZVIAVXnS4PKGrQeZ0Y,321
27
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=qBF1uZybN8dHzyMRvjqf3rWlAl0fdODV5h6WblhGJP8,17703
28
- vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=ZLKQ8Xa3h9nGkj4t4V_7OeU7CBFWY3gXB9CkaCLOhEk,2699
29
- vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=LhV2wSo07iOTUj1clKwH2zzCzKdLiW2gk22R3Qco81E,2196
27
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=4xIkrKXVryaD0fPd7RxSpzIqPg6Y14NEB7j7m0DrJvM,18974
28
+ vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=rhbWYBQSXkpEPIvTa--LPwhsl8RnX4KyU6Ax0M0A0pU,1701
29
+ vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=59Nht1XAxMcNESFV1VmECrF01lZMnGkB_9JWaTAFnv0,2214
30
30
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=QqR3Ly0RNrXwOeLdW5nERDFt0gRPf76n1bPES6o5UN4,1093
32
32
  vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
33
33
  vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
34
34
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
35
- vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=hoV-cUtS6H9kmRQXHd2py95GRWI_dAnnaPwvlNBkDOQ,8571
35
+ vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=lumtypr0JEZfiA32hcs_olTmnT0wIUzPBy0pnZVfyU4,8532
36
36
  vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=oJAQrAm5iFQq0_fX94sMbS3RQEK1M1VsoUck4vsPs9A,5820
37
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=uIEpWxO8SYA_sb-EK_4wdyYEwGQOnykAOExFRkZcFaE,4241
37
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=IYx0nll0t-tsPcjfgpfHMZE4FJgMFIsOiaQanGLYF0Q,4410
38
38
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=ybLIa4uclqVIy3VAQvI1ivg2tnK5Ug_1R5a69DFqL7E,11104
39
39
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=I1Jkp2htRINJATtv1e-zs9BrReFX842djpiVgBPHDYg,2186
40
40
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=p-PvlnxpBQ7IKskZi2A19jKAtKnSxJ8LPbGMA83VkFk,2805
41
41
  vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=aYZSJTxknU4LMiQdWk9LcK6CkhdozeDEMiRxfAyUNEc,2202
42
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=grb2iDxZ8DiNlo1nfO3KPxs8saM_JZAskOFp-C4ZEq4,8908
42
+ vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=3fJzrFoGJX_igzWKgXp7f7-owdVBG6xuy-kBSWNbNxc,8734
43
43
  vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=MU9I8CB1X1TgL1aa1eT6DHWwNJ-2v79t74xl0oy-fBo,5510
44
44
  vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=8CPnn06HIBxBOiECevUffeVmQmCpec6WtPQnNl9gj9Y,3748
45
- vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=HkNMgdQELiON42jdO-xDLmqrEKdGx1RVqrz2DXNTLS8,3239
45
+ vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=xtyecs9mJ_WEwVpP12jxYwvehLXynhqLrPJ-Ahdk2GA,3232
46
46
  vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=TMb8txILu2uWjzoxaghjgjlzeBAgzn4vkP_8zSh2qoE,1151
47
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=LFjLUrH6sJ4czPnExdRqFr0PB_yKBMLXLvK5GAzIAgc,3273
47
+ vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=9YR6MtxVq8Bavb0ud2lZX0t2Y_NUd-dY9kRgq8WBz-Y,3093
48
48
  vellum_ee/workflows/display/nodes/vellum/retry_node.py,sha256=LgokATi7sSS38Fil-XjqoR4t7AMOJ-GzXRw6p606Svo,3397
49
49
  vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=TxcAGZDl_hvJ7Y1hUi9YVEVrj9Ie0hKkASdpfRL4_cs,9227
50
50
  vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=62baAElKoRKIoba0lLhnrXGWWx96B73VxKGxh7BaIxc,2612
51
51
  vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=5EWzdA3TSUPlbJhs4uo1KGH6eGtDXZucVhlUoc_xpl4,3242
52
52
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=p0fCvbKzpGvVrg67QmJd14m9E8_DG0u5s6SYIhzlkNA,4018
53
54
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=ulrpoYUW-5kIxfG4Lf5F2p0k_EoYKhmahEbF3P_eruM,1648
54
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py,sha256=bg9INsXiWfyK047u8TD1oEOFYrqDq8GC7Hvgz69n7BE,1988
55
56
  vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py,sha256=NuIw8Yb42KUdoGi3Ur8_7VPg50IC4hNrwAkCociwqNk,2091
@@ -62,23 +63,23 @@ vellum_ee/workflows/display/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
62
63
  vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=VD-4USiRlCcdC3Qe9WfdkxwFdircai0vqvuZCbELR84,9556
63
64
  vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
65
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=A1-tIpC5KIKG9JA_rkd1nLS8zUG3Kb4QiVdvb3boFxE,2509
66
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=2ZDTmpiU2CcZe4ukxoQ79SJx8V8kDRQHgUxP5Vtesus,15605
67
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=oEtjTovI6-T_OGND7UBDnBig0kjVm0bPwWMUbRCV1OU,19781
68
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=KgxSN8L5AWPL8EpQfSZiTqK428nAIElcWrV-sR17528,6456
69
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=yS8GpjbH0objjcNYK73j8rDHbhqinIbG7CcoNjnolBg,40611
70
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=_-ADur28OkVy4YEgMHkkVYqMbS1j3GcOtX9MTYmmvf0,4632
66
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=iR9vt-Xf8NSLHptrp1uTd_qbhHz-LrWkrRyKN96aqGM,2492
67
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=4R8cZ98JsGmIq-kmt3q519c4nCI7wCy5ynAUCUNnvuI,15605
68
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=PXoNUAgqfyNCAoYGWoo5D-_5SLEannn7SD08nxZmVe8,19781
69
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=s6_mnk0pkztU59wYpSfOFpMhAJaRjmyfxM6WJGtnD4Y,6456
70
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=PkSgghJDz0fpDB72HHPjLjo8LkZk-HpUkCQzRLX-iVw,40611
71
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=dsJr8I9AdPwMOGszirfNDzZP2Ychd94aAKuPXAzknMk,4632
71
72
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py,sha256=IRazH2QR6F8RGqNemEnHueyj5DtEa6rFTYhT16S4jI8,15917
72
73
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py,sha256=V__y7uu-dy6TJjPeu4UDvaoO2yYwBRbPiW9uJdzWRx4,29828
73
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=R8DW1DUb0DOSLtnF2E1HaCTmtpG-ski0LfcM2WeLVNo,47672
74
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py,sha256=z9FSufJeV-003R87wi_Lx4mZewdeeOeTPCGNc9vg8vY,8819
74
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=6ejs_C1cuaRHtc8Qb2qh8-b-juDwLwdfTBd-6CSDDYw,47672
75
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py,sha256=spaPscLDjlwR7_2JxB5HzsLp0ss7_GsAgdiS5qUQ_6o,8819
75
76
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256=wgedEa2IVP2ssH_FLghoEmLgpJR41AY-iNIw1SESeqA,6106
76
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=yIq5UexHAk7Afh_6sMlXNAUeKdckBUvCBVIEDLEnhFs,5773
77
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=THQB73vAgdiRRk7GKWwzw99G-X3LLgEEVCb4QCQrrMQ,5773
77
78
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py,sha256=0N7lqB2WMvSItUY78EWpF-g4fXvhkc4NCY-Ws57OYsQ,7446
78
79
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py,sha256=XRtXTWtNXHe1g8E_mNcAhYZVjc0UcGlJRjq34_sd0jo,787
79
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=cKM87WUrBZwVauP7VD4rQdObd2jllHJJRHWDGL1tgMI,20605
80
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=PbIezAnkGubhY_e5dpOaaaVZ9VeoYJKqvCKbIbjucfU,16172
81
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=ObCnoIVJM434jJBC3_kOTKbY4sCDHlknwMTFWRGiOtU,8449
80
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=nZ3IOZSX3cOg4XV5-PW-Hsu806vfzmOZyCpZyl1I50w,20605
81
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=8GakAJmf140XzQRZyr-BbZUt22h0lZKUFhNZY4zlD4g,16172
82
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=QifoIZja04F1ulMhKlfZHtOqhAWrbUXlnQpybBBzNdw,8449
82
83
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=-bGp82C5_XgcVxeM80zWL9viogxvE4DGk7-5H__wwxA,8649
83
84
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=elc4ak2OyI4y5P6GPnK2RwuZLcx4FL6hHlmhY3ARk6k,13008
84
85
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=BzFNl9ECeGh0krm-CUjbBQQq0g7krANsp0Sh-j5dAkc,11322
@@ -86,18 +87,18 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_n
86
87
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=NdhE3lm7RMQ8DqkraPSq24IbOxNla9unbs4tsMWRzm4,3781
87
88
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=eD5686C9nWC5s6t08vbAnm9qf9t53gYQM-E1FwAa75c,3035
88
89
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=huKAOeMJ2MKmp6XtbvMJTUadqynoV40Ypoz9jsBEBEQ,7431
89
- vellum_ee/workflows/display/types.py,sha256=ixfmcQn51Rhsm4_0hWfG0_WpzLE89ZrDZpeYBklsP1Q,2592
90
+ vellum_ee/workflows/display/types.py,sha256=UZ23Hv2ULWFrMaG1mRSbVnPEa9YvuLlv0dOMkA2j5_Y,2466
90
91
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
92
  vellum_ee/workflows/display/utils/expressions.py,sha256=9FpOslDI-RCR5m4TgAu9KCHh4aTVnh7CHR2ykyMUDw0,1151
92
93
  vellum_ee/workflows/display/utils/vellum.py,sha256=EVPQUSsZ3OIeLTEbV6LHPor37t9fnj9kJxDqP4PmTLQ,8234
93
- vellum_ee/workflows/display/vellum.py,sha256=ROvXFoLmnEXmJJ_Nc0ZVz94LZf6opU4O1TWbGnAfHug,5028
94
+ vellum_ee/workflows/display/vellum.py,sha256=bevbLCd2KqJBKqJ3lQayeRfjY7x1Djf57F9iJ-6KBJw,5162
94
95
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
95
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=-14UlLZlmfWDqNtxhY9GxXlrlPcgzEpAIffd94QPEvU,19932
96
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=2PyHM8bpgRqNtImCtN9fi5VqYvkOi5saVM9OXlwGmGQ,20400
96
97
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=kp0u8LN_2IwshLrhMImhpZx1hRyAcD5gXY-kDuuaGMQ,1269
97
98
  vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=Ny9VWjCxc1_w8Z5xiQEJmNmEwtjlDlxgFCrmCWSmFmA,8511
98
- vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=mbAzCpswOek34ITeTkesbVreCXpulj4NFjIg3RcdVZ8,18243
99
+ vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=wLXrYY0ccR37IG2MWwV49ELmwquVwDlDe3W4KXwOitM,16691
99
100
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- vellum_ee/workflows/server/virtual_file_loader.py,sha256=X_DdNK7MfyOjKWekk6YQpOSCT6klKcdjT6nVJcBH1sM,1481
101
+ vellum_ee/workflows/server/virtual_file_loader.py,sha256=ET-Q83W5Cgqzqz3qtFNwtS2nJEIcm3VtvR5kffsT3VY,2262
101
102
  vellum_ee/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
103
  vellum_ee/workflows/tests/local_files/__init__.py,sha256=UyP6kKkRqr9cTKHQF4MVLdLk5MM9GGcLuqxXsQGm22Y,51
103
104
  vellum_ee/workflows/tests/local_files/base_class.py,sha256=UuiC7J68MVr6A4949QYiBpXOLdsvFG_Cw1muEPiHT6I,298
@@ -110,7 +111,7 @@ vellum_ee/workflows/tests/local_workflow/display/__init__.py,sha256=xo75Uqb4aErO
110
111
  vellum_ee/workflows/tests/local_workflow/display/nodes/__init__.py,sha256=szW_mgOUriyZ6v1vlnevBgkzNi8g83-ihS98UOLHVcE,155
111
112
  vellum_ee/workflows/tests/local_workflow/display/nodes/final_output.py,sha256=Kv92TCREiZsB9531KZYaBIq83uHn7e_ECw_yAbD1qfk,1017
112
113
  vellum_ee/workflows/tests/local_workflow/display/nodes/templating_node.py,sha256=5cankEe1rDZlXKgILFSPbmN0tUZhIdmcFgz_AguXTJc,1229
113
- vellum_ee/workflows/tests/local_workflow/display/workflow.py,sha256=QV-TyH6FeqOZ53U8kj3m_annpYgRynG_hfrOuoV1cmk,2051
114
+ vellum_ee/workflows/tests/local_workflow/display/workflow.py,sha256=rYjUO0TN6GPCDldD4liWFPOLquJmw-sP4HYtyGspe08,2024
114
115
  vellum_ee/workflows/tests/local_workflow/inputs.py,sha256=4cgsZBoUbIY0Rs8gknC9yqxQ-sSoULclx_SAm1FT2RA,96
115
116
  vellum_ee/workflows/tests/local_workflow/metadata.json,sha256=rdu3h5qkFZiqhCAMxoyoWyMI0O8QALC5-URvSIW6F00,24
116
117
  vellum_ee/workflows/tests/local_workflow/nodes/__init__.py,sha256=1F6jxUpSKfPXPj4ZZKSbnX6Mg-VwF3euLJSZfGn6xkM,127
@@ -118,14 +119,14 @@ vellum_ee/workflows/tests/local_workflow/nodes/final_output.py,sha256=ZX7zBv87zi
118
119
  vellum_ee/workflows/tests/local_workflow/nodes/templating_node.py,sha256=NQwFN61QkHfI3Vssz-B0NKGfupK8PU0FDSAIAhYBLi0,325
119
120
  vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIPLsmrVS_aVEZEc-wULSv787Q,393
120
121
  vellum_ee/workflows/tests/test_display_meta.py,sha256=C25dErwghPNXio49pvSRxyOuc96srH6eYEwTAWdE2zY,2258
121
- vellum_ee/workflows/tests/test_server.py,sha256=M6vvQ2hjIpDWtQdDM9EPbMvUrZ93niAuYnxMNJWOjPA,511
122
+ vellum_ee/workflows/tests/test_server.py,sha256=IWqjJXSbVFuV3w6b9lB3N6yoVAHJicmJuubASvw5QQM,2276
122
123
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
123
124
  vellum/__init__.py,sha256=qJRjommzKdcsfZUNkqN2k1BuOwVVSuX4Nuv9ITCz1AM,36536
124
125
  vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
125
126
  vellum/client/__init__.py,sha256=tKtdM1_GqmGq1gpi9ydWD_T-MM7fPn8QdHh8ww19cNI,117564
126
127
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
127
128
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
128
- vellum/client/core/client_wrapper.py,sha256=ZLOoZbFrHfMWTwl3j2UlsGsUsTrHJM0L9ZyltUPXo1g,1869
129
+ vellum/client/core/client_wrapper.py,sha256=r9FX6fq7T8lmJtpc4VW9IORBb0_3s14dOpTkKYA_l68,1869
129
130
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
130
131
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
131
132
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -1396,12 +1397,12 @@ vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW
1396
1397
  vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=h6eUc3SggvhzBWlOD0PrPUlkoCSQHwjqYn81VkxSIxU,4948
1397
1398
  vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
1398
1399
  vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
1399
- vellum/workflows/nodes/displayable/api_node/node.py,sha256=QdpsyGVxo5PcN8nwGZpcpW_YMKHr3_VvmbK1BlrdOFk,2547
1400
+ vellum/workflows/nodes/displayable/api_node/node.py,sha256=cp0nAukcOpM6TcNhbz12h08TMJxp_LM-MLDl1dAzYsk,2534
1400
1401
  vellum/workflows/nodes/displayable/api_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1401
1402
  vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py,sha256=fiskhfcI4c6CxFlbSWb1JKsuq-98zAeUWOExc848ALw,3130
1402
1403
  vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
1403
1404
  vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
1404
- vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=Ev_So7D_4Qfvl2_E8veVfxAxWfbJIA2ujyW5istLg5I,4066
1405
+ vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=I4zdxSXJ7-pjVcNNrSAEN_hAnhQGUBM6u5RczCActkw,4343
1405
1406
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1406
1407
  vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=HGNoGLJ9lbqflGdYFDIiuHFyi0iJ-agJu4kkJ7D3dGs,3212
1407
1408
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
@@ -1416,12 +1417,12 @@ vellum/workflows/nodes/displayable/bases/tests/test_utils.py,sha256=eqdqbKNRWVMD
1416
1417
  vellum/workflows/nodes/displayable/bases/types.py,sha256=C37B2Qh2YP7s7pUjd-EYKc2Zl1TbnCgI_mENuUSb8bo,1706
1417
1418
  vellum/workflows/nodes/displayable/bases/utils.py,sha256=ckMUenSsNkiYmSw6FmjSMHYaCk8Y8_sUjL6lkFFEqts,5412
1418
1419
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1419
- vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=pdDrjI8wdqMyf52kK6TlSjSU-MRxV2SKDwKcK2LCgkU,9547
1420
+ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=oUBfghBMe6JzrPm5e3tGNuBqILwnaBfnCnOSUX-HfOE,9552
1420
1421
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1421
1422
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1422
1423
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1423
- vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=6_RMWedAWU8Zrl0HpQorQgDfjV9khnhSouZeKadClyI,23441
1424
- vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=-7YdoF-NO6sYRFLrdkd0n1FhQFiZbJBK5jFcLNghgVo,3635
1424
+ vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=xAaoOfQHQUlp0iKlig87t0aT2cJM-8PxiTb1QDg8VmY,24641
1425
+ vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=tBuR9cV1caFtpGuQrw_LcPDAfzLI-Mpmi1Klzpr34KM,3870
1425
1426
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1426
1427
  vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=Qjfl33gZ3JEgxBA1EgzSUebboGvsARthIxxcQyvx5Gg,1152
1427
1428
  vellum/workflows/nodes/displayable/final_output_node/__init__.py,sha256=G7VXM4OWpubvSJtVkGmMNeqgb9GkM7qZT838eL18XU4,72
@@ -1461,8 +1462,8 @@ vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=c
1461
1462
  vellum/workflows/nodes/mocks.py,sha256=a1FjWEIocseMfjzM-i8DNozpUsaW0IONRpZmXBoWlyc,10455
1462
1463
  vellum/workflows/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1463
1464
  vellum/workflows/nodes/tests/test_mocks.py,sha256=mfPvrs75PKcsNsbJLQAN6PDFoVqs9TmQxpdyFKDdO60,7837
1464
- vellum/workflows/nodes/tests/test_utils.py,sha256=7PtdV_fzl56agx0IDitdqOmqUO9cQZmJww-3ToxzSqA,4174
1465
- vellum/workflows/nodes/utils.py,sha256=b-U8xjUpGswaoEiav5tU_OFKB26GkYFzuko9XCMU_Fo,7627
1465
+ vellum/workflows/nodes/tests/test_utils.py,sha256=qNB6ApIsnFtE_9HDaEah9KD-zX8e10FhDixewS1uRcc,5199
1466
+ vellum/workflows/nodes/utils.py,sha256=Tc3TAmAytb-gi30BAyzGY7DG0uS1_7KTGYdjrvKUSt0,8362
1466
1467
  vellum/workflows/outputs/__init__.py,sha256=AyZ4pRh_ACQIGvkf0byJO46EDnSix1ZCAXfvh-ms1QE,94
1467
1468
  vellum/workflows/outputs/base.py,sha256=b4Dnha1miKu3uFJYptKKflIHNuajPF2BNKy0BTt8Tjc,8622
1468
1469
  vellum/workflows/ports/__init__.py,sha256=bZuMt-R7z5bKwpu4uPW7LlJeePOQWmCcDSXe5frUY5g,101
@@ -1475,10 +1476,11 @@ vellum/workflows/references/environment_variable.py,sha256=-gfOcdYwVp9ztSUYz6h2W
1475
1476
  vellum/workflows/references/execution_count.py,sha256=JILHqt8ELdc9ct-WsVCA5X-rKiP1rmJODw-XTf4kpHI,722
1476
1477
  vellum/workflows/references/external_input.py,sha256=c_4SojTpykCSbGS1Pjmx9FfquyYGMPksoj0AbrWv7Go,2064
1477
1478
  vellum/workflows/references/input.py,sha256=3INu-TLTi4dziWmva6LO3WvgDlPzsjayUx61cVvqLJA,325
1478
- vellum/workflows/references/lazy.py,sha256=gSOsRwH_V4Jt8aJrwn-8hp3V0jU7GlvoIUDnsMKxvHk,2909
1479
+ vellum/workflows/references/lazy.py,sha256=abGEQ7EUKEAZqUrQtt0YLq6Ipi7vqc-oDJhUkwAFW8c,3116
1479
1480
  vellum/workflows/references/node.py,sha256=LP854wDVs-9I_aZ7-nkbwXqL2H7W2_3LED2e9FixNS8,1418
1480
1481
  vellum/workflows/references/output.py,sha256=-g97wkZDf-6_l_-NM4C_8v1VBt2c7NCPhtrG2lBLKSc,2808
1481
1482
  vellum/workflows/references/state_value.py,sha256=bInUF0A3Pt4-zhA0f6LdSuyv8tz7n5QRkHAEn4gsmqI,711
1483
+ vellum/workflows/references/tests/test_lazy.py,sha256=0s50-LizMTlSTBQahpK0fg_xqCucA8YTp6QmIMqPvMk,919
1482
1484
  vellum/workflows/references/vellum_secret.py,sha256=Od4d19a5yletWMqNfJR5d_mZQUkVcFzj29mE-T9J7yE,480
1483
1485
  vellum/workflows/references/workflow_input.py,sha256=86IuhlBz-9cGxeUzizyjdp482ajcl7h8MnX1soNFMII,1415
1484
1486
  vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
@@ -1520,8 +1522,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1520
1522
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1521
1523
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=NRteiICyJvDM5zrtUfq2fZoXcGQVaWC9xmNlLLVW0cU,7979
1522
1524
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1523
- vellum_ai-0.14.19.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1524
- vellum_ai-0.14.19.dist-info/METADATA,sha256=_Ot_Bgq5LluSkVWep3mE9BIZn1f5WMD1VbDLEhGECw0,5408
1525
- vellum_ai-0.14.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1526
- vellum_ai-0.14.19.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1527
- vellum_ai-0.14.19.dist-info/RECORD,,
1525
+ vellum_ai-0.14.21.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1526
+ vellum_ai-0.14.21.dist-info/METADATA,sha256=UqD3qeDGaeZTzlZPvYTpGbLEGaN7RYFGaTsxUDoboCo,5408
1527
+ vellum_ai-0.14.21.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1528
+ vellum_ai-0.14.21.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1529
+ vellum_ai-0.14.21.dist-info/RECORD,,
@@ -46,17 +46,17 @@ StateValueDisplayOverridesType = TypeVar("StateValueDisplayOverridesType", bound
46
46
 
47
47
 
48
48
  @dataclass
49
- class EdgeDisplayOverrides:
49
+ class EdgeDisplay:
50
50
  id: UUID
51
51
 
52
52
 
53
53
  @dataclass
54
- class EdgeDisplay(EdgeDisplayOverrides):
55
- pass
56
-
54
+ class EdgeDisplayOverrides(EdgeDisplay):
55
+ """
56
+ DEPRECATED: Use EdgeDisplay instead. Will be removed in 0.15.0
57
+ """
57
58
 
58
- EdgeDisplayType = TypeVar("EdgeDisplayType", bound=EdgeDisplay)
59
- EdgeDisplayOverridesType = TypeVar("EdgeDisplayOverridesType", bound=EdgeDisplayOverrides)
59
+ pass
60
60
 
61
61
 
62
62
  @dataclass
@@ -115,6 +115,10 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
115
115
  port_displays: Dict[Port, PortDisplayOverrides] = {}
116
116
  node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
117
117
 
118
+ # Used to explicitly set the target handle id for a node
119
+ # Once all nodes are Generic Nodes, we may replace this with a trigger_id or trigger attribute
120
+ target_handle_id: ClassVar[Optional[UUID]] = None
121
+
118
122
  # Used to store the mapping between node types and their display classes
119
123
  _node_display_registry: Dict[Type[NodeType], Type["BaseNodeDisplay"]] = {}
120
124
 
@@ -205,7 +209,7 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
205
209
  "base": self.get_base().dict(),
206
210
  "definition": self.get_definition().dict(),
207
211
  "trigger": {
208
- "id": str(self.get_trigger_id()),
212
+ "id": str(self.get_target_handle_id()),
209
213
  "merge_behavior": node.Trigger.merge_behavior.value,
210
214
  },
211
215
  "ports": ports,
@@ -255,7 +259,24 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
255
259
  return PortDisplay(id=port_id, node_id=self.node_id)
256
260
 
257
261
  def get_trigger_id(self) -> UUID:
258
- return uuid4_from_hash(f"{self.node_id}|trigger")
262
+ return self.get_target_handle_id()
263
+
264
+ def get_target_handle_id(self) -> UUID:
265
+ """
266
+ Is the same as `get_trigger_id()` but kept for legacy workflows. Once all workflows have been updated to
267
+ become Generic Nodes, we should be able to drive off of only `get_trigger_id()` going forward
268
+ """
269
+
270
+ return self._get_node_display_uuid("target_handle_id")
271
+
272
+ def get_target_handle_id_by_source_node_id(self, source_node_id: UUID) -> UUID:
273
+ """
274
+ In the vast majority of cases, nodes will only have a single target handle and can be retrieved independently
275
+ of the source node. However, in rare cases (such as legacy Merge nodes), this method can be overridden to
276
+ account for the case of retrieving one amongst multiple target handles on a node.
277
+ """
278
+
279
+ return self.get_target_handle_id()
259
280
 
260
281
  @classmethod
261
282
  def get_from_node_display_registry(cls, node_class: Type[NodeType]) -> Optional[Type["BaseNodeDisplay"]]:
@@ -315,6 +336,10 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
315
336
 
316
337
  raise ValueError(f"Node {cls.__name__} must define an explicit {attribute} of type {attribute_type.__name__}.")
317
338
 
339
+ def _get_node_display_uuid(self, attribute: str) -> UUID:
340
+ explicit_value = self._get_explicit_node_display_attr(attribute, UUID)
341
+ return explicit_value if explicit_value else uuid4_from_hash(f"{self.node_id}|{attribute}")
342
+
318
343
  def __init_subclass__(cls, **kwargs: Any) -> None:
319
344
  super().__init_subclass__(**kwargs)
320
345
  if not cls._node_display_registry:
@@ -4,7 +4,6 @@ from typing import ClassVar, Dict, Optional
4
4
  from vellum.workflows.nodes.utils import get_unadorned_node
5
5
  from vellum.workflows.ports import Port
6
6
  from vellum.workflows.types.generics import NodeType
7
- from vellum.workflows.utils.uuids import uuid4_from_hash
8
7
  from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
9
8
  from vellum_ee.workflows.display.nodes.types import PortDisplay
10
9
  from vellum_ee.workflows.display.vellum import NodeDisplayComment, NodeDisplayData
@@ -14,13 +13,6 @@ class BaseNodeVellumDisplay(BaseNodeDisplay[NodeType]):
14
13
  # Used to explicitly set display data for a node
15
14
  display_data: ClassVar[Optional[NodeDisplayData]] = None
16
15
 
17
- # Used to explicitly set the target handle id for a node
18
- target_handle_id: ClassVar[Optional[UUID]] = None
19
-
20
- def _get_node_display_uuid(self, attribute: str) -> UUID:
21
- explicit_value = self._get_explicit_node_display_attr(attribute, UUID)
22
- return explicit_value if explicit_value else uuid4_from_hash(f"{self.node_id}|{attribute}")
23
-
24
16
  def get_display_data(self) -> NodeDisplayData:
25
17
  explicit_value = self._get_explicit_node_display_attr("display_data", NodeDisplayData)
26
18
  docstring = self._node.__doc__
@@ -40,18 +32,6 @@ class BaseNodeVellumDisplay(BaseNodeDisplay[NodeType]):
40
32
 
41
33
  return explicit_value if explicit_value else NodeDisplayData()
42
34
 
43
- def get_target_handle_id(self) -> UUID:
44
- return self._get_node_display_uuid("target_handle_id")
45
-
46
- def get_target_handle_id_by_source_node_id(self, source_node_id: UUID) -> UUID:
47
- """
48
- In the vast majority of cases, nodes will only have a single target handle and can be retrieved independently
49
- of the source node. However, in rare cases (such as legacy Merge nodes), this method can be overridden to
50
- account for the case of retrieving one amongst multiple target handles on a node.
51
- """
52
-
53
- return self.get_target_handle_id()
54
-
55
35
  def get_source_handle_id(self, port_displays: Dict[Port, PortDisplay]) -> UUID:
56
36
  unadorned_node = get_unadorned_node(self._node)
57
37
  default_port = unadorned_node.Ports.default
@@ -7,12 +7,12 @@ from vellum.workflows.types.generics import NodeType
7
7
  from vellum.workflows.utils.uuids import uuid4_from_hash
8
8
 
9
9
  if TYPE_CHECKING:
10
- from vellum_ee.workflows.display.types import NodeDisplayType
10
+ from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
11
11
 
12
12
 
13
13
  def get_node_display_class(
14
- base_class: Type["NodeDisplayType"], node_class: Type[NodeType], root_node_class: Optional[Type[NodeType]] = None
15
- ) -> Type["NodeDisplayType"]:
14
+ base_class: Type["BaseNodeDisplay"], node_class: Type[NodeType], root_node_class: Optional[Type[NodeType]] = None
15
+ ) -> Type["BaseNodeDisplay"]:
16
16
  node_display_class = base_class.get_from_node_display_registry(node_class)
17
17
  if node_display_class:
18
18
  if not issubclass(node_display_class, base_class):