vellum-ai 0.12.9__py3-none-any.whl → 0.12.13__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 (26) hide show
  1. vellum/__init__.py +2 -2
  2. vellum/client/__init__.py +14 -4
  3. vellum/client/core/client_wrapper.py +1 -1
  4. vellum/client/types/__init__.py +2 -2
  5. vellum/client/types/function_call.py +0 -2
  6. vellum/client/types/function_call_request.py +0 -2
  7. vellum/client/types/metric_definition_execution.py +6 -0
  8. vellum/client/types/test_suite_run_execution_metric_result.py +6 -0
  9. vellum/client/types/test_suite_run_metric_array_output.py +32 -0
  10. vellum/client/types/test_suite_run_metric_output.py +2 -0
  11. vellum/types/{fulfilled_enum.py → test_suite_run_metric_array_output.py} +1 -1
  12. vellum/workflows/exceptions.py +1 -1
  13. vellum/workflows/nodes/displayable/bases/search_node.py +1 -5
  14. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +17 -10
  15. vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +13 -3
  16. vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py +1 -2
  17. vellum/workflows/runner/runner.py +10 -3
  18. vellum/workflows/state/encoder.py +4 -0
  19. vellum/workflows/state/tests/test_state.py +19 -0
  20. vellum/workflows/workflows/base.py +41 -1
  21. {vellum_ai-0.12.9.dist-info → vellum_ai-0.12.13.dist-info}/METADATA +1 -1
  22. {vellum_ai-0.12.9.dist-info → vellum_ai-0.12.13.dist-info}/RECORD +25 -25
  23. vellum/client/types/fulfilled_enum.py +0 -5
  24. {vellum_ai-0.12.9.dist-info → vellum_ai-0.12.13.dist-info}/LICENSE +0 -0
  25. {vellum_ai-0.12.9.dist-info → vellum_ai-0.12.13.dist-info}/WHEEL +0 -0
  26. {vellum_ai-0.12.9.dist-info → vellum_ai-0.12.13.dist-info}/entry_points.txt +0 -0
vellum/__init__.py CHANGED
@@ -120,7 +120,6 @@ from .types import (
120
120
  FolderEntityWorkflowSandbox,
121
121
  FolderEntityWorkflowSandboxData,
122
122
  FulfilledAdHocExecutePromptEvent,
123
- FulfilledEnum,
124
123
  FulfilledExecutePromptEvent,
125
124
  FulfilledExecutePromptResponse,
126
125
  FulfilledExecuteWorkflowWorkflowResultEvent,
@@ -389,6 +388,7 @@ from .types import (
389
388
  TestSuiteRunExternalExecConfigData,
390
389
  TestSuiteRunExternalExecConfigDataRequest,
391
390
  TestSuiteRunExternalExecConfigRequest,
391
+ TestSuiteRunMetricArrayOutput,
392
392
  TestSuiteRunMetricErrorOutput,
393
393
  TestSuiteRunMetricJsonOutput,
394
394
  TestSuiteRunMetricNumberOutput,
@@ -649,7 +649,6 @@ __all__ = [
649
649
  "FolderEntityWorkflowSandboxData",
650
650
  "ForbiddenError",
651
651
  "FulfilledAdHocExecutePromptEvent",
652
- "FulfilledEnum",
653
652
  "FulfilledExecutePromptEvent",
654
653
  "FulfilledExecutePromptResponse",
655
654
  "FulfilledExecuteWorkflowWorkflowResultEvent",
@@ -922,6 +921,7 @@ __all__ = [
922
921
  "TestSuiteRunExternalExecConfigData",
923
922
  "TestSuiteRunExternalExecConfigDataRequest",
924
923
  "TestSuiteRunExternalExecConfigRequest",
924
+ "TestSuiteRunMetricArrayOutput",
925
925
  "TestSuiteRunMetricErrorOutput",
926
926
  "TestSuiteRunMetricJsonOutput",
927
927
  "TestSuiteRunMetricNumberOutput",
vellum/client/__init__.py CHANGED
@@ -1079,6 +1079,7 @@ class Vellum:
1079
1079
  index_id: typing.Optional[str] = OMIT,
1080
1080
  index_name: typing.Optional[str] = OMIT,
1081
1081
  options: typing.Optional[SearchRequestOptionsRequest] = OMIT,
1082
+ document_index: typing.Optional[str] = OMIT,
1082
1083
  request_options: typing.Optional[RequestOptions] = None,
1083
1084
  ) -> SearchResponse:
1084
1085
  """
@@ -1090,14 +1091,17 @@ class Vellum:
1090
1091
  The query to search for.
1091
1092
 
1092
1093
  index_id : typing.Optional[str]
1093
- The ID of the index to search against. Must provide either this or index_name.
1094
+ The ID of the index to search against. Must provide either this, index_name or document_index.
1094
1095
 
1095
1096
  index_name : typing.Optional[str]
1096
- The name of the index to search against. Must provide either this or index_id.
1097
+ The name of the index to search against. Must provide either this, index_id or document_index.
1097
1098
 
1098
1099
  options : typing.Optional[SearchRequestOptionsRequest]
1099
1100
  Configuration options for the search.
1100
1101
 
1102
+ document_index : typing.Optional[str]
1103
+ Either the index name or index ID to search against. Must provide either this, index_id or index_name.
1104
+
1101
1105
  request_options : typing.Optional[RequestOptions]
1102
1106
  Request-specific configuration.
1103
1107
 
@@ -1128,6 +1132,7 @@ class Vellum:
1128
1132
  "options": convert_and_respect_annotation_metadata(
1129
1133
  object_=options, annotation=SearchRequestOptionsRequest, direction="write"
1130
1134
  ),
1135
+ "document_index": document_index,
1131
1136
  },
1132
1137
  request_options=request_options,
1133
1138
  omit=OMIT,
@@ -2395,6 +2400,7 @@ class AsyncVellum:
2395
2400
  index_id: typing.Optional[str] = OMIT,
2396
2401
  index_name: typing.Optional[str] = OMIT,
2397
2402
  options: typing.Optional[SearchRequestOptionsRequest] = OMIT,
2403
+ document_index: typing.Optional[str] = OMIT,
2398
2404
  request_options: typing.Optional[RequestOptions] = None,
2399
2405
  ) -> SearchResponse:
2400
2406
  """
@@ -2406,14 +2412,17 @@ class AsyncVellum:
2406
2412
  The query to search for.
2407
2413
 
2408
2414
  index_id : typing.Optional[str]
2409
- The ID of the index to search against. Must provide either this or index_name.
2415
+ The ID of the index to search against. Must provide either this, index_name or document_index.
2410
2416
 
2411
2417
  index_name : typing.Optional[str]
2412
- The name of the index to search against. Must provide either this or index_id.
2418
+ The name of the index to search against. Must provide either this, index_id or document_index.
2413
2419
 
2414
2420
  options : typing.Optional[SearchRequestOptionsRequest]
2415
2421
  Configuration options for the search.
2416
2422
 
2423
+ document_index : typing.Optional[str]
2424
+ Either the index name or index ID to search against. Must provide either this, index_id or index_name.
2425
+
2417
2426
  request_options : typing.Optional[RequestOptions]
2418
2427
  Request-specific configuration.
2419
2428
 
@@ -2452,6 +2461,7 @@ class AsyncVellum:
2452
2461
  "options": convert_and_respect_annotation_metadata(
2453
2462
  object_=options, annotation=SearchRequestOptionsRequest, direction="write"
2454
2463
  ),
2464
+ "document_index": document_index,
2455
2465
  },
2456
2466
  request_options=request_options,
2457
2467
  omit=OMIT,
@@ -18,7 +18,7 @@ class BaseClientWrapper:
18
18
  headers: typing.Dict[str, str] = {
19
19
  "X-Fern-Language": "Python",
20
20
  "X-Fern-SDK-Name": "vellum-ai",
21
- "X-Fern-SDK-Version": "0.12.9",
21
+ "X-Fern-SDK-Version": "0.12.13",
22
22
  }
23
23
  headers["X_API_KEY"] = self.api_key
24
24
  return headers
@@ -127,7 +127,6 @@ from .folder_entity_test_suite_data import FolderEntityTestSuiteData
127
127
  from .folder_entity_workflow_sandbox import FolderEntityWorkflowSandbox
128
128
  from .folder_entity_workflow_sandbox_data import FolderEntityWorkflowSandboxData
129
129
  from .fulfilled_ad_hoc_execute_prompt_event import FulfilledAdHocExecutePromptEvent
130
- from .fulfilled_enum import FulfilledEnum
131
130
  from .fulfilled_execute_prompt_event import FulfilledExecutePromptEvent
132
131
  from .fulfilled_execute_prompt_response import FulfilledExecutePromptResponse
133
132
  from .fulfilled_execute_workflow_workflow_result_event import FulfilledExecuteWorkflowWorkflowResultEvent
@@ -402,6 +401,7 @@ from .test_suite_run_external_exec_config import TestSuiteRunExternalExecConfig
402
401
  from .test_suite_run_external_exec_config_data import TestSuiteRunExternalExecConfigData
403
402
  from .test_suite_run_external_exec_config_data_request import TestSuiteRunExternalExecConfigDataRequest
404
403
  from .test_suite_run_external_exec_config_request import TestSuiteRunExternalExecConfigRequest
404
+ from .test_suite_run_metric_array_output import TestSuiteRunMetricArrayOutput
405
405
  from .test_suite_run_metric_error_output import TestSuiteRunMetricErrorOutput
406
406
  from .test_suite_run_metric_json_output import TestSuiteRunMetricJsonOutput
407
407
  from .test_suite_run_metric_number_output import TestSuiteRunMetricNumberOutput
@@ -641,7 +641,6 @@ __all__ = [
641
641
  "FolderEntityWorkflowSandbox",
642
642
  "FolderEntityWorkflowSandboxData",
643
643
  "FulfilledAdHocExecutePromptEvent",
644
- "FulfilledEnum",
645
644
  "FulfilledExecutePromptEvent",
646
645
  "FulfilledExecutePromptResponse",
647
646
  "FulfilledExecuteWorkflowWorkflowResultEvent",
@@ -910,6 +909,7 @@ __all__ = [
910
909
  "TestSuiteRunExternalExecConfigData",
911
910
  "TestSuiteRunExternalExecConfigDataRequest",
912
911
  "TestSuiteRunExternalExecConfigRequest",
912
+ "TestSuiteRunMetricArrayOutput",
913
913
  "TestSuiteRunMetricErrorOutput",
914
914
  "TestSuiteRunMetricJsonOutput",
915
915
  "TestSuiteRunMetricNumberOutput",
@@ -2,7 +2,6 @@
2
2
 
3
3
  from ..core.pydantic_utilities import UniversalBaseModel
4
4
  import typing
5
- from .fulfilled_enum import FulfilledEnum
6
5
  from ..core.pydantic_utilities import IS_PYDANTIC_V2
7
6
  import pydantic
8
7
 
@@ -15,7 +14,6 @@ class FunctionCall(UniversalBaseModel):
15
14
  arguments: typing.Dict[str, typing.Optional[typing.Any]]
16
15
  id: typing.Optional[str] = None
17
16
  name: str
18
- state: typing.Optional[FulfilledEnum] = None
19
17
 
20
18
  if IS_PYDANTIC_V2:
21
19
  model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
@@ -2,7 +2,6 @@
2
2
 
3
3
  from ..core.pydantic_utilities import UniversalBaseModel
4
4
  import typing
5
- from .fulfilled_enum import FulfilledEnum
6
5
  from ..core.pydantic_utilities import IS_PYDANTIC_V2
7
6
  import pydantic
8
7
 
@@ -15,7 +14,6 @@ class FunctionCallRequest(UniversalBaseModel):
15
14
  arguments: typing.Dict[str, typing.Optional[typing.Any]]
16
15
  id: typing.Optional[str] = None
17
16
  name: str
18
- state: typing.Optional[FulfilledEnum] = None
19
17
 
20
18
  if IS_PYDANTIC_V2:
21
19
  model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
@@ -1,10 +1,13 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ from __future__ import annotations
3
4
  from ..core.pydantic_utilities import UniversalBaseModel
5
+ from .array_vellum_value import ArrayVellumValue
4
6
  import typing
5
7
  from .test_suite_run_metric_output import TestSuiteRunMetricOutput
6
8
  from ..core.pydantic_utilities import IS_PYDANTIC_V2
7
9
  import pydantic
10
+ from ..core.pydantic_utilities import update_forward_refs
8
11
 
9
12
 
10
13
  class MetricDefinitionExecution(UniversalBaseModel):
@@ -18,3 +21,6 @@ class MetricDefinitionExecution(UniversalBaseModel):
18
21
  frozen = True
19
22
  smart_union = True
20
23
  extra = pydantic.Extra.allow
24
+
25
+
26
+ update_forward_refs(ArrayVellumValue, MetricDefinitionExecution=MetricDefinitionExecution)
@@ -1,11 +1,14 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ from __future__ import annotations
3
4
  from ..core.pydantic_utilities import UniversalBaseModel
5
+ from .array_vellum_value import ArrayVellumValue
4
6
  import typing
5
7
  from .test_suite_run_metric_output import TestSuiteRunMetricOutput
6
8
  from .test_suite_run_execution_metric_definition import TestSuiteRunExecutionMetricDefinition
7
9
  from ..core.pydantic_utilities import IS_PYDANTIC_V2
8
10
  import pydantic
11
+ from ..core.pydantic_utilities import update_forward_refs
9
12
 
10
13
 
11
14
  class TestSuiteRunExecutionMetricResult(UniversalBaseModel):
@@ -22,3 +25,6 @@ class TestSuiteRunExecutionMetricResult(UniversalBaseModel):
22
25
  frozen = True
23
26
  smart_union = True
24
27
  extra = pydantic.Extra.allow
28
+
29
+
30
+ update_forward_refs(ArrayVellumValue, TestSuiteRunExecutionMetricResult=TestSuiteRunExecutionMetricResult)
@@ -0,0 +1,32 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from __future__ import annotations
4
+ from ..core.pydantic_utilities import UniversalBaseModel
5
+ from .array_vellum_value import ArrayVellumValue
6
+ import typing
7
+ from .vellum_value import VellumValue
8
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+ from ..core.pydantic_utilities import update_forward_refs
11
+
12
+
13
+ class TestSuiteRunMetricArrayOutput(UniversalBaseModel):
14
+ """
15
+ Output for a test suite run metric that is of type ARRAY
16
+ """
17
+
18
+ value: typing.Optional[typing.List[VellumValue]] = None
19
+ type: typing.Literal["ARRAY"] = "ARRAY"
20
+ name: str
21
+
22
+ if IS_PYDANTIC_V2:
23
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
24
+ else:
25
+
26
+ class Config:
27
+ frozen = True
28
+ smart_union = True
29
+ extra = pydantic.Extra.allow
30
+
31
+
32
+ update_forward_refs(ArrayVellumValue, TestSuiteRunMetricArrayOutput=TestSuiteRunMetricArrayOutput)
@@ -5,10 +5,12 @@ from .test_suite_run_metric_string_output import TestSuiteRunMetricStringOutput
5
5
  from .test_suite_run_metric_number_output import TestSuiteRunMetricNumberOutput
6
6
  from .test_suite_run_metric_json_output import TestSuiteRunMetricJsonOutput
7
7
  from .test_suite_run_metric_error_output import TestSuiteRunMetricErrorOutput
8
+ from .test_suite_run_metric_array_output import TestSuiteRunMetricArrayOutput
8
9
 
9
10
  TestSuiteRunMetricOutput = typing.Union[
10
11
  TestSuiteRunMetricStringOutput,
11
12
  TestSuiteRunMetricNumberOutput,
12
13
  TestSuiteRunMetricJsonOutput,
13
14
  TestSuiteRunMetricErrorOutput,
15
+ TestSuiteRunMetricArrayOutput,
14
16
  ]
@@ -1,3 +1,3 @@
1
1
  # WARNING: This file will be removed in a future release. Please import from "vellum.client" instead.
2
2
 
3
- from vellum.client.types.fulfilled_enum import *
3
+ from vellum.client.types.test_suite_run_metric_array_output import *
@@ -2,7 +2,7 @@ from vellum.workflows.errors import WorkflowError, WorkflowErrorCode
2
2
 
3
3
 
4
4
  class NodeException(Exception):
5
- def __init__(self, message: str, code: WorkflowErrorCode):
5
+ def __init__(self, message: str, code: WorkflowErrorCode = WorkflowErrorCode.INTERNAL_ERROR):
6
6
  self.message = message
7
7
  self.code = code
8
8
  super().__init__(message)
@@ -12,7 +12,6 @@ from vellum import (
12
12
  SearchWeightsRequest,
13
13
  )
14
14
  from vellum.core import ApiError, RequestOptions
15
- from vellum.utils.uuid import is_valid_uuid
16
15
  from vellum.workflows.errors import WorkflowErrorCode
17
16
  from vellum.workflows.exceptions import NodeException
18
17
  from vellum.workflows.nodes.bases import BaseNode
@@ -74,13 +73,10 @@ class BaseSearchNode(BaseNode[StateType], Generic[StateType]):
74
73
  results: List[SearchResult]
75
74
 
76
75
  def _perform_search(self) -> SearchResponse:
77
- index_is_uuid = True if isinstance(self.document_index, UUID) else is_valid_uuid(self.document_index)
78
-
79
76
  try:
80
77
  return self._context.vellum_client.search(
81
78
  query=self.query,
82
- index_id=str(self.document_index) if index_is_uuid else None,
83
- index_name=str(self.document_index) if not index_is_uuid else None,
79
+ document_index=str(self.document_index),
84
80
  options=self.options,
85
81
  )
86
82
  except NotFoundError:
@@ -1,3 +1,4 @@
1
+ import json
1
2
  from typing import Iterator
2
3
 
3
4
  from vellum.workflows.errors import WorkflowErrorCode
@@ -37,13 +38,19 @@ class InlinePromptNode(BaseInlinePromptNode[StateType]):
37
38
  code=WorkflowErrorCode.INTERNAL_ERROR,
38
39
  )
39
40
 
40
- string_output = next((output for output in outputs if output.type == "STRING"), None)
41
- if not string_output or string_output.value is None:
42
- output_types = {output.type for output in outputs}
43
- is_plural = len(output_types) > 1
44
- raise NodeException(
45
- message=f"Expected to receive a non-null string output from Prompt. Only found outputs of type{'s' if is_plural else ''}: {', '.join(output_types)}", # noqa: E501
46
- code=WorkflowErrorCode.INTERNAL_ERROR,
47
- )
48
-
49
- yield BaseOutput(name="text", value=string_output.value)
41
+ string_outputs = []
42
+ for output in outputs:
43
+ if output.value is None:
44
+ continue
45
+
46
+ if output.type == "STRING":
47
+ string_outputs.append(output.value)
48
+ elif output.type == "JSON":
49
+ string_outputs.append(json.dumps(output.value, indent=4))
50
+ elif output.type == "FUNCTION_CALL":
51
+ string_outputs.append(output.value.model_dump_json(indent=4))
52
+ else:
53
+ string_outputs.append(output.value.message)
54
+
55
+ value = "\n".join(string_outputs)
56
+ yield BaseOutput(name="text", value=value)
@@ -12,7 +12,6 @@ from vellum.client.types.initiated_execute_prompt_event import InitiatedExecuteP
12
12
  from vellum.client.types.prompt_output import PromptOutput
13
13
  from vellum.client.types.prompt_request_json_input import PromptRequestJsonInput
14
14
  from vellum.client.types.string_vellum_value import StringVellumValue
15
- from vellum.workflows.nodes.displayable.bases.inline_prompt_node.node import BaseInlinePromptNode
16
15
  from vellum.workflows.nodes.displayable.inline_prompt_node.node import InlinePromptNode
17
16
 
18
17
 
@@ -74,7 +73,7 @@ def test_inline_prompt_node__function_definitions(vellum_adhoc_prompt_client):
74
73
  pass
75
74
 
76
75
  # AND a prompt node with a accepting that function definition
77
- class MyNode(BaseInlinePromptNode):
76
+ class MyNode(InlinePromptNode):
78
77
  ml_model = "gpt-4o"
79
78
  functions = [my_function]
80
79
  prompt_inputs = {}
@@ -99,7 +98,7 @@ def test_inline_prompt_node__function_definitions(vellum_adhoc_prompt_client):
99
98
  vellum_adhoc_prompt_client.adhoc_execute_prompt_stream.side_effect = generate_prompt_events
100
99
 
101
100
  # WHEN the node is run
102
- list(MyNode().run())
101
+ outputs = list(MyNode().run())
103
102
 
104
103
  # THEN the prompt is executed with the correct inputs
105
104
  mock_api = vellum_adhoc_prompt_client.adhoc_execute_prompt_stream
@@ -117,3 +116,14 @@ def test_inline_prompt_node__function_definitions(vellum_adhoc_prompt_client):
117
116
  },
118
117
  ),
119
118
  ]
