vellum-ai 0.12.3__py3-none-any.whl → 0.12.5__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/workflows/client.py +32 -0
- vellum/client/types/chat_message_prompt_block.py +1 -1
- vellum/client/types/function_definition.py +26 -7
- vellum/client/types/jinja_prompt_block.py +1 -1
- vellum/client/types/plain_text_prompt_block.py +1 -1
- vellum/client/types/rich_text_prompt_block.py +1 -1
- vellum/client/types/variable_prompt_block.py +1 -1
- vellum/plugins/vellum_mypy.py +20 -23
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +21 -8
- vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py +0 -0
- vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +64 -0
- vellum/workflows/sandbox.py +51 -0
- vellum/workflows/tests/__init__.py +0 -0
- vellum/workflows/tests/test_sandbox.py +62 -0
- vellum/workflows/types/core.py +2 -52
- vellum/workflows/utils/functions.py +41 -4
- vellum/workflows/utils/tests/test_functions.py +93 -0
- {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/METADATA +1 -1
- {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/RECORD +33 -28
- vellum_cli/__init__.py +14 -0
- vellum_cli/pull.py +16 -2
- vellum_cli/tests/test_pull.py +45 -0
- vellum_ee/workflows/display/nodes/base_node_vellum_display.py +2 -2
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +1 -3
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py +18 -18
- vellum_ee/workflows/display/nodes/vellum/search_node.py +19 -15
- vellum_ee/workflows/display/nodes/vellum/templating_node.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/utils.py +4 -4
- vellum_ee/workflows/display/utils/vellum.py +1 -2
- {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/LICENSE +0 -0
- {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/WHEEL +0 -0
- {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/entry_points.txt +0 -0
| @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            from dataclasses import dataclass
         | 
| 2 2 | 
             
            from typing import Dict, List, Optional, Union
         | 
| 3 3 |  | 
| 4 | 
            +
            from pydantic import BaseModel
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
            from vellum.client.types.function_definition import FunctionDefinition
         | 
| 5 7 | 
             
            from vellum.workflows.utils.functions import compile_function_definition
         | 
| 6 8 |  | 
| @@ -169,3 +171,94 @@ def test_compile_function_definition__dataclasses(): | |
| 169 171 | 
             
                        },
         | 
| 170 172 | 
             
                    },
         | 
| 171 173 | 
             
                )
         | 
| 174 | 
            +
             | 
| 175 | 
            +
             | 
| 176 | 
            +
            def test_compile_function_definition__pydantic():
         | 
| 177 | 
            +
                # GIVEN a function with a pydantic model
         | 
| 178 | 
            +
                class MyPydanticModel(BaseModel):
         | 
| 179 | 
            +
                    a: int
         | 
| 180 | 
            +
                    b: str
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                def my_function(c: MyPydanticModel):
         | 
| 183 | 
            +
                    pass
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                # WHEN compiling the function
         | 
| 186 | 
            +
                compiled_function = compile_function_definition(my_function)
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                # THEN it should return the compiled function definition
         | 
| 189 | 
            +
                assert compiled_function == FunctionDefinition(
         | 
| 190 | 
            +
                    name="my_function",
         | 
| 191 | 
            +
                    parameters={
         | 
| 192 | 
            +
                        "type": "object",
         | 
| 193 | 
            +
                        "properties": {"c": {"$ref": "#/$defs/MyPydanticModel"}},
         | 
| 194 | 
            +
                        "required": ["c"],
         | 
| 195 | 
            +
                        "$defs": {
         | 
| 196 | 
            +
                            "MyPydanticModel": {
         | 
| 197 | 
            +
                                "type": "object",
         | 
| 198 | 
            +
                                "properties": {"a": {"type": "integer"}, "b": {"type": "string"}},
         | 
| 199 | 
            +
                                "required": ["a", "b"],
         | 
| 200 | 
            +
                            }
         | 
| 201 | 
            +
                        },
         | 
| 202 | 
            +
                    },
         | 
| 203 | 
            +
                )
         | 
| 204 | 
            +
             | 
| 205 | 
            +
             | 
| 206 | 
            +
            def test_compile_function_definition__default_dataclass():
         | 
| 207 | 
            +
                # GIVEN a function with a dataclass
         | 
| 208 | 
            +
                @dataclass
         | 
| 209 | 
            +
                class MyDataClass:
         | 
| 210 | 
            +
                    a: int
         | 
| 211 | 
            +
                    b: str
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                def my_function(c: MyDataClass = MyDataClass(a=1, b="hello")):
         | 
| 214 | 
            +
                    pass
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                # WHEN compiling the function
         | 
| 217 | 
            +
                compiled_function = compile_function_definition(my_function)
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                # THEN it should return the compiled function definition
         | 
| 220 | 
            +
                assert compiled_function == FunctionDefinition(
         | 
| 221 | 
            +
                    name="my_function",
         | 
| 222 | 
            +
                    parameters={
         | 
| 223 | 
            +
                        "type": "object",
         | 
| 224 | 
            +
                        "properties": {"c": {"$ref": "#/$defs/MyDataClass", "default": {"a": 1, "b": "hello"}}},
         | 
| 225 | 
            +
                        "required": [],
         | 
| 226 | 
            +
                        "$defs": {
         | 
| 227 | 
            +
                            "MyDataClass": {
         | 
| 228 | 
            +
                                "type": "object",
         | 
| 229 | 
            +
                                "properties": {"a": {"type": "integer"}, "b": {"type": "string"}},
         | 
| 230 | 
            +
                                "required": ["a", "b"],
         | 
| 231 | 
            +
                            }
         | 
| 232 | 
            +
                        },
         | 
| 233 | 
            +
                    },
         | 
| 234 | 
            +
                )
         | 
| 235 | 
            +
             | 
| 236 | 
            +
             | 
| 237 | 
            +
            def test_compile_function_definition__default_pydantic():
         | 
| 238 | 
            +
                # GIVEN a function with a pydantic model as the default value
         | 
| 239 | 
            +
                class MyPydanticModel(BaseModel):
         | 
| 240 | 
            +
                    a: int
         | 
| 241 | 
            +
                    b: str
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                def my_function(c: MyPydanticModel = MyPydanticModel(a=1, b="hello")):
         | 
| 244 | 
            +
                    pass
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                # WHEN compiling the function
         | 
| 247 | 
            +
                compiled_function = compile_function_definition(my_function)
         | 
| 248 | 
            +
             | 
| 249 | 
            +
                # THEN it should return the compiled function definition
         | 
| 250 | 
            +
                assert compiled_function == FunctionDefinition(
         | 
| 251 | 
            +
                    name="my_function",
         | 
| 252 | 
            +
                    parameters={
         | 
| 253 | 
            +
                        "type": "object",
         | 
| 254 | 
            +
                        "properties": {"c": {"$ref": "#/$defs/MyPydanticModel", "default": {"a": 1, "b": "hello"}}},
         | 
| 255 | 
            +
                        "required": [],
         | 
| 256 | 
            +
                        "$defs": {
         | 
| 257 | 
            +
                            "MyPydanticModel": {
         | 
| 258 | 
            +
                                "type": "object",
         | 
| 259 | 
            +
                                "properties": {"a": {"type": "integer"}, "b": {"type": "string"}},
         | 
| 260 | 
            +
                                "required": ["a", "b"],
         | 
| 261 | 
            +
                            }
         | 
| 262 | 
            +
                        },
         | 
| 263 | 
            +
                    },
         | 
| 264 | 
            +
                )
         | 
| @@ -1,17 +1,17 @@ | |
| 1 1 | 
             
            vellum_cli/CONTRIBUTING.md,sha256=FtDC7BGxSeMnwCXAUssFsAIElXtmJE-O5Z7BpolcgvI,2935
         | 
| 2 2 | 
             
            vellum_cli/README.md,sha256=2NudRoLzWxNKqnuVy1JuQ7DerIaxWGYkrH8kMd-asIE,90
         | 
| 3 | 
            -
            vellum_cli/__init__.py,sha256= | 
| 3 | 
            +
            vellum_cli/__init__.py,sha256=A9uo9OE7xQACNEtX4k0c-rxypDqS5V8kA8u4BNN0azM,7402
         | 
| 4 4 | 
             
            vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
         | 
| 5 5 | 
             
            vellum_cli/config.py,sha256=wJQnv3tCgu1BOugg0AOP94yQ-x1yAg8juX_QoFN9Y7w,5223
         | 
| 6 6 | 
             
            vellum_cli/image_push.py,sha256=SJwhwWJsLjwGNezNVd_oCVpFMfPsAB3dfLWmriZZUtw,4419
         | 
| 7 7 | 
             
            vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
         | 
| 8 | 
            -
            vellum_cli/pull.py,sha256= | 
| 8 | 
            +
            vellum_cli/pull.py,sha256=q68fr1o5H9l8Dvc8BTY1GARJYjAV1i6Fg-Lg4Oo4FDw,6155
         | 
| 9 9 | 
             
            vellum_cli/push.py,sha256=gcYhIogeYejZIhNm5Cjp0VBECaXLmVQEvZjrPH0-TSU,5337
         | 
| 10 10 | 
             
            vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 11 11 | 
             
            vellum_cli/tests/conftest.py,sha256=eFGwBxib3Nki830lIFintB0b6r4x8T_KMnmzhlTY5x0,1337
         | 
| 12 12 | 
             
            vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
         | 
| 13 13 | 
             
            vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
         | 
| 14 | 
            -
            vellum_cli/tests/test_pull.py,sha256= | 
| 14 | 
            +
            vellum_cli/tests/test_pull.py,sha256=P2JFNHU1hE6iydYl7rW35h7c8_DSrLiAS7gNsFMy1JU,17829
         | 
| 15 15 | 
             
            vellum_cli/tests/test_push.py,sha256=V2iGcskh2X3OHj2uV5Vx_BhmtyfmUkyx0lrp8DDOExc,5824
         | 
| 16 16 | 
             
            vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 17 17 | 
             
            vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| @@ -20,7 +20,7 @@ vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp | |
| 20 20 | 
             
            vellum_ee/workflows/display/base.py,sha256=3ZFUYRNKL24fBqXhKpa_Dq2W1a-a86J20dmJYA3H2eY,1755
         | 
| 21 21 | 
             
            vellum_ee/workflows/display/nodes/__init__.py,sha256=5XOcZJXYUgaLS55QgRJzyQ_W1tpeprjnYAeYVezqoGw,160
         | 
| 22 22 | 
             
            vellum_ee/workflows/display/nodes/base_node_display.py,sha256=23PLqcpMe_mYkYdug9PDb6Br7o64Thx9-IhcviKGvGo,6662
         | 
| 23 | 
            -
            vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256= | 
| 23 | 
            +
            vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=BxA-YVUJvB36NM-Q5DNCwckeqymwLKMp9DVCaTyrPbs,2253
         | 
| 24 24 | 
             
            vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=vyKeJAevAXvEAEtWeTEdBZXD3eJQYW_DEXLKVZ5KmYc,1325
         | 
| 25 25 | 
             
            vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 26 26 | 
             
            vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=QqR3Ly0RNrXwOeLdW5nERDFt0gRPf76n1bPES6o5UN4,1093
         | 
| @@ -28,8 +28,8 @@ vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6m | |
| 28 28 | 
             
            vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
         | 
| 29 29 | 
             
            vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nmPLj8vkbVCS46XQqmHq8Xj8Mr36wCK_vWf26A9KIkw,1505
         | 
| 30 30 | 
             
            vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=4SSQGecKWHuoGy5YIGJeOZVHGKwTs_8Y-gf3GvsHb0M,8506
         | 
| 31 | 
            -
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256= | 
| 32 | 
            -
            vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256= | 
| 31 | 
            +
            vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=XqizRn5bLwT8LMwgyvfbln8inhCxzTi1EkD22Fx-5-U,4222
         | 
| 32 | 
            +
            vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=EtdqJfhYw03PuT2iyJ6mSAZK4RsQqDie_2AnJAtMelk,13625
         | 
| 33 33 | 
             
            vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=ygTjSjYDI4DtkxADWub5rhBnRWItMKWF6fezBrgpOKA,1979
         | 
| 34 34 | 
             
            vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=t5iJQVoRT5g-v2IiUb4kFYdvUVKch0zn27016pzDZoo,2761
         | 
| 35 35 | 
             
            vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=3TJvHX_Uuf_gr94VkYc_zmNH8I5p71ChIeoAbJZ3ddY,2158
         | 
| @@ -39,13 +39,13 @@ vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=AqUlItgSZij12qRKguKV | |
| 39 39 | 
             
            vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=jzO63B9KiEAncnBqmz2ZTcxjmEHozMEe7WnfpcpsQYg,3195
         | 
| 40 40 | 
             
            vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=9VpC3h0RYOxJuRbjDwidBYlLKakkmlEnDMBh2C7lHcY,1107
         | 
| 41 41 | 
             
            vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=gLRkizwyw21-Z12IyDbdOJpXayiZZd4HWd6qgZQg8sc,3106
         | 
| 42 | 
            -
            vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256= | 
| 42 | 
            +
            vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=laNWcDt62VRM5hLfcOi-ouAyNhYiFRsD0PWbVGLwlLI,9035
         | 
| 43 43 | 
             
            vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=zOp4voBSgB3MR1R93wTOrsiiara_hxEAYFupLl_SvTA,2657
         | 
| 44 | 
            -
            vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256= | 
| 44 | 
            +
            vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=IHumtFFZSanRizU3-0ATFgUnDuSFZMScZce8YTDJiGU,3373
         | 
| 45 45 | 
             
            vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 46 46 | 
             
            vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=aJfQnIvlrRHVKgQid_gg6VQKkJyPgFnzbvWt9_t0Vz0,3860
         | 
| 47 47 | 
             
            vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=hB8dcGMGkuC95kk9hmZUgHsCLwEA37fHTFXj0JzbRjM,4692
         | 
| 48 | 
            -
            vellum_ee/workflows/display/nodes/vellum/utils.py,sha256= | 
| 48 | 
            +
            vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=6mPg9QilJfLw9Sgk_h9LRSyKZpKgRu06mr3X1AmmDCA,4691
         | 
| 49 49 | 
             
            vellum_ee/workflows/display/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 50 50 | 
             
            vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=TEg3QbdE7rLbEhml9pMWmay--phsekGlfGVhTblxCGE,1727
         | 
| 51 51 | 
             
            vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| @@ -65,7 +65,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_ser | |
| 65 65 | 
             
            vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=BGCgJ3WWiYK5fWJp_Yz-aWQPli5sIKOhLTVYfG9Tpq8,9177
         | 
| 66 66 | 
             
            vellum_ee/workflows/display/types.py,sha256=FSPg3TO8iNE2gnl1vn-nsMfit2V6yeBXW0Igh089A9w,2011
         | 
| 67 67 | 
             
            vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 68 | 
            -
            vellum_ee/workflows/display/utils/vellum.py,sha256 | 
| 68 | 
            +
            vellum_ee/workflows/display/utils/vellum.py,sha256=-cz3xB-_-r1O9TBdLQPBvlpptg9CrZVNQ50QimmJFnA,5032
         | 
| 69 69 | 
             
            vellum_ee/workflows/display/vellum.py,sha256=OSv0ZS50h1zJbunJ9TH7VEWFw-exXdK_ZsdzPxP9ROs,8814
         | 
| 70 70 | 
             
            vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
         | 
| 71 71 | 
             
            vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=ydAbFMzcY2LURINZbXYm9BAXZdIa3-7rQ86Kupo7qcA,12804
         | 
| @@ -76,7 +76,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749 | |
| 76 76 | 
             
            vellum/client/__init__.py,sha256=o4m7iRZWEV8rP3GkdaztHAjNmjxjWERlarviFoHzuKI,110927
         | 
| 77 77 | 
             
            vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
         | 
| 78 78 | 
             
            vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
         | 
| 79 | 
            -
            vellum/client/core/client_wrapper.py,sha256= | 
| 79 | 
            +
            vellum/client/core/client_wrapper.py,sha256=wl6o-mN_dvL9IHNiM92SLF4UVlR6ssouBizBfQnMvLw,1868
         | 
| 80 80 | 
             
            vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
         | 
| 81 81 | 
             
            vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
         | 
| 82 82 | 
             
            vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
         | 
| @@ -130,7 +130,7 @@ vellum/client/resources/workflow_deployments/types/workflow_deployments_list_req | |
| 130 130 | 
             
            vellum/client/resources/workflow_sandboxes/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
         | 
| 131 131 | 
             
            vellum/client/resources/workflow_sandboxes/client.py,sha256=3wVQxkjrJ5bIS8fB5FpKXCP2dX38299ghWrJ8YmXxwQ,7435
         | 
| 132 132 | 
             
            vellum/client/resources/workflows/__init__.py,sha256=Z4xi8Nxd9U4t35FQSepTt1p-ns0X1xtdNs168kUcuBk,153
         | 
| 133 | 
            -
            vellum/client/resources/workflows/client.py,sha256= | 
| 133 | 
            +
            vellum/client/resources/workflows/client.py,sha256=1X9KKRIr-Jwxbkd2a43DYfukKRKgNL1IXkGb9VC15a0,11391
         | 
| 134 134 | 
             
            vellum/client/resources/workflows/types/__init__.py,sha256=-uFca4ypncAOvfsg6sjD-5C9zWdA5qNvU6m675GphVg,177
         | 
| 135 135 | 
             
            vellum/client/resources/workflows/types/workflows_pull_request_format.py,sha256=dOWE_jnDnniIJLoeseeCms23aklghyBkoPmBFzcqqZk,165
         | 
| 136 136 | 
             
            vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
         | 
| @@ -173,7 +173,7 @@ vellum/client/types/chat_history_vellum_value_request.py,sha256=HzAiysncG5unJ-tl | |
| 173 173 | 
             
            vellum/client/types/chat_message.py,sha256=EOA8v5Ebx2KS9BtwBBGbuvSK-pn4xWYZiioHuuPWvzw,916
         | 
| 174 174 | 
             
            vellum/client/types/chat_message_content.py,sha256=DQLB5rG40qLRLsmKWWo-XKa4rhk9TGQs_eFTFow2zEM,607
         | 
| 175 175 | 
             
            vellum/client/types/chat_message_content_request.py,sha256=iFT_PmN6sUjeN1_fZXr2ePJEbSq_GZcClBvtu8SdVmQ,724
         | 
| 176 | 
            -
            vellum/client/types/chat_message_prompt_block.py,sha256= | 
| 176 | 
            +
            vellum/client/types/chat_message_prompt_block.py,sha256=b6WmJqAc6r15XhHKsq3VmZBP-uoKV4jCSO-_xrDY5Qw,1351
         | 
| 177 177 | 
             
            vellum/client/types/chat_message_request.py,sha256=r2EW1pfnvNYx2fo6mBqU5HQrUzp67WXuE5G-XK281E4,945
         | 
| 178 178 | 
             
            vellum/client/types/chat_message_role.py,sha256=-i0Jrcbwf72MkMoaFTGyxRduvlN7f5Y9ULhCXR5KNdA,182
         | 
| 179 179 | 
             
            vellum/client/types/code_execution_node_array_result.py,sha256=KCdbmjXjReO-hPPpBsSR17h_roDUpc4R-92cmIn59ck,952
         | 
| @@ -271,7 +271,7 @@ vellum/client/types/function_call_request.py,sha256=eJBIN-wLkkkDUIwAy1nMeWHu3MZ5 | |
| 271 271 | 
             
            vellum/client/types/function_call_variable_value.py,sha256=VQKCiEtJsmIK3i7CtFV_2ZpxeX70rqpUViXIvAci8L0,702
         | 
| 272 272 | 
             
            vellum/client/types/function_call_vellum_value.py,sha256=lLJb-S_-S_UXm6una1BMyCbqLpMhbbMcaVIYNO45h5o,759
         | 
| 273 273 | 
             
            vellum/client/types/function_call_vellum_value_request.py,sha256=oUteuCfWcj7UJbSE_Vywmmva9kyTaeL9iv5WJHabDVs,788
         | 
| 274 | 
            -
            vellum/client/types/function_definition.py,sha256= | 
| 274 | 
            +
            vellum/client/types/function_definition.py,sha256=UzlrrBtdWe7RMStfc1UVdcnr4s8N4mOhsM306p6x_CE,1693
         | 
| 275 275 | 
             
            vellum/client/types/generate_options_request.py,sha256=TUDqsH0tiPWDZH4T-p5gsvKvwVHEVZ_k6oI3qsjlsk4,782
         | 
| 276 276 | 
             
            vellum/client/types/generate_request.py,sha256=gL6ywAJe6YCJ5oKbtYwL2H_TMdC_6PJZAI7-P3UOF3I,1286
         | 
| 277 277 | 
             
            vellum/client/types/generate_response.py,sha256=QjbBGFGRE1tHcyDodM6Avzq0YHI4gsprkAWpdqZRrh4,1135
         | 
| @@ -304,7 +304,7 @@ vellum/client/types/initiated_workflow_node_result_event.py,sha256=Nu1J4iQYsW2HH | |
| 304 304 | 
             
            vellum/client/types/instructor_vectorizer_config.py,sha256=7udlosXv4CUWTW_Q9m0mz3VRi1FKSbBhDIOhtxRd0-U,731
         | 
| 305 305 | 
             
            vellum/client/types/instructor_vectorizer_config_request.py,sha256=6LGFFQKntMfX7bdetUqEMVdr3KJHEps0oDp2bNmqWbM,738
         | 
| 306 306 | 
             
            vellum/client/types/iteration_state_enum.py,sha256=83JSh842OJgQiLtNn1KMimy6RlEYRVH3mDmYWS6Ewzo,180
         | 
| 307 | 
            -
            vellum/client/types/jinja_prompt_block.py,sha256 | 
| 307 | 
            +
            vellum/client/types/jinja_prompt_block.py,sha256=-wukO4TaDvGlrbkg9ZtDOPEfoLmaoX7830ktLGHRrvI,939
         | 
| 308 308 | 
             
            vellum/client/types/json_input.py,sha256=ZUA2O9YueBCx0IMMdB8uYNSWJiSDZxMm5ogwbwCmz_g,761
         | 
| 309 309 | 
             
            vellum/client/types/json_input_request.py,sha256=x5sA-VXxF4QH-98xRcIKPZhsMVbnJNUQofiUQqyfGk4,768
         | 
| 310 310 | 
             
            vellum/client/types/json_variable_value.py,sha256=X7eBEWxuozfvIdqD5sIZ5L-L77Ou6IIsZaQVNXh5G2k,634
         | 
| @@ -392,7 +392,7 @@ vellum/client/types/paginated_test_suite_test_case_list.py,sha256=9KrCCQKy0egMmV | |
| 392 392 | 
             
            vellum/client/types/paginated_workflow_release_tag_read_list.py,sha256=dH24ESWyAMVtyHsBkxG8kJ9oORY04Wn3IN-7jvV7Lu4,818
         | 
| 393 393 | 
             
            vellum/client/types/pdf_search_result_meta_source.py,sha256=EMVhqdN1bwE6Ujdx4VhlmKQtJvitN-57kY8oZPxh9dI,1126
         | 
| 394 394 | 
             
            vellum/client/types/pdf_search_result_meta_source_request.py,sha256=nUhaD2Kw1paGC6O_ICVNu3R0e1SVgTshRTkGNgmcjXo,1133
         | 
| 395 | 
            -
            vellum/client/types/plain_text_prompt_block.py,sha256= | 
| 395 | 
            +
            vellum/client/types/plain_text_prompt_block.py,sha256=cqEN-B4mcvMw_9lBN7FQG8pk9b5LBJ9xpM6PTgkGiqs,930
         | 
| 396 396 | 
             
            vellum/client/types/price.py,sha256=ewzXDBVLaleuXMVQ-gQ3G1Nl5J2OWOVEMEFfnQIpiTk,610
         | 
| 397 397 | 
             
            vellum/client/types/processing_failure_reason_enum.py,sha256=R_KIW7TcQejhc-vLhtNf9SdkYADgoZCn4ch4_RRIvsI,195
         | 
| 398 398 | 
             
            vellum/client/types/prompt_block.py,sha256=MIsxxmAmuT0thkkG12xm3THO5dlRLbFeMZBVTSvb788,493
         | 
| @@ -424,7 +424,7 @@ vellum/client/types/rejected_workflow_node_result_event.py,sha256=o9AUc9hT60F8ck | |
| 424 424 | 
             
            vellum/client/types/release_tag_source.py,sha256=YavosOXZ976yfXTNWRTZwh2HhRiYmSDk0bQCkl-jCoQ,158
         | 
| 425 425 | 
             
            vellum/client/types/replace_test_suite_test_case_request.py,sha256=c1GT1RUCei1yWxyZy4Gv40PkXYisvK5OkzlqQ6WeBYA,1906
         | 
| 426 426 | 
             
            vellum/client/types/rich_text_child_block.py,sha256=X_ACKFKSUx5SXT1cLp0Y5-7VrNxcGOggPm67Lk2442U,270
         | 
| 427 | 
            -
            vellum/client/types/rich_text_prompt_block.py,sha256= | 
| 427 | 
            +
            vellum/client/types/rich_text_prompt_block.py,sha256=_Y2tRnSDtOUYHcq7zNfYbgqcLZab-Zd-Yh6UKdybVIY,1036
         | 
| 428 428 | 
             
            vellum/client/types/sandbox_scenario.py,sha256=f4S0tDxmPYHIrD_BMjRL3XZGcGxlWy9apfI64hV7MBE,844
         | 
| 429 429 | 
             
            vellum/client/types/scenario_input.py,sha256=caC8p5ZnuXhv2ZiHvzTvKL3Ebtr4NXP9Q8UcJEVB8-U,476
         | 
| 430 430 | 
             
            vellum/client/types/scenario_input_chat_history_variable_value.py,sha256=ihgJktmZpz_12wx2yPtyrSrBjcBcSg9fby7h_eLoXgI,835
         | 
| @@ -566,7 +566,7 @@ vellum/client/types/token_overlapping_window_chunking_request.py,sha256=IjCs9UDr | |
| 566 566 | 
             
            vellum/client/types/unit_enum.py,sha256=BKWRVp2WfHtGK4D6TsolhNJHGHfExzrRHkFn8H8QkwQ,113
         | 
| 567 567 | 
             
            vellum/client/types/upload_document_response.py,sha256=6_5Cm4yBPq5nD-rEql6GsmrAtSVVtNRczOL5YwsBVMI,649
         | 
| 568 568 | 
             
            vellum/client/types/upsert_test_suite_test_case_request.py,sha256=iB38vx4mo4yNLV5XTeXMGR-PJLOQPloWQOAAi7PDpM0,2079
         | 
| 569 | 
            -
            vellum/client/types/variable_prompt_block.py,sha256= | 
| 569 | 
            +
            vellum/client/types/variable_prompt_block.py,sha256=PZxTq_zu7wa5r2eTBbwCRL7hwDKaLaBT3URB1RR2WKw,946
         | 
| 570 570 | 
             
            vellum/client/types/vellum_audio.py,sha256=oPm1bcxk7fTfWfHWOPSLvrZrRBjCyPDVDRMACPoWmMI,721
         | 
| 571 571 | 
             
            vellum/client/types/vellum_audio_request.py,sha256=y9CZgQ1TteW0AHNk8GuAZLNVFa981rh7P9vyV8bfgys,728
         | 
| 572 572 | 
             
            vellum/client/types/vellum_error.py,sha256=jCKfuCkDTiyFb1-QyP2cg0wReja6wMuooKPAjNhBA0M,643
         | 
| @@ -659,7 +659,7 @@ vellum/evaluations/utils/uuid.py,sha256=Ch6wWRgwICxLxJCTl5iE3EdRlZj2zADR-zUMUtjc | |
| 659 659 | 
             
            vellum/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 660 660 | 
             
            vellum/plugins/pydantic.py,sha256=EbI0pJMhUS9rLPSkzmAELfnCHrWCJzOrU06T8ommwdw,2334
         | 
| 661 661 | 
             
            vellum/plugins/utils.py,sha256=U9ZY9KdE3RRvbcG01hXxu9CvfJD6Fo7nJDgcHjQn0FI,606
         | 
| 662 | 
            -
            vellum/plugins/vellum_mypy.py,sha256= | 
| 662 | 
            +
            vellum/plugins/vellum_mypy.py,sha256=VC15EzjTsXOb9uF1bky4rcxePP-0epMVmCsLB2z4Dh8,24816
         | 
| 663 663 | 
             
            vellum/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 664 664 | 
             
            vellum/resources/__init__.py,sha256=sQWK7g_Z4EM7pa7fy6vy3d_DMdTJ4wVcozBn3Lx4Qpo,141
         | 
| 665 665 | 
             
            vellum/resources/ad_hoc/__init__.py,sha256=UD01D9nS_M7sRKmMbEg4Tv9SlfFj3cWahVxwUEaSLAY,148
         | 
| @@ -1297,7 +1297,7 @@ vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org | |
| 1297 1297 | 
             
            vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=EvylK1rGKpd4iiooEW9O5A9Q8DMTtBwETe_GtQT8M-E,2139
         | 
| 1298 1298 | 
             
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
         | 
| 1299 1299 | 
             
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
         | 
| 1300 | 
            -
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256= | 
| 1300 | 
            +
            vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=H1AVDnitwIkwya12oV68Qj2tyb786pfRHHz5qxtubD4,5935
         | 
| 1301 1301 | 
             
            vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=zdpNJoawB5PedsCCfgOGDDoWuif0jNtlV-K9sFL6cNQ,4968
         | 
| 1302 1302 | 
             
            vellum/workflows/nodes/displayable/bases/search_node.py,sha256=pqiui8G6l_9FLE1HH4rCdFC73Bl7_AIBAmQQMjqe190,3570
         | 
| 1303 1303 | 
             
            vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
         | 
| @@ -1315,6 +1315,8 @@ vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhy | |
| 1315 1315 | 
             
            vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=7Ep7Ff7FtFry3Jwxhg_npF_-jT2P6TGKp5MRNnCZ8Tc,3923
         | 
| 1316 1316 | 
             
            vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
         | 
| 1317 1317 | 
             
            vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=dTnP1yH1P0NqMw3noxt9XwaDCpX8ZOhuvVYNAn_DdCQ,2119
         | 
| 1318 | 
            +
            vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1319 | 
            +
            vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=189Oo66QDYJS8vCcyLe9ErJBGpWZVmPePFHta8wzdeM,2615
         | 
| 1318 1320 | 
             
            vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
         | 
| 1319 1321 | 
             
            vellum/workflows/nodes/displayable/merge_node/node.py,sha256=ZyPvcTgfPOneOm5Dc2kUOoPkwNJqwRPZSj232akXynA,324
         | 
| 1320 1322 | 
             
            vellum/workflows/nodes/displayable/note_node/__init__.py,sha256=KWA3P4fyYJ-fOTky8qNGlcOotQ-HeHJ9AjZt6mRQmCE,58
         | 
| @@ -1351,6 +1353,7 @@ vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPyc | |
| 1351 1353 | 
             
            vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
         | 
| 1352 1354 | 
             
            vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
         | 
| 1353 1355 | 
             
            vellum/workflows/runner/runner.py,sha256=RXnLEmSJFbp0u4vKF7rvD2fscuYfcRYkspIJINnvFAI,27607
         | 
| 1356 | 
            +
            vellum/workflows/sandbox.py,sha256=wNyOfd3gb6-O85EQcBIHNCnSYPH7Oufh2z4hQnR2HFU,2059
         | 
| 1354 1357 | 
             
            vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
         | 
| 1355 1358 | 
             
            vellum/workflows/state/base.py,sha256=jpSzF1OQd3-fqi6dMGlNsQl-7JnJxCdzWIigmX8Wz-I,14425
         | 
| 1356 1359 | 
             
            vellum/workflows/state/context.py,sha256=oXiEdNsWJi1coRB85IreTgUeR6_CrWWBXndtLff9S7M,1272
         | 
| @@ -1358,18 +1361,20 @@ vellum/workflows/state/encoder.py,sha256=kRrqwD0vFCiSRZR3rg8Sjkh8sDEerQQhlvmdSYQ | |
| 1358 1361 | 
             
            vellum/workflows/state/store.py,sha256=VYGBQgN1bpd1as5eGiouV_7scg8QsRs4_1aqZAGIsRQ,793
         | 
| 1359 1362 | 
             
            vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1360 1363 | 
             
            vellum/workflows/state/tests/test_state.py,sha256=BQjcdREIK1MPuGhivRUgpynVJLftjEpH9RG3cRKxQEY,3310
         | 
| 1364 | 
            +
            vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1365 | 
            +
            vellum/workflows/tests/test_sandbox.py,sha256=OMN15LuFUV58-XnAhtBiLcEjNt-Pj6bZgetDr8miCiw,1808
         | 
| 1361 1366 | 
             
            vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
         | 
| 1362 | 
            -
            vellum/workflows/types/core.py,sha256= | 
| 1367 | 
            +
            vellum/workflows/types/core.py,sha256=D2NcSBwGgWj_mtXZqe3KnEQcb5qd5HzqAwnxwmlCfCw,899
         | 
| 1363 1368 | 
             
            vellum/workflows/types/generics.py,sha256=ZkfoRhWs042i5IjA99v2wIhmh1u-Wieo3LzosgGWJVk,600
         | 
| 1364 1369 | 
             
            vellum/workflows/types/stack.py,sha256=RDSGLkcV612ge8UuAH9TZiEGXxJt0Av2-H5rfzrTVVI,1014
         | 
| 1365 1370 | 
             
            vellum/workflows/types/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1366 1371 | 
             
            vellum/workflows/types/tests/test_utils.py,sha256=t6eqTSZqw2oVkIw6lP393qVmuyzjZZ62Ls1iELwZg_o,2434
         | 
| 1367 1372 | 
             
            vellum/workflows/types/utils.py,sha256=Vk_itjV8YrfoT_Pm_x7QMvBdpCTr_XBTlszqZkQQJLw,5587
         | 
| 1368 1373 | 
             
            vellum/workflows/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1369 | 
            -
            vellum/workflows/utils/functions.py,sha256= | 
| 1374 | 
            +
            vellum/workflows/utils/functions.py,sha256=7A4BImhtY__qQpNrF5uPiwLfkj6PSUxYvF7ITigIkxY,4051
         | 
| 1370 1375 | 
             
            vellum/workflows/utils/names.py,sha256=QLUqfJ1tmSEeUwBKTTiv_Qk3QGbInC2RSmlXfGXc8Wo,380
         | 
| 1371 1376 | 
             
            vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 1372 | 
            -
            vellum/workflows/utils/tests/test_functions.py,sha256= | 
| 1377 | 
            +
            vellum/workflows/utils/tests/test_functions.py,sha256=ytdruS55aO2egsb5sAv8_9jf68L1cJoZu2uKV2iamrg,8083
         | 
| 1373 1378 | 
             
            vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
         | 
| 1374 1379 | 
             
            vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
         | 
| 1375 1380 | 
             
            vellum/workflows/utils/tests/test_vellum_variables.py,sha256=0ISy1xjY7_rci0Mt_naK0xrmurE1REZLMCgPOCLFKRM,776
         | 
| @@ -1379,8 +1384,8 @@ vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528 | |
| 1379 1384 | 
             
            vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
         | 
| 1380 1385 | 
             
            vellum/workflows/workflows/base.py,sha256=zpspOEdO5Ye_0ZvN-Wkzv9iQSiF1sD201ba8lhbnPbs,17086
         | 
| 1381 1386 | 
             
            vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
         | 
| 1382 | 
            -
            vellum_ai-0.12. | 
| 1383 | 
            -
            vellum_ai-0.12. | 
| 1384 | 
            -
            vellum_ai-0.12. | 
| 1385 | 
            -
            vellum_ai-0.12. | 
| 1386 | 
            -
            vellum_ai-0.12. | 
| 1387 | 
            +
            vellum_ai-0.12.5.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
         | 
| 1388 | 
            +
            vellum_ai-0.12.5.dist-info/METADATA,sha256=RkJBl93Re8tabpOh2GJyTu7c9lIotTa2y1wqfeEo0yc,5128
         | 
| 1389 | 
            +
            vellum_ai-0.12.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
         | 
| 1390 | 
            +
            vellum_ai-0.12.5.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
         | 
| 1391 | 
            +
            vellum_ai-0.12.5.dist-info/RECORD,,
         | 
    
        vellum_cli/__init__.py
    CHANGED
    
    | @@ -125,10 +125,16 @@ Should only be used for debugging purposes.""", | |
| 125 125 | 
             
                help="""Exclude the code definition of each Resource from the pull response. \
         | 
| 126 126 | 
             
            Should only be used for debugging purposes.""",
         | 
| 127 127 | 
             
            )
         | 
| 128 | 
            +
            @click.option(
         | 
| 129 | 
            +
                "--strict",
         | 
| 130 | 
            +
                is_flag=True,
         | 
| 131 | 
            +
                help="""Raises an error immediately if there are any issues with the pulling of the Resource.""",
         | 
| 132 | 
            +
            )
         | 
| 128 133 | 
             
            def pull(
         | 
| 129 134 | 
             
                ctx: click.Context,
         | 
| 130 135 | 
             
                include_json: Optional[bool],
         | 
| 131 136 | 
             
                exclude_code: Optional[bool],
         | 
| 137 | 
            +
                strict: Optional[bool],
         | 
| 132 138 | 
             
            ) -> None:
         | 
| 133 139 | 
             
                """Pull Resources from Vellum"""
         | 
| 134 140 |  | 
| @@ -136,6 +142,7 @@ def pull( | |
| 136 142 | 
             
                    pull_command(
         | 
| 137 143 | 
             
                        include_json=include_json,
         | 
| 138 144 | 
             
                        exclude_code=exclude_code,
         | 
| 145 | 
            +
                        strict=strict,
         | 
| 139 146 | 
             
                    )
         | 
| 140 147 |  | 
| 141 148 |  | 
| @@ -159,12 +166,18 @@ Should only be used for debugging purposes.""", | |
| 159 166 | 
             
                help="""Exclude the code definition of the Workflow from the pull response. \
         | 
| 160 167 | 
             
            Should only be used for debugging purposes.""",
         | 
| 161 168 | 
             
            )
         | 
| 169 | 
            +
            @click.option(
         | 
| 170 | 
            +
                "--strict",
         | 
| 171 | 
            +
                is_flag=True,
         | 
| 172 | 
            +
                help="""Raises an error immediately if there are any issues with the pulling of the Workflow.""",
         | 
| 173 | 
            +
            )
         | 
| 162 174 | 
             
            def workflows_pull(
         | 
| 163 175 | 
             
                module: Optional[str],
         | 
| 164 176 | 
             
                include_json: Optional[bool],
         | 
| 165 177 | 
             
                workflow_sandbox_id: Optional[str],
         | 
| 166 178 | 
             
                workflow_deployment: Optional[str],
         | 
| 167 179 | 
             
                exclude_code: Optional[bool],
         | 
| 180 | 
            +
                strict: Optional[bool],
         | 
| 168 181 | 
             
            ) -> None:
         | 
| 169 182 | 
             
                """
         | 
| 170 183 | 
             
                Pull Workflows from Vellum. If a module is provided, only the Workflow for that module will be pulled.
         | 
| @@ -177,6 +190,7 @@ def workflows_pull( | |
| 177 190 | 
             
                    workflow_sandbox_id=workflow_sandbox_id,
         | 
| 178 191 | 
             
                    workflow_deployment=workflow_deployment,
         | 
| 179 192 | 
             
                    exclude_code=exclude_code,
         | 
| 193 | 
            +
                    strict=strict,
         | 
| 180 194 | 
             
                )
         | 
| 181 195 |  | 
| 182 196 |  | 
    
        vellum_cli/pull.py
    CHANGED
    
    | @@ -13,6 +13,8 @@ from vellum.workflows.vellum_client import create_vellum_client | |
| 13 13 | 
             
            from vellum_cli.config import VellumCliConfig, WorkflowConfig, load_vellum_cli_config
         | 
| 14 14 | 
             
            from vellum_cli.logger import load_cli_logger
         | 
| 15 15 |  | 
| 16 | 
            +
            ERROR_LOG_FILE_NAME = "error.log"
         | 
| 17 | 
            +
             | 
| 16 18 |  | 
| 17 19 | 
             
            def _is_valid_uuid(val: Union[str, UUID, None]) -> bool:
         | 
| 18 20 | 
             
                try:
         | 
| @@ -81,6 +83,7 @@ def pull_command( | |
| 81 83 | 
             
                workflow_deployment: Optional[str] = None,
         | 
| 82 84 | 
             
                include_json: Optional[bool] = None,
         | 
| 83 85 | 
             
                exclude_code: Optional[bool] = None,
         | 
| 86 | 
            +
                strict: Optional[bool] = None,
         | 
| 84 87 | 
             
            ) -> None:
         | 
| 85 88 | 
             
                load_dotenv()
         | 
| 86 89 | 
             
                logger = load_cli_logger()
         | 
| @@ -109,6 +112,8 @@ def pull_command( | |
| 109 112 | 
             
                    query_parameters["include_json"] = include_json
         | 
| 110 113 | 
             
                if exclude_code:
         | 
| 111 114 | 
             
                    query_parameters["exclude_code"] = exclude_code
         | 
| 115 | 
            +
                if strict:
         | 
| 116 | 
            +
                    query_parameters["strict"] = strict
         | 
| 112 117 |  | 
| 113 118 | 
             
                response = client.workflows.pull(
         | 
| 114 119 | 
             
                    pk,
         | 
| @@ -119,6 +124,7 @@ def pull_command( | |
| 119 124 | 
             
                zip_buffer = io.BytesIO(zip_bytes)
         | 
| 120 125 |  | 
| 121 126 | 
             
                target_dir = os.path.join(os.getcwd(), *workflow_config.module.split("."))
         | 
| 127 | 
            +
                error_content = ""
         | 
| 122 128 | 
             
                with zipfile.ZipFile(zip_buffer) as zip_file:
         | 
| 123 129 | 
             
                    # Delete files in target_dir that aren't in the zip file
         | 
| 124 130 | 
             
                    if os.path.exists(target_dir):
         | 
| @@ -146,8 +152,13 @@ def pull_command( | |
| 146 152 | 
             
                        target_file = os.path.join(target_dir, file_name)
         | 
| 147 153 | 
             
                        os.makedirs(os.path.dirname(target_file), exist_ok=True)
         | 
| 148 154 | 
             
                        with zip_file.open(file_name) as source, open(target_file, "w") as target:
         | 
| 155 | 
            +
                            content = source.read().decode("utf-8")
         | 
| 156 | 
            +
                            if file_name == ERROR_LOG_FILE_NAME:
         | 
| 157 | 
            +
                                error_content = content
         | 
| 158 | 
            +
                                continue
         | 
| 159 | 
            +
             | 
| 149 160 | 
             
                            logger.info(f"Writing to {target_file}...")
         | 
| 150 | 
            -
                            target.write( | 
| 161 | 
            +
                            target.write(content)
         | 
| 151 162 |  | 
| 152 163 | 
             
                if include_json:
         | 
| 153 164 | 
             
                    logger.warning(
         | 
| @@ -158,4 +169,7 @@ Its schema should be considered unstable and subject to change at any time.""" | |
| 158 169 | 
             
                if save_lock_file:
         | 
| 159 170 | 
             
                    config.save()
         | 
| 160 171 |  | 
| 161 | 
            -
                 | 
| 172 | 
            +
                if error_content:
         | 
| 173 | 
            +
                    logger.error(error_content)
         | 
| 174 | 
            +
                else:
         | 
| 175 | 
            +
                    logger.info(f"Successfully pulled Workflow into {workflow_config.module}")
         | 
    
        vellum_cli/tests/test_pull.py
    CHANGED
    
    | @@ -441,3 +441,48 @@ def test_pull__sandbox_id_with_other_workflow_deployment_in_lock(vellum_client, | |
| 441 441 | 
             
                            "deployments": [],
         | 
| 442 442 | 
             
                        },
         | 
| 443 443 | 
             
                    ]
         | 
