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.
- vellum/client/core/client_wrapper.py +1 -1
- vellum/client/resources/document_indexes/client.py +4 -4
- vellum/client/resources/documents/client.py +0 -2
- vellum/client/resources/folder_entities/client.py +4 -8
- vellum/client/resources/test_suite_runs/client.py +0 -2
- vellum/client/types/deployment_read.py +5 -5
- vellum/client/types/deployment_release_tag_read.py +2 -2
- vellum/client/types/document_document_to_document_index.py +5 -5
- vellum/client/types/document_index_read.py +5 -5
- vellum/client/types/document_read.py +1 -1
- vellum/client/types/enriched_normalized_completion.py +3 -3
- vellum/client/types/generate_options_request.py +2 -2
- vellum/client/types/slim_deployment_read.py +5 -5
- vellum/client/types/slim_document.py +3 -3
- vellum/client/types/slim_document_document_to_document_index.py +5 -5
- vellum/client/types/slim_workflow_deployment.py +5 -5
- vellum/client/types/test_suite_run_read.py +5 -5
- vellum/client/types/workflow_deployment_read.py +5 -5
- vellum/client/types/workflow_release_tag_read.py +2 -2
- vellum/workflows/constants.py +9 -0
- vellum/workflows/nodes/core/map_node/node.py +1 -1
- vellum/workflows/nodes/core/retry_node/node.py +4 -3
- vellum/workflows/nodes/core/try_node/node.py +1 -1
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +5 -0
- vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +1 -0
- vellum/workflows/tests/test_undefined.py +12 -0
- vellum/workflows/workflows/base.py +59 -0
- vellum/workflows/workflows/tests/test_base_workflow.py +88 -0
- {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/METADATA +1 -1
- {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/RECORD +34 -33
- vellum_ee/workflows/display/nodes/__init__.py +4 -0
- {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/LICENSE +0 -0
- {vellum_ai-0.14.3.dist-info → vellum_ai-0.14.4.dist-info}/WHEEL +0 -0
- {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.
|
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
|
-
|
58
|
-
|
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
|
-
|
593
|
-
|
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
|
-
|
52
|
-
|
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
|
-
|
203
|
-
|
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
|
-
|
34
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
22
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
31
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
38
|
+
* `DEVELOPMENT` - Development
|
39
|
+
* `STAGING` - Staging
|
40
|
+
* `PRODUCTION` - Production
|
41
41
|
"""
|
42
42
|
|
43
43
|
indexing_config: DocumentIndexIndexingConfig
|
@@ -29,9 +29,9 @@ class EnrichedNormalizedCompletion(UniversalBaseModel):
|
|
29
29
|
"""
|
30
30
|
The reason the generation finished.
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
* `LENGTH` - LENGTH
|
33
|
+
* `STOP` - STOP
|
34
|
+
* `UNKNOWN` - UNKNOWN
|
35
35
|
"""
|
36
36
|
|
37
37
|
logprobs: typing.Optional[NormalizedLogProbs] = pydantic.Field(default=None)
|
@@ -30,17 +30,17 @@ class SlimDeploymentRead(UniversalBaseModel):
|
|
30
30
|
"""
|
31
31
|
The current status of the deployment
|
32
32
|
|
33
|
-
|
34
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
41
|
-
|
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
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
22
|
-
|
21
|
+
* `SYSTEM` - System
|
22
|
+
* `USER` - User
|
23
23
|
"""
|
24
24
|
|
25
25
|
history_item: WorkflowReleaseTagWorkflowDeploymentHistoryItem = pydantic.Field()
|
vellum/workflows/constants.py
CHANGED
@@ -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[
|
23
|
-
|
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[
|
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,
|
@@ -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)
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
503
|
-
vellum/client/types/slim_document.py,sha256=
|
504
|
-
vellum/client/types/slim_document_document_to_document_index.py,sha256=
|
505
|
-
vellum/client/types/slim_workflow_deployment.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
1476
|
-
vellum_ai-0.14.
|
1477
|
-
vellum_ai-0.14.
|
1478
|
-
vellum_ai-0.14.
|
1479
|
-
vellum_ai-0.14.
|
1480
|
-
vellum_ai-0.14.
|
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
|
File without changes
|
File without changes
|
File without changes
|