vellum-ai 0.14.53__py3-none-any.whl → 0.14.55__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 (36) hide show
  1. vellum/__init__.py +4 -0
  2. vellum/client/__init__.py +4 -4
  3. vellum/client/core/client_wrapper.py +1 -1
  4. vellum/client/reference.md +116 -114
  5. vellum/client/resources/deployments/client.py +121 -2
  6. vellum/client/resources/release_reviews/client.py +1 -118
  7. vellum/client/resources/workflow_deployments/client.py +4 -2
  8. vellum/client/types/__init__.py +4 -0
  9. vellum/client/types/components_schemas_prompt_version_build_config_sandbox.py +5 -0
  10. vellum/client/types/execute_api_request_body.py +3 -1
  11. vellum/client/types/prompt_deployment_release_prompt_version.py +6 -1
  12. vellum/client/types/prompt_version_build_config_sandbox.py +22 -0
  13. vellum/types/components_schemas_prompt_version_build_config_sandbox.py +3 -0
  14. vellum/types/prompt_version_build_config_sandbox.py +3 -0
  15. vellum/workflows/nodes/bases/base.py +32 -1
  16. vellum/workflows/nodes/displayable/code_execution_node/tests/{test_code_execution_node.py → test_node.py} +139 -16
  17. vellum/workflows/nodes/experimental/tool_calling_node/node.py +6 -6
  18. vellum/workflows/nodes/experimental/tool_calling_node/utils.py +4 -1
  19. vellum/workflows/nodes/tests/test_utils.py +8 -21
  20. vellum/workflows/nodes/utils.py +4 -1
  21. vellum/workflows/runner/runner.py +1 -1
  22. vellum/workflows/state/base.py +0 -18
  23. vellum/workflows/types/code_execution_node_wrappers.py +28 -0
  24. vellum/workflows/utils/functions.py +1 -0
  25. vellum/workflows/utils/tests/test_functions.py +14 -0
  26. {vellum_ai-0.14.53.dist-info → vellum_ai-0.14.55.dist-info}/METADATA +1 -1
  27. {vellum_ai-0.14.53.dist-info → vellum_ai-0.14.55.dist-info}/RECORD +36 -32
  28. vellum_cli/logger.py +11 -0
  29. vellum_cli/push.py +36 -32
  30. vellum_cli/tests/test_push.py +31 -0
  31. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +2 -7
  32. vellum_ee/workflows/display/workflows/base_workflow_display.py +20 -4
  33. vellum_ee/workflows/tests/test_display_meta.py +48 -0
  34. {vellum_ai-0.14.53.dist-info → vellum_ai-0.14.55.dist-info}/LICENSE +0 -0
  35. {vellum_ai-0.14.53.dist-info → vellum_ai-0.14.55.dist-info}/WHEEL +0 -0
  36. {vellum_ai-0.14.53.dist-info → vellum_ai-0.14.55.dist-info}/entry_points.txt +0 -0
@@ -16,7 +16,6 @@ from pydantic_core import core_schema
16
16
  from vellum.core.pydantic_utilities import UniversalBaseModel
17
17
  from vellum.utils.uuid import is_valid_uuid
18
18
  from vellum.workflows.constants import undefined
19
- from vellum.workflows.edges.edge import Edge
20
19
  from vellum.workflows.inputs.base import BaseInputs
21
20
  from vellum.workflows.references import ExternalInputReference, OutputReference, StateValueReference
22
21
  from vellum.workflows.types.definition import CodeResourceDefinition, serialize_type_encoder_with_id
@@ -174,23 +173,6 @@ class NodeExecutionCache:
174
173
  if all(dep in self._dependencies_invoked[execution_id] for dep in dependencies):
175
174
  self._node_executions_queued[node].remove(execution_id)
176
175
 
177
- def queue_node_execution(
178
- self, node: Type["BaseNode"], dependencies: Set["Type[BaseNode]"], invoked_by: Optional[Edge] = None
179
- ) -> UUID:
180
- execution_id = uuid4()
181
- if not invoked_by:
182
- return execution_id
183
-
184
- source_node = invoked_by.from_port.node_class
185
- for queued_node_execution_id in self._node_executions_queued[node]:
186
- if source_node not in self._dependencies_invoked[queued_node_execution_id]:
187
- self._invoke_dependency(queued_node_execution_id, node, source_node, dependencies)
188
- return queued_node_execution_id
189
-
190
- self._node_executions_queued[node].append(execution_id)
191
- self._invoke_dependency(execution_id, node, source_node, dependencies)
192
- return execution_id
193
-
194
176
  def is_node_execution_initiated(self, node: Type["BaseNode"], execution_id: UUID) -> bool:
195
177
  return execution_id in self._node_executions_initiated[node]
196
178
 
@@ -1,15 +1,41 @@
1
+ from vellum.client.types.function_call import FunctionCall
2
+
3
+
1
4
  class StringValueWrapper(str):
2
5
  def __getitem__(self, key):
3
6
  if key == "value":
4
7
  return self
8
+ if key == "type":
9
+ return "STRING"
5
10
  return super().__getitem__(key)
6
11
 
7
12
  def __getattr__(self, attr):
8
13
  if attr == "value":
9
14
  return self
15
+ if attr == "type":
16
+ return "STRING"
10
17
  raise AttributeError(f"'str' object has no attribute '{attr}'")
11
18
 
12
19
 
20
+ class FunctionCallWrapper(FunctionCall):
21
+ def __init__(self, obj):
22
+ super().__init__(arguments=obj.arguments, name=obj.name, id=obj.id)
23
+
24
+ def __getitem__(self, key):
25
+ if key == "value":
26
+ return self
27
+ if key == "type":
28
+ return "FUNCTION_CALL"
29
+ raise KeyError(key)
30
+
31
+ def __getattr__(self, attr):
32
+ if attr == "value":
33
+ return self
34
+ if attr == "type":
35
+ return "FUNCTION_CALL"
36
+ raise AttributeError(f"'FunctionCall' object has no attribute '{attr}'")
37
+
38
+
13
39
  class ListWrapper(list):
14
40
  def __getitem__(self, key):
15
41
  item = super().__getitem__(key)
@@ -73,5 +99,7 @@ def clean_for_dict_wrapper(obj):
73
99
  return ListWrapper(map(lambda item: clean_for_dict_wrapper(item), obj))
74
100
  elif isinstance(obj, str):
