vellum-ai 0.14.69__py3-none-any.whl → 0.14.71__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 (48) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/workflows/environment/__init__.py +2 -1
  3. vellum/workflows/environment/environment.py +10 -3
  4. vellum/workflows/nodes/displayable/code_execution_node/node.py +8 -1
  5. vellum/workflows/nodes/displayable/code_execution_node/tests/test_node.py +53 -0
  6. vellum/workflows/nodes/experimental/tool_calling_node/tests/test_node.py +77 -1
  7. vellum/workflows/nodes/experimental/tool_calling_node/utils.py +2 -2
  8. vellum/workflows/references/environment_variable.py +11 -9
  9. {vellum_ai-0.14.69.dist-info → vellum_ai-0.14.71.dist-info}/METADATA +1 -1
  10. {vellum_ai-0.14.69.dist-info → vellum_ai-0.14.71.dist-info}/RECORD +48 -42
  11. vellum_cli/__init__.py +5 -2
  12. vellum_cli/image_push.py +24 -1
  13. vellum_cli/tests/test_image_push.py +103 -12
  14. vellum_ee/workflows/display/nodes/base_node_display.py +1 -1
  15. vellum_ee/workflows/display/nodes/utils.py +2 -2
  16. vellum_ee/workflows/display/nodes/vellum/api_node.py +2 -2
  17. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +1 -1
  18. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +1 -1
  19. vellum_ee/workflows/display/nodes/vellum/error_node.py +1 -1
  20. vellum_ee/workflows/display/nodes/vellum/final_output_node.py +2 -2
  21. vellum_ee/workflows/display/nodes/vellum/guardrail_node.py +1 -1
  22. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +8 -4
  23. vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py +9 -1
  24. vellum_ee/workflows/display/nodes/vellum/map_node.py +1 -1
  25. vellum_ee/workflows/display/nodes/vellum/merge_node.py +1 -1
  26. vellum_ee/workflows/display/nodes/vellum/note_node.py +1 -0
  27. vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py +1 -1
  28. vellum_ee/workflows/display/nodes/vellum/retry_node.py +1 -1
  29. vellum_ee/workflows/display/nodes/vellum/search_node.py +70 -7
  30. vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py +1 -1
  31. vellum_ee/workflows/display/nodes/vellum/templating_node.py +1 -1
  32. vellum_ee/workflows/display/nodes/vellum/tests/test_inline_subworkflow_node.py +88 -0
  33. vellum_ee/workflows/display/nodes/vellum/tests/test_search_node.py +104 -0
  34. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +16 -0
  35. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +82 -0
  36. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +9 -1
  37. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +4 -4
  38. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py +59 -297
  39. vellum_ee/workflows/display/tests/workflow_serialization/test_workflow_input_parameterization_error.py +37 -0
  40. vellum_ee/workflows/display/utils/auto_layout.py +130 -0
  41. vellum_ee/workflows/display/utils/expressions.py +17 -1
  42. vellum_ee/workflows/display/utils/tests/__init__.py +0 -0
  43. vellum_ee/workflows/display/utils/tests/test_auto_layout.py +56 -0
  44. vellum_ee/workflows/display/workflows/base_workflow_display.py +15 -10
  45. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +41 -0
  46. {vellum_ai-0.14.69.dist-info → vellum_ai-0.14.71.dist-info}/LICENSE +0 -0
  47. {vellum_ai-0.14.69.dist-info → vellum_ai-0.14.71.dist-info}/WHEEL +0 -0
  48. {vellum_ai-0.14.69.dist-info → vellum_ai-0.14.71.dist-info}/entry_points.txt +0 -0
@@ -18,7 +18,7 @@ class BaseClientWrapper:
18
18
  headers: typing.Dict[str, str] = {
19
19
  "X-Fern-Language": "Python",
20
20
  "X-Fern-SDK-Name": "vellum-ai",
21
- "X-Fern-SDK-Version": "0.14.69",
21
+ "X-Fern-SDK-Version": "0.14.71",
22
22
  }
23
23
  headers["X-API-KEY"] = self.api_key
24
24
  return headers
@@ -1,5 +1,6 @@
1
- from .environment import Environment
1
+ from .environment import Environment, EnvironmentVariables
2
2
 
3
3
  __all__ = [
4
+ "EnvironmentVariables",
4
5
  "Environment",
5
6
  ]
@@ -3,7 +3,14 @@ from typing import Optional
3
3
  from vellum.workflows.references import EnvironmentVariableReference
4
4
 
5
5
 
6
- class Environment:
6
+ class EnvironmentVariables:
7
7
  @staticmethod