| 444 | 
            +
             | 
| 445 | 
            +
             | 
| 446 | 
            +
            def test_pull__handle_error_log(vellum_client, mock_module):
         | 
| 447 | 
            +
                # GIVEN a pyproject.toml with a workflow configured
         | 
| 448 | 
            +
                temp_dir = mock_module.temp_dir
         | 
| 449 | 
            +
                module = mock_module.module
         | 
| 450 | 
            +
                workflow_sandbox_id = mock_module.workflow_sandbox_id
         | 
| 451 | 
            +
             | 
| 452 | 
            +
                # AND the workflow pull API call returns a zip file with an error log
         | 
| 453 | 
            +
                vellum_client.workflows.pull.return_value = iter(
         | 
| 454 | 
            +
                    [_zip_file_map({"workflow.py": "print('hello')", "error.log": "test error"})]
         | 
| 455 | 
            +
                )
         | 
| 456 | 
            +
             | 
| 457 | 
            +
                # WHEN the user runs the pull command with the new workflow sandbox id
         | 
| 458 | 
            +
                runner = CliRunner()
         | 
| 459 | 
            +
                result = runner.invoke(cli_main, ["workflows", "pull", "--workflow-sandbox-id", workflow_sandbox_id])
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                # THEN the command returns successfully
         | 
