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.
@@ -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.2",
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.2",
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:
@@ -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: "PROVIDER_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
- return Port.on_if(
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
- for active_span_id, active_node_data in list(self._active_nodes_by_execution_id.items()):
852
- cancellation_event = NodeExecutionRejectedEvent(
853
- trace_id=self._execution_context.trace_id,
854
- span_id=active_span_id,
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(
@@ -1,5 +1,6 @@
1
- from .core import MergeBehavior
1
+ from .core import CancelSignal, MergeBehavior
2
2
 
3
3
  __all__ = [
4
+ "CancelSignal",
4
5
  "MergeBehavior",
5
6
  ]
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 1.7.2
3
+ Version: 1.7.3
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -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=4Sfjvux7hceG2zs5IHHn9McKc2YE_WIb9ctx_HfCyzA,2840
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=dmIYCJl2OdQnU5CW_fgKcQy7tERAeddLQ1FSp7gIKeA,4541
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=GZoeybB9uM7ai8sBLAtUMHrMVgh-WrJDWrKZci6feDs,11892
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=NDp2rEU-1QACxrSplocDKlPzILczzvPygkUOrysjU7Y,24109
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=EIIiA2OlaVUPiKiSh6egQZxPA6ny1GDMdPq1AuN-mV8,2961
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=rwMZlQBkzK-EfewC6OysNCeuDeTCfpNuzaUlgYoFJMw,43329
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=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
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=X8xNBLUhnea97t3qeeZJ2XyUwW_a38YiznXr73j_ppE,950
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.2.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
2069
- vellum_ai-1.7.2.dist-info/METADATA,sha256=KyFKrTqcT-6Pvl5zTeo1EsEP0-uY4WREJPAr8Vdkh4A,5547
2070
- vellum_ai-1.7.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
2071
- vellum_ai-1.7.2.dist-info/entry_points.txt,sha256=xVavzAKN4iF_NbmhWOlOkHluka0YLkbN_pFQ9pW3gLI,117
2072
- vellum_ai-1.7.2.dist-info/RECORD,,
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,,