119
+ assert (
120
+ outputs[-1].value
121
+ == """{
122
+ "arguments": {
123
+ "foo": "hello",
124
+ "bar": 1
125
+ },
126
+ "id": null,
127
+ "name": "my_function"
128
+ }"""
129
+ )
@@ -118,8 +118,7 @@ witness or missing person.\
118
118
 
119
119
  # AND we should have made the expected call to Vellum search
120
120
  vellum_search_client.assert_called_once_with(
121
- index_id=None,
122
- index_name="vellum-trust-center-policies",
121
+ document_index="vellum-trust-center-policies",
123
122
  query="How often is employee training?",
124
123
  options=SearchRequestOptionsRequest(
125
124
  limit=8,
@@ -4,7 +4,7 @@ import logging
4
4
  from queue import Empty, Queue
5
5
  from threading import Event as ThreadingEvent, Thread
6
6
  from uuid import UUID
7
- from typing import TYPE_CHECKING, Any, Dict, Generic, Iterable, Iterator, Optional, Sequence, Set, Type, Union
7
+ from typing import TYPE_CHECKING, Any, Dict, Generic, Iterable, Iterator, List, Optional, Sequence, Set, Type, Union
8
8
 
9
9
  from vellum.workflows.constants import UNDEF
10
10
  from vellum.workflows.context import execution_context, get_parent_context
@@ -72,6 +72,7 @@ class WorkflowRunner(Generic[StateType]):
72
72
  entrypoint_nodes: Optional[RunFromNodeArg] = None,
73
73
  external_inputs: Optional[ExternalInputsArg] = None,
74
74
  cancel_signal: Optional[ThreadingEvent] = None,
75
+ node_output_mocks: Optional[List[BaseOutputs]] = None,
75
76
  parent_context: Optional[ParentContext] = None,
76
77
  ):
77
78
  if state and external_inputs:
@@ -123,6 +124,9 @@ class WorkflowRunner(Generic[StateType]):
123
124
 
124
125
  self._dependencies: Dict[Type[BaseNode], Set[Type[BaseNode]]] = defaultdict(set)
125
126
  self._state_forks: Set[StateType] = {self._initial_state}
127
+ self._mocks_by_node_outputs_class = (
128
+ {mock.__class__: mock for mock in node_output_mocks} if node_output_mocks else {}
129
+ )
126
130
 
127
131
  self._active_nodes_by_execution_id: Dict[UUID, BaseNode[StateType]] = {}
128
132
  self._cancel_signal = cancel_signal
@@ -178,8 +182,11 @@ class WorkflowRunner(Generic[StateType]):
178
182
  node_definition=node.__class__,
179
183
  parent=parent_context,
180
184
  )
