vellum-ai 0.14.3__py3-none-any.whl → 0.14.4__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 (34) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/client/resources/document_indexes/client.py +4 -4
  3. vellum/client/resources/documents/client.py +0 -2
  4. vellum/client/resources/folder_entities/client.py +4 -8
  5. vellum/client/resources/test_suite_runs/client.py +0 -2
  6. vellum/client/types/deployment_read.py +5 -5
  7. vellum/client/types/deployment_release_tag_read.py +2 -2
  8. vellum/client/types/document_document_to_document_index.py +5 -5
  9. vellum/client/types/document_index_read.py +5 -5
  10. vellum/client/types/document_read.py +1 -1
  11. vellum/client/types/enriched_normalized_completion.py +3 -3
  12. vellum/client/types/generate_options_request.py +2 -2
  13. vellum/client/types/slim_deployment_read.py +5 -5
  14. vellum/client/types/slim_document.py +3 -3
  15. vellum/client/types/slim_document_document_to_document_index.py +5 -5
  16. vellum/client/types/slim_workflow_deployment.py +5 -5
  17. vellum/client/types/test_suite_run_read.py +5 -5
  18. vellum/client/types/workflow_deployment_read.py +5 -5
  19. vellum/client/types/workflow_release_tag_read.py +2 -2
  20. vellum/workflows/constants.py +9 -0
  21. vellum/workflows/nodes/core/map_node/node.py +1 -1
  22. vellum/workflows/nodes/core/retry_node/node.py +4 -3
  23. vellum/workflows/nodes/core/try_node/node.py +1 -1
  24. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +5 -0
  25. vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +1 -0
  26. vellum/workflows/tests/test_undefined.py +12 -0
  27. vellum/workflows/workflows/base.py +59 -0
  28. vellum/workflows/workflows/tests/test_base_workflow.py +88 -0
  29. {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/METADATA +1 -1
  30. {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/RECORD +34 -33
  31. vellum_ee/workflows/display/nodes/__init__.py +4 -0
  32. {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/LICENSE +0 -0
  33. {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/WHEEL +0 -0
  34. {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.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.3",
21
+ "X-Fern-SDK-Version": "0.14.4",
22
22
  }
23
23
  headers["X_API_KEY"] = self.api_key
24
24
  return headers
@@ -54,8 +54,8 @@ class DocumentIndexesClient:
54
54
  status : typing.Optional[DocumentIndexesListRequestStatus]
55
55
  Filter down to only document indices that have a status matching the status specified
56
56
 
57
- - `ACTIVE` - Active
58
- - `ARCHIVED` - Archived
57
+ * `ACTIVE` - Active
58
+ * `ARCHIVED` - Archived
59
59
 
60
60
  request_options : typing.Optional[RequestOptions]
61
61
  Request-specific configuration.
@@ -589,8 +589,8 @@ class AsyncDocumentIndexesClient:
589
589
  status : typing.Optional[DocumentIndexesListRequestStatus]
590
590
  Filter down to only document indices that have a status matching the status specified
591
591
 
592
- - `ACTIVE` - Active
593
- - `ARCHIVED` - Archived
592
+ * `ACTIVE` - Active
593
+ * `ARCHIVED` - Archived
594
594
 
595
595
  request_options : typing.Optional[RequestOptions]
596
596
  Request-specific configuration.
@@ -278,7 +278,6 @@ class DocumentsClient:
278
278
  **Note:** Uses a base url of `https://documents.vellum.ai`.
279
279
 
280
280
  This is a multipart/form-data request. The `contents` field should be a file upload. It also expects a JSON body with the following fields:
281
-
282
281
  - `add_to_index_names: list[str]` - Optionally include the names of all indexes that you'd like this document to be included in
283
282
  - `external_id: str | None` - Optionally include an external ID for this document. This is useful if you want to re-upload the same document later when its contents change and would like it to be re-indexed.
284
283
  - `label: str` - A human-friendly name for this document. Typically the filename.
@@ -675,7 +674,6 @@ class AsyncDocumentsClient:
675
674
  **Note:** Uses a base url of `https://documents.vellum.ai`.
676
675
 
677
676
  This is a multipart/form-data request. The `contents` field should be a file upload. It also expects a JSON body with the following fields:
678
-
679
677
  - `add_to_index_names: list[str]` - Optionally include the names of all indexes that you'd like this document to be included in
680
678
  - `external_id: str | None` - Optionally include an external ID for this document. This is useful if you want to re-upload the same document later when its contents change and would like it to be re-indexed.
681
679
  - `label: str` - A human-friendly name for this document. Typically the filename.
@@ -39,7 +39,6 @@ class FolderEntitiesClient:
39
39
 
40
40
  To filter by an entity's parent folder, provide the ID of the parent folder. To filter by the root directory, provide
41
41
  a string representing the entity type of the root directory. Supported root directories include:
42
-
43
42
  - PROMPT_SANDBOX
44
43
  - WORKFLOW_SANDBOX
45
44
  - DOCUMENT_INDEX
@@ -48,8 +47,8 @@ class FolderEntitiesClient:
48
47
  entity_status : typing.Optional[FolderEntitiesListRequestEntityStatus]
49
48
  Filter down to only those objects whose entities have a status matching the status specified.
50
49
 
51
- - `ACTIVE` - Active
52
- - `ARCHIVED` - Archived
50
+ * `ACTIVE` - Active
51
+ * `ARCHIVED` - Archived
53
52
 
54
53
  limit : typing.Optional[int]
55
54
  Number of results to return per page.
@@ -119,7 +118,6 @@ class FolderEntitiesClient:
119
118
  folder_id : str
120
119
  The ID of the folder to which the entity should be added. This can be a UUID of a folder, or the name of a root
121
120
  directory. Supported root directories include:
122
-
123
121
  - PROMPT_SANDBOX
124
122
  - WORKFLOW_SANDBOX
125
123
  - DOCUMENT_INDEX
@@ -190,7 +188,6 @@ class AsyncFolderEntitiesClient:
190
188
 
191
189
  To filter by an entity's parent folder, provide the ID of the parent folder. To filter by the root directory, provide
192
190
  a string representing the entity type of the root directory. Supported root directories include:
193
-
194
191
  - PROMPT_SANDBOX
195
192
  - WORKFLOW_SANDBOX
196
193
  - DOCUMENT_INDEX
@@ -199,8 +196,8 @@ class AsyncFolderEntitiesClient:
199
196
  entity_status : typing.Optional[FolderEntitiesListRequestEntityStatus]
200
197
  Filter down to only those objects whose entities have a status matching the status specified.
201
198
 
202
- - `ACTIVE` - Active
203
- - `ARCHIVED` - Archived
199
+ * `ACTIVE` - Active
200
+ * `ARCHIVED` - Archived
204
201
 
205
202
  limit : typing.Optional[int]
206
203
  Number of results to return per page.
@@ -278,7 +275,6 @@ class AsyncFolderEntitiesClient:
278
275
  folder_id : str
279
276
  The ID of the folder to which the entity should be added. This can be a UUID of a folder, or the name of a root
280
277
  directory. Supported root directories include:
281
-
282
278
  - PROMPT_SANDBOX
283
279
  - WORKFLOW_SANDBOX
284
280
  - DOCUMENT_INDEX
@@ -163,7 +163,6 @@ class TestSuiteRunsClient:
163
163
 
164
164
  expand : typing.Optional[typing.Union[str, typing.Sequence[str]]]
165
165
  The response fields to expand for more information.
166
-
167
166
  - 'results.metric_results.metric_label' expands the metric label for each metric result.
168
167
  - 'results.metric_results.metric_definition' expands the metric definition for each metric result.
169
168
  - 'results.metric_results.metric_definition.name' expands the metric definition name for each metric result.
@@ -381,7 +380,6 @@ class AsyncTestSuiteRunsClient:
381
380
 
382
381
  expand : typing.Optional[typing.Union[str, typing.Sequence[str]]]
383
382
  The response fields to expand for more information.
384
-
385
383
  - 'results.metric_results.metric_label' expands the metric label for each metric result.
386
384
  - 'results.metric_results.metric_definition' expands the metric definition for each metric result.
387
385
  - 'results.metric_results.metric_definition.name' expands the metric definition name for each metric result.
@@ -30,17 +30,17 @@ class DeploymentRead(UniversalBaseModel):
30
30
  """
31
31
  The current status of the deployment
32
32
 
33
- - `ACTIVE` - Active
34
- - `ARCHIVED` - Archived
33
+ * `ACTIVE` - Active
34
+ * `ARCHIVED` - Archived
35
35
  """
36
36
 
37
37
  environment: typing.Optional[EnvironmentEnum] = pydantic.Field(default=None)
38
38
  """
39
39
  The environment this deployment is used in
40
40
 
41
- - `DEVELOPMENT` - Development
42
- - `STAGING` - Staging
43
- - `PRODUCTION` - Production
41
+ * `DEVELOPMENT` - Development
42
+ * `STAGING` - Staging
43
+ * `PRODUCTION` - Production
44
44
  """
45
45
 
46
46
  last_deployed_on: dt.datetime
@@ -18,8 +18,8 @@ class DeploymentReleaseTagRead(UniversalBaseModel):
18
18
  """
19
19
  The source of how the Release Tag was originally created
20
20
 
21
- - `SYSTEM` - System
22
- - `USER` - User
21
+ * `SYSTEM` - System
22
+ * `USER` - User
23
23
  """
24
24
 
25
25
  history_item: DeploymentReleaseTagDeploymentHistoryItem = pydantic.Field()
@@ -26,11 +26,11 @@ class DocumentDocumentToDocumentIndex(UniversalBaseModel):
26
26
  """
27
27
  An enum value representing where this document is along its indexing lifecycle for this index.
28
28
 
29
- - `AWAITING_PROCESSING` - Awaiting Processing
30
- - `QUEUED` - Queued
31
- - `INDEXING` - Indexing
32
- - `INDEXED` - Indexed
33
- - `FAILED` - Failed
29
+ * `AWAITING_PROCESSING` - Awaiting Processing
30
+ * `QUEUED` - Queued
31
+ * `INDEXING` - Indexing
32
+ * `INDEXED` - Indexed
33
+ * `FAILED` - Failed
34
34
  """
35
35
 
36
36
  extracted_text_file_url: typing.Optional[str] = None
@@ -27,17 +27,17 @@ class DocumentIndexRead(UniversalBaseModel):
27
27
  """
28
28
  The current status of the document index
29
29
 
30
- - `ACTIVE` - Active
31
- - `ARCHIVED` - Archived
30
+ * `ACTIVE` - Active
31
+ * `ARCHIVED` - Archived
32
32
  """
33
33
 
34
34
  environment: typing.Optional[EnvironmentEnum] = pydantic.Field(default=None)
35
35
  """
36
36
  The environment this document index is used in
37
37
 
38
- - `DEVELOPMENT` - Development
39
- - `STAGING` - Staging
40
- - `PRODUCTION` - Production
38
+ * `DEVELOPMENT` - Development
39
+ * `STAGING` - Staging
40
+ * `PRODUCTION` - Production
41
41
  """
42
42
 
43
43
  indexing_config: DocumentIndexIndexingConfig
@@ -28,7 +28,7 @@ class DocumentRead(UniversalBaseModel):
28
28
  """
29
29
  The current status of the document
30
30
 
31
- - `ACTIVE` - Active
31
+ * `ACTIVE` - Active
32
32
  """
33
33
 
34
34
  original_file_url: typing.Optional[str] = None
@@ -29,9 +29,9 @@ class EnrichedNormalizedCompletion(UniversalBaseModel):
29
29
  """
30
30
  The reason the generation finished.
31
31
 
32
- - `LENGTH` - LENGTH
33
- - `STOP` - STOP
34
- - `UNKNOWN` - UNKNOWN
32
+ * `LENGTH` - LENGTH
33
+ * `STOP` - STOP
34
+ * `UNKNOWN` - UNKNOWN
35
35
  """
36
36
 
37
37
  logprobs: typing.Optional[NormalizedLogProbs] = pydantic.Field(default=None)
@@ -12,8 +12,8 @@ class GenerateOptionsRequest(UniversalBaseModel):
12
12
  """
13
13
  Which logprobs to include, if any. Defaults to NONE.
14
14
 
15
- - `ALL` - ALL
16
- - `NONE` - NONE
15
+ * `ALL` - ALL
16
+ * `NONE` - NONE
17
17
  """
18
18
 
19
19
  if IS_PYDANTIC_V2:
@@ -30,17 +30,17 @@ class SlimDeploymentRead(UniversalBaseModel):
30
30
  """
31
31
  The current status of the deployment
32
32
 
33
- - `ACTIVE` - Active
34
- - `ARCHIVED` - Archived
33
+ * `ACTIVE` - Active
34
+ * `ARCHIVED` - Archived
35
35
  """
36
36
 
37
37
  environment: typing.Optional[EnvironmentEnum] = pydantic.Field(default=None)
38
38
  """
39
39
  The environment this deployment is used in
40
40
 
41
- - `DEVELOPMENT` - Development
42
- - `STAGING` - Staging
43
- - `PRODUCTION` - Production
41
+ * `DEVELOPMENT` - Development
42
+ * `STAGING` - Staging
43
+ * `PRODUCTION` - Production
44
44
  """
45
45
 
46
46
  last_deployed_on: dt.datetime
@@ -37,15 +37,15 @@ class SlimDocument(UniversalBaseModel):
37
37
  """
38
38
  An enum value representing why the document could not be processed. Is null unless processing_state is FAILED.
39
39
 
40
- - `EXCEEDED_CHARACTER_LIMIT` - Exceeded Character Limit
41
- - `INVALID_FILE` - Invalid File
40
+ * `EXCEEDED_CHARACTER_LIMIT` - Exceeded Character Limit
41
+ * `INVALID_FILE` - Invalid File
42
42
  """
43
43
 
44
44
  status: typing.Optional[DocumentStatus] = pydantic.Field(default=None)
45
45
  """
46
46
  The document's current status.
47
47
 
48
- - `ACTIVE` - Active
48
+ * `ACTIVE` - Active
49
49
  """
50
50
 
51
51
  keywords: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
@@ -26,11 +26,11 @@ class SlimDocumentDocumentToDocumentIndex(UniversalBaseModel):
26
26
  """
27
27
  An enum value representing where this document is along its indexing lifecycle for this index.
28
28
 
29
- - `AWAITING_PROCESSING` - Awaiting Processing
30
- - `QUEUED` - Queued
31
- - `INDEXING` - Indexing
32
- - `INDEXED` - Indexed
33
- - `FAILED` - Failed
29
+ * `AWAITING_PROCESSING` - Awaiting Processing
30
+ * `QUEUED` - Queued
31
+ * `INDEXING` - Indexing
32
+ * `INDEXED` - Indexed
33
+ * `FAILED` - Failed
34
34
  """
35
35
 
36
36
  if IS_PYDANTIC_V2:
@@ -29,17 +29,17 @@ class SlimWorkflowDeployment(UniversalBaseModel):
29
29
  """
30
30
  The current status of the workflow deployment
31
31
 
32
- - `ACTIVE` - Active
33
- - `ARCHIVED` - Archived
32
+ * `ACTIVE` - Active
33
+ * `ARCHIVED` - Archived
34
34
  """
35
35
 
36
36
  environment: typing.Optional[EnvironmentEnum] = pydantic.Field(default=None)
37
37
  """
38
38
  The environment this workflow deployment is used in
39
39
 
40
- - `DEVELOPMENT` - Development
41
- - `STAGING` - Staging
42
- - `PRODUCTION` - Production
40
+ * `DEVELOPMENT` - Development
41
+ * `STAGING` - Staging
42
+ * `PRODUCTION` - Production
43
43
  """
44
44
 
45
45
  created: dt.datetime
@@ -21,11 +21,11 @@ class TestSuiteRunRead(UniversalBaseModel):
21
21
  """
22
22
  The current state of this run
23
23
 
24
- - `QUEUED` - Queued
25
- - `RUNNING` - Running
26
- - `COMPLETE` - Complete
27
- - `FAILED` - Failed
28
- - `CANCELLED` - Cancelled
24
+ * `QUEUED` - Queued
25
+ * `RUNNING` - Running
26
+ * `COMPLETE` - Complete
27
+ * `FAILED` - Failed
28
+ * `CANCELLED` - Cancelled
29
29
  """
30
30
 
31
31
  exec_config: typing.Optional[TestSuiteRunExecConfig] = pydantic.Field(default=None)
@@ -29,17 +29,17 @@ class WorkflowDeploymentRead(UniversalBaseModel):
29
29
  """
30
30
  The current status of the workflow deployment
31
31
 
32
- - `ACTIVE` - Active
33
- - `ARCHIVED` - Archived
32
+ * `ACTIVE` - Active
33
+ * `ARCHIVED` - Archived
34
34
  """
35
35
 
36
36
  environment: typing.Optional[EnvironmentEnum] = pydantic.Field(default=None)
37
37
  """
38
38
  The environment this workflow deployment is used in
39
39
 
40
- - `DEVELOPMENT` - Development
41
- - `STAGING` - Staging
42
- - `PRODUCTION` - Production
40
+ * `DEVELOPMENT` - Development
41
+ * `STAGING` - Staging
42
+ * `PRODUCTION` - Production
43
43
  """
44
44
 
45
45
  created: dt.datetime
@@ -18,8 +18,8 @@ class WorkflowReleaseTagRead(UniversalBaseModel):
18
18
  """
19
19
  The source of how the Release Tag was originally created
20
20
 
21
- - `SYSTEM` - System
22
- - `USER` - User
21
+ * `SYSTEM` - System
22
+ * `USER` - User
23
23
  """
24
24
 
25
25
  history_item: WorkflowReleaseTagWorkflowDeploymentHistoryItem = pydantic.Field()
@@ -3,6 +3,15 @@ from typing import Any, cast
3
3
 
4
4
 
5
5
  class _UndefMeta(type):
6
+ def __new__(cls, name: str, bases: tuple[type, ...], attrs: dict[str, Any]) -> type:
7
+ cls.__name__ = "undefined"
8
+ cls.__qualname__ = "undefined"
9
+
10
+ undefined_class = super().__new__(cls, name, bases, attrs)
11
+ undefined_class.__name__ = "undefined"
12
+ undefined_class.__qualname__ = "undefined"
13
+ return undefined_class
14
+
6
15
  def __repr__(cls) -> str:
7
16
  return "undefined"
8
17
 
@@ -42,8 +42,8 @@ class MapNode(BaseAdornmentNode[StateType], Generic[StateType, MapNodeItemType])
42
42
  Used to map over a list of items and execute a Subworkflow on each iteration.
43
43
 
44
44
  items: List[MapNodeItemType] - The items to map over
45
- subworkflow: Type["BaseWorkflow[SubworkflowInputs, BaseState]"] - The Subworkflow to execute on each iteration
46
45
  max_concurrency: Optional[int] = None - The maximum number of concurrent subworkflow executions
46
+ subworkflow: Type["BaseWorkflow"] - The Subworkflow to execute
47
47
  """
48
48
 
49
49
  items: List[MapNodeItemType]
@@ -18,9 +18,10 @@ class RetryNode(BaseAdornmentNode[StateType], Generic[StateType]):
18
18
  Used to retry a Subworkflow a specified number of times.
19
19
 
20
20
  max_attempts: int - The maximum number of attempts to retry the Subworkflow
21
- delay: float - The number of seconds to wait between retries
22
- retry_on_error_code: Optional[VellumErrorCode] = None - The error code to retry on
23
- subworkflow: Type["BaseWorkflow[SubworkflowInputs, BaseState]"] - The Subworkflow to execute
21
+ delay: float = None - The number of seconds to wait between retries
22
+ retry_on_error_code: Optional[WorkflowErrorCode] = None - The error code to retry on
23
+ retry_on_condition: Optional[BaseDescriptor] = None - The condition to retry on
24
+ subworkflow: Type["BaseWorkflow"] - The Subworkflow to execute
24
25
  """
25
26
 
26
27
  max_attempts: int
@@ -17,7 +17,7 @@ class TryNode(BaseAdornmentNode[StateType], Generic[StateType]):
17
17
  """
18
18
  Used to execute a Subworkflow and handle errors.
19
19
 
20
- on_error_code: Optional[VellumErrorCode] = None - The error code to handle
20
+ on_error_code: Optional[WorkflowErrorCode] = None - The error code to handle
21
21
  subworkflow: Type["BaseWorkflow"] - The Subworkflow to execute
22
22
  """
23
23
 
@@ -17,6 +17,7 @@ from vellum import (
17
17
  )
18
18
  from vellum.client import RequestOptions
19
19
  from vellum.client.types.chat_message_request import ChatMessageRequest
20
+ from vellum.client.types.prompt_settings import PromptSettings
20
21
  from vellum.workflows.constants import OMIT
21
22
  from vellum.workflows.context import get_parent_context
22
23
  from vellum.workflows.errors import WorkflowErrorCode
@@ -53,6 +54,8 @@ class BaseInlinePromptNode(BasePromptNode[StateType], Generic[StateType]):
53
54
  parameters: PromptParameters = DEFAULT_PROMPT_PARAMETERS
54
55
  expand_meta: Optional[AdHocExpandMeta] = OMIT
55
56
 
57
+ settings: Optional[PromptSettings] = None
58
+
56
59
  class Trigger(BasePromptNode.Trigger):
57
60
  merge_behavior = MergeBehavior.AWAIT_ANY
58
61
 
@@ -60,6 +63,7 @@ class BaseInlinePromptNode(BasePromptNode[StateType], Generic[StateType]):
60
63
  input_variables, input_values = self._compile_prompt_inputs()
61
64
  parent_context = get_parent_context()
62
65
  request_options = self.request_options or RequestOptions()
66
+
63
67
  request_options["additional_body_parameters"] = {
64
68
  "execution_context": {"parent_context": parent_context},
65
69
  **request_options.get("additional_body_parameters", {}),
@@ -79,6 +83,7 @@ class BaseInlinePromptNode(BasePromptNode[StateType], Generic[StateType]):
79
83
  input_variables=input_variables,
80
84
  parameters=self.parameters,
81
85
  blocks=self.blocks,
86
+ settings=self.settings,
82
87
  functions=normalized_functions,
83
88
  expand_meta=self.expand_meta,
84
89
  request_options=request_options,
@@ -91,6 +91,7 @@ def test_inline_text_prompt_node__basic(vellum_adhoc_prompt_client):
91
91
  custom_parameters=None,
92
92
  ),
93
93
  request_options=mock.ANY,
94
+ settings=None,
94
95
  )
95
96
 
96
97
 
@@ -0,0 +1,12 @@
1
+ import pytest
2
+
3
+ from vellum.workflows.constants import undefined
4
+
5
+
6
+ def test_undefined__ensure_sensible_error_messages():
7
+ # WHEN we invoke an invalid operation on `undefined`
8
+ with pytest.raises(Exception) as e:
9
+ len(undefined)
10
+
11
+ # THEN we get a sensible error message
12
+ assert str(e.value) == "object of type 'undefined' has no len()"
@@ -100,6 +100,30 @@ class _BaseWorkflowMeta(type):
100
100
  new_dct,
101
101
  )
102
102
 
103
+ def collect_nodes(graph_item: Union[GraphAttribute, Set[GraphAttribute]]) -> Set[Type[BaseNode]]:
104
+ nodes: Set[Type[BaseNode]] = set()
105
+ if isinstance(graph_item, Graph):
106
+ nodes.update(node for node in graph_item.nodes)
107
+ elif isinstance(graph_item, set):
108
+ for item in graph_item:
109
+ if isinstance(item, Graph):
110
+ nodes.update(node for node in item.nodes)
111
+ elif inspect.isclass(item) and issubclass(item, BaseNode):
112
+ nodes.add(item)
113
+ elif issubclass(graph_item, BaseNode):
114
+ nodes.add(graph_item)
115
+ else:
116
+ raise ValueError(f"Unexpected graph type: {graph_item.__class__}")
117
+ return nodes
118
+
119
+ graph_nodes = collect_nodes(dct.get("graph", set()))
120
+ unused_nodes = collect_nodes(dct.get("unused_graphs", set()))
121
+
122
+ overlap = graph_nodes & unused_nodes
123
+ if overlap:
124
+ node_names = [node.__name__ for node in overlap]
125
+ raise ValueError(f"Node(s) {', '.join(node_names)} cannot appear in both graph and unused_graphs")
126
+
103
127
  cls = super().__new__(mcs, name, bases, dct)
104
128
  workflow_class = cast(Type["BaseWorkflow"], cls)
105
129
  workflow_class.__id__ = uuid4_from_hash(workflow_class.__qualname__)
@@ -112,6 +136,7 @@ GraphAttribute = Union[Type[BaseNode], Graph, Set[Type[BaseNode]], Set[Graph]]
112
136
  class BaseWorkflow(Generic[InputsType, StateType], metaclass=_BaseWorkflowMeta):
113
137
  __id__: UUID = uuid4_from_hash(__qualname__)
114
138
  graph: ClassVar[GraphAttribute]
139
+ unused_graphs: ClassVar[Set[GraphAttribute]] # nodes or graphs that are defined but not used in the graph
115
140
  emitters: List[BaseWorkflowEmitter]
116
141
  resolvers: List[BaseWorkflowResolver]
117
142
 
@@ -196,6 +221,40 @@ class BaseWorkflow(Generic[InputsType, StateType], metaclass=_BaseWorkflowMeta):
196
221
  nodes.add(node)
197
222
  yield node
198
223
 
224
+ @classmethod
225
+ def get_unused_nodes(cls) -> Iterator[Type[BaseNode]]:
226
+ """
227
+ Returns an iterator over the nodes that are defined but not used in the graph.
228
+ """
229
+ if not hasattr(cls, "unused_graphs"):
230
+ yield from ()
231
+ else:
232
+ nodes = set()
233
+ for item in cls.unused_graphs:
234
+ if isinstance(item, Graph):
235
+ # Item is a graph
236
+ for node in item.nodes:
237
+ if node not in nodes:
238
+ nodes.add(node)
239
+ yield node
240
+ elif isinstance(item, set):
241
+ # Item is a set of graphs or nodes
242
+ for subitem in item:
243
+ if isinstance(subitem, Graph):
244
+ for node in subitem.nodes:
245
+ if node not in nodes:
246
+ nodes.add(node)
247
+ yield node
248
+ elif issubclass(subitem, BaseNode):
249
+ if subitem not in nodes:
250
+ nodes.add(subitem)
251
+ yield subitem
252
+ elif issubclass(item, BaseNode):
253
+ # Item is a node
254
+ if item not in nodes:
255
+ nodes.add(item)
256
+ yield item
257
+
199
258
  @classmethod
200
259
  def get_entrypoints(cls) -> Iterable[Type[BaseNode]]:
201
260
  return iter({e for g in cls.get_subgraphs() for e in g.entrypoints})
@@ -1,3 +1,5 @@
1
+ import pytest
2
+
1
3
  from vellum.workflows.inputs.base import BaseInputs
2
4
  from vellum.workflows.nodes.bases.base import BaseNode
3
5
  from vellum.workflows.nodes.core.inline_subworkflow_node.node import InlineSubworkflowNode
@@ -78,3 +80,89 @@ def test_subworkflow__inherit_base_outputs():
78
80
  # TEST that the outputs are correct
79
81
  assert terminal_event.name == "workflow.execution.fulfilled", terminal_event
80
82
  assert terminal_event.outputs == {"output": "bar"}
83
+
84
+
85
+ def test_workflow__nodes_not_in_graph():
86
+ class NodeA(BaseNode):
87
+ pass
88
+
89
+ class NodeB(BaseNode):
90
+ pass
91
+
92
+ class NodeC(BaseNode):
93
+ pass
94
+
95
+ # WHEN we create a workflow with multiple unused nodes
96
+ class TestWorkflow(BaseWorkflow[BaseInputs, BaseState]):
97
+ graph = NodeA
98
+ unused_graphs = {NodeB, NodeC}
99
+
100
+ # TEST that all nodes from unused_graphs are collected
101
+ unused_graphs = set(TestWorkflow.get_unused_nodes())
102
+ assert unused_graphs == {NodeB, NodeC}
103
+
104
+
105
+ def test_workflow__unused_graphs():
106
+ class NodeA(BaseNode):
107
+ pass
108
+
109
+ class NodeB(BaseNode):
110
+ pass
111
+
112
+ class NodeC(BaseNode):
113
+ pass
114
+
115
+ class NodeD(BaseNode):
116
+ pass
117
+
118
+ class NodeE(BaseNode):
119
+ pass
120
+
121
+ class NodeF(BaseNode):
122
+ pass
123
+
124
+ # WHEN we create a workflow with unused nodes in a graph
125
+ class TestWorkflow(BaseWorkflow[BaseInputs, BaseState]):
126
+ graph = NodeA
127
+ unused_graphs = {NodeB >> {NodeC >> NodeD}, NodeE, NodeF}
128
+
129
+ # TEST that all nodes from unused_graphs are collected
130
+ unused_graphs = set(TestWorkflow.get_unused_nodes())
131
+ assert unused_graphs == {NodeB, NodeC, NodeD, NodeE, NodeF}
132
+
133
+
134
+ def test_workflow__no_unused_nodes():
135
+ class NodeA(BaseNode):
136
+ pass
137
+
138
+ class NodeB(BaseNode):
139
+ pass
140
+
141
+ # WHEN we create a workflow with no unused nodes
142
+ class TestWorkflow(BaseWorkflow[BaseInputs, BaseState]):
143
+ graph = NodeA >> NodeB
144
+
145
+ # TEST that nodes not in the graph are empty
146
+ nodes = set(TestWorkflow.get_unused_nodes())
147
+ assert nodes == set()
148
+
149
+
150
+ def test_workflow__node_in_both_graph_and_unused():
151
+ class NodeA(BaseNode):
152
+ pass
153
+
154
+ class NodeB(BaseNode):
155
+ pass
156
+
157
+ class NodeC(BaseNode):
158
+ pass
159
+
160
+ # WHEN we try to create a workflow where NodeA appears in both graph and unused
161
+ with pytest.raises(ValueError) as exc_info:
162
+
163
+ class TestWorkflow(BaseWorkflow[BaseInputs, BaseState]):
164
+ graph = NodeA >> NodeB
165
+ unused_graphs = {NodeA >> NodeC}
166
+
167
+ # THEN it should raise an error
168
+ assert "Node(s) NodeA cannot appear in both graph and unused_graphs" in str(exc_info.value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.3
3
+ Version: 0.14.4
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -20,7 +20,7 @@ vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  vellum_ee/workflows/display/base.py,sha256=ak29FIsawhaFa9_paZUHThlZRFJ1xB486JWKuSt1PYY,1965
23
- vellum_ee/workflows/display/nodes/__init__.py,sha256=5XOcZJXYUgaLS55QgRJzyQ_W1tpeprjnYAeYVezqoGw,160
23
+ vellum_ee/workflows/display/nodes/__init__.py,sha256=436iSAh_Ex5tC68oEYvNgPu05ZVIAVXnS4PKGrQeZ0Y,321
24
24
  vellum_ee/workflows/display/nodes/base_node_display.py,sha256=En8Ir2e1mpExkAi1T8ExOEpZbv5gu6OetaNq35-_WSY,16317
25
25
  vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=pLO0dORfRu--Ne9NgoyFT_CNjfpr5fGCsgbsMkUF5GM,2845
26
26
  vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=0S6ksPp53WXWh1RQVH71nj2bkCWBj4ZaFYhTxW3N2F4,1230
@@ -119,7 +119,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
119
119
  vellum/client/__init__.py,sha256=j6zi0NZ4BMC6JrwckvzMWuG5x8KoOvO4KqsLhvVCa68,117624
120
120
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
121
121
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
122
- vellum/client/core/client_wrapper.py,sha256=5MqSBkzxbM11wbTg4CUjaavYf5Rv9t5-_lqijxHjmU8,1868
122
+ vellum/client/core/client_wrapper.py,sha256=pxEwlQ6QCqqK61MR38NnSRA28GMZgrYhfxlyjX2Sy-Y,1868
123
123
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
124
124
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
125
125
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -146,13 +146,13 @@ vellum/client/resources/deployments/types/__init__.py,sha256=29GVdoLOJsADSSSqZwb
146
146
  vellum/client/resources/deployments/types/deployments_list_request_status.py,sha256=CxlQD16KZXme7x31YYCe_3aAgEueutDTeJo5A4Au-aU,174
147
147
  vellum/client/resources/deployments/types/list_deployment_release_tags_request_source.py,sha256=hRGgWMYZL9uKCmD_2dU8-u9RCPUUGItpNn1tUY-NXKY,180
148
148
  vellum/client/resources/document_indexes/__init__.py,sha256=YpOl_9IV7xOlH4OmusQxtAJB11kxQfCSMDyT1_UD0oM,165
149
- vellum/client/resources/document_indexes/client.py,sha256=1kp5I8DC4UPvjlWsocuaNhgpIQppDfHFkZIMBKBFj9s,37520
149
+ vellum/client/resources/document_indexes/client.py,sha256=XDrceFkbX1MtrR4hoFR4b-UIC2PFS1AAlKPCWR6OcZQ,37520
150
150
  vellum/client/resources/document_indexes/types/__init__.py,sha256=IoFqKHN_VBdEhC7VL8_6Jbatrn0e0zuYEJAJUahcUR0,196
151
151
  vellum/client/resources/document_indexes/types/document_indexes_list_request_status.py,sha256=sfUEB0cvOSmlE2iITqnMVyHv05Zy2fWP4QjCIYqMg0M,178
152
152
  vellum/client/resources/documents/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
153
- vellum/client/resources/documents/client.py,sha256=V2OREx-YVxQxGgC_84QQGCUmW3QveOgLB2SEhUGPde4,27864
153
+ vellum/client/resources/documents/client.py,sha256=mSUvWf6iFXK6-QtfU9dTXNKhcRoMOA_6vyjtMzJ2S4g,27862
154
154
  vellum/client/resources/folder_entities/__init__.py,sha256=QOp7UMMB3a32GrfVaud35ECn4fqPBKXxCyClsDgd6GE,175
155
- vellum/client/resources/folder_entities/client.py,sha256=ep5dnfJmEuEyrOSUftEVwKaeXrg1DENEDjO4_nw9yq0,11114
155
+ vellum/client/resources/folder_entities/client.py,sha256=xkT6D1TwPxvf1eXgDhRpKg7_O2V78jwBsIGyJgnI5SY,11110
156
156
  vellum/client/resources/folder_entities/types/__init__.py,sha256=cHabrupjC-HL3kj-UZ9WdVzqHoQHCu6QsLFB3wlOs7k,212
157
157
  vellum/client/resources/folder_entities/types/folder_entities_list_request_entity_status.py,sha256=nK9b9fRSeCfjn2V2Hifl1IbhFeVsNkoeXJ8rCAPADFg,183
158
158
  vellum/client/resources/metric_definitions/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
@@ -164,7 +164,7 @@ vellum/client/resources/organizations/client.py,sha256=Uye92moqjAcOCs4astmuFpT92
164
164
  vellum/client/resources/sandboxes/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
165
165
  vellum/client/resources/sandboxes/client.py,sha256=i-6DHap5k6gFcYS-kWI8ayJFVZxb-GENRft6BJwVam4,17158
166
166
  vellum/client/resources/test_suite_runs/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
167
- vellum/client/resources/test_suite_runs/client.py,sha256=gCF1ewlUrCsZhnXYOYqdUuD2twTrQ-u95xOgvRy7WAw,15130
167
+ vellum/client/resources/test_suite_runs/client.py,sha256=tU-N1fEfXQPomt2f058PUNIhnGoMV4vo471PlQanTAs,15128
168
168
  vellum/client/resources/test_suites/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
169
169
  vellum/client/resources/test_suites/client.py,sha256=SlO-IXyhddm1U6WtrLIUUvlImf2vXC22bX2n9fpp6-c,25969
170
170
  vellum/client/resources/workflow_deployments/__init__.py,sha256=_duH6m1CDWcfqX6DTBNjO3ar4Xrl-f5PozMaTcT4Kow,251
@@ -249,20 +249,20 @@ vellum/client/types/create_test_suite_test_case_request.py,sha256=SYUz7_aZMQlin_
249
249
  vellum/client/types/deployment_history_item.py,sha256=YfcHo4X5OjHXsffndZoAjShYncUN19ZwIm96qKE0G7o,1310
250
250
  vellum/client/types/deployment_provider_payload_response.py,sha256=b0lkt0rK88ARQaMWn9MAHeWtMBsZKofDMlOAUsQvv7g,818
251
251
  vellum/client/types/deployment_provider_payload_response_payload.py,sha256=xHLQnWFN0AZRZdrOiKawwpoKK7BTmnZfp0P7FCc2ZqE,188
252
- vellum/client/types/deployment_read.py,sha256=NtXmYsYJOATxkMxeVkSM35XzDVGbva3RWmn5midBd1A,2160
252
+ vellum/client/types/deployment_read.py,sha256=e1Z3vHwtJ1AsNE83PqXte9aFV2LhqEK4zRUeMSVJPGA,2160
253
253
  vellum/client/types/deployment_release_tag_deployment_history_item.py,sha256=df4qKHT1f-z0jnRS4UmP8MQe6u3PwYej_d8KDF7EL88,631
254
- vellum/client/types/deployment_release_tag_read.py,sha256=YlwssIgBd5lKVqelH-gejQXQ7l31vrsRNMJKDGDyTEA,1129
254
+ vellum/client/types/deployment_release_tag_read.py,sha256=GXQBJYYYU30o_vAx6WWFAgliVXSP-mDTo7krCtbuyi4,1129
255
255
  vellum/client/types/docker_service_token.py,sha256=T0icNHBKsIs6TrEiDRjckM_f37hcF1DMwEE8161tTvY,614
256
- vellum/client/types/document_document_to_document_index.py,sha256=V0SkL-U3LHAL8dOp0fnOjdssuldkabZVJ2QCY_l5KFE,1404
256
+ vellum/client/types/document_document_to_document_index.py,sha256=hR8RUMQK8Nz0b1-xMbbQP66XKqvwC4V3__5Dk1Z47Dg,1404
257
257
  vellum/client/types/document_index_chunking.py,sha256=TU0Y7z0Xacm3dhzEDuDIG3ZKJCu3vNURRh3PqEd17mY,356
258
258
  vellum/client/types/document_index_chunking_request.py,sha256=g9BKCsHKg5kzjG7YYeMNQ_5R8TXLeSgumJlMXoSfBcs,435
259
259
  vellum/client/types/document_index_indexing_config.py,sha256=xL1pCzUOkw5sSie1OrBpasE3bVnv0UyZBn7uZztbhbs,781
260
260
  vellum/client/types/document_index_indexing_config_request.py,sha256=Wt-ys1o_acHNyLU0c1laG2PVT7rgCfwO54f5nudAxk4,832
261
- vellum/client/types/document_index_read.py,sha256=9btlJ9-H7DwTFfBljT2PuxtyTQjhiWTStvGqVJMwirE,1469
261
+ vellum/client/types/document_index_read.py,sha256=cXL115A4h-TFiGc29tAkXb1pkuK0RzIquyOu1Pv7Jug,1469
262
262
  vellum/client/types/document_processing_state.py,sha256=ISlurj7jQzwHzxPzDZTqeAIgSIIGMBBPgcOSoe04pTU,211
263
- vellum/client/types/document_read.py,sha256=NpI11FeW03pFiv-SMLEHu2yMkzibHQzzxqXRpcngi-s,1713
263
+ vellum/client/types/document_read.py,sha256=6nwEvVvVe-6y2vtPNYB7KtcFoaydH2ow-WhCmCAvMQ8,1713
264
264
  vellum/client/types/document_status.py,sha256=GD_TSoFmZUBJnPl-chAmaQFzQ2_TYO3PSqi3-9QfEHE,122
265
- vellum/client/types/enriched_normalized_completion.py,sha256=qk8o_PCj8rvgxa9omng0Nx5SvGNgzS7wnXMpoH56s8k,1825
265
+ vellum/client/types/enriched_normalized_completion.py,sha256=kdNabXh7azGZPGC4vdXLlXriH8L5sUmJ79uXYcJGh8o,1825
266
266
  vellum/client/types/entity_status.py,sha256=bY0jEpISwXqFnbWd3PSb3yXEr-ounPXlAO_fyvHV7l8,158
267
267
  vellum/client/types/entity_visibility.py,sha256=BX1KdYd7dirpv878XDDvtOHkMOqebM8-lkWmLyFLaw4,184
268
268
  vellum/client/types/environment_enum.py,sha256=Wcewxp1cpGAMDIAZbTp4Y0GGfvy2Bq_Qu_67f_wBDGA,179
@@ -319,7 +319,7 @@ vellum/client/types/function_call_request.py,sha256=udGEdk66q1zTpEFE2xq-cu6w_ahM
319
319
  vellum/client/types/function_call_vellum_value.py,sha256=lLJb-S_-S_UXm6una1BMyCbqLpMhbbMcaVIYNO45h5o,759
320
320
  vellum/client/types/function_call_vellum_value_request.py,sha256=oUteuCfWcj7UJbSE_Vywmmva9kyTaeL9iv5WJHabDVs,788
321
321
  vellum/client/types/function_definition.py,sha256=UzlrrBtdWe7RMStfc1UVdcnr4s8N4mOhsM306p6x_CE,1693
322
- vellum/client/types/generate_options_request.py,sha256=TUDqsH0tiPWDZH4T-p5gsvKvwVHEVZ_k6oI3qsjlsk4,782
322
+ vellum/client/types/generate_options_request.py,sha256=MGoX4EemN7ZVy-cTAcOQ_VuVibSzY_Rix3Ltp5aqSlo,782
323
323
  vellum/client/types/generate_request.py,sha256=gL6ywAJe6YCJ5oKbtYwL2H_TMdC_6PJZAI7-P3UOF3I,1286
324
324
  vellum/client/types/generate_response.py,sha256=QjbBGFGRE1tHcyDodM6Avzq0YHI4gsprkAWpdqZRrh4,1135
325
325
  vellum/client/types/generate_result.py,sha256=gh3cLPIFv2Jx4ZLx4ZY7s1iOzAjoA0Saj7cXMdp4v-A,1094
@@ -499,10 +499,10 @@ vellum/client/types/sentence_chunker_config.py,sha256=is3t8niS19gjRtqewSkLYpskJC
499
499
  vellum/client/types/sentence_chunker_config_request.py,sha256=EpGTP4z3YttiThYmdjwIBOI5YfsOlNP17dI9yiYqi3I,716
500
500
  vellum/client/types/sentence_chunking.py,sha256=guqU3072X4h8Laf6LhTWQ5lpjBpTgoXRxKp5iXJby2U,783
501
501
  vellum/client/types/sentence_chunking_request.py,sha256=77gv1fVc9IaTuGGx3O1HB0LF9sXM5pSTWksl8BEmvLU,812
502
- vellum/client/types/slim_deployment_read.py,sha256=DIYkuill3hfoNDYpgO8oZ7Aq9KGbM09dZv2gOEPPGeQ,1826
503
- vellum/client/types/slim_document.py,sha256=frw1r47C11M-AsQ5UiDMW-EIuK0JTYUrSh-s6ZPtQSA,2395
504
- vellum/client/types/slim_document_document_to_document_index.py,sha256=XDEkftIcN4w4LguyzSw7x-V-apbmxEAk2APZfAPzyiw,1346
505
- vellum/client/types/slim_workflow_deployment.py,sha256=FW7qXPtSIP9QAzECbl8gKL1iFqKWTAfIjSVwNTIL6GA,2189
502
+ vellum/client/types/slim_deployment_read.py,sha256=Xqwjx1QSpWzEXx5QPrBv5UT1QrwTrxoL2jpzOcf94Zc,1826
503
+ vellum/client/types/slim_document.py,sha256=HJiymYPvRxfxhBUkD8epW0hQ2Vt9PQtv398QsRb4DsI,2395
504
+ vellum/client/types/slim_document_document_to_document_index.py,sha256=vo7WbRRzbApQxT0MZu_NkjQmsFD8LoezmyeKBeGZpI8,1346
505
+ vellum/client/types/slim_workflow_deployment.py,sha256=p8nVtnAjPYZArkuVZE40qDjXRXHPpEKvIngKE2NAmLE,2189
506
506
  vellum/client/types/streaming_ad_hoc_execute_prompt_event.py,sha256=NdgmJ3AZMp6io-whZIGnGb49aiqz6__KafsrzjEF_9o,1183
507
507
  vellum/client/types/streaming_execute_prompt_event.py,sha256=bjfY5ZU8ZI048a7x1VW8dDXMtSl-3Ej5koSpfKboJj0,1161
508
508
  vellum/client/types/streaming_prompt_execution_meta.py,sha256=vFLNQAVbbuvQamO9NeKDDTLQDe2n7YVLqxbhOaf6Ytc,736
@@ -580,7 +580,7 @@ vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py,sh
580
580
  vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py,sha256=IdlTWDda1061PwsHaoGDyB7-2lBVSus7Z8agcdmSOYE,905
581
581
  vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py,sha256=0XxaQKR-pb__We2EDSoiKTcz3v-nKodIYtnwFXFQ_GM,912
582
582
  vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py,sha256=psLq8aL-ygkW-HZZFiYerDrCrTf556RuXbOOAUuMvr8,1229
583
- vellum/client/types/test_suite_run_read.py,sha256=3etXdX5ks6H0nuuTLebNl_is2ZKST17wdpLm60YVSf8,1439
583
+ vellum/client/types/test_suite_run_read.py,sha256=g6-ViS7YexJCVaZ6qNZhVZiJ8EUCRFbQXFlPaAhF23U,1439
584
584
  vellum/client/types/test_suite_run_state.py,sha256=E4f_AfzXBnxhObLLZ12dBzdoYlRm-gaTqkzrZQ_KfCo,197
585
585
  vellum/client/types/test_suite_run_test_suite.py,sha256=Wcmbk1XglVFKiDcqxsW7-c7QtOrIqJBK-vWXKXvORXY,602
586
586
  vellum/client/types/test_suite_run_workflow_release_tag_exec_config.py,sha256=0ANnBKsPqBNdEoZGEfwRzZKbXbzT24T2YNC7c-3Qy1M,1144
@@ -631,7 +631,7 @@ vellum/client/types/vellum_variable.py,sha256=LNNNlYbT1VqadO6aUmeir9cXirtxgrIl-R
631
631
  vellum/client/types/vellum_variable_extensions.py,sha256=PsrRo0STOKhxrkSFRrOXCPlf1x5Uxpy3vVMJz02O20E,685
632
632
  vellum/client/types/vellum_variable_type.py,sha256=SX8PY9l8zui3IaT9BwmOxczmb_WE7S9w37JshEZVemE,371
633
633
  vellum/client/types/workflow_deployment_history_item.py,sha256=4WUPzcthBvEZ7iaisKfEg0soUtHjcTEnL_VUVaKpTyw,1420
634
- vellum/client/types/workflow_deployment_read.py,sha256=zBn6JDHemCnmU6M4tMtyxwmxETOPeGKJeg9fmiAEP4w,2363
634
+ vellum/client/types/workflow_deployment_read.py,sha256=tp1WaojTVE_dz1oiZ97h8ixMbIWDgy2yRu08A7wPMpw,2363
635
635
  vellum/client/types/workflow_event_error.py,sha256=HIewu_kh3KNPpWegAQArvAGHCp-cBIXqlUAAc_dBZhc,687
636
636
  vellum/client/types/workflow_execution_actual_chat_history_request.py,sha256=L6U8tgM7SiU4qGJMZChFzj6HfHgO-YAlTXfbT7ZIaE4,1993
637
637
  vellum/client/types/workflow_execution_actual_json_request.py,sha256=5QYaPCSOwFnjH_kTrB2bTznTMFExSZdBhTkmelf1h4Q,1931
@@ -657,7 +657,7 @@ vellum/client/types/workflow_output_string.py,sha256=_jclzbQ-Wlf-7FEVTWXhs9h5FWf
657
657
  vellum/client/types/workflow_push_deployment_config_request.py,sha256=pG6bZtlw7S0TcXtNRQNa7y_2NodZe7dp5SchIrgRUVU,745
658
658
  vellum/client/types/workflow_push_exec_config.py,sha256=6TaVMVqhSOz4DnY46l8axPDtytSioXDl9nHvFXSxH1g,94
659
659
  vellum/client/types/workflow_push_response.py,sha256=1vUSZmZ1GK1242dAkNwJnJI0rL3pBT3_0HOLLjdiutw,724
660
- vellum/client/types/workflow_release_tag_read.py,sha256=S7ekl01oVDetL8R7MdBTb4cDhHN0W0iHGNJ1-ZpY3Tc,1155
660
+ vellum/client/types/workflow_release_tag_read.py,sha256=hevIvlmqfWnZWBLXAcXC7jxXQfnG4YUaV13DIvBycPQ,1155
661
661
  vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py,sha256=pjWobdk9mZD3Px86rwFHfs_PYJBGXDKQUkxsgNEe6EA,825
662
662
  vellum/client/types/workflow_request_chat_history_input_request.py,sha256=WCZvwDuNS8ylWOOoKD3t7fHLSYB0h-fVCqeDRzqPoPA,898
663
663
  vellum/client/types/workflow_request_input_request.py,sha256=wgbKgKy-ftTzc6VMsgPkIiHaAujSiJjLizp2GfksX-A,632
@@ -1270,7 +1270,7 @@ vellum/utils/uuid.py,sha256=Ch6wWRgwICxLxJCTl5iE3EdRlZj2zADR-zUMUtjcMWM,214
1270
1270
  vellum/version.py,sha256=jq-1PlAYxN9AXuaZqbYk9ak27SgE2lw9Ia5gx1b1gVI,76
1271
1271
  vellum/workflows/README.md,sha256=MLNm-ihc0ao6I8gwwOhXQQBf0jOf-EsA9C519ALYI1o,3610
1272
1272
  vellum/workflows/__init__.py,sha256=CssPsbNvN6rDhoLuqpEv7MMKGa51vE6dvAh6U31Pcio,71
1273
- vellum/workflows/constants.py,sha256=iPhVhkLfNyFXIUufIR7_9aNFfVOfoDAC8e7jWW02GsQ,949
1273
+ vellum/workflows/constants.py,sha256=2yg4_uo5gpqViy3ZLSwfC8qTybleYCtOnhA4Rj6bacM,1310
1274
1274
  vellum/workflows/context.py,sha256=R8qdsFbD_0p7B6PWnyvSrZ_aOgMtGw-_uk0P0UAmwLA,1230
1275
1275
  vellum/workflows/descriptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1276
1276
  vellum/workflows/descriptors/base.py,sha256=gSib3vJpcI_UC8y8jhdp-hOK3_TGTF-SuwdhxF6x5iQ,14332
@@ -1342,18 +1342,18 @@ vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=I7mDUiVoFj-l-
1342
1342
  vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1343
1343
  vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=n0-821Ov9ZfRFX_lbzLy5o2rX8fEw2qoxz0aFWCOxVg,1547
1344
1344
  vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
1345
- vellum/workflows/nodes/core/map_node/node.py,sha256=8-vVR5GywLD9vpayfXmC5_CL2oQJyHhpbG4znFoUkY0,8342
1345
+ vellum/workflows/nodes/core/map_node/node.py,sha256=O-5pKm_STw99IeoidcneDl6FexQc8ehp0x8UPO3AYBQ,8294
1346
1346
  vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1347
1347
  vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=8ZXs4IIYrXpa4pZz4BSx9t0fx_Usgk3_KF6r3kcy9tE,2547
1348
1348
  vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
1349
- vellum/workflows/nodes/core/retry_node/node.py,sha256=loIZJUcCsN0y3mr4pw7f23l4eDY69IoTwA2TMnxJlxA,4292
1349
+ vellum/workflows/nodes/core/retry_node/node.py,sha256=Vt3fx4G-DRIb9a-IHIUfaAclgfbzOPEQVkcumwhl9HE,4355
1350
1350
  vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1351
1351
  vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=RM_OHwxrHwyxvlQQBJPqVBxpedFuWQ9h2-Xa3kP75sc,4399
1352
1352
  vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
1353
1353
  vellum/workflows/nodes/core/templating_node/node.py,sha256=Vqlg4L-5XNuIdbZKQe-GEYqTIV7iXNjLO7QIRgz4ujc,3722
1354
1354
  vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=nY2P6r7cW85k7NEKXUFNeDTMWlz8ZEZyMY2Sg-0qO_E,7327
1355
1355
  vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
1356
- vellum/workflows/nodes/core/try_node/node.py,sha256=bk2uhYUl10yaPJlOBWxiL7igTUrL_7mM9S2nvsdWB68,4242
1356
+ vellum/workflows/nodes/core/try_node/node.py,sha256=CA26Mb6OK4Mr-qze183Dh-gdBQVN4Q5P0Kvg5MhCjTI,4244
1357
1357
  vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1358
1358
  vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=Wc2kLl-MkffsBxl3IiFaqLd16e2Iosxhk7qBnojPvQg,4092
1359
1359
  vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
@@ -1368,7 +1368,7 @@ vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org
1368
1368
  vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=cKsNziwWJ9jUjS578I5dIka-zmsXz94hYZR3Cofm8aE,3140
1369
1369
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1370
1370
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1371
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=UrmI8NkNJFGq9f59gD12S1e8D_R3ROHc934JmtfQk9I,6841
1371
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=zCBRdz01_G4Rh_G3UoI0--7VTFNi1HlFMCK1m_GVsZM,6988
1372
1372
  vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=NbwLOoWG5VVcnwL63WmaYck87y2QW36-JQWerOlKyx4,5713
1373
1373
  vellum/workflows/nodes/displayable/bases/search_node.py,sha256=3UtbqY3QO4kzfJHbmUNZGnEEfJmaoiF892u8H6TGjp8,5381
1374
1374
  vellum/workflows/nodes/displayable/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1409,7 +1409,7 @@ vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=sS
1409
1409
  vellum/workflows/nodes/displayable/subworkflow_deployment_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1410
1410
  vellum/workflows/nodes/displayable/subworkflow_deployment_node/tests/test_node.py,sha256=c8RP-QnsERzIinVytAc0jVZ9nd7Jl3hbc9-_yG91Ros,5445
1411
1411
  vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1412
- vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=CI7iMyyIlnds1rkVSjICOFg2UY0yV51NTKtKpfeEME4,4677
1412
+ vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=LaxohBcKfSW2PSiBBlx67FdW_q4YC2BM2ouH-vuGPAA,4700
1413
1413
  vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=VepO5z1277c1y5N6LLIC31nnWD1aak2m5oPFplfJHHs,6935
1414
1414
  vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=wOd5WvQdcwiqcmXExQr95QtIhSgpB6F3EfjybBuTw9E,2558
1415
1415
  vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
@@ -1450,6 +1450,7 @@ vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
1450
1450
  vellum/workflows/state/tests/test_state.py,sha256=jBynFR4m74Vn51DdmKBLkxb1loTy1CnJPtzPmdAFQUo,5159
1451
1451
  vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1452
1452
  vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
1453
+ vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
1453
1454
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1454
1455
  vellum/workflows/types/core.py,sha256=kMQremh_I8egXpiKmtMQbB6e3OczAWiRnnTq5V6xlD0,928
1455
1456
  vellum/workflows/types/generics.py,sha256=9HzFvtcF8qpn1wcsly7er250MMwdS9r-BjSVco9UBj4,584
@@ -1469,12 +1470,12 @@ vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrg
1469
1470
  vellum/workflows/utils/vellum_variables.py,sha256=fC2aSLvlS31D15dOWu43LBRR0QsgUKNXBiCUvvaLXSs,3231
1470
1471
  vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
1471
1472
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1472
- vellum/workflows/workflows/base.py,sha256=tBivLLLPtMyMi2Bd5WjbwQ2_zZFpG8rNfEidfQ1x2YI,19403
1473
+ vellum/workflows/workflows/base.py,sha256=eHa5iojvXFl3_vSb3jCoYt24dZdjppoohAqv99z8xRY,22096
1473
1474
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
1474
1475
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1475
- vellum/workflows/workflows/tests/test_base_workflow.py,sha256=dz5F3DuGOk9qUMjmNd-GdEE3320G5ko5nJ6J0QJyVcY,2659
1476
- vellum_ai-0.14.3.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1477
- vellum_ai-0.14.3.dist-info/METADATA,sha256=4Q0I2ydIobyCxpBPpfRJgFtoGEfWnlteA_j2XUuFvME,5407
1478
- vellum_ai-0.14.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1479
- vellum_ai-0.14.3.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1480
- vellum_ai-0.14.3.dist-info/RECORD,,
1476
+ vellum/workflows/workflows/tests/test_base_workflow.py,sha256=dTwC2VIqXNJ5yJ3MPwGNB9QpVzVzycT2kiBIljxhCwM,4836
1477
+ vellum_ai-0.14.4.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1478
+ vellum_ai-0.14.4.dist-info/METADATA,sha256=cV7wQcYIgzVrVDPeufin7dSQ5sRFUGtzbAhDw9kYKKc,5407
1479
+ vellum_ai-0.14.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1480
+ vellum_ai-0.14.4.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1481
+ vellum_ai-0.14.4.dist-info/RECORD,,
@@ -1,4 +1,8 @@
1
1
  # flake8: noqa: F401
2
2
 
3
3
  # Force an import to ensure that all display classes are registered with the BaseNodeDisplay registry
4
+ from .base_node_display import BaseNodeDisplay
4
5
  from .vellum import * # noqa: F401
6
+ from .vellum import __all__ as all_vellum_display_nodes
7
+
8
+ __all__ = ["BaseNodeDisplay"] + all_vellum_display_nodes