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]:
|