181
- with execution_context(parent_context=updated_parent_context):
182
- node_run_response = node.run()
185
+ if node.Outputs not in self._mocks_by_node_outputs_class:
186
+ with execution_context(parent_context=updated_parent_context):
187
+ node_run_response = node.run()
188
+ else:
189
+ node_run_response = self._mocks_by_node_outputs_class[node.Outputs]
183
190
  ports = node.Ports()
184
191
  if not isinstance(node_run_response, (BaseOutputs, Iterator)):
185
192
  raise NodeException(
@@ -2,6 +2,7 @@ from dataclasses import asdict, is_dataclass
2
2
  from datetime import datetime
3
3
  import enum
4
4
  from json import JSONEncoder
5
+ from queue import Queue
5
6
  from uuid import UUID
6
7
  from typing import Any, Callable, Dict, Type
7
8
 
@@ -44,6 +45,9 @@ class DefaultStateEncoder(JSONEncoder):
44
45
  if isinstance(obj, enum.Enum):
45
46
  return obj.value
46
47
 
48
+ if isinstance(obj, Queue):
49
+ return list(obj.queue)
50
+
47
51
  if is_dataclass(obj):
48
52
  # Technically, obj is DataclassInstance | type[DataclassInstance], but asdict expects a DataclassInstance
49
53
  # in practice, we only ever pass the former
@@ -2,6 +2,7 @@ import pytest
2
2
  from collections import defaultdict
3
3
  from copy import deepcopy
4
4
  import json
5
+ from queue import Queue
5
6
  from typing import Dict
6
7
 
7
8
  from vellum.workflows.nodes.bases import BaseNode
@@ -113,3 +114,21 @@ def test_state_json_serialization__with_node_output_updates():
113
114
 
114
115
  # THEN the state is serialized correctly
115
116
  assert json_state["meta"]["node_outputs"] == {"MockNode.Outputs.baz": "hello"}
117
+
118
+
119
+ def test_state_json_serialization__with_queue():
120
+ # GIVEN an initial state instance
121
+ state = MockState(foo="bar")
122
+
123
+ # AND we add a Node Output queue to state
124
+ queue: Queue[str] = Queue()
125
+ queue.put("test1")
126
+ queue.put("test2")
127
+
128
+ state.meta.node_outputs[MockNode.Outputs.baz] = queue
129
+
130
+ # WHEN we serialize the state
131
+ json_state = json.loads(json.dumps(state, cls=DefaultStateEncoder))
132
+
133
+ # THEN the state is serialized correctly with the queue turned into a list
134
+ assert json_state["meta"]["node_outputs"] == {"MockNode.Outputs.baz": ["test1", "test2"]}
@@ -194,6 +194,7 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
194
194
  entrypoint_nodes: Optional[RunFromNodeArg] = None,
195
195
  external_inputs: Optional[ExternalInputsArg] = None,
196
196
  cancel_signal: Optional[ThreadingEvent] = None,
197
+ node_output_mocks: Optional[List[BaseOutputs]] = None,
197
198
  ) -> TerminalWorkflowEvent:
198
199
  """
199
200
  Invoke a Workflow, returning the last event emitted, which should be one of:
@@ -218,6 +219,9 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
218
219
 
219
220
  cancel_signal: Optional[ThreadingEvent] = None
220
221
  A threading event that can be used to cancel the Workflow Execution.
222
+
223
+ node_output_mocks: Optional[List[Outputs]] = None
224
+ A list of Outputs to mock for Nodes during Workflow Execution.
221
225
  """