| 462 | 
            +
                assert result.exit_code == 0
         | 
| 463 | 
            +
             | 
| 464 | 
            +
                # AND the error log file is not written to the module directory
         | 
| 465 | 
            +
                assert not os.path.exists(os.path.join(temp_dir, *module.split("."), "error.log"))
         | 
| 466 | 
            +
             | 
| 467 | 
            +
                # AND the error log is printed to the console
         | 
| 468 | 
            +
                assert result.output.endswith("\x1b[31;20mtest error\x1b[0m\n")
         | 
| 469 | 
            +
             | 
| 470 | 
            +
             | 
| 471 | 
            +
            def test_pull__strict__with_error(vellum_client, mock_module):
         | 
| 472 | 
            +
                # GIVEN a pyproject.toml with a workflow configured
         | 
| 473 | 
            +
                workflow_sandbox_id = mock_module.workflow_sandbox_id
         | 
| 474 | 
            +
             | 
| 475 | 
            +
                # AND the workflow pull API call returns a zip file
         | 
| 476 | 
            +
                vellum_client.workflows.pull.return_value = iter([_zip_file_map({"workflow.py": "print('hello')"})])
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                # WHEN the user runs the pull command with the new workflow sandbox id
         | 
| 479 | 
            +
                runner = CliRunner()
         | 