8
- def get(name: str, default: Optional[str] = None) -> EnvironmentVariableReference:
9
- return EnvironmentVariableReference(name=name, default=default)
8
+ def get(name: str, default: Optional[str] = None):
9
+ env_ref = EnvironmentVariableReference(name=name)
10
+ if default is not None:
11
+ return env_ref.coalesce(default)
12
+ return env_ref
13
+
14
+
15
+ # Deprecated: Use EnvironmentVariables instead. Will be removed in v0.15.0
16
+ Environment = EnvironmentVariables
@@ -98,7 +98,7 @@ class CodeExecutionNode(BaseNode[StateType], Generic[StateType, _OutputType], me
98
98
  def run(self) -> Outputs:
99
99
  output_type = self.__class__.get_output_type()
100
100
  code, filepath = self._resolve_code()
101
- if not self.packages and self.runtime == "PYTHON_3_11_6":
101
+ if not self.packages and self.runtime == "PYTHON_3_11_6" and not self._has_secrets_in_code_inputs():
102
102
  logs, result = run_code_inline(code, self.code_inputs, output_type, filepath)
103
103
  return self.Outputs(result=result, log=logs)
104
104
 
@@ -133,6 +133,13 @@ class CodeExecutionNode(BaseNode[StateType], Generic[StateType, _OutputType], me
133
133
 
134
134
  return self.Outputs(result=code_execution_result.output.value, log=code_execution_result.log)
135
135
 
136
+ def _has_secrets_in_code_inputs(self) -> bool:
137
+ """Check if any code_inputs contain VellumSecret instances that require API execution."""
138
+ for input_value in self.code_inputs.values():
139
+ if isinstance(input_value, VellumSecret):
140
+ return True
141
+ return False
142
+
136
143
  def _compile_code_inputs(self) -> List[CodeExecutorInput]:
137
144
  # TODO: We may want to consolidate with prompt deployment input compilation
138
145
  # https://app.shortcut.com/vellum/story/4117
@@ -1233,3 +1233,56 @@ def main(numbers: List[str]) -> str:
1233
1233
  ],
1234
1234
  request_options=None,
1235
1235
  )
1236
+
1237
+
1238
+ def test_run_node__vellum_secret_forces_api_execution(vellum_client):
1239
+ """Test that CodeExecutionNode with VellumSecretReference forces API execution instead of inline execution."""
1240
+
1241
+ # GIVEN a node that subclasses CodeExecutionNode with VellumSecretReference but no packages
1242
+ # This should normally run inline, but the presence of secrets should force API execution
1243
+ class State(BaseState):
1244
+ pass
1245
+
1246
+ class ExampleCodeExecutionNode(CodeExecutionNode[State, str]):
1247
+ code = """
1248
+ def main(secret: str) -> str:
1249
+ return f"Secret value: {secret}"
1250
+ """
1251
+ runtime = "PYTHON_3_11_6"
1252
+ # Note: No packages specified, which would normally trigger inline execution
1253
+
1254
+ code_inputs = {
1255
+ "secret": VellumSecretReference("MY_SECRET"),
1256
+ }
1257
+
1258
+ # AND we know what the Code Execution Node will respond with
1259
+ mock_code_execution = CodeExecutorResponse(
1260
+ log="",
1261
+ output=StringVellumValue(value="Secret value: my_secret_value"),
1262
+ )
1263
+ vellum_client.execute_code.return_value = mock_code_execution
1264
+
1265
+ # WHEN we run the node
1266
+ node = ExampleCodeExecutionNode(state=State())
1267
+ outputs = node.run()
1268
+
1269
+ # THEN the node should have produced the outputs we expect
1270
+ assert outputs == {"result": "Secret value: my_secret_value", "log": ""}
1271
+
1272
+ # AND we should have invoked the Code via API (not inline) due to the secret
1273
+ vellum_client.execute_code.assert_called_once_with(
1274
+ input_values=[
1275
+ CodeExecutorSecretInput(
1276
+ name="secret",
1277
+ value="MY_SECRET",
1278
+ )
1279
+ ],
1280
+ code="""
1281
+ def main(secret: str) -> str:
1282
+ return f"Secret value: {secret}"
1283
+ """,
1284
+ runtime="PYTHON_3_11_6",
1285
+ output_type="STRING",
1286
+ packages=[],
1287
+ request_options=None,
1288
+ )
@@ -1,7 +1,17 @@
1
+ import json
2
+ from typing import Any, List
3
+
4
+ from vellum import ChatMessage
1
5
  from vellum.client.types.function_call import FunctionCall
2
6
  from vellum.client.types.function_call_vellum_value import FunctionCallVellumValue
3
- from vellum.workflows.nodes.experimental.tool_calling_node.utils import create_tool_router_node
7
+ from vellum.client.types.string_chat_message_content import StringChatMessageContent
8
+ from vellum.workflows import BaseWorkflow
9
+ from vellum.workflows.inputs.base import BaseInputs
10
+ from vellum.workflows.nodes.bases import BaseNode
11
+ from vellum.workflows.nodes.experimental.tool_calling_node.utils import create_function_node, create_tool_router_node
12
+ from vellum.workflows.outputs.base import BaseOutputs
4
13
  from vellum.workflows.state.base import BaseState, StateMeta
14
+ from vellum.workflows.state.context import WorkflowContext
5
15
 
6
16
 
7
17
  def first_function() -> str:
@@ -51,3 +61,69 @@ def test_port_condition_match_function_name():
51
61
  # AND the default port should be false
52
62
  default_port = getattr(router_node.Ports, "default")
53
63
  assert default_port.resolve_condition(state) is False