222
226
 
223
227
  events = WorkflowRunner(
@@ -227,6 +231,7 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
227
231
  entrypoint_nodes=entrypoint_nodes,
228
232
  external_inputs=external_inputs,
229
233
  cancel_signal=cancel_signal,
234
+ node_output_mocks=node_output_mocks,
230
235
  parent_context=self._context.parent_context,
231
236
  ).stream()
232
237
  first_event: Optional[Union[WorkflowExecutionInitiatedEvent, WorkflowExecutionResumedEvent]] = None
@@ -290,6 +295,7 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
290
295
  entrypoint_nodes: Optional[RunFromNodeArg] = None,
291
296
  external_inputs: Optional[ExternalInputsArg] = None,
292
297
  cancel_signal: Optional[ThreadingEvent] = None,
298
+ node_output_mocks: Optional[List[BaseOutputs]] = None,
293
299
  ) -> WorkflowEventStream:
294
300
  """
295
301
  Invoke a Workflow, yielding events as they are emitted.
@@ -315,6 +321,9 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
315
321
 
316
322
  cancel_signal: Optional[ThreadingEvent] = None
317
323
  A threading event that can be used to cancel the Workflow Execution.
324
+
325
+ node_output_mocks: Optional[List[Outputs]] = None
326
+ A list of Outputs to mock for Nodes during Workflow Execution.
318
327
  """
319
328
 
320
329
  should_yield = event_filter or workflow_event_filter
@@ -325,6 +334,7 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
325
334
  entrypoint_nodes=entrypoint_nodes,
326
335
  external_inputs=external_inputs,
327
336
  cancel_signal=cancel_signal,
337
+ node_output_mocks=node_output_mocks,
328
338
  parent_context=self.context.parent_context,
329
339
  ).stream():
330
340
  if should_yield(self.__class__, event):
@@ -416,7 +426,6 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
416
426
  def load_from_module(module_path: str) -> Type["BaseWorkflow"]:
417
427
  workflow_path = f"{module_path}.workflow"
418
428
  module = importlib.import_module(workflow_path)
419
-
420
429
  workflows: List[Type[BaseWorkflow]] = []
421
430
  for name in dir(module):
422
431
  if name.startswith("__"):