75
101
  return StringValueWrapper(obj)
102
+ elif isinstance(obj, FunctionCall):
103
+ return FunctionCallWrapper(obj)
76
104
 
77
105
  return obj
@@ -16,6 +16,7 @@ type_map = {
16
16
  dict: "object",
17
17
  None: "null",
18
18
  type(None): "null",
19
+ inspect._empty: "null",
19
20
  }
20
21
 
21
22
 
@@ -262,3 +262,17 @@ def test_compile_function_definition__default_pydantic():
262
262
  },
263
263
  },
264
264
  )
265
+
266
+
267
+ def test_compile_function_definition__lambda():
268
+ # GIVEN a lambda
269
+ lambda_function = lambda x: x + 1 # noqa: E731
270
+
271
+ # WHEN compiling the function
272
+ compiled_function = compile_function_definition(lambda_function)
273
+
274
+ # THEN it should return the compiled function definition
275
+ assert compiled_function == FunctionDefinition(
276
+ name="<lambda>",
277
+ parameters={"type": "object", "properties": {"x": {"type": "null"}}, "required": ["x"]},
278
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.53
3
+ Version: 0.14.55
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -5,10 +5,10 @@ vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3
5
5
  vellum_cli/config.py,sha256=v5BmZ-t_v4Jmqd7KVuQMZF2pRI-rbMspSkVYXIRoTmI,9448
6
6
  vellum_cli/image_push.py,sha256=skFXf25ixMOX1yfcyAtii-RivYYv-_hsv-Z-bVB6m5Q,7380
7
7
  vellum_cli/init.py,sha256=WpnMXPItPmh0f0bBGIer3p-e5gu8DUGwSArT_FuoMEw,5093
8
- vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
8
+ vellum_cli/logger.py,sha256=dcM_OmgqXLo93vDYswO5ylyUQQcTfnA5GTd5tbIt3wM,1446
9
9
  vellum_cli/ping.py,sha256=p_BCCRjgPhng6JktuECtkDQLbhopt6JpmrtGoLnLJT8,1161
10
10
  vellum_cli/pull.py,sha256=M50yXzA_35N35gk1Y8KjLbXrzdRG86--XFQvEukxGtA,13371
11
- vellum_cli/push.py,sha256=9oYmYhIWln3U0g7AstWEOA6ng5W_RthUA-Fie8FalFE,9846
11
+ vellum_cli/push.py,sha256=wxRlFu2mYW9SvwODYxwajri1mDQ2be0n-9i0d9QAc30,10194
12
12
  vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  vellum_cli/tests/conftest.py,sha256=AFYZryKA2qnUuCPBxBKmHLFoPiE0WhBFFej9tNwSHdc,1526
14
14
  vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
@@ -17,7 +17,7 @@ vellum_cli/tests/test_init.py,sha256=8UOc_ThfouR4ja5cCl_URuLk7ohr9JXfCnG4yka1OUQ
17
17
  vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
18
18
  vellum_cli/tests/test_ping.py,sha256=3ucVRThEmTadlV9LrJdCCrr1Ofj3rOjG6ue0BNR2UC0,2523
19
19
  vellum_cli/tests/test_pull.py,sha256=7HRAhIdkVW5mR2VckEaNDjp4rt-MlIxOWMMI2XNUPE8,49814
20
- vellum_cli/tests/test_push.py,sha256=K-TaOjU4mc-x0-ee1DNXT7yZBC0pEM-R9VY57kdMdmY,32849
20
+ vellum_cli/tests/test_push.py,sha256=I8XICg3pUb3yxAFLXziVHHf5CRm354LO-uUfwtca3bU,33897
21
21
  vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -89,7 +89,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_
89
89
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=KkYZc_bZuq1lmDcvUz3QxIqJLpQPCZioD1FHUNsMJY8,11211
90
90
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=aZaqRDrkO3ytcmdM2eKJqHSt60MF070NMj6M2vgzOKc,7711
91
91
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=r748dpS13HtwY7t_KQFExFssxRy0xI2d-wxmhiUHRe0,3850
92
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=rp9suYcwVZPpIQ3ChlWWvahMlaUd7u-31VmesR0Mn8w,7683
92
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=Lws9-tWRsbtiS_WqRrO03BLMMRe5_6reXX_XfkkHkJs,7478
93
93
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=EL5kfakuoEcwD85dGjhMta-J-PpCHRSDoc80SdbBrQk,2769
94
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=RmFUDx8dYdfsOE2CGLvdXqNNRtLLpVzXDN8dqZyMcZ8,5822
95
95
  vellum_ee/workflows/display/types.py,sha256=i4T7ElU5b5h-nA1i3scmEhO1BqmNDc4eJDHavATD88w,2821
@@ -100,7 +100,7 @@ vellum_ee/workflows/display/utils/registry.py,sha256=fWIm5Jj-10gNFjgn34iBu4RWv3V
100
100
  vellum_ee/workflows/display/utils/vellum.py,sha256=mtoXmSYwR7rvrq-d6CzCW_auaJXTct0Mi1F0xpRCiNQ,5627
101
101
  vellum_ee/workflows/display/vellum.py,sha256=o7mq_vk2Yapu9DDKRz5l76h8EmCAypWGQYe6pryrbB8,3576
102
102
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
103
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=DbjLChDtlNAs86sWL5-ojYYzwFsOjACAGfquxM3VYcw,32563
103
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=dVOe3TOV00uvllxsDziM3pFfL2HYTkWRq9iKDlj_xyU,33162
104
104
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=gxz76AeCqgAZ9D2lZeTiZzxY9eMgn3qOSfVgiqYcOh8,2028
105
105
  vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=rRwXLgsXqiaSn3jzP7lc--pytRW3Jmnj2-zNq5l-FQ4,29472
106
106
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=aaKdmWrgEe5YyV4zuDY_4E3y-l59rIHQnNGiPj2OWxQ,359
@@ -125,15 +125,15 @@ vellum_ee/workflows/tests/local_workflow/nodes/__init__.py,sha256=1F6jxUpSKfPXPj
125
125
  vellum_ee/workflows/tests/local_workflow/nodes/final_output.py,sha256=ZX7zBv87zirg0w9VKUW3QVDSdBLDqcqAMZjCL_oWbpU,297
126
126
  vellum_ee/workflows/tests/local_workflow/nodes/templating_node.py,sha256=NQwFN61QkHfI3Vssz-B0NKGfupK8PU0FDSAIAhYBLi0,325
127
127
  vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIPLsmrVS_aVEZEc-wULSv787Q,393
128
- vellum_ee/workflows/tests/test_display_meta.py,sha256=C25dErwghPNXio49pvSRxyOuc96srH6eYEwTAWdE2zY,2258
128
+ vellum_ee/workflows/tests/test_display_meta.py,sha256=DIzjNbwK1-4mlttPML6NskQ4rPVMXhj5zeOmBEyPqKI,3728
129
129
  vellum_ee/workflows/tests/test_server.py,sha256=SsOkS6sGO7uGC4mxvk4iv8AtcXs058P9hgFHzTWmpII,14519
130
130
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
131
- vellum/__init__.py,sha256=Hqfl49WZJzzqOKzVsTGi-j9twIqFOoRmACJsrEsjL44,41918
131
+ vellum/__init__.py,sha256=U4MVBzBx8I8-rOG_feluSz5U8_hD969e85F4cRgmVv4,42104
132
132
  vellum/client/README.md,sha256=qmaVIP42MnxAu8jV7u-CsgVFfs3-pHQODrXdZdFxtaw,4749
133
- vellum/client/__init__.py,sha256=PEnFl7LbXQcvAi3bVN2qyt5xm2FtVtq7xWKkcWM3Tg4,120166
133
+ vellum/client/__init__.py,sha256=AYopGv2ZRVn3zsU8_km6KOvEHDbXiTPCVuYVI7bWvdA,120166
134
134
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
135
135
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
136
- vellum/client/core/client_wrapper.py,sha256=UPFYm3-GgbhlDGHG7qlxCpHlYyCIlwqLut0VIw8bDk0,1869
136
+ vellum/client/core/client_wrapper.py,sha256=GMn5XtiuHqXf7vTEZMBtzd-oj9clWCurZASqSMpcAcI,1869
137
137
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
138
138
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
139
139
  vellum/client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -149,14 +149,14 @@ vellum/client/errors/bad_request_error.py,sha256=_EbO8mWqN9kFZPvIap8qa1lL_EWkRcs
149
149
  vellum/client/errors/forbidden_error.py,sha256=QO1kKlhClAPES6zsEK7g9pglWnxn3KWaOCAawWOg6Aw,263
150
150
  vellum/client/errors/internal_server_error.py,sha256=8USCagXyJJ1MOm9snpcXIUt6eNXvrd_aq7Gfcu1vlOI,268
151
151
  vellum/client/errors/not_found_error.py,sha256=tBVCeBC8n3C811WHRj_n-hs3h8MqwR5gp0vLiobk7W8,262
152
- vellum/client/reference.md,sha256=23-W_ajXfNLsPKA25ICSXpSxxnI0sRQgYCAk6D2w9LM,90890
152
+ vellum/client/reference.md,sha256=WCBi7X9xzilw6EivAydV27LRdFtxFuJHo4i7akhGr_k,90952
153
153
  vellum/client/resources/__init__.py,sha256=XgQao4rJxyYu71j64RFIsshz4op9GE8-i-C5GCv-KVE,1555
154
154
  vellum/client/resources/ad_hoc/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
155
155
  vellum/client/resources/ad_hoc/client.py,sha256=rtpiGR6j8CcXSnN6UW_jYwLLdfJ9dwkTm_nta9oRzno,25933
156
156
  vellum/client/resources/container_images/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
157
157
  vellum/client/resources/container_images/client.py,sha256=N9Xe-IyuZigbZum3MZFqgZrVKgfNOTGFxK83alHra04,15181
158
158
  vellum/client/resources/deployments/__init__.py,sha256=m64MNuPx3qVazOnTNwOY8oEeDrAkNwMJvUEe5xoMDvs,239
159
- vellum/client/resources/deployments/client.py,sha256=DTN27ZHHvyUs4aaXolDpbI_KkDvOMet2YWB07TSrMSE,39101
159
+ vellum/client/resources/deployments/client.py,sha256=6RhEkPNtb1UBDRYWOxnK7CpO1bTLqn6ZOKKGCw7WOZA,43498
160
160
  vellum/client/resources/deployments/types/__init__.py,sha256=29GVdoLOJsADSSSqZwb6CQPeEmPjkKrbsWfru1bemj8,321
161
161
  vellum/client/resources/deployments/types/deployments_list_request_status.py,sha256=CxlQD16KZXme7x31YYCe_3aAgEueutDTeJo5A4Au-aU,174
162
162
  vellum/client/resources/deployments/types/list_deployment_release_tags_request_source.py,sha256=hRGgWMYZL9uKCmD_2dU8-u9RCPUUGItpNn1tUY-NXKY,180
@@ -179,7 +179,7 @@ vellum/client/resources/organizations/client.py,sha256=Uye92moqjAcOCs4astmuFpT92
179
179
  vellum/client/resources/prompts/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
180
180
  vellum/client/resources/prompts/client.py,sha256=Z9Q9zvoCI8onkEbGSr5xVpNzzstV7xU9MmTwBnNoX98,14222
181
181
  vellum/client/resources/release_reviews/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
182
- vellum/client/resources/release_reviews/client.py,sha256=VLXcmw1o8cYYtdTJQpajJWE2ve1z40_IXIbQRQIhqpY,9395
182
+ vellum/client/resources/release_reviews/client.py,sha256=6u7qYK_fpRZzizYnFtUS06Q41RqEzSsre6RQwRimf8w,5088
183
183
  vellum/client/resources/sandboxes/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
184
184
  vellum/client/resources/sandboxes/client.py,sha256=_LInSBP67ON8ykUcdiUd5vxHYZkAPX4RkJbR5Ph6l_s,18026
185
185
  vellum/client/resources/test_suite_runs/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
@@ -187,7 +187,7 @@ vellum/client/resources/test_suite_runs/client.py,sha256=xHN3c9eIaSGWoeEdD2Jmi-e
187
187
  vellum/client/resources/test_suites/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
188
188
  vellum/client/resources/test_suites/client.py,sha256=aBReUOWcerq7vnjXEDbpDH1OMc6INMr0XUBaXE07umw,25989
189
189
  vellum/client/resources/workflow_deployments/__init__.py,sha256=_duH6m1CDWcfqX6DTBNjO3ar4Xrl-f5PozMaTcT4Kow,251
190
- vellum/client/resources/workflow_deployments/client.py,sha256=EtTpmjvTxA_uCTTxh8qnWXEfW1ppSickDyxBMk2cArA,35398
190
+ vellum/client/resources/workflow_deployments/client.py,sha256=bh8vYpy_ycI7gH964CPOEwbP8nFsl78kJw7oXE9s6NY,35480
191
191
  vellum/client/resources/workflow_deployments/types/__init__.py,sha256=W7DKJ1nduwhRckYLvH7wHLdaGH9MXHTZkxwG7FdTngY,340
192
192
  vellum/client/resources/workflow_deployments/types/list_workflow_release_tags_request_source.py,sha256=LPETHLX9Ygha_JRT9oWZAZR6clv-W1tTelXzktkTBX8,178
193
193
  vellum/client/resources/workflow_deployments/types/workflow_deployments_list_request_status.py,sha256=FXVkVmGM6DZ2RpTGnZXWJYiVlLQ-K5fDtX3WMaBPaWk,182
@@ -201,7 +201,7 @@ vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCat
201
201
  vellum/client/resources/workspace_secrets/client.py,sha256=zlBdbeTP6sqvtyl_DlrpfG-W5hSP7tJ1NYLSygi4CLU,8205
202
202
  vellum/client/resources/workspaces/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
203
203
  vellum/client/resources/workspaces/client.py,sha256=RthwzN1o-Jxwg5yyNNodavFyNUSxfLoTv26w3mRR5g8,3595
204
- vellum/client/types/__init__.py,sha256=wFQ3c_Pu8mGQFHIUy5dORq6Afmp5jdl9pnfUizIXjtI,63474
204
+ vellum/client/types/__init__.py,sha256=6YfOKPZ7rGwTipcHjrv71MVVtARtlAPClzVDsEcsjac,63767
205
205
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
206
206
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
207
207
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=oDG60TpwK1YNSKhRsBbiP2O3ZF9PKR-M9chGIfKw4R4,1004
@@ -263,6 +263,7 @@ vellum/client/types/compile_prompt_deployment_expand_meta_request.py,sha256=z0iM
263
263
  vellum/client/types/compile_prompt_meta.py,sha256=lQOFdrhMpzMOf_hasn4vb1AKnX2VuASr-1evaugJ4ro,848
264
264
  vellum/client/types/components_schemas_pdf_search_result_meta_source.py,sha256=WEB3B__R6zLakrJMMn_1z9FIylBcxencQ6JHVPs7HSg,206
265
265
  vellum/client/types/components_schemas_pdf_search_result_meta_source_request.py,sha256=FbgAsvMARYuSub2QQwFEkkbVeYwKkNmVi98nk7CxC-Q,235
266
+ vellum/client/types/components_schemas_prompt_version_build_config_sandbox.py,sha256=OquKc9g8mgyxmNPKXcEq9E6PCgtKSbNi-RQqp2go9VI,230
266
267
  vellum/client/types/condition_combinator.py,sha256=NQ6-F85juf21jsRuZRA6PjIFv7ITVWG5myuuZdLxeQI,156
267
268
  vellum/client/types/conditional_node_result.py,sha256=vx8xo9F1KoJqOnYPtSevfOcBxKYAk8J8JGWFr1c4UO8,784
268
269
  vellum/client/types/conditional_node_result_data.py,sha256=yk4E7KHSzmKlweI9ce9eN_iW08V70KGmG1Z0K5455T0,604
@@ -300,7 +301,7 @@ vellum/client/types/error_input.py,sha256=UiYDo7pxeCmW7REuk80ByzUp1hxEQwQCEA5isZ
300
301
  vellum/client/types/error_vellum_value.py,sha256=Y7yO8Y1eOlbRyOqbOh6MyPRNHYKH48gIhlZIRcw1UaA,726
301
302
  vellum/client/types/error_vellum_value_request.py,sha256=o0aSn34dRcpnAwAfwW_sgwP7CkODGd5448w2Olg-spg,755
302
303
  vellum/client/types/execute_api_request_bearer_token.py,sha256=agAhp9lzfzZcYGZdzg2jHAEHCaHlqzbgp6qeeNebcto,183
303
- vellum/client/types/execute_api_request_body.py,sha256=MArsO_-H41lU8Lz0dB78MVcFupjWtRV7UBEljY3Dnwk,169
304
+ vellum/client/types/execute_api_request_body.py,sha256=WySF2yj9rtx2vF4En0dfZkzPF2FNFtVRFW7P8Mw-hF8,217
304
305
  vellum/client/types/execute_api_request_headers_value.py,sha256=bHtGwOpknQDcQo6qtMKqJxaYpvbinDfwx2uaPzyuZ9s,184
305
306
  vellum/client/types/execute_api_response.py,sha256=TBBLTgllRBiIq4moOVylUqwmk7kpVqGlPV5y5iquq2g,843
306
307
  vellum/client/types/execute_api_response_json.py,sha256=80J1Du-JQGlVXIEECClC-IMYhTpcSTMtlYP_2Pq64kA,213
@@ -500,7 +501,7 @@ vellum/client/types/prompt_deployment_input_request.py,sha256=KrT4-Ew2VvTWXEkYQz
500
501
  vellum/client/types/prompt_deployment_parent_context.py,sha256=xlZKf3_FU0lB5YPb1q0s79DNbz0d51laAgIJTIO2J-s,1693
501
502
  vellum/client/types/prompt_deployment_release.py,sha256=H6sluuxANsoaX6gA9lw76lJkTECuxFofSeetKF00ze0,1346
502
503
  vellum/client/types/prompt_deployment_release_prompt_deployment.py,sha256=tj8g0qEJyAuijxRBUV6nO2IITEorqVY-C37oqiWg6Po,582
503
- vellum/client/types/prompt_deployment_release_prompt_version.py,sha256=NELGH68M8-SFtdci1Ygg0FpgjYeZgmBjfFke2m3GP8Y,577
504
+ vellum/client/types/prompt_deployment_release_prompt_version.py,sha256=MRiTZ13hMHbhFCJ859CkT231_zFcWo2b_0kDs2G4RWQ,849
504
505
  vellum/client/types/prompt_exec_config.py,sha256=2-hbAa_zeXl0V6oAZXZzE0ipcFoOU0WnPSePRXYRlfo,1143
505
506
  vellum/client/types/prompt_execution_meta.py,sha256=3hhMZgdAR5mKfnh2e_eVN3oKfT0E9w26khVPrpjn7jk,1141
506
507
  vellum/client/types/prompt_node_execution_meta.py,sha256=IyWH__nCp5uwS0N32b2ZEsA-Fv7AZDB4nnlRZayU2Gc,888
@@ -514,6 +515,7 @@ vellum/client/types/prompt_request_input.py,sha256=brEdYhYm74Ac8XjK9wF0rKOLgnqd_
514
515
  vellum/client/types/prompt_request_json_input.py,sha256=vLhwvCWL_yjVfDzT4921xK4Ql92OkvG-ruvOC_uppFI,739
515
516
  vellum/client/types/prompt_request_string_input.py,sha256=8GSFhtN3HeYssbDRY7B5SCh5Qrp67340D9c3oINpCmw,714
516
517
  vellum/client/types/prompt_settings.py,sha256=gITevU-SWiStXFKLfpwG5dQJ-bic5CxnM0OHsT9KR0s,635
518
+ vellum/client/types/prompt_version_build_config_sandbox.py,sha256=SXU62bAueVpoWo178bLIMYi8aNVpsBGTtOQxHcg6Dmo,678
517
519
  vellum/client/types/raw_prompt_execution_overrides_request.py,sha256=x4Chkm_NxXySOEyA6s6J_mhhiM91KCcQbu6pQETB8RI,927
518
520
  vellum/client/types/reducto_chunker_config.py,sha256=by_Dj0hZPkLQAf7l1KAudRB8X2XnlfHiRTsyiR-DTRY,654
519
521
  vellum/client/types/reducto_chunker_config_request.py,sha256=RnulU2a_PUtvRE2qhARQhsCkWI--K_MYkobzLNRGEz4,661
@@ -939,6 +941,7 @@ vellum/types/compile_prompt_deployment_expand_meta_request.py,sha256=gXZJpYawKJ2
939
941
  vellum/types/compile_prompt_meta.py,sha256=3WBjvEVnAqbIf-TajGtEWm0D-L_ZHm7MHo5_dD4N8jc,157
940
942
  vellum/types/components_schemas_pdf_search_result_meta_source.py,sha256=JuW2DXM7vd33IEpbrFF3NBVucydn_Lb96PqRbO5khsk,186
941
943
  vellum/types/components_schemas_pdf_search_result_meta_source_request.py,sha256=SQoJprykGG4h6xFphGMwyMKvtuoHAsv7o_6pBj9yPgI,194
944
+ vellum/types/components_schemas_prompt_version_build_config_sandbox.py,sha256=7uNb2ZzYojSaUy7i8kBFAaqhvgriAjEIkoZhGx7k87k,192
942
945
  vellum/types/condition_combinator.py,sha256=1wNfjIPngHhdUbhMpjNVZqUI8LEu0XIExUX4Rtln1Tg,158
943
946
  vellum/types/conditional_node_result.py,sha256=zcfDgqzQWXVcqEQi_ozC_7l2to8Y3uNZ5mFN_uIVDW8,161
944
947
  vellum/types/conditional_node_result_data.py,sha256=z7Mtn_iKkan2jrGc2Q7fx-anx3ijHSSqnZwAb1w4ouk,166
@@ -1190,6 +1193,7 @@ vellum/types/prompt_request_input.py,sha256=kjHHbam1HcDm9_1br9iqlZhrke3nRJYh4UNZ
1190
1193
  vellum/types/prompt_request_json_input.py,sha256=OlXiUPchxe184SWbmIvbmARpY9YWPi8yPqWaVC8xoBU,163
1191
1194
  vellum/types/prompt_request_string_input.py,sha256=1V-fTtuyhEw5H4EpqIkCqX7aHGJivUzzc_LMeszPjnc,165
1192
1195
  vellum/types/prompt_settings.py,sha256=6_AzrH73lBHSDxKxidI6zhDjAeWh_nZcaIGlrzJhypU,153
1196
+ vellum/types/prompt_version_build_config_sandbox.py,sha256=thz3Ty7FMZr1NWrrtPS1QN32kPpZo9hg9VIN6c6biuc,173
1193
1197
  vellum/types/raw_prompt_execution_overrides_request.py,sha256=NvCoHH8ehO0UortbDuDQvwOdxQzXw0_PMGsJc7DtvoA,176
1194
1198
  vellum/types/reducto_chunker_config.py,sha256=6hu2m_WTavxTfKs46BWZGiuOsLE4HYgoP-VdDGS6KTI,160
1195
1199
  vellum/types/reducto_chunker_config_request.py,sha256=KjIZYQu27OIA--0e6RjgUwWmY3iE8s9rlehdhfZRzhQ,168
@@ -1543,7 +1547,7 @@ vellum/workflows/inputs/tests/test_inputs.py,sha256=lioA8917mFLYq7Ml69UNkqUjcWbb
1543
1547
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1544
1548
  vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
1545
1549
  vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
1546
- vellum/workflows/nodes/bases/base.py,sha256=lQOUhVIgZMuYo6Kd5L7mcBooAVYERWjDL3csrAMP5Pg,15626
1550
+ vellum/workflows/nodes/bases/base.py,sha256=3yWWY6ZYpUIMzGyKeu_7xs8qC58uef0ly6EVUbWIAQ0,17170
1547
1551
  vellum/workflows/nodes/bases/base_adornment_node.py,sha256=Ao2opOW4kgNoYXFF9Pk7IMpVZdy6luwrjcqEwU5Q9V0,3404
1548
1552
  vellum/workflows/nodes/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1549
1553
  vellum/workflows/nodes/bases/tests/test_base_adornment_node.py,sha256=fXZI9KqpS4XMBrBnIEkK3foHaBVvyHwYcQWWDKay7ic,1148
@@ -1596,7 +1600,7 @@ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=U21jXW8XZo
1596
1600
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1597
1601
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1598
1602
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1599
- vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=N5SZeYyxEDrkbTagEvbnsTLgOeqrYEfIUOheM5qgjiU,31423
1603
+ vellum/workflows/nodes/displayable/code_execution_node/tests/test_node.py,sha256=mOVOD9UL2X0BpURn3vTI0ZPE7MGyVNo0XIwNKqxxbrM,34723
1600
1604
  vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=VRTKms59vrSR9mDk99cojParZVAP4lzjEeDwDNXU1tk,3837
1601
1605
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1602
1606
  vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=Qjfl33gZ3JEgxBA1EgzSUebboGvsARthIxxcQyvx5Gg,1152
@@ -1639,14 +1643,14 @@ vellum/workflows/nodes/experimental/__init__.py,sha256=_tpZGWAZLydcKxfrj1-plrZeT
1639
1643
  vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
1640
1644
  vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=cKI2Ls25L-JVt4z4a2ozQa-YBeVy21Z7BQ32Sj7iBPE,10460
1641
1645
  vellum/workflows/nodes/experimental/tool_calling_node/__init__.py,sha256=S7OzT3I4cyOU5Beoz87nPwCejCMP2FsHBFL8OcVmxJ4,118
1642
- vellum/workflows/nodes/experimental/tool_calling_node/node.py,sha256=NUC7VZj2D86IDQzjCq_a3-Xeqj_b3BE8T1kOMIfN7V8,4878
1646
+ vellum/workflows/nodes/experimental/tool_calling_node/node.py,sha256=Vxa0hs_tK1zdU-ux5j1XtwQkTph8crdd56wrMfAqWUY,4849
1643
1647
  vellum/workflows/nodes/experimental/tool_calling_node/tests/test_tool_calling_node.py,sha256=sxG26mOwt4N36RLoPJ-ngginPqC5qFzD_kGj9izdCFI,1833
1644
- vellum/workflows/nodes/experimental/tool_calling_node/utils.py,sha256=cdFR0yeb0mDl5CmH27cYQWIb4STg-ZfqtuI6rW66AHo,5097
1648
+ vellum/workflows/nodes/experimental/tool_calling_node/utils.py,sha256=mIQpAxLT2IF4SNQvUpRsX-t0jODxQ3Xvb_LEF7bRMF8,5214
1645
1649
  vellum/workflows/nodes/mocks.py,sha256=a1FjWEIocseMfjzM-i8DNozpUsaW0IONRpZmXBoWlyc,10455
1646
1650
  vellum/workflows/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1647
1651
  vellum/workflows/nodes/tests/test_mocks.py,sha256=mfPvrs75PKcsNsbJLQAN6PDFoVqs9TmQxpdyFKDdO60,7837
1648
- vellum/workflows/nodes/tests/test_utils.py,sha256=qNB6ApIsnFtE_9HDaEah9KD-zX8e10FhDixewS1uRcc,5199
1649
- vellum/workflows/nodes/utils.py,sha256=KpV9CdSyu6fVLWPA5-Ee8jXJNGP3Q0V5mKdv7lPHypw,9387
1652
+ vellum/workflows/nodes/tests/test_utils.py,sha256=OPVZo9yi8qt0rVqayKhfgh4Hk-dVdIzqfbS89fDhRiE,4913
1653
+ vellum/workflows/nodes/utils.py,sha256=K2gf05eM-EKkKHf2SPpvEly8cBL4RftWSMvIZJIMlso,9455
1650
1654
  vellum/workflows/outputs/__init__.py,sha256=AyZ4pRh_ACQIGvkf0byJO46EDnSix1ZCAXfvh-ms1QE,94
1651
1655
  vellum/workflows/outputs/base.py,sha256=1OGHqBJVk7i8cW8uewFWOhIjuMlRRpzCDrGE30ZwDjw,8763
1652
1656
  vellum/workflows/ports/__init__.py,sha256=bZuMt-R7z5bKwpu4uPW7LlJeePOQWmCcDSXe5frUY5g,101
@@ -1669,10 +1673,10 @@ vellum/workflows/references/workflow_input.py,sha256=W3rOK1EPd2gYHb04WJwmNm1CUSd
1669
1673
  vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
1670
1674
  vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
1671
1675
  vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
1672
- vellum/workflows/runner/runner.py,sha256=BOFqcxvK2oktJmcEIdHBaSanZtWcaqJq06s9aLQFaZw,33000
1676
+ vellum/workflows/runner/runner.py,sha256=0Ufxyl3nwWVI--w_iVTAVXUOKJXuZiEn6-BrrUAGVBs,32983
1673
1677
  vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2235
1674
1678
  vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
1675
- vellum/workflows/state/base.py,sha256=ZXDmVafs6sExcbx1azrZjEGQsmuY68mSRWfI7t2PT4c,22330
1679
+ vellum/workflows/state/base.py,sha256=-0b-nNBEXvGVau4c1BUwmCsXfo5wZD5VjLb8-eqi0Y8,21502
1676
1680
  vellum/workflows/state/context.py,sha256=KOAI1wEGn8dGmhmAemJaf4SZbitP3jpIBcwKfznQaRE,3076
1677
1681
  vellum/workflows/state/encoder.py,sha256=z7Mk6jQC-92wCj6XTK7VEnJ8px_lU8qy0BINqwGDN4I,2063
1678
1682
  vellum/workflows/state/store.py,sha256=uVe-oN73KwGV6M6YLhwZMMUQhzTQomsVfVnb8V91gVo,1147
@@ -1682,7 +1686,7 @@ vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
1682
1686
  vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
1683
1687
  vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
1684
1688
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1685
- vellum/workflows/types/code_execution_node_wrappers.py,sha256=zPnfvhxpDS3vvM6hX1X6sPfvo1bu1kcPQfhNoJD9vtM,2362
1689
+ vellum/workflows/types/code_execution_node_wrappers.py,sha256=sPo7fLSyf92n6OFsrNLAsaNs0_I3AH-fXkEw3KrbWmc,3162
1686
1690
  vellum/workflows/types/core.py,sha256=kMQremh_I8egXpiKmtMQbB6e3OczAWiRnnTq5V6xlD0,928
1687
1691
  vellum/workflows/types/definition.py,sha256=z81CL_u0FJol-9yUIqoXNTYAARtU8x__c6s-f4rb5c8,2335
1688
1692
  vellum/workflows/types/generics.py,sha256=tKXz0LwWJGKw1YGudyl9_yFDrRgU6yYV1yJV1Zv-LTw,1430
@@ -1691,10 +1695,10 @@ vellum/workflows/types/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
1691
1695
  vellum/workflows/types/tests/test_utils.py,sha256=UnZog59tR577mVwqZRqqWn2fScoOU1H6up0EzS8zYhw,2536
1692
1696
  vellum/workflows/types/utils.py,sha256=axxHbPLsnjhEOnMZrc5YarFd-P2bnsacBDQGNCvY8OY,6367
1693
1697
  vellum/workflows/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1694
- vellum/workflows/utils/functions.py,sha256=7A4BImhtY__qQpNrF5uPiwLfkj6PSUxYvF7ITigIkxY,4051
1698
+ vellum/workflows/utils/functions.py,sha256=uWeD3MQfPsiPDCbecl8y8KU-B1ALnSSdYkv-YiyuWAs,4079
1695
1699
  vellum/workflows/utils/names.py,sha256=QLUqfJ1tmSEeUwBKTTiv_Qk3QGbInC2RSmlXfGXc8Wo,380
1696
1700
  vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1697
- vellum/workflows/utils/tests/test_functions.py,sha256=ytdruS55aO2egsb5sAv8_9jf68L1cJoZu2uKV2iamrg,8083
1701
+ vellum/workflows/utils/tests/test_functions.py,sha256=Qt33YfSqQ28JFAR46twuyQwZMJ2fuzKzt74eE01QAd8,8552
1698
1702
  vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
1699
1703
  vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
1700
1704
  vellum/workflows/utils/tests/test_vellum_variables.py,sha256=maI5e7Od7UlpMwlrOrcdlXqnFhonkXGnWq8G2-YQLi8,1155
@@ -1707,8 +1711,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1707
1711
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1708
1712
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=8P5YIsNMO78_CR1NNK6wkEdkMB4b3Q_Ni1qxh78OnHo,20481
1709
1713
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1710
- vellum_ai-0.14.53.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1711
- vellum_ai-0.14.53.dist-info/METADATA,sha256=6sVp5uF3Vqk4PsjvJtN8hYVk_I_SXciihRRIrcHSnRE,5484
1712
- vellum_ai-0.14.53.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1713
- vellum_ai-0.14.53.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1714
- vellum_ai-0.14.53.dist-info/RECORD,,
1714
+ vellum_ai-0.14.55.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1715
+ vellum_ai-0.14.55.dist-info/METADATA,sha256=ApsBqWl_U1jFrSqdnv2Rksz_onftgT0T2yu6KxfOpPc,5484
1716
+ vellum_ai-0.14.55.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1717
+ vellum_ai-0.14.55.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1718
+ vellum_ai-0.14.55.dist-info/RECORD,,
vellum_cli/logger.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import os
3
+ from typing import Optional
3
4
 
4
5
 
5
6
  class CLIFormatter(logging.Formatter):
@@ -34,3 +35,13 @@ def load_cli_logger() -> logging.Logger:
34
35
  logger.addHandler(handler)
35
36
 
36
37
  return logger
38
+
39
+
40
+ def handle_cli_error(logger: logging.Logger, title: str, message: str, suggestion: Optional[str] = None):
41
+ logger.error("\n\033[1;31m✖ {}\033[0m".format(title)) # Bold red X and title
42
+ logger.error("\n\033[1m{}\033[0m".format(message)) # Bold message
43
+ if suggestion:
44
+ logger.error("\n\033[1;34mNext steps:\033[0m") # Bold blue
45
+ logger.error(suggestion)
46
+
47
+ exit(1)
vellum_cli/push.py CHANGED
@@ -15,7 +15,7 @@ from vellum.types import WorkflowPushDeploymentConfigRequest
15
15
  from vellum.workflows.vellum_client import create_vellum_client
16
16
  from vellum.workflows.workflows.base import BaseWorkflow
17
17
  from vellum_cli.config import DEFAULT_WORKSPACE_CONFIG, WorkflowConfig, WorkflowDeploymentConfig, load_vellum_cli_config
18
- from vellum_cli.logger import load_cli_logger
18
+ from vellum_cli.logger import handle_cli_error, load_cli_logger
19
19
  from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
20
20
 
21
21
 
@@ -178,41 +178,39 @@ def push_command(
178
178
  strict=strict,
179
179
  )
180
180
  except ApiError as e:
181
- if e.status_code != 400 or not isinstance(e.body, dict) or "diffs" not in e.body:
182
- raise e
183
-
184
- diffs: dict = e.body["diffs"]
185
- generated_only = diffs.get("generated_only", [])
186
- generated_only_str = (
187
- "\n".join(
188
- ["Files that were generated but not found in the original project:"]
189
- + [f"- {file}" for file in generated_only]
181
+ if e.status_code == 400 and isinstance(e.body, dict) and "diffs" in e.body:
182
+ diffs: dict = e.body["diffs"]
183
+ generated_only = diffs.get("generated_only", [])
184
+ generated_only_str = (
185
+ "\n".join(
186
+ ["Files that were generated but not found in the original project:"]
187
+ + [f"- {file}" for file in generated_only]
188
+ )
189
+ if generated_only
190
+ else ""
190
191
  )
191
- if generated_only
192
- else ""
193
- )
194
192
 
195
- original_only = diffs.get("original_only", [])
196
- original_only_str = (
197
- "\n".join(
198
- ["Files that were found in the original project but not generated:"]
199
- + [f"- {file}" for file in original_only]
193
+ original_only = diffs.get("original_only", [])
194
+ original_only_str = (
195
+ "\n".join(
196
+ ["Files that were found in the original project but not generated:"]
197
+ + [f"- {file}" for file in original_only]
198
+ )
199
+ if original_only
200
+ else ""
200
201
  )
201
- if original_only
202
- else ""
203
- )
204
202
 
205
- modified = diffs.get("modified", {})
206
- modified_str = (
207
- "\n\n".join(
208
- ["Files that were different between the original project and the generated artifact:"]
209
- + ["\n".join(line.strip() for line in lines) for lines in modified.values()]
203
+ modified = diffs.get("modified", {})
204
+ modified_str = (
205
+ "\n\n".join(
206
+ ["Files that were different between the original project and the generated artifact:"]
207
+ + ["\n".join(line.strip() for line in lines) for lines in modified.values()]
208
+ )
209
+ if modified
210
+ else ""
210
211
  )
211
- if modified
212
- else ""
213
- )
214
212
 
215
- reported_diffs = f"""\
213
+ reported_diffs = f"""\
216
214
  {e.body.get("detail")}
217
215
 
218
216
  {generated_only_str}
@@ -221,8 +219,14 @@ def push_command(
221
219
 
222
220
  {modified_str}
223
221
  """
224
- logger.error(reported_diffs)
225
- return
222
+ logger.error(reported_diffs)
223
+ return
224
+
225
+ if e.status_code == 400 and isinstance(e.body, dict) and "detail" in e.body:
226
+ handle_cli_error(logger, title="API request to /workflows/push failed.", message=e.body["detail"])
227
+ return
228
+
229
+ raise e
226
230
 
227
231
  if dry_run:
228
232
  error_messages = [str(e) for e in workflow_display.errors]
@@ -525,6 +525,37 @@ Files that were different between the original project and the generated artifac
525
525
  )
526
526
 
527
527
 
528
+ def test_push__push_fails_due_to_400_error(mock_module, vellum_client):
529
+ # GIVEN a single workflow configured
530
+ temp_dir = mock_module.temp_dir
531
+ module = mock_module.module
532
+
533
+ # AND a workflow exists in the module successfully
534
+ _ensure_workflow_py(temp_dir, module)
535
+
536
+ # AND the push API call returns a 4xx response
537
+ vellum_client.workflows.push.side_effect = ApiError(
538
+ status_code=400,
539
+ body={
540
+ "detail": "Pushing the Workflow failed because you did something wrong",
541
+ },
542
+ )
543
+
544
+ # WHEN calling `vellum push` on strict mode
545
+ runner = CliRunner()
546
+ result = runner.invoke(cli_main, ["push", module])
547
+
548
+ # THEN it should fail with a user error code
549
+ assert result.exit_code == 1
550
+
551
+ # AND the error message should be in the error message
552
+ assert "API request to /workflows/push failed." in result.output
553
+ assert "Pushing the Workflow failed because you did something wrong" in result.output
554
+
555
+ # AND the stack trace should not be
556
+ assert "Traceback" not in result.output
557
+
558
+
528
559
  @pytest.mark.parametrize(
529
560
  "file_data",
530
561
  [
@@ -161,17 +161,12 @@ def test_serialize_workflow():
161
161
  },
162
162
  ],
163
163
  "outputs": [
164
- {
165
- "id": "e62bc785-a914-4066-b79e-8c89a5d0ec6c",
166
- "name": "text",
167
- "type": "STRING",
168
- "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": ""}},
169
- },
164
+ {"id": "e62bc785-a914-4066-b79e-8c89a5d0ec6c", "name": "text", "type": "STRING", "value": None},
170
165
  {
171
166
  "id": "4674f1d9-e3af-411f-8a55-40a3a3ab5394",
172
167
  "name": "chat_history",
173
168
  "type": "CHAT_HISTORY",
174
- "value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": []}},
169
+ "value": None,
175
170
  },
176
171
  ],
177
172
  }
@@ -583,14 +583,30 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
583
583
  # DEPRECATED: This will be removed in the 0.15.0 release
584
584
  workflow_class: Optional[Type[BaseWorkflow]] = None,
585
585
  ) -> Union[WorkflowEventDisplayContext, None]:
586
- workflow_display_module = f"{module_path}.display.workflow"
586
+ full_workflow_display_module_path = f"{module_path}.display.workflow"
587
587
  try:
588
- display_class = importlib.import_module(workflow_display_module)
588
+ display_module = importlib.import_module(full_workflow_display_module_path)
589
589
  except ModuleNotFoundError:
590
+ logger.exception("Failed to import workflow display module: %s", full_workflow_display_module_path)
590
591
  return None
591
592
 
592
- WorkflowDisplayClass = display_class.WorkflowDisplay
593
- if not isinstance(WorkflowDisplayClass, type) or not issubclass(WorkflowDisplayClass, BaseWorkflowDisplay):
593
+ WorkflowDisplayClass: Optional[Type[BaseWorkflowDisplay]] = None
594
+ for name, definition in display_module.__dict__.items():
595
+ if name.startswith("_"):
596
+ continue
597
+
598
+ if (
599
+ not isinstance(definition, type)
600
+ or not issubclass(definition, BaseWorkflowDisplay)
601
+ or definition == BaseWorkflowDisplay
602
+ ):
603
+ continue
604
+
605
+ WorkflowDisplayClass = definition
606
+ break
607
+
608
+ if not WorkflowDisplayClass:
609
+ logger.exception("No workflow display class found in module: %s", full_workflow_display_module_path)
594
610
  return None
595
611
 
596
612
  return WorkflowDisplayClass().get_event_display_context()
@@ -54,3 +54,51 @@ def test_base_class_dynamic_import(files):
54
54
  }
55
55
  assert display_meta
56
56
  assert display_meta.model_dump(mode="json") == expected_result
57
+
58
+
59
+ def test_gather_event_display_context__custom_workflow_name():
60
+ # GIVEN a workflow module with a custom workflow name
61
+ workflow_output_id = uuid4()
62
+ files = {
63
+ "__init__.py": "",
64
+ "workflow.py": """\
65
+ from vellum.workflows import BaseWorkflow
66
+
67
+ class MyCustomWorkflow(BaseWorkflow):
68
+ class Outputs(BaseWorkflow.Outputs):
69
+ answer = "foo"
70
+ """,
71
+ "display/__init__.py": """\
72
+ # flake8: noqa: F401, F403
73
+
74
+ from .workflow import *
75
+ """,
76
+ "display/workflow.py": f"""\
77
+ from uuid import UUID
78
+ from vellum_ee.workflows.display.workflows import BaseWorkflowDisplay
79
+ from vellum_ee.workflows.display.base import WorkflowOutputDisplay
80
+ from ..workflow import MyCustomWorkflow
81
+
82
+ class MyCustomWorkflowDisplay(BaseWorkflowDisplay[MyCustomWorkflow]):
83
+ output_displays = {{
84
+ MyCustomWorkflow.Outputs.answer: WorkflowOutputDisplay(
85
+ id=UUID("{workflow_output_id}"), name="answer"
86
+ )
87
+ }}
88
+ """,
89
+ }
90
+
91
+ namespace = str(uuid4())
92
+
93
+ # AND the virtual file loader is registered
94
+ sys.meta_path.append(VirtualFileFinder(files, namespace))
95
+
96
+ # WHEN the workflow display context is gathered
97
+ Workflow = BaseWorkflow.load_from_module(namespace)
98
+ display_meta = BaseWorkflowDisplay.gather_event_display_context(namespace, Workflow)
99
+
100
+ # THEN the workflow display context is successfully gathered
101
+ assert display_meta
102
+ assert display_meta.workflow_outputs == {
103
+ "answer": workflow_output_id,
104
+ }