64
+
65
+
66
+ def test_tool_calling_node_inline_workflow_context():
67
+ """
68
+ Test that the tool calling node correctly passes the context to the inline workflow.
69
+ This specifically tests that inline workflows receive the correct context.
70
+ """
71
+
72
+ # GIVEN a test workflow that captures its context
73
+ class MyNode(BaseNode):
74
+ class Outputs(BaseOutputs):
75
+ generated_files: Any
76
+
77
+ def run(self) -> Outputs:
78
+ return self.Outputs(generated_files=self._context.generated_files)
79
+
80
+ class MyWorkflow(BaseWorkflow[BaseInputs, BaseState]):
81
+ graph = MyNode
82
+
83
+ class Outputs(BaseOutputs):
84
+ generated_files = MyNode.Outputs.generated_files
85
+
86
+ # GIVEN a tool router node
87
+ tool_router_node = create_tool_router_node(
88
+ ml_model="test-model",
89
+ blocks=[],
90
+ functions=[MyWorkflow],
91
+ prompt_inputs=None,
92
+ )
93
+
94
+ # WHEN we create a function node for the workflow
95
+ function_node_class = create_function_node(
96
+ function=MyWorkflow,
97
+ tool_router_node=tool_router_node,
98
+ )
99
+
100
+ # AND we create an instance with a context containing generated_files
101
+ function_node = function_node_class()
102
+
103
+ # Create a parent context with test data
104
+ parent_context = WorkflowContext(
105
+ generated_files={"script.py": "print('hello world')"},
106
+ )
107
+ function_node._context = parent_context
108
+
109
+ # Create a state with chat_history for the function node
110
+ class TestState(BaseState):
111
+ chat_history: List[ChatMessage] = []
112
+
113
+ function_node.state = TestState(meta=StateMeta(node_outputs={tool_router_node.Outputs.text: '{"arguments": {}}'}))
114
+
115
+ # WHEN the function node runs
116
+ outputs = function_node.run()
117
+
118
+ # THEN the workflow should have run successfully
119
+ assert outputs is not None
120
+
121
+ # AND the chat history should contain a function response
122
+ assert len(function_node.state.chat_history) == 1
123
+ function_response = function_node.state.chat_history[0]
124
+ assert function_response.role == "FUNCTION"
125
+
126
+ # AND the response should contain the generated files
127
+ assert isinstance(function_response.content, StringChatMessageContent)
128
+ data = json.loads(function_response.content.value)
129
+ assert data["generated_files"] == {"script.py": "print('hello world')"}
@@ -22,6 +22,7 @@ from vellum.workflows.outputs.base import BaseOutput
22
22
  from vellum.workflows.ports.port import Port
23
23
  from vellum.workflows.references.lazy import LazyReference
24
24
  from vellum.workflows.state.base import BaseState
25
+ from vellum.workflows.state.context import WorkflowContext
25
26
  from vellum.workflows.state.encoder import DefaultStateEncoder
26
27
  from vellum.workflows.types.core import EntityInputsInterface, MergeBehavior
27
28
  from vellum.workflows.types.generics import is_workflow_class