| 480 | 
            +
                result = runner.invoke(cli_main, ["workflows", "pull", "--strict", "--workflow-sandbox-id", workflow_sandbox_id])
         | 
| 481 | 
            +
             | 
| 482 | 
            +
                # THEN the command returns successfully
         | 
| 483 | 
            +
                assert result.exit_code == 0
         | 
| 484 | 
            +
             | 
| 485 | 
            +
                # AND the pull api is called with strict=True
         | 
| 486 | 
            +
                vellum_client.workflows.pull.assert_called_once()
         | 
| 487 | 
            +
                call_args = vellum_client.workflows.pull.call_args.kwargs
         | 
| 488 | 
            +
                assert call_args["request_options"]["additional_query_parameters"] == {"strict": True}
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            from uuid import UUID
         | 
| 2 | 
            -
            from typing import ClassVar, Dict, Optional
         | 
| 2 | 
            +
            from typing import ClassVar, Dict, Optional, Union
         | 
| 3 3 |  | 
| 4 4 | 
             
            from vellum.workflows.nodes.utils import get_unadorned_node
         | 
| 5 5 | 
             
            from vellum.workflows.ports import Port
         | 
| @@ -18,7 +18,7 @@ class BaseNodeVellumDisplay(BaseNodeDisplay[NodeType]): | |
| 18 18 | 
             
                target_handle_id: ClassVar[Optional[UUID]] = None
         | 
