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
         |