@@ -152,8 +153,7 @@ def create_function_node(
152
153
 
153
154
  # Call the function based on its type
154
155
  inputs_instance = function.get_inputs_class()(**arguments)
155
-
156
- workflow = function()
156
+ workflow = function(context=WorkflowContext.create_from(self._context))
157
157
  terminal_event = workflow.run(
158
158
  inputs=inputs_instance,
159
159
  )
@@ -1,6 +1,7 @@
1
1
  import os
2
- from typing import TYPE_CHECKING, Optional
2
+ from typing import TYPE_CHECKING, Any, Optional
3
3
 
4
+ from vellum.workflows.constants import undefined
4
5
  from vellum.workflows.descriptors.base import BaseDescriptor
5
6
 
6
7
  if TYPE_CHECKING:
@@ -8,17 +9,18 @@ if TYPE_CHECKING:
8
9
 
9
10
 
10
11
  class EnvironmentVariableReference(BaseDescriptor[str]):
11
- def __init__(self, *, name: str, default: Optional[str]):
12
+ def __init__(
13
+ self,
14
+ *,
15
+ name: str,
16
+ # DEPRECATED - to be removed in 0.15.0 release
17
+ default: Optional[str] = None,
18
+ ):
12
19
  super().__init__(name=name, types=(str,))
13
- self._default = default
14
20
 
15
- def resolve(self, state: "BaseState") -> str:
21
+ def resolve(self, state: "BaseState") -> Any:
16
22
  env_value = os.environ.get(self.name)
17
23
  if env_value is not None:
18
24
  return env_value
19
25
 
20
- if self._default is not None:
21
- return self._default
22
-
23
- # Fetch Vellum Environment Variable named `self.name` once that project is done
24
- raise ValueError(f"No environment variable named '{self.name}' found")
26
+ return undefined
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.69
3
+ Version: 0.14.71
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -1,9 +1,9 @@
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=2_6oGoVcLFUh4L63Kz4SBL4Y6XevJ70oYbg7BJ3cb5Q,12569
3
+ vellum_cli/__init__.py,sha256=oi-vvNVepu23IBBjhA5uUIDVYBPqQ3EzxWZAPn2S64c,12700
4
4
  vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
5
5
  vellum_cli/config.py,sha256=v5BmZ-t_v4Jmqd7KVuQMZF2pRI-rbMspSkVYXIRoTmI,9448
6
- vellum_cli/image_push.py,sha256=mjK3Fj3_MIhIGmurYVz_OC-hCoAef5LqDb0OppKJIJc,9909
6
+ vellum_cli/image_push.py,sha256=Xw_IlItZ27OM5XrWcaqRxXCx4rroV3IaUByl8Ela6U8,10730
7
7
  vellum_cli/init.py,sha256=WpnMXPItPmh0f0bBGIer3p-e5gu8DUGwSArT_FuoMEw,5093
8
8
  vellum_cli/logger.py,sha256=dcM_OmgqXLo93vDYswO5ylyUQQcTfnA5GTd5tbIt3wM,1446
9
9
  vellum_cli/ping.py,sha256=p_BCCRjgPhng6JktuECtkDQLbhopt6JpmrtGoLnLJT8,1161
@@ -12,7 +12,7 @@ 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
15
- vellum_cli/tests/test_image_push.py,sha256=QM-JlR_aJappvwbCLteQZZf76sd7SE1sRj3armvFK-I,5706
15
+ vellum_cli/tests/test_image_push.py,sha256=QGbhCB2DhkepoBUdfhv_ovks-HQ164jmjKFuYvPmJt8,9141
16
16
  vellum_cli/tests/test_image_push_error_handling.py,sha256=_Wjfkn1orI2K4Ahzqz4u8T13or7NOX01K4BtcTuTIOM,7107
17
17
  vellum_cli/tests/test_init.py,sha256=8UOc_ThfouR4ja5cCl_URuLk7ohr9JXfCnG4yka1OUQ,18754
18
18
  vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
@@ -27,37 +27,39 @@ vellum_ee/workflows/display/base.py,sha256=EqlQFD56kpqMY02ZBJBQajzJKh33Dwi60Wo77
27
27
  vellum_ee/workflows/display/editor/__init__.py,sha256=MSAgY91xCEg2neH5d8jXx5wRdR962ftZVa6vO9BGq9k,167
28
28
  vellum_ee/workflows/display/editor/types.py,sha256=x-tOOCJ6CF4HmiKDfCmcc3bOVfc1EBlP5o6u5WEfLoY,567
29
29
  vellum_ee/workflows/display/nodes/__init__.py,sha256=jI1aPBQf8DkmrYoZ4O-wR1duqZByOf5mDFmo_wFJPE4,307
30
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=2VyAk9SjBpt_b2fp81KlFxS5ddk2JhcldEI1S4crPj0,16921
30
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=8Iio5O2Lu7XA5EfCWhXNZVzEOiaXO4eMdssczGBKXxU,16922
31
31
  vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=jI_kUi9LnNLDpY63QtlC4TfN8P571VN4LpzH0I1ZtLk,1149
32
32
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=Z4Mf7xLCNiblSbpKI0BrV5modQr-ZcFzhfir_OSyTTs,2997
34
34
  vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
35
- vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
35
+ vellum_ee/workflows/display/nodes/utils.py,sha256=gxiixuiJi6jrYTV2jmsPsyQfeuwKmrULRb-Lg9c0Aqw,975
36
36
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
37
- vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=ZiOJsSovftbH1eVFdU0-UE4DUliIHPQZkwrFcooN-Vk,8856
37
+ vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=5Uq8x08F64yrBcqbfsVeuoGnTa9eoOPumYzZZrDPmr0,8847
38
38
  vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=rJbHZBg9A_v2bjk-R6MfWzShcrS2gcKIOyYGoqwTx8s,6353
39
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=L308T4U6eaL0WUJ_hQ0qrH-i8IuMBCm5XjRO2_b-Mro,4507
40
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=MrvyiYD0qgQf3-ZYFcurQtin3FagAHGRoT7zYGiIao0,11150
41
- vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=m2DmOXm9-jiiIl6zwkXHNfsYp5PTpBHEdt5xaIsabWo,2363
42
- vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=jUDI2FwVaw0Or4zJL58J_g0S--i59Hzik60s_Es_M-8,3098
43
- vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=5_5D5PMzBOeUdVtRlANbfEsu7Gv3r37dLvpfjGAqYac,2330
44
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=2qp3J1nZ4R4szTynakwT9gL51SZEjIiLLdTvA_wIQu0,10954
45
- vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=fQV5o83BPTwGX6o-ThN4r7BcIhySyqwpW1JGYWpvSJI,5625
46
- vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=2teCYQSX8g-b8aaC_MY4XSC4GRMTJigPFWNTQEkC_gk,3907
47
- vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=yBWeN4T_lOsDVnNOKWRiT7JYKu0IR5Fx2z99iq6QKSA,3273
48
- vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=3E0UqmgVYdtbj4nyq8gKju8EpMsRHMCQ0KLrJhug3XU,1084
49
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=1NxFddxWCFtMe_je1cutP7qnoASoG94LJqKhRkoQwvw,3535
50
- vellum_ee/workflows/display/nodes/vellum/retry_node.py,sha256=X3xnlAU5JisL0jRvaG_V9RvTF7ZlGufTO8tXLLVhGIg,3280
51
- vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=3n1qa-zWIk0p_H94u0hjfDtGkanldC6EXVhg0xgLmE4,9544
52
- vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=MWLZBXHsmj5vKgqOgI2HHcHAJzLS0sqybn6idhwug8Y,2669
53
- vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=J84_EUfwWwpeOfUFBdRorrD1Bod0jDBFdQ6xnRyp9Ho,3338
39
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=6lavdBw297GwAQqyxjnPUtx5pHv6k5V9Vkuq7s2D0TM,4508
40
+ vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=9GtbvSJUNF626tCYxnMxETVZm3Fq84vOZ3Nkdkl3n-M,11146
41
+ vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=YhMsi2TG1zSR8E7IpxzzSncOyVLcvqTuGa3mr4RqHd8,2364
42
+ vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=zo-nalsuayMqeb2GwR2OB9SFK3y2U5aG-rtwrsjdasQ,3089
43
+ vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=IniO5KvO0Rw9zghFg3RFvbXBTv6Zi1iuQhaA1DLazqU,2331
44
+ vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=1ydd1-SXCuJdPDquMrvV5JXIIhf7eBdvY2dXqDz_r5o,11035
45
+ vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=f7MeoxgKrdyb1dSJsvdDtZPlp1J2Pa4njPvN3qHVktA,6028
46
+ vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=uaZ2wcZR1J9C9iI0QWAsgNK9IlcuCz1808oxXmiYsLY,3908
47
+ vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=RTP_raQWL8ZKoRKLpxLfpyXzw61TZeTCkTuM1uRLIkI,3274
48
+ vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=6xf8MJ684KecKPJrGlCJuJYLPtYImXmqN85Y_6KPjW4,1141
49
+ vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=cT5qT7Nd2v6rSsIErpSAWaxta7txGOSFOZz2AQYQmWE,3536
50
+ vellum_ee/workflows/display/nodes/vellum/retry_node.py,sha256=Gos8F1yKN69GmegDO2q3NlGTamibd4rpuTasSU0mK8c,3281
51
+ vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=bF07csUFSQlAeOayPPws5pz3tBTp1PdwgHb8WItgXmY,12319
52
+ vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=Ub6XDdVtVarqoqQrIXpJxNbp3xvz37vwpuf93DhLvX8,2670
53
+ vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=TdIJWh2l8p4tw7ejRexGOFQKnviirUqie3WYwsrVQ4g,3339
54
54
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=ZasoqG8FmqnZDj2FfL5BGPq9fafOTJqV_4xjOKLi1gc,5434
56
56
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=540FoWMpJ3EN_DPjHsr9ODJWCRVcUa5hZBn-5T2GiHU,1665
57
+ vellum_ee/workflows/display/nodes/vellum/tests/test_inline_subworkflow_node.py,sha256=SKOYan-dxY4gsO0R4JyQUyWrABHBN8XImKw9Eeo4wGo,3535
57
58
  vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py,sha256=uiMB0cOxKZzos7YKnj4ef4DFa2bOvZJWIv-hfbUV6Go,1218
58
59
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_deployment_node.py,sha256=G-qJyTNJkpqJiEZ3kCJl86CXJINLeFyf2lM0bQHCCOs,3822
59
60
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py,sha256=TtzUj3Zk3ZhwtXE_WyctCC-CmcLB1RxntyF7u-a3i6I,10077
60
61
  vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py,sha256=h93ysolmbo2viisyhRnXKHPxiDK0I_dSAbYoHFYIoO4,1953
62
+ vellum_ee/workflows/display/nodes/vellum/tests/test_search_node.py,sha256=KvByxgbUkVyfPIVxTUBUk6a92JiJMi8eReZWxzfPExU,3864
61
63
  vellum_ee/workflows/display/nodes/vellum/tests/test_subworkflow_deployment_node.py,sha256=BUzHJgjdWnPeZxjFjHfDBKnbFjYjnbXPjc-1hne1B2Y,3965
62
64
  vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py,sha256=LSk2gx9TpGXbAqKe8dggQW8yJZqj-Cf0EGJFeGGlEcw,3321
63
65
  vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py,sha256=ZsLIGnJ9QKrXjYeDW8LEN8M9FnWRQ9TohHFyB6144HY,7970
@@ -71,7 +73,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DE
71
73
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
74
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=XOQDDRiG46etxTC7-_RUEutoNumXc02fo7oho4GYM0c,1900
73
75
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=tsjGM-jOurPSkDIbrDFdjNLmkI1fPNPAw3J9-l9knCw,12848
74
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=MdjWgD8yZhv0MnpI-Ak5EqMzh2joVz3z5WFqr42PgZc,21508
76
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=xrekxgRlZrNIF-bkvfIzGGN3vKgTKNttNz3tfLanzd4,22062
75
77
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=s6_mnk0pkztU59wYpSfOFpMhAJaRjmyfxM6WJGtnD4Y,6456
76
78
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=PkSgghJDz0fpDB72HHPjLjo8LkZk-HpUkCQzRLX-iVw,40611
77
79
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=dsJr8I9AdPwMOGszirfNDzZP2Ychd94aAKuPXAzknMk,4632
@@ -82,30 +84,34 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_stat
82
84
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256=MNnQ51ZWOQGVfBdpIqvr4OZF0tWdfrh2bsHP3xkTwQw,5841
83
85
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=kLOnUNn-r1w1JXNQcVKe-Vp-fKhSfuDBuDqrjGkFZ3U,5544
84
86
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py,sha256=v07cILUzS5iFYDrSOAXK93yz50-FtxLaMYMwoaPOv20,7374
85
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py,sha256=Jcuzu_zjS4ATrPg-pKvrU9WeUFAWMmPQVIcYltG6NfA,14930
86
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=u2nquKoO3o2xIkU_uFPOb_s5YoLmULiq09vb6Ee0Cqw,21415
87
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py,sha256=glOPy9y_GOLGMxc7glfo7IGq5iuCDbz9-TE_6Krha2U,18426
88
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=1ND_6lfPNUQjSc72k_sxydeeOU5f_kHkRXO65boYFok,21631
87
89
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=3gZuNM8sT6ovVaeoAvd2JoyKwuxokvowlhH8kwDUoZ8,16559
88
90
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=IIJt7YZBzkhNtbmaMwCX4ENs58QtSIIoBHlMR6OwGU8,8342
89
91
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=QXiRjwtiTPeMUl40Pvh_geeU99C3mv1aVS85oeIUwY4,21052
90
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=K0mECBUyTNX4I468goeaRf93N7Qfizoc1ctCH5_nNys,12936
92
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=JuosR1Xvyy2-0UKuCxx0P_3QH3OXgU88llxpyQ7NScM,12936
91
93
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=KkYZc_bZuq1lmDcvUz3QxIqJLpQPCZioD1FHUNsMJY8,11211
92
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=aZaqRDrkO3ytcmdM2eKJqHSt60MF070NMj6M2vgzOKc,7711
93
95
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=r748dpS13HtwY7t_KQFExFssxRy0xI2d-wxmhiUHRe0,3850
94
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py,sha256=DzoDdmAwabMTuNu2gCgAyO0KjZxFr9JlkQRz2koUAJ8,46504
96
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py,sha256=7UWh_8dKiRL7AochCcIvOsWvC0G3yp8aEup1wIIPo9k,25256
95
97
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=Cx3oY6vPVap0xm_mChqfQw4zzR4pqV36o_SyD8g6jPY,8727
96
98
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=EL5kfakuoEcwD85dGjhMta-J-PpCHRSDoc80SdbBrQk,2769
97
99
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=RmFUDx8dYdfsOE2CGLvdXqNNRtLLpVzXDN8dqZyMcZ8,5822
100
+ vellum_ee/workflows/display/tests/workflow_serialization/test_workflow_input_parameterization_error.py,sha256=vAdmn3YTBDpo55znbydQxsgg9ASqHcvsUPwiBR_7wfo,1461
98
101
  vellum_ee/workflows/display/types.py,sha256=i4T7ElU5b5h-nA1i3scmEhO1BqmNDc4eJDHavATD88w,2821
99
102
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
+ vellum_ee/workflows/display/utils/auto_layout.py,sha256=R_BLSZjdanj3UIR4cS6WVT6ek0i7AKJyHSjK1wPiois,3877
100
104
  vellum_ee/workflows/display/utils/exceptions.py,sha256=LSwwxCYNxFkf5XMUcFkaZKpQ13OSrI7y_bpEUwbKVk0,169
101
- vellum_ee/workflows/display/utils/expressions.py,sha256=Y0WMn0V3GjVTJShMSWIe3Z75NzrRfs4_qPytUTiqbhQ,13489
105
+ vellum_ee/workflows/display/utils/expressions.py,sha256=bSZ-sRByLCsut8XcRkCFbbqYvw9p7tlIeF-HFnEm664,14354
102
106
  vellum_ee/workflows/display/utils/registry.py,sha256=fWIm5Jj-10gNFjgn34iBu4RWv3Vd15ijtSN0V97bpW8,1513
107
+ vellum_ee/workflows/display/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
+ vellum_ee/workflows/display/utils/tests/test_auto_layout.py,sha256=vfXI769418s9vda5Gb5NFBH747WMOwSgHRXeLCTLVm8,2356
103
109
  vellum_ee/workflows/display/utils/vellum.py,sha256=mtoXmSYwR7rvrq-d6CzCW_auaJXTct0Mi1F0xpRCiNQ,5627
104
110
  vellum_ee/workflows/display/vellum.py,sha256=o7mq_vk2Yapu9DDKRz5l76h8EmCAypWGQYe6pryrbB8,3576
105
111
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
106
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=dVOe3TOV00uvllxsDziM3pFfL2HYTkWRq9iKDlj_xyU,33162
112
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=LKM8MnrezrBHU1W5gZ2y82UqkBwnKQ2OBQZD56g-XmI,33399
107
113
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=gxz76AeCqgAZ9D2lZeTiZzxY9eMgn3qOSfVgiqYcOh8,2028
108
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=o0bHG9gi6RKlyccuCyow-YbCY8ejcvS1f4VJ6ozjUVA,30234
114
+ vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=L7SKWJ26Ex-XXTNfHYXux7KP6I-dxE1EMQylap4Mhjs,31762
109
115
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=aaKdmWrgEe5YyV4zuDY_4E3y-l59rIHQnNGiPj2OWxQ,359
110
116
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
117
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=7JphJcSO3H85qiC2DpFfBWjC3JjrbRmoynBC6KKHVsA,2710
@@ -136,7 +142,7 @@ vellum/client/README.md,sha256=CuGUYnaE0Imt0KqQ4sIPaUghCjLHkF3DdEvZWu14-8s,4807
136
142
  vellum/client/__init__.py,sha256=AYopGv2ZRVn3zsU8_km6KOvEHDbXiTPCVuYVI7bWvdA,120166
137
143
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
138
144
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
139
- vellum/client/core/client_wrapper.py,sha256=dnusvY6O2THB1zDdl_1dPfH3fL9UKVhqz1Gp1UtaEck,1869
145
+ vellum/client/core/client_wrapper.py,sha256=3ZqkR_DngkaI-fY5PAgWW2c7RZ88oONDwDkWfxAKLBc,1869
140
146
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
141
147
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
142
148
  vellum/client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -1499,8 +1505,8 @@ vellum/workflows/edges/__init__.py,sha256=wSkmAnz9xyi4vZwtDbKxwlplt2skD7n3NsxkvR
1499
1505
  vellum/workflows/edges/edge.py,sha256=N0SnY3gKVuxImPAdCbPMPlHJIXbkQ3fwq_LbJRvVMFc,677
1500
1506
  vellum/workflows/emitters/__init__.py,sha256=YyOgaoLtVW8eFNEWODzCYb0HzL0PoSeNRf4diJ1Y0dk,80
1501
1507
  vellum/workflows/emitters/base.py,sha256=D5SADKIvnbgKwIBgYm77jaqvpo1o0rz4MmuX_muRqQU,359
1502
- vellum/workflows/environment/__init__.py,sha256=wGHslgSEZ7Octe4C-hNtl84EFelNimgmWQoi7px4-uw,71
1503
- vellum/workflows/environment/environment.py,sha256=0XhJPBs8YASWmvPx8bkSdCvcbDmzpe9stfs2kgtNDRU,296
1508
+ vellum/workflows/environment/__init__.py,sha256=TJz0m9dwIs6YOwCTeuN0HHsU-ecyjc1OJXx4AFy83EQ,121
1509
+ vellum/workflows/environment/environment.py,sha256=Ck3RPKXJvtMGx_toqYQQQF-ZwXm5ijVwJpEPTeIJ4_Q,471
1504
1510
  vellum/workflows/errors/__init__.py,sha256=tWGPu5xyAU8gRb8_bl0fL7OfU3wxQ9UH6qVwy4X4P_Q,113
1505
1511
  vellum/workflows/errors/types.py,sha256=nUWuniEfrhdtb-_2GzoDGlYnSJ_yuNUGjVkaKLNr-rM,4049
1506
1512
  vellum/workflows/events/__init__.py,sha256=6pxxceJo2dcaRkWtkDAYlUQZ-PHBQSZytIoyuUK48Qw,759
@@ -1604,11 +1610,11 @@ vellum/workflows/nodes/displayable/bases/tests/test_utils.py,sha256=eqdqbKNRWVMD
1604
1610
  vellum/workflows/nodes/displayable/bases/types.py,sha256=C37B2Qh2YP7s7pUjd-EYKc2Zl1TbnCgI_mENuUSb8bo,1706
1605
1611
  vellum/workflows/nodes/displayable/bases/utils.py,sha256=ckMUenSsNkiYmSw6FmjSMHYaCk8Y8_sUjL6lkFFEqts,5412
1606
1612
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1607
- vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=o2hP4tWad3-qXY_QtodtGiOGrO8HjeQnqYrxxpxeJVo,9954
1613
+ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=Qh4SPafzdRKbVKQH3h9SgH4vKeQQjvHAfP8ttUxLA2M,10304
1608
1614
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1609
1615
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1610
1616
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1611
- vellum/workflows/nodes/displayable/code_execution_node/tests/test_node.py,sha256=DRd-nOC04RGjXz-ctxADVq7b-hgdiFN3ZfhK6Ld7J8I,36634
1617
+ vellum/workflows/nodes/displayable/code_execution_node/tests/test_node.py,sha256=47W5fPLpDcaKhCVuauKOwcivx1NfhpbsRMPrs-WBnlY,38441
1612
1618
  vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=VRTKms59vrSR9mDk99cojParZVAP4lzjEeDwDNXU1tk,3837
1613
1619
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1614
1620
  vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=71ZUNfTiD7t2Kai2ypw0tmv1lSf1brQaHAQD-SeUrGE,1101
@@ -1653,8 +1659,8 @@ vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha2
1653
1659
  vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=cKI2Ls25L-JVt4z4a2ozQa-YBeVy21Z7BQ32Sj7iBPE,10460
1654
1660
  vellum/workflows/nodes/experimental/tool_calling_node/__init__.py,sha256=S7OzT3I4cyOU5Beoz87nPwCejCMP2FsHBFL8OcVmxJ4,118
1655
1661
  vellum/workflows/nodes/experimental/tool_calling_node/node.py,sha256=FkhaJccpCbx2be_IZ5V2v6Lo-jPJ0WgSC5tveLvAW4A,5774
1656
- vellum/workflows/nodes/experimental/tool_calling_node/tests/test_node.py,sha256=sxG26mOwt4N36RLoPJ-ngginPqC5qFzD_kGj9izdCFI,1833
1657
- vellum/workflows/nodes/experimental/tool_calling_node/utils.py,sha256=vB-tdN-44iVrTFvwGLVZW3dv62imIp5fPo0FYCW0l3M,9815
1662
+ vellum/workflows/nodes/experimental/tool_calling_node/tests/test_node.py,sha256=7x_o81vT7gWtVw3zDppcWnlJbakgxx_oI1esqhs2gpI,4551
1663
+ vellum/workflows/nodes/experimental/tool_calling_node/utils.py,sha256=iiB_Tm3zvElispx_DhnW4eQH1MnK-Y9k44X_PSpp7p8,9923
1658
1664
  vellum/workflows/nodes/mocks.py,sha256=a1FjWEIocseMfjzM-i8DNozpUsaW0IONRpZmXBoWlyc,10455
1659
1665
  vellum/workflows/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1660
1666
  vellum/workflows/nodes/tests/test_mocks.py,sha256=mfPvrs75PKcsNsbJLQAN6PDFoVqs9TmQxpdyFKDdO60,7837
@@ -1668,7 +1674,7 @@ vellum/workflows/ports/port.py,sha256=j_qiZlpx-a1cK5E7sxXwPcb_9NS-KUM-JoP8mgqg32
1668
1674
  vellum/workflows/ports/utils.py,sha256=cWJ9xX1KrHBTiU3xe6t7Rs0yaOy9RV18GMtHaAshAsc,3094
1669
1675
  vellum/workflows/references/__init__.py,sha256=glHFC1VfXmcbNvH5VzFbkT03d8_D7MMcvEcsUBrzLIs,591
1670
1676
  vellum/workflows/references/constant.py,sha256=6yUT4q1sMj1hkI_tzzQ9AYcmeeDYFUNCqUq_W2DN0S8,540
1671
- vellum/workflows/references/environment_variable.py,sha256=-gfOcdYwVp9ztSUYz6h2WI2Cg95zqxq5hhFf3Yr7aQg,791
1677
+ vellum/workflows/references/environment_variable.py,sha256=evpxiBKzBk74JzxBXWkfTrZe4Kx-fuUG1W6XjtXzaUw,700
1672
1678
  vellum/workflows/references/execution_count.py,sha256=JILHqt8ELdc9ct-WsVCA5X-rKiP1rmJODw-XTf4kpHI,722
1673
1679
  vellum/workflows/references/external_input.py,sha256=c_4SojTpykCSbGS1Pjmx9FfquyYGMPksoj0AbrWv7Go,2064
1674
1680
  vellum/workflows/references/input.py,sha256=3INu-TLTi4dziWmva6LO3WvgDlPzsjayUx61cVvqLJA,325
@@ -1720,8 +1726,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1720
1726
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1721
1727
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=fROqff6AZpCIzaSwOKSdtYy4XR0UZQ6ejxL3RJOSJVs,20447
1722
1728
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1723
- vellum_ai-0.14.69.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1724
- vellum_ai-0.14.69.dist-info/METADATA,sha256=kD1Yw09evk1wBzHUC1nBcnmpRGuK1v5ccyY_woFDV38,5556
1725
- vellum_ai-0.14.69.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1726
- vellum_ai-0.14.69.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1727
- vellum_ai-0.14.69.dist-info/RECORD,,
1729
+ vellum_ai-0.14.71.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1730
+ vellum_ai-0.14.71.dist-info/METADATA,sha256=C5GX4tfVPU2-YXu_9tu4RToI1a6SafllfrsjW6SiM9c,5556
1731
+ vellum_ai-0.14.71.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1732
+ vellum_ai-0.14.71.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1733
+ vellum_ai-0.14.71.dist-info/RECORD,,
vellum_cli/__init__.py CHANGED
@@ -362,9 +362,12 @@ def images() -> None:
362
362
  "This field does not push multiple local tags of the passed in image.",
363
363
  )