| 19 19 |  | 
| 20 20 | 
             
                # Used to explicitly set the node input ids by name for a node
         | 
| 21 | 
            -
                node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
         | 
| 21 | 
            +
                node_input_ids_by_name: ClassVar[Dict[str, Union[UUID, str]]] = {}
         | 
| 22 22 |  | 
| 23 23 | 
             
                def _get_node_display_uuid(self, attribute: str) -> UUID:
         | 
| 24 24 | 
             
                    explicit_value = self._get_explicit_node_display_attr(attribute, UUID)
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            import inspect
         | 
| 2 2 | 
             
            from uuid import UUID
         | 
| 3 | 
            -
            from typing import ClassVar,  | 
| 3 | 
            +
            from typing import ClassVar, Generic, Optional, TypeVar
         | 
| 4 4 |  | 
| 5 5 | 
             
            from vellum.workflows.nodes.displayable.code_execution_node import CodeExecutionNode
         | 
| 6 6 | 
             
            from vellum.workflows.nodes.displayable.code_execution_node.utils import read_file_from_path
         | 
| @@ -21,8 +21,6 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType] | |
| 21 21 | 
             
                output_id: ClassVar[Optional[UUID]] = None
         | 
| 22 22 | 
             
                log_output_id: ClassVar[Optional[UUID]] = None
         | 
