vellum-ai 0.12.3__py3-none-any.whl → 0.12.5__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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]:
|