vellum-ai 1.7.2__py3-none-any.whl → 1.7.3__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 +2 -2
- vellum/workflows/errors/types.py +2 -1
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +50 -0
- vellum/workflows/nodes/displayable/tool_calling_node/utils.py +13 -6
- vellum/workflows/resolvers/resolver.py +14 -9
- vellum/workflows/runner/runner.py +43 -15
- vellum/workflows/types/__init__.py +2 -1
- vellum/workflows/types/core.py +3 -0
- {vellum_ai-1.7.2.dist-info → vellum_ai-1.7.3.dist-info}/METADATA +1 -1
- {vellum_ai-1.7.2.dist-info → vellum_ai-1.7.3.dist-info}/RECORD +13 -13
- {vellum_ai-1.7.2.dist-info → vellum_ai-1.7.3.dist-info}/LICENSE +0 -0
- {vellum_ai-1.7.2.dist-info → vellum_ai-1.7.3.dist-info}/WHEEL +0 -0
- {vellum_ai-1.7.2.dist-info → vellum_ai-1.7.3.dist-info}/entry_points.txt +0 -0
@@ -27,10 +27,10 @@ class BaseClientWrapper:
|
|
27
27
|
|
28
28
|
def get_headers(self) -> typing.Dict[str, str]:
|
29
29
|
headers: typing.Dict[str, str] = {
|
30
|
-
"User-Agent": "vellum-ai/1.7.
|
30
|
+
"User-Agent": "vellum-ai/1.7.3",
|
31
31
|
"X-Fern-Language": "Python",
|
32
32
|
"X-Fern-SDK-Name": "vellum-ai",
|
33
|
-
"X-Fern-SDK-Version": "1.7.
|
33
|
+
"X-Fern-SDK-Version": "1.7.3",
|
34
34
|
**(self.get_custom_headers() or {}),
|
35
35
|
}
|
36
36
|
if self._api_version is not None:
|
vellum/workflows/errors/types.py
CHANGED
@@ -43,6 +43,7 @@ _VELLUM_ERROR_CODE_TO_WORKFLOW_ERROR_CODE: Dict[VellumErrorCodeEnum, WorkflowErr
|
|
43
43
|
"INVALID_INPUTS": WorkflowErrorCode.INVALID_INPUTS,
|
44
44
|
"PROVIDER_ERROR": WorkflowErrorCode.PROVIDER_ERROR,
|
45
45
|
"PROVIDER_CREDENTIALS_UNAVAILABLE": WorkflowErrorCode.PROVIDER_CREDENTIALS_UNAVAILABLE,
|
46
|
+
"INTEGRATION_CREDENTIALS_UNAVAILABLE": WorkflowErrorCode.INTEGRATION_CREDENTIALS_UNAVAILABLE,
|
46
47
|
"REQUEST_TIMEOUT": WorkflowErrorCode.PROVIDER_ERROR,
|
47
48
|
"INTERNAL_SERVER_ERROR": WorkflowErrorCode.INTERNAL_ERROR,
|
48
49
|
"USER_DEFINED_ERROR": WorkflowErrorCode.USER_DEFINED_ERROR,
|
@@ -95,7 +96,7 @@ _WORKFLOW_ERROR_CODE_TO_VELLUM_ERROR_CODE: Dict[WorkflowErrorCode, VellumErrorCo
|
|
95
96
|
WorkflowErrorCode.NODE_EXECUTION: "USER_DEFINED_ERROR",
|
96
97
|
WorkflowErrorCode.PROVIDER_ERROR: "PROVIDER_ERROR",
|
97
98
|
WorkflowErrorCode.PROVIDER_CREDENTIALS_UNAVAILABLE: "PROVIDER_CREDENTIALS_UNAVAILABLE",
|
98
|
-
WorkflowErrorCode.INTEGRATION_CREDENTIALS_UNAVAILABLE: "
|
99
|
+
WorkflowErrorCode.INTEGRATION_CREDENTIALS_UNAVAILABLE: "INTEGRATION_CREDENTIALS_UNAVAILABLE",
|
99
100
|
WorkflowErrorCode.USER_DEFINED_ERROR: "USER_DEFINED_ERROR",
|
100
101
|
WorkflowErrorCode.WORKFLOW_CANCELLED: "REQUEST_TIMEOUT",
|
101
102
|
}
|
@@ -24,6 +24,7 @@ from vellum.workflows.nodes.displayable.tool_calling_node.utils import (
|
|
24
24
|
create_tool_prompt_node,
|
25
25
|
)
|
26
26
|
from vellum.workflows.outputs.base import BaseOutputs
|
27
|
+
from vellum.workflows.ports.utils import validate_ports
|
27
28
|
from vellum.workflows.state.base import BaseState, StateMeta
|
28
29
|
from vellum.workflows.state.context import WorkflowContext
|
29
30
|
from vellum.workflows.types.definition import DeploymentDefinition
|
@@ -38,6 +39,55 @@ def second_function() -> str:
|
|
38
39
|
return "second_function"
|
39
40
|
|
40
41
|
|
42
|
+
def test_router_node_port_ordering_with_multiple_tools():
|
43
|
+
"""
|
44
|
+
Test that router node ports are created in the correct order: on_if, on_elif, ..., on_else.
|
45
|
+
|
46
|
+
This test validates the fix for the bug where multiple tools would create multiple on_if
|
47
|
+
ports instead of on_if followed by on_elif ports, which violates port validation rules.
|
48
|
+
"""
|
49
|
+
|
50
|
+
# GIVEN three functions to ensure we test multiple elif cases
|
51
|
+
def third_function() -> str:
|
52
|
+
return "third_function"
|
53
|
+
|
54
|
+
# AND a tool prompt node
|
55
|
+
tool_prompt_node = create_tool_prompt_node(
|
56
|
+
ml_model="test-model",
|
57
|
+
blocks=[],
|
58
|
+
functions=[first_function, second_function, third_function],
|
59
|
+
prompt_inputs=None,
|
60
|
+
parameters=DEFAULT_PROMPT_PARAMETERS,
|
61
|
+
)
|
62
|
+
|
63
|
+
# WHEN a router node is created with multiple functions
|
64
|
+
router_node = create_router_node(
|
65
|
+
functions=[first_function, second_function, third_function],
|
66
|
+
tool_prompt_node=tool_prompt_node,
|
67
|
+
)
|
68
|
+
|
69
|
+
# THEN the first function port should be an on_if port
|
70
|
+
first_function_port = getattr(router_node.Ports, "first_function")
|
71
|
+
assert first_function_port._condition_type.value == "IF"
|
72
|
+
|
73
|
+
# AND the second function port should be an on_elif port
|
74
|
+
second_function_port = getattr(router_node.Ports, "second_function")
|
75
|
+
assert second_function_port._condition_type.value == "ELIF"
|
76
|
+
|
77
|
+
# AND the third function port should also be an on_elif port
|
78
|
+
third_function_port = getattr(router_node.Ports, "third_function")
|
79
|
+
assert third_function_port._condition_type.value == "ELIF"
|
80
|
+
|
81
|
+
# AND the default port should be an on_else port
|
82
|
+
default_port = getattr(router_node.Ports, "default")
|
83
|
+
assert default_port._condition_type.value == "ELSE"
|
84
|
+
|
85
|
+
# AND the ports should pass validation
|
86
|
+
ports = [first_function_port, second_function_port, third_function_port, default_port]
|
87
|
+
# This should not raise an exception
|
88
|
+
validate_ports(ports)
|
89
|
+
|
90
|
+
|
41
91
|
def test_port_condition_match_function_name():
|
42
92
|
"""
|
43
93
|
Test that the port condition correctly matches the function name.
|
@@ -409,8 +409,8 @@ def create_router_node(
|
|
409
409
|
# Avoid using lambda to capture function_name
|
410
410
|
# lambda will capture the function_name by reference,
|
411
411
|
# and if the function_name is changed, the port_condition will also change.
|
412
|
-
def create_port_condition(fn_name):
|
413
|
-
|
412
|
+
def create_port_condition(fn_name, is_first):
|
413
|
+
condition = (
|
414
414
|
ToolCallingState.current_prompt_output_index.less_than(tool_prompt_node.Outputs.results.length())
|
415
415
|
& tool_prompt_node.Outputs.results[ToolCallingState.current_prompt_output_index]["type"].equals(
|
416
416
|
"FUNCTION_CALL"
|
@@ -419,26 +419,33 @@ def create_router_node(
|
|
419
419
|
"name"
|
420
420
|
].equals(fn_name)
|
421
421
|
)
|
422
|
+
# First port should be on_if, subsequent ports should be on_elif
|
423
|
+
return Port.on_if(condition) if is_first else Port.on_elif(condition)
|
422
424
|
|
425
|
+
is_first_port = True
|
423
426
|
for function in functions:
|
424
427
|
if isinstance(function, ComposioToolDefinition):
|
425
428
|
function_name = get_function_name(function)
|
426
|
-
port = create_port_condition(function_name)
|
429
|
+
port = create_port_condition(function_name, is_first_port)
|
427
430
|
setattr(Ports, function_name, port)
|
431
|
+
is_first_port = False
|
428
432
|
elif isinstance(function, VellumIntegrationToolDefinition):
|
429
433
|
function_name = get_function_name(function)
|
430
|
-
port = create_port_condition(function_name)
|
434
|
+
port = create_port_condition(function_name, is_first_port)
|
431
435
|
setattr(Ports, function_name, port)
|
436
|
+
is_first_port = False
|
432
437
|
elif isinstance(function, MCPServer):
|
433
438
|
tool_functions: List[MCPToolDefinition] = compile_mcp_tool_definition(function)
|
434
439
|
for tool_function in tool_functions:
|
435
440
|
name = get_mcp_tool_name(tool_function)
|
436
|
-
port = create_port_condition(name)
|
441
|
+
port = create_port_condition(name, is_first_port)
|
437
442
|
setattr(Ports, name, port)
|
443
|
+
is_first_port = False
|
438
444
|
else:
|
439
445
|
function_name = get_function_name(function)
|
440
|
-
port = create_port_condition(function_name)
|
446
|
+
port = create_port_condition(function_name, is_first_port)
|
441
447
|
setattr(Ports, function_name, port)
|
448
|
+
is_first_port = False
|
442
449
|
|
443
450
|
# Add the else port for when no function conditions match
|
444
451
|
setattr(Ports, "default", Port.on_else())
|
@@ -52,15 +52,6 @@ class VellumResolver(BaseWorkflowResolver):
|
|
52
52
|
if response.state is None:
|
53
53
|
return None
|
54
54
|
|
55
|
-
if (
|
56
|
-
response.previous_trace_id is None
|
57
|
-
or response.root_trace_id is None
|
58
|
-
or response.previous_span_id is None
|
59
|
-
or response.root_span_id is None
|
60
|
-
):
|
61
|
-
logger.warning("Could not find required execution events for state loading")
|
62
|
-
return None
|
63
|
-
|
64
55
|
if "meta" in response.state:
|
65
56
|
response.state.pop("meta")
|
66
57
|
|
@@ -71,6 +62,20 @@ class VellumResolver(BaseWorkflowResolver):
|
|
71
62
|
logger.warning("No workflow class registered, falling back to BaseState")
|
72
63
|
state = BaseState(**response.state)
|
73
64
|
|
65
|
+
if (
|
66
|
+
response.previous_trace_id is None
|
67
|
+
or response.root_trace_id is None
|
68
|
+
or response.previous_span_id is None
|
69
|
+
or response.root_span_id is None
|
70
|
+
):
|
71
|
+
return LoadStateResult(
|
72
|
+
state=state,
|
73
|
+
previous_trace_id=response.trace_id,
|
74
|
+
previous_span_id=response.span_id,
|
75
|
+
root_trace_id=response.trace_id,
|
76
|
+
root_span_id=response.span_id,
|
77
|
+
)
|
78
|
+
|
74
79
|
return LoadStateResult(
|
75
80
|
state=state,
|
76
81
|
previous_trace_id=response.previous_trace_id,
|
@@ -695,6 +695,34 @@ class WorkflowRunner(Generic[StateType]):
|
|
695
695
|
|
696
696
|
return None
|
697
697
|
|
698
|
+
def _emit_node_cancellation_events(
|
699
|
+
self,
|
700
|
+
error_message: str,
|
701
|
+
parent_context: Optional[ParentContext],
|
702
|
+
) -> None:
|
703
|
+
"""
|
704
|
+
Emit node cancellation events for all active nodes.
|
705
|
+
|
706
|
+
Args:
|
707
|
+
error_message: The error message to include in the cancellation events
|
708
|
+
parent_context: The parent context for the cancellation events
|
709
|
+
"""
|
710
|
+
for span_id, active_node in list(self._active_nodes_by_execution_id.items()):
|
711
|
+
rejection_event = NodeExecutionRejectedEvent(
|
712
|
+
trace_id=self._execution_context.trace_id,
|
713
|
+
span_id=span_id,
|
714
|
+
body=NodeExecutionRejectedBody(
|
715
|
+
node_definition=active_node.node.__class__,
|
716
|
+
error=WorkflowError(
|
717
|
+
code=WorkflowErrorCode.NODE_CANCELLED,
|
718
|
+
message=error_message,
|
719
|
+
),
|
720
|
+
),
|
721
|
+
parent=parent_context,
|
722
|
+
)
|
723
|
+
self._workflow_event_outer_queue.put(rejection_event)
|
724
|
+
self._active_nodes_by_execution_id.pop(span_id)
|
725
|
+
|
698
726
|
def _initiate_workflow_event(self) -> WorkflowExecutionInitiatedEvent:
|
699
727
|
links: Optional[List[SpanLink]] = None
|
700
728
|
|
@@ -848,21 +876,10 @@ class WorkflowRunner(Generic[StateType]):
|
|
848
876
|
|
849
877
|
if rejection_event:
|
850
878
|
failed_node_name = rejection_event.body.node_definition.__name__
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
body=NodeExecutionRejectedBody(
|
856
|
-
node_definition=active_node_data.node.__class__,
|
857
|
-
error=WorkflowError(
|
858
|
-
message=f"Node execution cancelled due to {failed_node_name} failure",
|
859
|
-
code=WorkflowErrorCode.NODE_CANCELLED,
|
860
|
-
),
|
861
|
-
),
|
862
|
-
parent=self._execution_context.parent_context,
|
863
|
-
)
|
864
|
-
self._workflow_event_outer_queue.put(cancellation_event)
|
865
|
-
self._active_nodes_by_execution_id.pop(active_span_id)
|
879
|
+
self._emit_node_cancellation_events(
|
880
|
+
error_message=f"Node execution cancelled due to {failed_node_name} failure",
|
881
|
+
parent_context=self._execution_context.parent_context,
|
882
|
+
)
|
866
883
|
break
|
867
884
|
|
868
885
|
# Handle any remaining events
|
@@ -932,6 +949,17 @@ class WorkflowRunner(Generic[StateType]):
|
|
932
949
|
|
933
950
|
while not kill_switch.wait(timeout=0.1):
|
934
951
|
if self._cancel_signal.is_set():
|
952
|
+
parent_context = WorkflowParentContext(
|
953
|
+
span_id=self._initial_state.meta.span_id,
|
954
|
+
workflow_definition=self.workflow.__class__,
|
955
|
+
parent=self._execution_context.parent_context,
|
956
|
+
)
|
957
|
+
|
958
|
+
self._emit_node_cancellation_events(
|
959
|
+
error_message="Workflow run cancelled",
|
960
|
+
parent_context=parent_context,
|
961
|
+
)
|
962
|
+
|
935
963
|
self._workflow_event_outer_queue.put(
|
936
964
|
self._reject_workflow_event(
|
937
965
|
WorkflowError(
|
vellum/workflows/types/core.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from enum import Enum
|
2
|
+
from threading import Event as ThreadingEvent
|
2
3
|
from typing import ( # type: ignore[attr-defined]
|
3
4
|
Any,
|
4
5
|
Dict,
|
@@ -15,6 +16,8 @@ JsonArray = List["Json"]
|
|
15
16
|
JsonObject = Dict[str, "Json"]
|
16
17
|
Json = Union[None, bool, int, float, str, JsonArray, JsonObject]
|
17
18
|
|
19
|
+
CancelSignal = ThreadingEvent
|
20
|
+
|
18
21
|
# Unions and Generics inherit from `_GenericAlias` instead of `type`
|
19
22
|
# In future versions of python, we'll see `_UnionGenericAlias`
|
20
23
|
UnderGenericAlias = _GenericAlias
|
@@ -160,7 +160,7 @@ vellum/client/README.md,sha256=flqu57ubZNTfpq60CdLtJC9gp4WEkyjb_n_eZ4OYf9w,6497
|
|
160
160
|
vellum/client/__init__.py,sha256=rMnKRqL5-356SBc-rfm56MkO87PuAi2mtcfBszcJU1M,74316
|
161
161
|
vellum/client/core/__init__.py,sha256=lTcqUPXcx4112yLDd70RAPeqq6tu3eFMe1pKOqkW9JQ,1562
|
162
162
|
vellum/client/core/api_error.py,sha256=44vPoTyWN59gonCIZMdzw7M1uspygiLnr3GNFOoVL2Q,614
|
163
|
-
vellum/client/core/client_wrapper.py,sha256=
|
163
|
+
vellum/client/core/client_wrapper.py,sha256=_OdpOQxXZT7UdFB0twb2X_9YF8z4xjZfVD-9hV_mXao,2840
|
164
164
|
vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
|
165
165
|
vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
|
166
166
|
vellum/client/core/force_multipart.py,sha256=awxh5MtcRYe74ehY8U76jzv6fYM_w_D3Rur7KQQzSDk,429
|
@@ -1804,7 +1804,7 @@ vellum/workflows/emitters/vellum_emitter.py,sha256=t4ixrN0NNXrydMP9PVKYvcOMxoMqs
|
|
1804
1804
|
vellum/workflows/environment/__init__.py,sha256=TJz0m9dwIs6YOwCTeuN0HHsU-ecyjc1OJXx4AFy83EQ,121
|
1805
1805
|
vellum/workflows/environment/environment.py,sha256=Ck3RPKXJvtMGx_toqYQQQF-ZwXm5ijVwJpEPTeIJ4_Q,471
|
1806
1806
|
vellum/workflows/errors/__init__.py,sha256=tWGPu5xyAU8gRb8_bl0fL7OfU3wxQ9UH6qVwy4X4P_Q,113
|
1807
|
-
vellum/workflows/errors/types.py,sha256=
|
1807
|
+
vellum/workflows/errors/types.py,sha256=AW1lkWeC2MlAHf-N-KcYiyiWa0IKhVD_N2WSqFyY3-s,4642
|
1808
1808
|
vellum/workflows/events/__init__.py,sha256=V4mh766fyA70WvHelm9kfVZGrUgEKcJ9tJt8EepfQYU,832
|
1809
1809
|
vellum/workflows/events/context.py,sha256=vCfMIPmz4j9Om36rRWa35A_JU_VccWWS52_mZkkqxak,3345
|
1810
1810
|
vellum/workflows/events/exception_handling.py,sha256=2okFtCzrOzaCP-HEwBPMvHn-evlyyE1zRkmIYjR__jQ,1975
|
@@ -1979,9 +1979,9 @@ vellum/workflows/nodes/displayable/tool_calling_node/node.py,sha256=pwK9q1blgRv9
|
|
1979
1979
|
vellum/workflows/nodes/displayable/tool_calling_node/state.py,sha256=CcBVb_YtwfSSka4ze678k6-qwmzMSfjfVP8_Y95feSo,302
|
1980
1980
|
vellum/workflows/nodes/displayable/tool_calling_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1981
1981
|
vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py,sha256=in1fbEz5x1tx3uKv9YXdvOncsHucNL8Ro6Go7lBuuOQ,8962
|
1982
|
-
vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py,sha256=
|
1982
|
+
vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py,sha256=Idjtlly6GTotNa4isXJ23RxKzQA2oE10MOm793aipLA,13892
|
1983
1983
|
vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py,sha256=EmKFA-ELdTzlK0xMqWnuSZPoGNLYCwk6b0amTqirZo0,11305
|
1984
|
-
vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=
|
1984
|
+
vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=yIo7xwI43M8wQO8UN4uYxWBWafgcC9e8Ucsp6PZDva4,24518
|
1985
1985
|
vellum/workflows/nodes/displayable/web_search_node/__init__.py,sha256=8FOnEP-n-U68cvxTlJW9wphIAGHq5aqjzLM-DoSSXnU,61
|
1986
1986
|
vellum/workflows/nodes/displayable/web_search_node/node.py,sha256=NQYux2bOtuBF5E4tn-fXi5y3btURPRrNqMSM9MAZYI4,5091
|
1987
1987
|
vellum/workflows/nodes/displayable/web_search_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -2017,11 +2017,11 @@ vellum/workflows/references/vellum_secret.py,sha256=Od4d19a5yletWMqNfJR5d_mZQUkV
|
|
2017
2017
|
vellum/workflows/references/workflow_input.py,sha256=W3rOK1EPd2gYHb04WJwmNm1CUSdvZ9LKrs8RMKxACBs,1751
|
2018
2018
|
vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
|
2019
2019
|
vellum/workflows/resolvers/base.py,sha256=wrQiSC02Bw4-dBwgFjJIHsjpe-4xz4rUJs_1RdErKA0,1164
|
2020
|
-
vellum/workflows/resolvers/resolver.py,sha256=
|
2020
|
+
vellum/workflows/resolvers/resolver.py,sha256=3uEYscB_2PHTazc0Y9SzOe_yiQZhVLfey19hU1HzBaU,3127
|
2021
2021
|
vellum/workflows/resolvers/tests/test_resolver.py,sha256=PnUGzsulo1It_LjjhHsRNiILvvl5G_IaK8ZX56zKC28,6204
|
2022
2022
|
vellum/workflows/resolvers/types.py,sha256=Hndhlk69g6EKLh_LYg5ILepW5U_h_BYNllfzhS9k8p4,237
|
2023
2023
|
vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
|
2024
|
-
vellum/workflows/runner/runner.py,sha256=
|
2024
|
+
vellum/workflows/runner/runner.py,sha256=NWmjGn8Unv3GjA-DF6e7sAEJhZptWqYqNOohZ4gy8Ko,44199
|
2025
2025
|
vellum/workflows/sandbox.py,sha256=mezSZmilR_fwR8164n8CEfzlMeQ55IqfapHp4ftImvQ,3212
|
2026
2026
|
vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
|
2027
2027
|
vellum/workflows/state/base.py,sha256=A8s0PC8UvFjPpkHDY6u-yIeb2KHjoAmu-GW-GYrDl0E,24654
|
@@ -2035,9 +2035,9 @@ vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
2035
2035
|
vellum/workflows/tests/test_dataset_row.py,sha256=S8aIiYU9TRzJ8GTl5qCjnJ-fuHdxatHJFGLlKTVHPr4,4174
|
2036
2036
|
vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
|
2037
2037
|
vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
|
2038
|
-
vellum/workflows/types/__init__.py,sha256=
|
2038
|
+
vellum/workflows/types/__init__.py,sha256=fZ3Xxly7YSsu4kCIYD5aYpYucNM97zTyInb9CA24mf0,102
|
2039
2039
|
vellum/workflows/types/code_execution_node_wrappers.py,sha256=fewX9bqF_4TZuK-gZYIn12s31-k03vHMGRpvFAPm11Y,3206
|
2040
|
-
vellum/workflows/types/core.py,sha256=
|
2040
|
+
vellum/workflows/types/core.py,sha256=B8d5spKNlHfXu5sWo72Jl1l1IOYdHaKGqgEr_lvBUqA,1027
|
2041
2041
|
vellum/workflows/types/definition.py,sha256=Qof2MAjSNB0AN2XkSKmk-owuY59YcxDVHYpno6-StPA,8058
|
2042
2042
|
vellum/workflows/types/generics.py,sha256=8jptbEx1fnJV0Lhj0MpCJOT6yNiEWeTOYOwrEAb5CRU,1576
|
2043
2043
|
vellum/workflows/types/stack.py,sha256=h7NE0vXR7l9DevFBIzIAk1Zh59K-kECQtDTKOUunwMY,1314
|
@@ -2065,8 +2065,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
|
|
2065
2065
|
vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2066
2066
|
vellum/workflows/workflows/tests/test_base_workflow.py,sha256=Boa-_m9ii2Qsa1RvVM-VYniF7zCpzGgEGy-OnPZkrHg,23941
|
2067
2067
|
vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
|
2068
|
-
vellum_ai-1.7.
|
2069
|
-
vellum_ai-1.7.
|
2070
|
-
vellum_ai-1.7.
|
2071
|
-
vellum_ai-1.7.
|
2072
|
-
vellum_ai-1.7.
|
2068
|
+
vellum_ai-1.7.3.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
|
2069
|
+
vellum_ai-1.7.3.dist-info/METADATA,sha256=CeGDMnbsse5v1VkYVs8u9mZ7GzXcny1eQ_J5GBNOZwg,5547
|
2070
|
+
vellum_ai-1.7.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
2071
|
+
vellum_ai-1.7.3.dist-info/entry_points.txt,sha256=xVavzAKN4iF_NbmhWOlOkHluka0YLkbN_pFQ9pW3gLI,117
|
2072
|
+
vellum_ai-1.7.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|