@@ -435,9 +444,40 @@ class BaseWorkflow(Generic[WorkflowInputsType, StateType], metaclass=_BaseWorkfl
435
444
  raise ValueError(f"No workflows found in {module_path}")
436
445
  elif len(workflows) > 1:
437
446
  raise ValueError(f"Multiple workflows found in {module_path}")
447
+ try:
448
+ BaseWorkflow.import_node_display(module_path)
449
+ except ModuleNotFoundError:
450
+ pass
438
451
 
439
452
  return workflows[0]
440
453
 
454
+ @staticmethod
455
+ def import_node_display(module_path):
456
+ # Import the nodes package
457
+ nodes_package = importlib.import_module(f"{module_path}.display.nodes")
458
+ # Use the loader to get the code
459
+ if hasattr(nodes_package, "__spec__") and nodes_package.__spec__ and nodes_package.__spec__.loader:
460
+ loader = nodes_package.__spec__.loader
461
+
462
+ # Check if the loader has a code attribute
463
+ if hasattr(loader, "code"):
464
+ code = loader.code
465
+
466
+ # Parse the code to find import statements
467
+ import_lines = [line.strip() for line in code.splitlines() if line.startswith("from ")]
468
+
469
+ # Import each module specified in the code
470
+ for line in import_lines:
471
+ try:
472
+ # Extract module name from the import line
473
+ module_name = line.split(" ")[1]
474
+ full_module_path = f"{module_path}.display.nodes{module_name}"
475
+ importlib.import_module(full_module_path)
476
+ except Exception:
477
+ continue
478
+ # Also import from workflow.py
479
+ importlib.import_module(f"{module_path}.display.workflow")
480
+
441
481
 
442
482
  WorkflowExecutionInitiatedBody.model_rebuild()
443
483
  WorkflowExecutionFulfilledBody.model_rebuild()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.12.9
3
+ Version: 0.12.13
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -72,12 +72,12 @@ vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86Fde
72
72
  vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=ydAbFMzcY2LURINZbXYm9BAXZdIa3-7rQ86Kupo7qcA,12804
73
73
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=AMxNnTm2z3LIR5rqxoCAfuy37F2FTuSRDVtKUoezO8M,1184
74
74
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=GhIviEMDWNw1p8z20ta08T5PeNCVJs5p2hrOX1uyNxg,17066
75
- vellum/__init__.py,sha256=QmGeEPXeFxgkZa849KKK3wH3Y641wyt00Rytfay6KiM,35520
75
+ vellum/__init__.py,sha256=FTKuzi4UX1MAYpZnW-JbtU8WgOzUIfolgajVVR96LGs,35552
76
76
  vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
77
- vellum/client/__init__.py,sha256=o4m7iRZWEV8rP3GkdaztHAjNmjxjWERlarviFoHzuKI,110927
77
+ vellum/client/__init__.py,sha256=z59nOGe27vMDqsU-ljfULBwC5J4nyrqFunhmo8xnxbU,111521
78
78
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
79
79
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
80
- vellum/client/core/client_wrapper.py,sha256=W6xaTM0O9LGmf_593EW5mnu33zCfMxGoWxp7zMTtbok,1868
80
+ vellum/client/core/client_wrapper.py,sha256=vjueLRJ8AxJ_TUVQkuXwAW-kVfBfyveLY3BAgl-dZqE,1869
81
81
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
82
82
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
83
83
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -136,7 +136,7 @@ vellum/client/resources/workflows/types/__init__.py,sha256=-uFca4ypncAOvfsg6sjD-
136
136
  vellum/client/resources/workflows/types/workflows_pull_request_format.py,sha256=dOWE_jnDnniIJLoeseeCms23aklghyBkoPmBFzcqqZk,165
137
137
  vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
138
138
  vellum/client/resources/workspace_secrets/client.py,sha256=h7UzXLyTttPq1t-JZGMg1BWxypxJvBGUdqg7KGT7MK4,8027
139
- vellum/client/types/__init__.py,sha256=618t1NgjOnUJWFFv5pS4dmOIttrTkHhMNj5F8yRlTpA,53769
139
+ vellum/client/types/__init__.py,sha256=cCh66eGhjb0bVYtwjjQBGpzjt_LT0SiVToraHqVglTg,53821
140
140
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
141
141
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
142
142
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=Bfvf1d_dkmshxRACVM5vcxbH_7AQY23RmrrnPc0ytYY,939
@@ -256,19 +256,18 @@ vellum/client/types/folder_entity_test_suite_data.py,sha256=RGITy3Pip6NeIb77YGav
256
256
  vellum/client/types/folder_entity_workflow_sandbox.py,sha256=gFmkwKZGh5O9-9y4w6VGK1IRsKLf7NZ4SCC-pgucm8M,853
257
257
  vellum/client/types/folder_entity_workflow_sandbox_data.py,sha256=MW0nLAvetgnsm6KWiGcYcKB9llR-UfosSNz0MtokN38,783
258
258
  vellum/client/types/fulfilled_ad_hoc_execute_prompt_event.py,sha256=19rFjVrzobaaAQhZlP_WGV9f_Rwrz4EPRXbT2aYkaJw,1016
259
- vellum/client/types/fulfilled_enum.py,sha256=MenrGneRMBvsq-n8tkMXAx0wppGWLJgkqdKnfklGP9U,124
260
259
  vellum/client/types/fulfilled_execute_prompt_event.py,sha256=E-iBwlMWvwQyRfzqPlgtX8KurE3IYsTRd5vWjXtbOmk,994
261
260
  vellum/client/types/fulfilled_execute_prompt_response.py,sha256=nKhDk2ZloCuE0uijX5XOE63_cq8PBo4UWs4hK4e3jUE,1227
262
261
  vellum/client/types/fulfilled_execute_workflow_workflow_result_event.py,sha256=kYlTOfJd9SydVSmJ8dr8pdLh7RHOwcFv5UzBYgKlyTw,1147
263
262
  vellum/client/types/fulfilled_prompt_execution_meta.py,sha256=sMWAMqJCh8n_NBtRSM4muiAqKne_W-NCxJVzKy9Q1Ec,934
264
263
  vellum/client/types/fulfilled_workflow_node_result_event.py,sha256=dYZUcyl_nFRFpBA_imaHkp9F7dLi59z2ESq4R7do9mo,1403
265
- vellum/client/types/function_call.py,sha256=nXPEC3nJh8QzjCvyomfm80fyO-Aar60KBOaGfQtZ5D0,804
264
+ vellum/client/types/function_call.py,sha256=3f19emMu06jHo3DlO4pQb_bC7NjKCLjWdLq3gndiCqg,713
266
265
  vellum/client/types/function_call_chat_message_content.py,sha256=qXbrMQeXn_CLjfDzQvv9llmae2wvpoTlUSQWdfMvf-k,831
267
266
  vellum/client/types/function_call_chat_message_content_request.py,sha256=HVGxHs6jc4EBgW7rdJXlF8KRlugY5YHa0ujDrEQqPCo,860
268
267
  vellum/client/types/function_call_chat_message_content_value.py,sha256=DHRZYAMc4Y5MerUS_6CIxQBtORftKn-gBx8Skgivm_A,736
269
268
  vellum/client/types/function_call_chat_message_content_value_request.py,sha256=67EZ3qSR9zO5akOgloswRE0Pv8BcjtWhdTRJIwuQU04,743
270
269
  vellum/client/types/function_call_input.py,sha256=Iiqk2-IX6xUI2UnRj3bum5C0OlQn9jRmBwatUzJQQt8,820
271
- vellum/client/types/function_call_request.py,sha256=eJBIN-wLkkkDUIwAy1nMeWHu3MZ5aJpOXyWtBa39RFA,811
270
+ vellum/client/types/function_call_request.py,sha256=udGEdk66q1zTpEFE2xq-cu6w_ahMpfQv_9lIey9x1G0,720
272
271
  vellum/client/types/function_call_variable_value.py,sha256=VQKCiEtJsmIK3i7CtFV_2ZpxeX70rqpUViXIvAci8L0,702
273
272
  vellum/client/types/function_call_vellum_value.py,sha256=lLJb-S_-S_UXm6una1BMyCbqLpMhbbMcaVIYNO45h5o,759
274
273
  vellum/client/types/function_call_vellum_value_request.py,sha256=oUteuCfWcj7UJbSE_Vywmmva9kyTaeL9iv5WJHabDVs,788
@@ -321,7 +320,7 @@ vellum/client/types/metadata_filter_config_request.py,sha256=eFmoTIVv4RB6DRaxqyD
321
320
  vellum/client/types/metadata_filter_rule_combinator.py,sha256=3Vpp1Mnv3As7efkxWTeV8qd4gdJ6OLoLhz_UeVBHAX8,165
322
321
  vellum/client/types/metadata_filter_rule_request.py,sha256=Pcs0TsU7CRnsEUoH0DWb-c9DTP2UW67lJKXlsTLXV48,1135
323
322
  vellum/client/types/metadata_filters_request.py,sha256=Yaiu7rkcrV2bCFk6HrZSjuF6V-6JYjZTpzxv7_MFe70,345
324
- vellum/client/types/metric_definition_execution.py,sha256=xwr5VJTo32k77isUtz2uzHGmtRm6K_VyOlTCbJr0JNU,672
323
+ vellum/client/types/metric_definition_execution.py,sha256=uLi7Wj1b0f5tjiZWbLGLZMLiNOLZ3ofR57WHne116t8,907
325
324
  vellum/client/types/metric_definition_history_item.py,sha256=oR0m0PG_NGpEBSwJ3n-CFi6TJo3o5Y4D_wfaqpk2VxI,1183
326
325
  vellum/client/types/metric_definition_input.py,sha256=4nmwpPqbeNQYCzLkXCkc-FGV5K2Zfa22xqSUe_L6o5s,331
327
326
  vellum/client/types/metric_node_result.py,sha256=YdKq1DZiBD1RBtjyMejImylv3BqrwY8B_UF4Ij-6_64,660
@@ -516,7 +515,7 @@ vellum/client/types/test_suite_run_execution_error_output.py,sha256=6UXaVzWivUTQ
516
515
  vellum/client/types/test_suite_run_execution_function_call_output.py,sha256=jgAk0xgWnJudZh4VhDNb8HfgUAUHA6I8PK_2ExHW9hE,873
517
516
  vellum/client/types/test_suite_run_execution_json_output.py,sha256=qO-EVGBzKU_zhGYo4hiOrIteymXEc5Hbsea5YC-cnXY,796
518
517
  vellum/client/types/test_suite_run_execution_metric_definition.py,sha256=5Yd7aQK7vr5swpA8ciMwmMb12wismM5vgCOoGLlAFmU,679
519
- vellum/client/types/test_suite_run_execution_metric_result.py,sha256=ANu2cAUOE8mEINWYdaUzYbJ7vXx7KYAhFniQ-emMGzo,924
518
+ vellum/client/types/test_suite_run_execution_metric_result.py,sha256=LfLwTtCmNJp3u_h3MfWbD9UKw9n8eN4QLN_VeKtHWAk,1175
520
519
  vellum/client/types/test_suite_run_execution_number_output.py,sha256=qzD1sny1o6HDZXkGgvXOPclR4-L1VyAfLvQCnLnU_BM,799
521
520
  vellum/client/types/test_suite_run_execution_output.py,sha256=jxZg_EOMwKjCDH0QyrecZyUW5OqCMMsWmk9PIwI8EUs,1171
522
521
  vellum/client/types/test_suite_run_execution_search_results_output.py,sha256=30dcLuSRxFZWZgkU2iPNzKcTsT8tJrD1B91UDSaOp3M,890
@@ -525,10 +524,11 @@ vellum/client/types/test_suite_run_external_exec_config.py,sha256=pznl2aDh12tGMR
525
524
  vellum/client/types/test_suite_run_external_exec_config_data.py,sha256=ukhvRkWY7MxWbj1Im1eqUWdW1AxO_98GX3WAjH77fSQ,1071
526
525
  vellum/client/types/test_suite_run_external_exec_config_data_request.py,sha256=c_ILHYfH55Yoc52oCK4uwtEv4mJxhDXM6YBFJwPh4uA,1142
527
526
  vellum/client/types/test_suite_run_external_exec_config_request.py,sha256=HxBtYYKC7p1pwlNjjeW3smcDrtiRvPx3xXRbWxID1vk,1401
527
+ vellum/client/types/test_suite_run_metric_array_output.py,sha256=U0G8rrhhqpX9_CWPV2Ys6PtzyJT6oRkUV4NOK9O4-qA,1035
528
528
  vellum/client/types/test_suite_run_metric_error_output.py,sha256=trW1KTH4SJafRfDFRyBS7TpzcT88tXkpWEoysij6IXQ,755
529
529
  vellum/client/types/test_suite_run_metric_json_output.py,sha256=DI3mJR5kpi8Hm2n6tx6buySHPwTkkbBbr8Lkk4k6HH4,738
530
530
  vellum/client/types/test_suite_run_metric_number_output.py,sha256=8pddeSds6Rrn0xGqyvgPsG1hr1tu6eOiQAp8kkM_aBk,739
531
- vellum/client/types/test_suite_run_metric_output.py,sha256=qxEJ6Ii4XOhJpM3tgn6ctRnldysduEIe8tQFnWBEOvQ,578
531
+ vellum/client/types/test_suite_run_metric_output.py,sha256=z9A4_ZT9_NIHWHkFZakaf_SMn3Y13WRJ_lWzTCzXZ_U,691
532
532
  vellum/client/types/test_suite_run_metric_string_output.py,sha256=YXerGfpvJdBtKrzgutSqEfG-N6cZoeOL59qZ5k6DwQA,737
533
533
  vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py,sha256=NUJXSSLxOxVAGOoQj74m5UqjCTCCeEIgbWGP6kM2Fck,1200
534
534
  vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py,sha256=IdlTWDda1061PwsHaoGDyB7-2lBVSus7Z8agcdmSOYE,905
@@ -830,7 +830,6 @@ vellum/types/folder_entity_test_suite_data.py,sha256=FQd58e9hlOBFwDp0DiD-YO_01S6
830
830
  vellum/types/folder_entity_workflow_sandbox.py,sha256=2KybEyswJhuqCL9FCp-LEfm8wkNmky1ROTN4je4T1gk,168
831
831
  vellum/types/folder_entity_workflow_sandbox_data.py,sha256=QIxbRKQAq-O9nVMYOTubkFmWx7rvX-BeV5lwU1d8TCY,173
832
832
  vellum/types/fulfilled_ad_hoc_execute_prompt_event.py,sha256=aC5REbvPJa1Ifnkr8jSY0RXrrNpSTicKz86SCrWZRag,175
833
- vellum/types/fulfilled_enum.py,sha256=UfkMLLR1u2MCMSQEivCED-r65cMFEhWPECskwVm-DAQ,152
834
833
  vellum/types/fulfilled_execute_prompt_event.py,sha256=IVEjlhPZkgnmhND0JXJo33mLCehupk4Cy6CTTaaW18o,168
835
834
  vellum/types/fulfilled_execute_prompt_response.py,sha256=0TmtIHRSLXmOzs-mnCA8txZHWtSP0RAG8ItLUiqDig8,171
836
835
  vellum/types/fulfilled_execute_workflow_workflow_result_event.py,sha256=Xuz7iHzmyUcGuXQ-e-a6qRgeeVmuX7ZZYC1-YYPkwDQ,186
@@ -1099,6 +1098,7 @@ vellum/types/test_suite_run_external_exec_config.py,sha256=y8JNeWgqWTac2Utv7zlXJ
1099
1098
  vellum/types/test_suite_run_external_exec_config_data.py,sha256=18Y2cEVxSlaFjH5pbvWGt8Hikoy4-GF1oPIibQR6l_U,178
1100
1099
  vellum/types/test_suite_run_external_exec_config_data_request.py,sha256=0IgvVC3Rxan9YktlIQ4rqsNRFqngy0U7htWDr6gEGjE,186
1101
1100
  vellum/types/test_suite_run_external_exec_config_request.py,sha256=PdPbkFlqq7ug7-jwhJG45CLbEVW-SCx-oczKrkCHsfM,181
1101
+ vellum/types/test_suite_run_metric_array_output.py,sha256=DeBxH90NXEmlNlQ8qH3uuV-w9AuekFlMY28zUPh2HcI,172
1102
1102
  vellum/types/test_suite_run_metric_error_output.py,sha256=_5HgfGe47snz0qG_C_6Hb_tHMepEUgP0NnVIqKJ0y2Y,172
1103
1103
  vellum/types/test_suite_run_metric_json_output.py,sha256=mZIXhFS0IoauRhNhwtO_nBe_EfZVqar0CKok4JpdWa0,171
1104
1104
  vellum/types/test_suite_run_metric_number_output.py,sha256=FRat-EjmPl4eyK307tPnQ8U3prAPsqgXVLdRmYXxaGw,173
@@ -1234,7 +1234,7 @@ vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
1234
1234
  vellum/workflows/events/tests/test_event.py,sha256=izB6Y9U5ROgmHBBpLNUY2navK4-qFp6hdJqJNz6Beek,13350
1235
1235
  vellum/workflows/events/types.py,sha256=cjRE8WL8tYCFradd9NOGl_H0mN3LiWWnA1uHmyT2Q0Q,3412
1236
1236
  vellum/workflows/events/workflow.py,sha256=l5tXes0sg7iWaA1ZUE5dtAqNnGQ8iy6trVbOU9meu7U,5240
1237
- vellum/workflows/exceptions.py,sha256=gXQvDL919cK3pwXc8BhLGKmR-YOskYDLvL1zPSSmLS4,579
1237
+ vellum/workflows/exceptions.py,sha256=l-FLGvXywxg6ivolCts71b8pcsYAWoB1cmUR4Jx7N8g,614
1238
1238
  vellum/workflows/expressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1239
1239
  vellum/workflows/expressions/accessor.py,sha256=OFvAHAVABr-k7GceIhtzIurV4OuV_yHft7JPRsq87Es,1472
1240
1240
  vellum/workflows/expressions/and_.py,sha256=I7lNqrUM3-m_5hmjjiMhaHhJtKcLj39kEFVWPDOqwfo,916
@@ -1310,7 +1310,7 @@ vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=H
1310
1310
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1311
1311
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=fypgmZHgaDtGqSBC8rjYiyryJ0H58LPt_CafLfAprO0,6341
1312
1312
  vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=zdpNJoawB5PedsCCfgOGDDoWuif0jNtlV-K9sFL6cNQ,4968
1313
- vellum/workflows/nodes/displayable/bases/search_node.py,sha256=Gq6CqvTxg4TPm7OBbAA9wnuSwtiKoxFINjMHX-_oNdE,3687
1313
+ vellum/workflows/nodes/displayable/bases/search_node.py,sha256=huhfEaolvf8TTzRyFqAyO1t0Vgqt0kcEOcbAChvvix0,3427
1314
1314
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1315
1315
  vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=JgyTgZRSb-gSXL4ccHn4VkPcPZFOkVK5ohPazPqSWFw,8652
1316
1316
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1325,9 +1325,9 @@ vellum/workflows/nodes/displayable/final_output_node/node.py,sha256=iH3ZPOstPku_
1325
1325
  vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
1326
1326
  vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=7Ep7Ff7FtFry3Jwxhg_npF_-jT2P6TGKp5MRNnCZ8Tc,3923
1327
1327
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1328
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=dTnP1yH1P0NqMw3noxt9XwaDCpX8ZOhuvVYNAn_DdCQ,2119
1328
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=OPjdEK5mL3D2cwL68GiBFlRJ2b0tgatxsfeUEPeQDxI,2146
1329
1329
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1330
- vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=P1DUL0wIG-cyA5dqGv7242cFWJXysmombdujKrJtl7k,4669
1330
+ vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=eobyGcb4hMdmmyk-CcJPpOAB-NSVMUCleWVSmuHmMiQ,4752
1331
1331
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
1332
1332
  vellum/workflows/nodes/displayable/merge_node/node.py,sha256=ZyPvcTgfPOneOm5Dc2kUOoPkwNJqwRPZSj232akXynA,324
1333
1333
  vellum/workflows/nodes/displayable/note_node/__init__.py,sha256=KWA3P4fyYJ-fOTky8qNGlcOotQ-HeHJ9AjZt6mRQmCE,58
@@ -1340,7 +1340,7 @@ vellum/workflows/nodes/displayable/subworkflow_deployment_node/__init__.py,sha25
1340
1340
  vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=FgS1ZMnIBliqEMNKX2ChE80bw4IVHEQ6IGiTDvF0RZw,7226
1341
1341
  vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1342
1342
  vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=UI_RMmXn9qwB-StnFPvkDd9FctBQAg43wrfouqvPepk,4701
1343
- vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=4CMwDtXwTaEvFfDpA6j2iLqc7S6IICSkvVZOobEpeps,6954
1343
+ vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=VepO5z1277c1y5N6LLIC31nnWD1aak2m5oPFplfJHHs,6935
1344
1344
  vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=KqKJtJ0vuNoPuUPMdILmBTt4a2fBBxxun-nmOI7T8jo,2585
1345
1345
  vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
1346
1346
  vellum/workflows/nodes/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1367,15 +1367,15 @@ vellum/workflows/references/workflow_input.py,sha256=86IuhlBz-9cGxeUzizyjdp482aj
1367
1367
  vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
1368
1368
  vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
1369
1369
  vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
1370
- vellum/workflows/runner/runner.py,sha256=RXnLEmSJFbp0u4vKF7rvD2fscuYfcRYkspIJINnvFAI,27607
1370
+ vellum/workflows/runner/runner.py,sha256=DuFvMyejwdIdapQDHrfVtouaifLEZ02WYPARmK3UqdE,28006
1371
1371
  vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2235
1372
1372
  vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
1373
1373
  vellum/workflows/state/base.py,sha256=jpSzF1OQd3-fqi6dMGlNsQl-7JnJxCdzWIigmX8Wz-I,14425
1374
1374
  vellum/workflows/state/context.py,sha256=_NeGQpYo8yNuh0Tfh3OvcB_bG_-GC8b3ZLLl83Pf8-I,1279
1375
- vellum/workflows/state/encoder.py,sha256=kRrqwD0vFCiSRZR3rg8Sjkh8sDEerQQhlvmdSYQAOl8,1741
1375
+ vellum/workflows/state/encoder.py,sha256=WdUidpOaBDx5lilJl8V8McFDHQYiCLCJR9dmktdzdZY,1836
1376
1376
  vellum/workflows/state/store.py,sha256=VYGBQgN1bpd1as5eGiouV_7scg8QsRs4_1aqZAGIsRQ,793
1377
1377
  vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1378
- vellum/workflows/state/tests/test_state.py,sha256=BQjcdREIK1MPuGhivRUgpynVJLftjEpH9RG3cRKxQEY,3310
1378
+ vellum/workflows/state/tests/test_state.py,sha256=7ap_Z9GJqyonZ1eVXwNyyuhV0AL5XiQ6uYCRhS7PFN4,3921
1379
1379
  vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1380
1380
  vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
1381
1381
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
@@ -1397,10 +1397,10 @@ vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrg
1397
1397
  vellum/workflows/utils/vellum_variables.py,sha256=g5xHYB8etfHE32ek19nP6Anf8NyjhmUtOwO2KmQ5xZU,3111
1398
1398
  vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
1399
1399
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1400
- vellum/workflows/workflows/base.py,sha256=FxK6ZNrQtuqcgZxWXy4_ole1LeeTiZI8VlxavRd3VbA,17119
1400
+ vellum/workflows/workflows/base.py,sha256=TLk5NiDB8N_Ytkzj_T8o-E4WpTUH8qJYZcoOk2xR3mo,18986
1401
1401
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
1402
- vellum_ai-0.12.9.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1403
- vellum_ai-0.12.9.dist-info/METADATA,sha256=XnLz57ZnuFRq6HV_sXjLRLt2cBE7jKWY0HoCKn7G1Fs,5160
1404
- vellum_ai-0.12.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1405
- vellum_ai-0.12.9.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1406
- vellum_ai-0.12.9.dist-info/RECORD,,
1402
+ vellum_ai-0.12.13.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1403
+ vellum_ai-0.12.13.dist-info/METADATA,sha256=uXAzy9xHbkmecOGR1GasDk6auS-Hbl12VwdAgqAuo5c,5161
1404
+ vellum_ai-0.12.13.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1405
+ vellum_ai-0.12.13.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1406
+ vellum_ai-0.12.13.dist-info/RECORD,,
@@ -1,5 +0,0 @@
1
- # This file was auto-generated by Fern from our API Definition.
2
-
3
- import typing
4
-
5
- FulfilledEnum = typing.Literal["FULFILLED"]