364
364
  @click.option("--workspace", type=str, help="The specific Workspace config to use when pushing")
365
- def image_push(image: str, tag: Optional[List[str]] = None, workspace: Optional[str] = None) -> None:
365
+ @click.option("--source", type=str, help="Path to Dockerfile to build before pushing")
366
+ def image_push(
367
+ image: str, tag: Optional[List[str]] = None, workspace: Optional[str] = None, source: Optional[str] = None
368
+ ) -> None:
366
369
  """Push Docker image to Vellum"""
367
- image_push_command(image, tag, workspace)
370
+ image_push_command(image, tag, workspace, source)
368
371
 
369
372
 
370
373
  @workflows.command(name="init")
vellum_cli/image_push.py CHANGED
@@ -17,10 +17,33 @@ from vellum_cli.logger import handle_cli_error, load_cli_logger
17
17
  _SUPPORTED_ARCHITECTURE = "amd64"
18
18
 
19
19
 
20
- def image_push_command(image: str, tags: Optional[List[str]] = None, workspace: Optional[str] = None) -> None:
20
+ def image_push_command(
21
+ image: str, tags: Optional[List[str]] = None, workspace: Optional[str] = None, source: Optional[str] = None
22
+ ) -> None:
21
23
  load_dotenv(dotenv_path=os.path.join(os.getcwd(), ".env"))
22
24
  logger = load_cli_logger()
23
25
  config = load_vellum_cli_config()
26
+
27
+ if source:
28
+ logger.info(f"Building Docker image from Dockerfile: {source}")
29
+
30
+ if not os.path.exists(source):
31
+ handle_cli_error(logger, "Dockerfile not found", f"Dockerfile does not exist: {source}")
32
+
33
+ source_dir = os.path.dirname(source)
34
+ dockerfile_name = os.path.basename(source)
35
+
36
+ build_result = subprocess.run(
37
+ ["docker", "buildx", "build", "-f", dockerfile_name, "--platform=linux/amd64", "-t", image, "."],
38
+ cwd=source_dir,
39
+ stdout=subprocess.PIPE,
40
+ stderr=subprocess.PIPE,
41
+ )
42
+
43
+ if build_result.returncode != 0:
44
+ handle_cli_error(logger, "Docker build failed", build_result.stderr.decode("utf-8"))
45
+
46
+ logger.info("Docker build completed successfully")
24
47
  workspace_config = next((w for w in config.workspaces if w.name == workspace), DEFAULT_WORKSPACE_CONFIG)
25
48
 
26
49
  api_key = os.getenv(workspace_config.api_key, None)