| 23 23 |  | 
| 24 | 
            -
                node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
         | 
| 25 | 
            -
             | 
| 26 24 | 
             
                def serialize(
         | 
| 27 25 | 
             
                    self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
         | 
| 28 26 | 
             
                ) -> JsonObject:
         | 
| @@ -40,17 +40,17 @@ _ConditionalNodeType = TypeVar("_ConditionalNodeType", bound=ConditionalNode) | |
| 40 40 |  | 
| 41 41 | 
             
            @dataclass
         | 
| 42 42 | 
             
            class RuleIdMap:
         | 
| 43 | 
            -
                id:  | 
| 43 | 
            +
                id: str
         | 
| 44 44 | 
             
                lhs: Optional["RuleIdMap"]
         | 
| 45 45 | 
             
                rhs: Optional["RuleIdMap"]
         | 
| 46 | 
            -
                field_node_input_id: Optional[ | 
| 47 | 
            -
                value_node_input_id: Optional[ | 
| 46 | 
            +
                field_node_input_id: Optional[str]
         | 
| 47 | 
            +
                value_node_input_id: Optional[str]
         | 
| 48 48 |  | 
| 49 49 |  | 
| 50 50 | 
             
            @dataclass
         | 
| 51 51 | 
             
            class ConditionId:
         | 
| 52 | 
            -
                id:  | 
| 53 | 
            -
                rule_group_id: Optional[ | 
| 52 | 
            +
                id: str
         | 
| 53 | 
            +
                rule_group_id: Optional[str]
         | 
| 54 54 |  | 
| 55 55 |  | 
| 56 56 | 
             
            class BaseConditionalNodeDisplay(BaseNodeVellumDisplay[_ConditionalNodeType], Generic[_ConditionalNodeType]):
         | 
| @@ -112,7 +112,7 @@ but the defined conditions have length {len(condition_ids)}""" | |
| 112 112 | 
             
                                node_id, f"{current_id}.field", descriptor._expression, display_context, field_node_input_id
         | 
| 113 113 | 
             
                            )
         | 
| 114 114 | 
             
                            node_inputs.append(expression_node_input)
         | 
| 115 | 
            -
                            field_node_input_id =  | 
| 115 | 
            +
                            field_node_input_id = expression_node_input.id
         | 
| 116 116 | 
             
                            operator = self._convert_descriptor_to_operator(descriptor)
         | 
| 117 117 |  | 
| 118 118 | 
             
                        elif isinstance(descriptor, (BetweenExpression, NotBetweenExpression)):
         | 
| @@ -128,8 +128,8 @@ but the defined conditions have length {len(condition_ids)}""" | |
| 128 128 | 
             
                            )
         | 
| 129 129 | 
             
                            node_inputs.extend([field_node_input, value_node_input])
         | 
| 130 130 | 
             
                            operator = self._convert_descriptor_to_operator(descriptor)
         | 
| 131 | 
            -
                            field_node_input_id =  | 
| 132 | 
            -
                            value_node_input_id =  | 
| 131 | 
            +
                            field_node_input_id = field_node_input.id
         | 
| 132 | 
            +
                            value_node_input_id = value_node_input.id
         | 
| 133 133 |  | 
| 134 134 | 
             
                        else:
         | 
| 135 135 | 
             
                            lhs = descriptor._lhs  # type: ignore[attr-defined]
         | 
| @@ -145,19 +145,19 @@ but the defined conditions have length {len(condition_ids)}""" | |
| 145 145 | 
             
                                    node_id, f"{current_id}.value", rhs, display_context, value_node_input_id
         | 
| 146 146 | 
             
                                )
         | 
| 147 147 | 
             
                                node_inputs.append(rhs_node_input)
         | 
| 148 | 
            -
                                value_node_input_id =  | 
| 148 | 
            +
                                value_node_input_id = rhs_node_input.id
         | 
| 149 149 |  | 
| 150 150 | 
             
                            operator = self._convert_descriptor_to_operator(descriptor)
         | 
| 151 | 
            -
                            field_node_input_id =  | 
| 151 | 
            +
                            field_node_input_id = lhs_node_input.id
         | 
| 152 152 |  | 
| 153 153 | 
             
                        return {
         | 
| 154 | 
            -
                            "id":  | 
| 154 | 
            +
                            "id": current_id,
         | 
| 155 155 | 
             
                            "rules": None,
         | 
| 156 156 | 
             
                            "combinator": None,
         | 
| 157 157 | 
             
                            "negated": False,
         | 
| 158 | 
            -
                            "field_node_input_id":  | 
| 158 | 
            +
                            "field_node_input_id": field_node_input_id,
         | 
| 159 159 | 
             
                            "operator": operator,
         | 
| 160 | 
            -
                            "value_node_input_id":  | 
| 160 | 
            +
                            "value_node_input_id": value_node_input_id,
         | 
| 161 161 | 
             
                        }
         | 
| 162 162 |  | 
| 163 163 | 
             
                    conditions = []
         | 
| @@ -263,7 +263,7 @@ but the defined conditions have length {len(condition_ids)}""" | |
| 263 263 |  | 
| 264 264 | 
             
                def get_nested_rule_details_by_path(
         | 
| 265 265 | 
             
                    self, rule_ids: List[RuleIdMap], path: List[int]
         | 
| 266 | 
            -
                ) -> Union[Tuple[ | 
| 266 | 
            +
                ) -> Union[Tuple[str, Optional[str], Optional[str]], None]:
         | 
| 267 267 | 
             
                    current_rule = rule_ids[path[0]]
         | 
| 268 268 |  | 
| 269 269 | 
             
                    for step in path[1:]:
         | 
| @@ -284,11 +284,11 @@ but the defined conditions have length {len(condition_ids)}""" | |
| 284 284 |  | 
| 285 285 | 
             
                    return None
         | 
| 286 286 |  | 
| 287 | 
            -
                def _generate_hash_for_rule_ids(self, node_id, rule_id) -> Tuple[ | 
| 287 | 
            +
                def _generate_hash_for_rule_ids(self, node_id, rule_id) -> Tuple[str, str, str]:
         | 
| 288 288 | 
             
                    return (
         | 
| 289 | 
            -
                        uuid4_from_hash(f"{node_id}|{rule_id}|current"),
         | 
| 290 | 
            -
                        uuid4_from_hash(f"{node_id}|{rule_id}||field"),
         | 
| 291 | 
            -
                        uuid4_from_hash(f"{node_id}|{rule_id}||value"),
         | 
| 289 | 
            +
                        str(uuid4_from_hash(f"{node_id}|{rule_id}|current")),
         | 
| 290 | 
            +
                        str(uuid4_from_hash(f"{node_id}|{rule_id}||field")),
         | 
| 291 | 
            +
                        str(uuid4_from_hash(f"{node_id}|{rule_id}||value")),
         | 
| 292 292 | 
             
                    )
         | 
| 293 293 |  | 
| 294 294 | 
             
                def _get_source_handle_ids(self) -> Dict[int, UUID]:
         |