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.
Files changed (33) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/client/resources/workflows/client.py +32 -0
  3. vellum/client/types/chat_message_prompt_block.py +1 -1
  4. vellum/client/types/function_definition.py +26 -7
  5. vellum/client/types/jinja_prompt_block.py +1 -1
  6. vellum/client/types/plain_text_prompt_block.py +1 -1
  7. vellum/client/types/rich_text_prompt_block.py +1 -1
  8. vellum/client/types/variable_prompt_block.py +1 -1
  9. vellum/plugins/vellum_mypy.py +20 -23
  10. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +21 -8
  11. vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py +0 -0
  12. vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py +64 -0
  13. vellum/workflows/sandbox.py +51 -0
  14. vellum/workflows/tests/__init__.py +0 -0
  15. vellum/workflows/tests/test_sandbox.py +62 -0
  16. vellum/workflows/types/core.py +2 -52
  17. vellum/workflows/utils/functions.py +41 -4
  18. vellum/workflows/utils/tests/test_functions.py +93 -0
  19. {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/METADATA +1 -1
  20. {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/RECORD +33 -28
  21. vellum_cli/__init__.py +14 -0
  22. vellum_cli/pull.py +16 -2
  23. vellum_cli/tests/test_pull.py +45 -0
  24. vellum_ee/workflows/display/nodes/base_node_vellum_display.py +2 -2
  25. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +1 -3
  26. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +18 -18
  27. vellum_ee/workflows/display/nodes/vellum/search_node.py +19 -15
  28. vellum_ee/workflows/display/nodes/vellum/templating_node.py +1 -1
  29. vellum_ee/workflows/display/nodes/vellum/utils.py +4 -4
  30. vellum_ee/workflows/display/utils/vellum.py +1 -2
  31. {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/LICENSE +0 -0
  32. {vellum_ai-0.12.3.dist-info → vellum_ai-0.12.5.dist-info}/WHEEL +0 -0
  33. {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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.12.3
3
+ Version: 0.12.5
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -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=XG6aC1NSPfBjNFzqiy9Lbk4DnELCKO8lpIZ3jeJR0r0,6990
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=EkQirsTe0KCpJ8oHTE3S9_M2XHSrb2wrXNq4hTkMZng,5770
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=pGqpBkahC360UITDE8BlcJ7LPd9DyRPn4NrCNdkQmAQ,15907
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=7F4zQnZQBOTp9turUUS41RaO40Z14m851WOLJHgmHPU,2234
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=_sdLmmOa1ZqZQZXzw0GMoUpgnV1sdOfc_19LJCBS_Xc,4288
32
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=TP7ItMeEXbVbkGr5Qwjv8vl9V0Fi9QBE04d3kdJH4JE,13666
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=I4_ENFWEhHUDYFUWF67-EyToCwmJynAXcbNpqw6Cpio,8681
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=UNYxoE-89agE8ugK0aWg_uN61jPqlC2VSxWHk568sN4,3324
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=3QsKS5Kht2Nod4A18T0bb4filK9AkyK5oImVlViK3l8,4643
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=IlkKrfAAi4BV_HFnsdMFxNJC2-TrPM9ubVHv8ikmbSA,5110
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=V6KKyJKYfRUGFN1-YsTg1jmCrvWiVWYEgcetm7xdB2U,1868
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=5wqDiO1xYnYxNmbaEE1OTnUn3YXKpruYqF3taCjLRDI,10263
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=K0D42GPIgJYfYYigXU6ggCUbwHcB1LwMNDjXDybh3MQ,1351
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=D6uZTIndSeTT4O6FQjU7jVB6Tn1VWOqlAjCa92qX5cE,1127
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=Q2aIQh8a-i09kL1ISM-kzTq7TZoyaafDDlmCkUmLnVw,939
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=GlzovdRbT6mhunMvIpF94_0apjh_0SZtkdlx5HFrE0k,930
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=60Bg_1wuXAd5eBiO9xiN8NjMvYE67ZLTtAb1A3N-7oI,1036
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=TnFQpfulqvbO-Ogs0u_IqQ6TPMMRC_Grz5uzd9-gMTs,946
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=3gzkf7d-B477mINh541fef_F33tixBWamhEb9e-9vLI,25152
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=mtnqcfpY5UYKCUm8HVL42juf5Q8MoJRg94V6CyEgZpQ,5398
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=oFTlYFAgb51la3GrHFreMPQqQc_YHrHfEvkQD8FE_bQ,1846
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=udPTz1yFuSbHIQ6UeOUXro_hj4c8XdAb00_bH-Bf9N0,2529
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=68OdrS1Gf3incmRd4g3a7-nylqQbJdQjl7AyfVUJg5I,5223
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.3.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1383
- vellum_ai-0.12.3.dist-info/METADATA,sha256=2LiLS000opig2vlfeENocV4Y7ekElNjRgEXVR9ddQIY,5128
1384
- vellum_ai-0.12.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1385
- vellum_ai-0.12.3.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1386
- vellum_ai-0.12.3.dist-info/RECORD,,
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(source.read().decode("utf-8"))
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
- logger.info(f"Successfully pulled Workflow into {workflow_config.module}")
172
+ if error_content:
173
+ logger.error(error_content)
174
+ else:
175
+ logger.info(f"Successfully pulled Workflow into {workflow_config.module}")
@@ -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, Dict, Generic, Optional, TypeVar
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: UUID
43
+ id: str
44
44
  lhs: Optional["RuleIdMap"]
45
45
  rhs: Optional["RuleIdMap"]
46
- field_node_input_id: Optional[UUID]
47
- value_node_input_id: Optional[UUID]
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: UUID
53
- rule_group_id: Optional[UUID]
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 = UUID(expression_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 = UUID(field_node_input.id)
132
- value_node_input_id = UUID(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 = UUID(rhs_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 = UUID(lhs_node_input.id)
151
+ field_node_input_id = lhs_node_input.id
152
152
 
153
153
  return {
154
- "id": str(current_id),
154
+ "id": current_id,
155
155
  "rules": None,
156
156
  "combinator": None,
157
157
  "negated": False,
158
- "field_node_input_id": str(field_node_input_id),
158
+ "field_node_input_id": field_node_input_id,
159
159
  "operator": operator,
160
- "value_node_input_id": str(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[UUID, Optional[UUID], Optional[UUID]], None]:
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[UUID, UUID, UUID]:
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]: