vellum-ai 0.10.7__py3-none-any.whl → 0.10.8__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,7 +17,7 @@ class BaseClientWrapper:
17
17
  headers: typing.Dict[str, str] = {
18
18
  "X-Fern-Language": "Python",
19
19
  "X-Fern-SDK-Name": "vellum-ai",
20
- "X-Fern-SDK-Version": "0.10.7",
20
+ "X-Fern-SDK-Version": "0.10.8",
21
21
  }
22
22
  headers["X_API_KEY"] = self.api_key
23
23
  return headers
@@ -103,4 +103,4 @@ class BaseEvent(UniversalBaseModel):
103
103
  api_version: Literal["2024-10-25"] = "2024-10-25"
104
104
  trace_id: UUID
105
105
  span_id: UUID
106
- parent: Optional['ParentContext'] = None
106
+ parent: Optional[ParentContext] = None
@@ -18,6 +18,7 @@ class InlineSubworkflowNode(BaseSubworkflowNode[StateType], Generic[StateType, W
18
18
  Used to execute a Subworkflow defined inline.
19
19
 
20
20
  subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"] - The Subworkflow to execute
21
+ subworkflow_inputs: ClassVar[EntityInputsInterface] = {}
21
22
  """
22
23
 
23
24
  subworkflow: Type["BaseWorkflow[WorkflowInputsType, InnerStateType]"]
@@ -82,6 +82,11 @@ class TemplatingNode(BaseNode[StateType], Generic[StateType, _OutputType], metac
82
82
  jinja_custom_filters: Mapping[str, Callable[[Union[str, bytes]], bool]] = _DEFAULT_JINJA_CUSTOM_FILTERS
83
83
 
84
84
  class Outputs(BaseNode.Outputs):
85
+ """
86
+ The outputs of the TemplatingNode.
87
+
88
+ result: _OutputType - The result of the template rendering
89
+ """
85
90
  # We use our mypy plugin to override the _OutputType with the actual output type
86
91
  # for downstream references to this output.
87
92
  result: _OutputType # type: ignore[valid-type]
@@ -8,7 +8,7 @@ from vellum.workflows.references.vellum_secret import VellumSecretReference
8
8
  class APINode(BaseAPINode):
9
9
  """
10
10
  Used to execute an API call. This node exists to be backwards compatible with Vellum's API Node, and for most cases,
11
- you should extend from `APINode` directly.
11
+ you should extend from `BaseAPINode` directly.
12
12
 
13
13
  url: str - The URL to send the request to.
14
14
  method: APIRequestMethod - The HTTP method to use for the request.
@@ -11,7 +11,6 @@ from vellum import (
11
11
  RawPromptExecutionOverridesRequest,
12
12
  StringInputRequest,
13
13
  )
14
-
15
14
  from vellum.workflows.constants import LATEST_RELEASE_TAG, OMIT
16
15
  from vellum.workflows.errors import VellumErrorCode
17
16
  from vellum.workflows.exceptions import NodeException
@@ -26,7 +25,7 @@ class BasePromptDeploymentNode(BasePromptNode, Generic[StateType]):
26
25
  prompt_inputs: EntityInputsInterface - The inputs for the Prompt
27
26
  deployment: Union[UUID, str] - Either the Prompt Deployment's UUID or its name.
28
27
  release_tag: str - The release tag to use for the Prompt Execution
29
- external_id: Optional[str] - The external ID to use for the Prompt Execution
28
+ external_id: Optional[str] - Optionally include a unique identifier for tracking purposes. Must be unique within a given Prompt Deployment.
30
29
  expand_meta: Optional[PromptDeploymentExpandMetaRequest] - Expandable execution fields to include in the response
31
30
  raw_overrides: Optional[RawPromptExecutionOverridesRequest] - The raw overrides to use for the Prompt Execution
32
31
  expand_raw: Optional[Sequence[str]] - Expandable raw fields to include in the response
@@ -67,9 +67,8 @@ class CodeExecutionNode(BaseNode[StateType], Generic[StateType, _OutputType], me
67
67
 
68
68
  filepath: str - The path to the script to execute.
69
69
  code_inputs: EntityInputsInterface - The inputs for the custom script.
70
- output_type: VellumVariableType = "STRING" - The type of the output from the custom script.
71
70
  runtime: CodeExecutionRuntime = "PYTHON_3_12" - The runtime to use for the custom script.
72
- packages: Optional[Sequence[CodeExecutionPackageRequest]] = None - The packages to use for the custom script.
71
+ packages: Optional[Sequence[CodeExecutionPackage]] = None - The packages to use for the custom script.
73
72
  request_options: Optional[RequestOptions] = None - The request options to use for the custom script.
74
73
  """
75
74
 
@@ -2,9 +2,20 @@ import os
2
2
  from typing import Union
3
3
 
4
4
 
5
+ def get_project_root() -> str:
6
+ current_dir = os.getcwd()
7
+ while current_dir != '/':
8
+ if ".git" in os.listdir(current_dir):
9
+ return current_dir
10
+ current_dir = os.path.dirname(current_dir)
11
+ raise FileNotFoundError("Project root not found.")
12
+
5
13
  def read_file_from_path(filepath: str) -> Union[str, None]:
6
- if not os.path.exists(filepath):
14
+ project_root = get_project_root()
15
+ relative_filepath = os.path.join(project_root, filepath)
16
+
17
+ if not os.path.exists(relative_filepath):
7
18
  return None
8
19
 
9
- with open(filepath) as file:
20
+ with open(relative_filepath, 'r') as file:
10
21
  return file.read()
@@ -9,16 +9,23 @@ from vellum.workflows.types.generics import StateType
9
9
 
10
10
  class InlinePromptNode(BaseInlinePromptNode[StateType]):
11
11
  """
12
- Used to execute an Inline Prompt and surface a string output for convenience.
12
+ Used to execute a Prompt defined inline.
13
13
 
14
14
  prompt_inputs: EntityInputsInterface - The inputs for the Prompt
15
15
  ml_model: str - Either the ML Model's UUID or its name.
16
- blocks: List[PromptBlockRequest] - The blocks that make up the Prompt
16
+ blocks: List[PromptBlock] - The blocks that make up the Prompt
17
+ functions: Optional[List[FunctionDefinition]] - The functions to include in the Prompt
17
18
  parameters: PromptParameters - The parameters for the Prompt
18
- expand_meta: Optional[AdHocExpandMetaRequest] - Set of expandable execution fields to include in the response
19
+ expand_meta: Optional[AdHocExpandMeta] - Expandable execution fields to include in the response
20
+ request_options: Optional[RequestOptions] - The request options to use for the Prompt Execution
19
21
  """
20
22
 
21
23
  class Outputs(BaseInlinePromptNode.Outputs):
24
+ """
25
+ The outputs of the InlinePromptNode.
26
+
27
+ text: str - The result of the Prompt Execution
28
+ """
22
29
  text: str
23
30
 
24
31
  def run(self) -> Iterator[BaseOutput]:
@@ -14,7 +14,7 @@ class PromptDeploymentNode(BasePromptDeploymentNode[StateType]):
14
14
  prompt_inputs: EntityInputsInterface - The inputs for the Prompt
15
15
  deployment: Union[UUID, str] - Either the Prompt Deployment's UUID or its name.
16
16
  release_tag: str - The release tag to use for the Prompt Execution
17
- external_id: Optional[str] - The external ID to use for the Prompt Execution
17
+ external_id: Optional[str] - Optionally include a unique identifier for tracking purposes. Must be unique within a given Prompt Deployment.
18
18
  expand_meta: Optional[PromptDeploymentExpandMetaRequest] - Expandable execution fields to include in the response
19
19
  raw_overrides: Optional[RawPromptExecutionOverridesRequest] - The raw overrides to use for the Prompt Execution
20
20
  expand_raw: Optional[Sequence[str]] - Expandable raw fields to include in the response
@@ -23,6 +23,11 @@ class PromptDeploymentNode(BasePromptDeploymentNode[StateType]):
23
23
  """
24
24
 
25
25
  class Outputs(BasePromptDeploymentNode.Outputs):
26
+ """
27
+ The outputs of the PromptDeploymentNode.
28
+
29
+ text: str - The result of the Prompt Execution
30
+ """
26
31
  text: str
27
32
 
28
33
  def run(self) -> Iterator[BaseOutput]:
@@ -12,7 +12,6 @@ from vellum import (
12
12
  WorkflowRequestStringInputRequest,
13
13
  )
14
14
  from vellum.core import RequestOptions
15
-
16
15
  from vellum.workflows.constants import LATEST_RELEASE_TAG, OMIT
17
16
  from vellum.workflows.errors import VellumErrorCode
18
17
  from vellum.workflows.exceptions import NodeException
@@ -28,7 +27,7 @@ class SubworkflowDeploymentNode(BaseSubworkflowNode[StateType], Generic[StateTyp
28
27
  subworkflow_inputs: EntityInputsInterface - The inputs for the Subworkflow
29
28
  deployment: Union[UUID, str] - Either the Workflow Deployment's UUID or its name.
30
29
  release_tag: str = LATEST_RELEASE_TAG - The release tag to use for the Workflow Execution
31
- external_id: Optional[str] = OMIT - The external ID to use for the Workflow Execution
30
+ external_id: Optional[str] = OMIT - Optionally include a unique identifier for tracking purposes. Must be unique within a given Workflow Deployment.
32
31
  expand_meta: Optional[WorkflowExpandMetaRequest] = OMIT - Expandable execution fields to include in the respownse
33
32
  metadata: Optional[Dict[str, Optional[Any]]] = OMIT - The metadata to use for the Workflow Execution
34
33
  request_options: Optional[RequestOptions] = None - The request options to use for the Workflow Execution
@@ -8,7 +8,6 @@ from vellum import (
8
8
  PromptOutput,
9
9
  StringVellumValue,
10
10
  )
11
-
12
11
  from vellum.workflows.constants import OMIT
13
12
  from vellum.workflows.inputs import BaseInputs
14
13
  from vellum.workflows.nodes import PromptDeploymentNode
@@ -65,7 +64,7 @@ def test_text_prompt_deployment_node__basic(vellum_client):
65
64
  assert text_output.name == "text"
66
65
  assert text_output.value == "Hello, world!"
67
66
 
68
- # AND we should have made the expected call to Vellum search
67
+ # AND we should have made the expected call to stream the prompt execution
69
68
  vellum_client.execute_prompt_stream.assert_called_once_with(
70
69
  expand_meta=OMIT,
71
70
  expand_raw=OMIT,
@@ -28,7 +28,7 @@ from vellum.workflows.events.node import (
28
28
  NodeExecutionRejectedBody,
29
29
  NodeExecutionStreamingBody,
30
30
  )
31
- from vellum.workflows.events.types import BaseEvent
31
+ from vellum.workflows.events.types import BaseEvent, ParentContext, WorkflowParentContext
32
32
  from vellum.workflows.events.utils import is_terminal_event
33
33
  from vellum.workflows.events.workflow import (
34
34
  WorkflowExecutionFulfilledBody,
@@ -71,6 +71,7 @@ class WorkflowRunner(Generic[StateType]):
71
71
  entrypoint_nodes: Optional[RunFromNodeArg] = None,
72
72
  external_inputs: Optional[ExternalInputsArg] = None,
73
73
  cancel_signal: Optional[ThreadingEvent] = None,
74
+ parent_context: Optional[ParentContext] = None,
74
75
  ):
75
76
  if state and external_inputs:
76
77
  raise ValueError("Can only run a Workflow providing one of state or external inputs, not both")
@@ -115,6 +116,7 @@ class WorkflowRunner(Generic[StateType]):
115
116
 
116
117
  self._active_nodes_by_execution_id: Dict[UUID, BaseNode[StateType]] = {}
117
118
  self._cancel_signal = cancel_signal
119
+ self._parent_context = parent_context
118
120
 
119
121
  setattr(
120
122
  self._initial_state,
@@ -143,6 +145,11 @@ class WorkflowRunner(Generic[StateType]):
143
145
  node_definition=node.__class__,
144
146
  inputs=node._inputs,
145
147
  ),
148
+ parent=WorkflowParentContext(
149
+ span_id=span_id,
150
+ workflow_definition=self.workflow.__class__,
151
+ parent=self._parent_context
152
+ )
146
153
  ),
147
154
  )
148
155
  )
@@ -190,6 +197,11 @@ class WorkflowRunner(Generic[StateType]):
190
197
  output=BaseOutput(name=output.name),
191
198
  invoked_ports=invoked_ports,
192
199
  ),
200
+ parent=WorkflowParentContext(
201
+ span_id=span_id,
202
+ workflow_definition=self.workflow.__class__,
203
+ parent=self._parent_context
204
+ )
193
205
  ),
194
206
  )
195
207
  )
@@ -214,6 +226,11 @@ class WorkflowRunner(Generic[StateType]):
214
226
  output=output,
215
227
  invoked_ports=invoked_ports,
216
228
  ),
229
+ parent=WorkflowParentContext(
230
+ span_id=span_id,
231
+ workflow_definition=self.workflow.__class__,
232
+ parent=self._parent_context,
233
+ )
217
234
  ),
218
235
  )
219
236
  )
@@ -233,6 +250,11 @@ class WorkflowRunner(Generic[StateType]):
233
250
  output=output,
234
251
  invoked_ports=invoked_ports,
235
252
  ),
253
+ parent=WorkflowParentContext(
254
+ span_id=span_id,
255
+ workflow_definition=self.workflow.__class__,
256
+ parent=self._parent_context,
257
+ )
236
258
  ),
237
259
  )
238
260
  )
@@ -259,6 +281,11 @@ class WorkflowRunner(Generic[StateType]):
259
281
  outputs=outputs,
260
282
  invoked_ports=invoked_ports,
261
283
  ),
284
+ parent=WorkflowParentContext(
285
+ span_id=span_id,
286
+ workflow_definition=self.workflow.__class__,
287
+ parent=self._parent_context,
288
+ )
262
289
  ),
263
290
  )
264
291
  )
@@ -273,6 +300,11 @@ class WorkflowRunner(Generic[StateType]):
273
300
  node_definition=node.__class__,
274
301
  error=e.error,
275
302
  ),
303
+ parent=WorkflowParentContext(
304
+ span_id=span_id,
305
+ workflow_definition=self.workflow.__class__,
306
+ parent=self._parent_context,
307
+ )
276
308
  ),
277
309
  )
278
310
  )
@@ -292,6 +324,11 @@ class WorkflowRunner(Generic[StateType]):
292
324
  code=VellumErrorCode.INTERNAL_ERROR,
293
325
  ),
294
326
  ),
327
+ parent=WorkflowParentContext(
328
+ span_id=span_id,
329
+ workflow_definition=self.workflow.__class__,
330
+ parent=self._parent_context
331
+ )
295
332
  ),
296
333
  )
297
334
  )
@@ -387,6 +424,7 @@ class WorkflowRunner(Generic[StateType]):
387
424
  workflow_definition=self.workflow.__class__,
388
425
  inputs=self._initial_state.meta.workflow_inputs,
389
426
  ),
427
+ parent=self._parent_context,
390
428
  )
391
429
 
392
430
  def _stream_workflow_event(self, output: BaseOutput) -> WorkflowExecutionStreamingEvent:
@@ -397,6 +435,7 @@ class WorkflowRunner(Generic[StateType]):
397
435
  workflow_definition=self.workflow.__class__,
398
436
  output=output,
399
437
  ),
438
+ parent=self._parent_context
400
439
  )
401
440
 
402
441
  def _fulfill_workflow_event(self, outputs: OutputsType) -> WorkflowExecutionFulfilledEvent:
@@ -407,6 +446,7 @@ class WorkflowRunner(Generic[StateType]):
407
446
  workflow_definition=self.workflow.__class__,
408
447
  outputs=outputs,
409
448
  ),
449
+ parent=self._parent_context,
410
450
  )
411
451
 
412
452
  def _reject_workflow_event(self, error: VellumError) -> WorkflowExecutionRejectedEvent:
@@ -417,6 +457,7 @@ class WorkflowRunner(Generic[StateType]):
417
457
  workflow_definition=self.workflow.__class__,
418
458
  error=error,
419
459
  ),
460
+ parent=self._parent_context,
420
461
  )
421
462
 
422
463
  def _resume_workflow_event(self) -> WorkflowExecutionResumedEvent:
@@ -436,6 +477,7 @@ class WorkflowRunner(Generic[StateType]):
436
477
  workflow_definition=self.workflow.__class__,
437
478
  external_inputs=external_inputs,
438
479
  ),
480
+ parent=self._parent_context,
439
481
  )
440
482
 
441
483
  def _stream(self) -> None:
@@ -0,0 +1,5 @@
1
+ from .core import MergeBehavior
2
+
3
+ __all__ = [
4
+ "MergeBehavior",
5
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.10.7
3
+ Version: 0.10.8
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -1,21 +1,21 @@
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=t62kIq0vDia8TTJqAmqFpYCo40buWNDQmjIDTOvmwwE,2416
3
+ vellum_cli/__init__.py,sha256=E2_T4MuUkfobYqla03ci2tRWQ7ZsaZA6wU340OCWRJ4,2788
4
4
  vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
5
5
  vellum_cli/config.py,sha256=urqMGQUkTntzdx-JV0P32FZVbqRZqgI-yFVmGPVblNI,3613
6
6
  vellum_cli/image_push.py,sha256=lCQhkQu-IlIMHNSynmEl5KUzO_dHW27NTAFWnyvPpcs,4419
7
7
  vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
8
- vellum_cli/pull.py,sha256=op8HQmtiKa4TlrgEvhLiIac0Zhal6LETW22rhSkNHGE,3483
8
+ vellum_cli/pull.py,sha256=UApkIEq5BVq8Si_ZePyv5MMFUAspFetpec5Ix88WFOQ,3866
9
9
  vellum_cli/push.py,sha256=HhXHqLvWKf3CUZJ3yIm-KeoBkgk73EXqVtGgWYcBcVk,5089
10
10
  vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
11
- vellum_cli/tests/test_pull.py,sha256=24sHYWNViS-G_UHmPC_-KXb6l3OOs2AiDGv2kKp4AHY,5815
11
+ vellum_cli/tests/test_pull.py,sha256=gIkbpd4l_yUmIoW8k3wrTpp6h7OFbB0KXdijIjAgffU,7416
12
12
  vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  vellum_ee/workflows/display/base.py,sha256=yYH86aTPfOy7Zbzj9YBzU-yLUX3GBHVNxKqJFy7_wxk,1797
17
17
  vellum_ee/workflows/display/nodes/__init__.py,sha256=5XOcZJXYUgaLS55QgRJzyQ_W1tpeprjnYAeYVezqoGw,160
18
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=0ee5qP5uF9WASIocwhZfEi8S2NmPdaGQLlG-kwPb9ZI,5942
18
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=gmGGOXHydc158aS55JOHZtYvta6jj4ZCuue-9n8KvFY,5942
19
19
  vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=a62tpKcX0LdyZM2clwoGwpUfH3HMBbX1qiA0FFb_nk4,1649
20
20
  vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=A036wKuBjhtBGJKdkQSq4v1Rcm0cXHropJxKPuGWAsk,907
21
21
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -24,7 +24,7 @@ vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6m
24
24
  vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
25
25
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=jQgm0dsQAlxZ0tYR_cv5pX-6wHMPQfFwmhI3DQ29S9Y,1432
26
26
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=awjKut2m7HoEmqewRfdR1dw8ufA0Q5mVG8V8jhaHlKw,8572
27
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=bAtSJpcKyJW-VLvBEr92lKPpdPH1L_IA02qg78U1uFA,3403
27
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=MASV7u0X4eiS3SzRWeBcbWZ_YgNlwwg5cM2vaFWjpqk,3915
28
28
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=v9g263oEtyL6ejp5ZfLrVfrcqU9gZwzuUI4yBuOScbI,12983
29
29
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=2HsghUtPBOQ-4sN-2jDOnbEuIwcsilDKO3f2o1WlYgw,2897
30
30
  vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=lr4d2uV3Lq8d22b5LCKbWMz_nU7Q0fvffcNQ7zx5Ygc,2163
@@ -71,7 +71,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
71
71
  vellum/client/__init__.py,sha256=o4m7iRZWEV8rP3GkdaztHAjNmjxjWERlarviFoHzuKI,110927
72
72
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
73
73
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
74
- vellum/client/core/client_wrapper.py,sha256=c9d8t0gg4sHCfhz528mHO5hti3rrAmFRPArvRV33Lkk,1890
74
+ vellum/client/core/client_wrapper.py,sha256=-M3uhAr1iTDcPBsJsI4SD1DfT1LMZ1qdWYe2eEbN-N4,1890
75
75
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
76
76
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
77
77
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -1194,7 +1194,7 @@ vellum/workflows/events/__init__.py,sha256=vLwQuykMmbv0izdUvsamouRQKbmKX_r9Poo77
1194
1194
  vellum/workflows/events/node.py,sha256=YQVWrE8LD5IxRTz_e0-0bXMhk3RZ75ZKTvAJZqH8dP0,5270
1195
1195
  vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1196
1196
  vellum/workflows/events/tests/test_event.py,sha256=BbAeTohMdfAdpBea9fbi5nDXX6UQ7xASMv9jNuwOmDU,12704
1197
- vellum/workflows/events/types.py,sha256=2MDqlhBMwFWKso423IGH9ZdsPnmBWGGOIBceW568pnk,2865
1197
+ vellum/workflows/events/types.py,sha256=9apSwzmjVtuSDxEP2NhF8HbGGOP2BkMaqnOy__YH-oY,2863
1198
1198
  vellum/workflows/events/utils.py,sha256=OwtE8dHOCX01jvLyoS1l18tYQ4ob0YJcUhUorKWLJh0,232
1199
1199
  vellum/workflows/events/workflow.py,sha256=kPjZTh5hzCsSrVKLkXQNwzxhnUp3X4GkFA5veGatGlQ,4353
1200
1200
  vellum/workflows/exceptions.py,sha256=Dc7mxstsaMDRmS91QEOiZCbZ1ZIRacnm0l5lQmC6WkA,401
@@ -1243,7 +1243,7 @@ vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT
1243
1243
  vellum/workflows/nodes/core/error_node/__init__.py,sha256=g7RRnlHhqu4qByfLjBwCunmgGA8dI5gNsjS3h6TwlSI,60
1244
1244
  vellum/workflows/nodes/core/error_node/node.py,sha256=hqBPHoLnhNrK9ITIaEzpnk47XYDbG6cmObz7oe78Ceg,944
1245
1245
  vellum/workflows/nodes/core/inline_subworkflow_node/__init__.py,sha256=nKNEH1QTl-1PcvmYoqSWEl0-t6gAur8GLTXHzklRQfM,84
1246
- vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=hXYdhY_4cJVzCDBeFynFflRisgS4nBeFsuz3sFzrMGI,3002
1246
+ vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=mWugLOYnVmji-dSf8Rfizs_XKKfKWSskMbn6TRMDbaY,3063
1247
1247
  vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
1248
1248
  vellum/workflows/nodes/core/map_node/node.py,sha256=aPhV3niv_jWSwrZ2CwiRg0CDOM-09Fa6QqOPYNJMgRc,6206
1249
1249
  vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1255,7 +1255,7 @@ vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=zANiu9-d-uIOP9t
1255
1255
  vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
1256
1256
  vellum/workflows/nodes/core/templating_node/custom_filters.py,sha256=Q0DahYRHP4KfaUXDt9XxN-DFLBrAxlv90yaVqxScoUw,264
1257
1257
  vellum/workflows/nodes/core/templating_node/exceptions.py,sha256=cDp140PP4OnInW4qAvg3KqiSiF70C71UyEAKRBR1Abo,46
1258
- vellum/workflows/nodes/core/templating_node/node.py,sha256=SU8zCVLz1Qq4bXoECHssECQBmUwxdeQgFMo7x1nv5Ts,4364
1258
+ vellum/workflows/nodes/core/templating_node/node.py,sha256=uxdOk_vyb5ONoOWG4xMDo3_eAZS_JxnZi-cMlq2Fc4k,4499
1259
1259
  vellum/workflows/nodes/core/templating_node/render.py,sha256=OpJp0NAH6qcEL6K9lxR0qjpFb75TYNttJR5iCos8tmg,1792
1260
1260
  vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=L6F3Gw9doguj1TSKmAns-mzXvoRuRivaCFe3mhjo13E,551
1261
1261
  vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
@@ -1264,7 +1264,7 @@ vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW
1264
1264
  vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=u06GmVGln5lg-65YYFAmjlKwxuXbP8bKA8Qf_Zbq7ak,3764
1265
1265
  vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
1266
1266
  vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
1267
- vellum/workflows/nodes/displayable/api_node/node.py,sha256=-m93_KqwaWxbtbNQDWnLZZ-TSHCwd4ir2V542zovaZU,2043
1267
+ vellum/workflows/nodes/displayable/api_node/node.py,sha256=mnoncJtxo5YhuFCR3_axpvCqrGQKLShvfU6xJO7Fa8I,2047
1268
1268
  vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
1269
1269
  vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
1270
1270
  vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=YQNoO5xgjd44EzOTe0EVAxWgMLoaWGx_68fxgoEBqto,2487
@@ -1273,15 +1273,15 @@ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=et_cMMc
1273
1273
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1274
1274
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1275
1275
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=vbl6LRCrmlxFURcFGFMAEBJjgNGPB5q9AnQ8UITxYuI,4869
1276
- vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=JjNMiAFgOupUo5EUeHaryG74SCjEECxBZiS8cMECR_c,4378
1276
+ vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=KsKU9SNgjd1feiylSNS33DE0jKsJbYsaepF5wpCUzRU,4440
1277
1277
  vellum/workflows/nodes/displayable/bases/search_node.py,sha256=z8IQg-J46AbRMgFi92M08A220Wf7gU0xE3634ii3T1E,3565
1278
1278
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1279
- vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=8yPoA8yCvk4TODot5Ou09wbonkCfqvPYFc5cOHbwP10,8078
1279
+ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=zK-gxWmox8QZ84J11faUmasRozNKDIBv_86Gjq8uj7M,7975
1280
1280
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1281
1281
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1282
1282
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1283
1283
  vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=pvkvMOIL94vDP3KUrQh0OF1lELjEFJ6HIDEz5kUqbzo,3377
1284
- vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=R0gVJVwn2g3caDr25LBj_mj9JUIbORSS-88MQkvSWQU,215
1284
+ vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=JAoa0AUIDUHKuNVlsxlTD0RT5rX9K_7GAEACGz4XJas,613
1285
1285
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1286
1286
  vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=SWfsEQ7G_y3yEnxzMhjtjHF4xZvFdFTds77LrFZHGUU,1020
1287
1287
  vellum/workflows/nodes/displayable/final_output_node/__init__.py,sha256=G7VXM4OWpubvSJtVkGmMNeqgb9GkM7qZT838eL18XU4,72
@@ -1289,21 +1289,21 @@ vellum/workflows/nodes/displayable/final_output_node/node.py,sha256=iH3ZPOstPku_
1289
1289
  vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
1290
1290
  vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=vctOgn1gUYGIClknGciUjmDRFKlcEbIRZYvzgBaMiVo,3918
1291
1291
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1292
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=gZSiATdEwka07GkBm1F_CbqZLXNYdFAvFgT0vE2w1zA,1854
1292
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=M4pUl2RO0a_094oCrtCmgo0rr_wKT_F3KN4y1eDFm4Y,2112
1293
1293
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
1294
1294
  vellum/workflows/nodes/displayable/merge_node/node.py,sha256=ZyPvcTgfPOneOm5Dc2kUOoPkwNJqwRPZSj232akXynA,324
1295
1295
  vellum/workflows/nodes/displayable/note_node/__init__.py,sha256=KWA3P4fyYJ-fOTky8qNGlcOotQ-HeHJ9AjZt6mRQmCE,58
1296
1296
  vellum/workflows/nodes/displayable/note_node/node.py,sha256=8rwP7RS1OOyQJ-ZuZBXTCtT2ZW8J6eGD59iKmq_pB24,258
1297
1297
  vellum/workflows/nodes/displayable/prompt_deployment_node/__init__.py,sha256=krX1Hds-TSVYZsx0wJFX4wsAKkEFYOX1ifwRGiIM-EA,82
1298
- vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=zEgOWgahPr-Jozd97xEqhX3ZelcHcMuKPMiOFb1igXE,2321
1298
+ vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=1GzSTUFiqjly7Uz-xSsEI5a4NZNv8ZEI_1C2oYwQKEg,2513
1299
1299
  vellum/workflows/nodes/displayable/search_node/__init__.py,sha256=hpBpvbrDYf43DElRZFLzieSn8weXiwNiiNOJurERQbs,62
1300
1300
  vellum/workflows/nodes/displayable/search_node/node.py,sha256=k7_S5yWFGZrIV1R5BsFIFSkOvmnbJK39pNmZD8XLCX4,1310
1301
1301
  vellum/workflows/nodes/displayable/subworkflow_deployment_node/__init__.py,sha256=9yYM6001YZeqI1VOk1QuEM_yrffk_EdsO7qaPzINKds,92
1302
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=HjKaQ8QaqmdEcwOIg2DoWk__l9cMpR4tYnZ51WQDThk,6714
1302
+ vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=JcMRX0dFYj3OETzkB7u3J6VFfRftYygHlFvrY266GYc,6776
1303
1303
  vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1304
1304
  vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=UwNCIrq2gDpObcosrpiIHFdHZLWarmlS7ez8GanIBDc,4649
1305
1305
  vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=AZtodUoX_Fl_ZXDinutAxlsDsfcxEYS0nFL0mcBylW8,6955
1306
- vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=Ee2_1bvWycaVNzKGLsxAcu_3HNvTM_DiwDAeF20ZgBk,2497
1306
+ vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=t4ctc6MCwtvOOV4MG-xm-1w1A-ik0--_1es6yJ1qklU,2510
1307
1307
  vellum/workflows/nodes/utils.py,sha256=zY0b5WjJtGwVPPLY3ffHUdRREPvyoNwmJDigz5jQRAI,812
1308
1308
  vellum/workflows/outputs/__init__.py,sha256=AyZ4pRh_ACQIGvkf0byJO46EDnSix1ZCAXfvh-ms1QE,94
1309
1309
  vellum/workflows/outputs/base.py,sha256=aOll71CH_g1RaVO1wl038BqpWH70cD3XXSRxzH0YoRA,8002
@@ -1325,7 +1325,7 @@ vellum/workflows/references/workflow_input.py,sha256=epspVRZ9n_nxoTxI5Am3GDd2fpU
1325
1325
  vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
1326
1326
  vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
1327
1327
  vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
1328
- vellum/workflows/runner/runner.py,sha256=MavIvMsEJkFxgZb4sd0-vLFWnVBfZIn4AsfVJcqn1rY,24504
1328
+ vellum/workflows/runner/runner.py,sha256=zqVjt4r7BuMou5oVFUglMPGshmQitUPfASBvATsfxGk,26770
1329
1329
  vellum/workflows/runner/types.py,sha256=UQIGqOuCDgxEQpoJr4ut3wAnAjp4scDWhNhEhYFyLrw,466
1330
1330
  vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
1331
1331
  vellum/workflows/state/base.py,sha256=gm4pun9BzYaZbW8I1j7EriUIlAzqQkKT3IBbXPh3FkA,12663
@@ -1334,7 +1334,7 @@ vellum/workflows/state/encoder.py,sha256=kRrqwD0vFCiSRZR3rg8Sjkh8sDEerQQhlvmdSYQ
1334
1334
  vellum/workflows/state/store.py,sha256=VYGBQgN1bpd1as5eGiouV_7scg8QsRs4_1aqZAGIsRQ,793
1335
1335
  vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1336
1336
  vellum/workflows/state/tests/test_state.py,sha256=BQjcdREIK1MPuGhivRUgpynVJLftjEpH9RG3cRKxQEY,3310
1337
- vellum/workflows/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1337
+ vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1338
1338
  vellum/workflows/types/core.py,sha256=llsHFE3XKnVEk_pYoK0s9WUdeninSU5Kmoi7dU4GX0c,1804
1339
1339
  vellum/workflows/types/generics.py,sha256=ZkfoRhWs042i5IjA99v2wIhmh1u-Wieo3LzosgGWJVk,600
1340
1340
  vellum/workflows/types/stack.py,sha256=RDSGLkcV612ge8UuAH9TZiEGXxJt0Av2-H5rfzrTVVI,1014
@@ -1350,8 +1350,8 @@ vellum/workflows/utils/vellum_variables.py,sha256=wbYejKwjy23ITDRfdGW4d181buvCbZ
1350
1350
  vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
1351
1351
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1352
1352
  vellum/workflows/workflows/base.py,sha256=QxIm0zCic8P-y0NNLdqgC1YKTu-3TmMJ-wH1nUylguA,13689
1353
- vellum_ai-0.10.7.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1354
- vellum_ai-0.10.7.dist-info/METADATA,sha256=ORDcBMHiWjSs9HCgB8N2aas_2KPUBSDX96vbojp8F6w,5128
1355
- vellum_ai-0.10.7.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
1356
- vellum_ai-0.10.7.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1357
- vellum_ai-0.10.7.dist-info/RECORD,,
1353
+ vellum_ai-0.10.8.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1354
+ vellum_ai-0.10.8.dist-info/METADATA,sha256=n5dQCMNsh-FaCOh5YMeDVzfusigZuus_UEjWSmFnK2Q,5128
1355
+ vellum_ai-0.10.8.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
1356
+ vellum_ai-0.10.8.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1357
+ vellum_ai-0.10.8.dist-info/RECORD,,
vellum_cli/__init__.py CHANGED
@@ -42,11 +42,30 @@ def push(
42
42
 
43
43
  @main.command()
44
44
  @click.argument("module", required=False)
45
- @click.option("--legacy-module", is_flag=True, help="Pull the workflow as a legacy module")
46
- @click.option("--include-json", is_flag=True, help="Include the JSON representation of the Workflow in the pull response. Should only be used for debugging purposes.")
47
- def pull(module: Optional[str], legacy_module: Optional[bool], include_json: Optional[bool]) -> None:
45
+ @click.option(
46
+ "--include-json",
47
+ is_flag=True,
48
+ help="Include the JSON representation of the Workflow in the pull response. Should only be used for debugging purposes.",
49
+ )
50
+ @click.option("--workflow-sandbox-id", type=str, help="Pull the Workflow from a specific Sandbox ID")
51
+ @click.option(
52
+ "--exclude-code",
53
+ is_flag=True,
54
+ help="Exclude the code definition of the Workflow from the pull response. Should only be used for debugging purposes.",
55
+ )
56
+ def pull(
57
+ module: Optional[str],
58
+ include_json: Optional[bool],
59
+ workflow_sandbox_id: Optional[str],
60
+ exclude_code: Optional[bool],
61
+ ) -> None:
48
62
  """Pull Workflow from Vellum"""
49
- pull_command(module, legacy_module, include_json)
63
+ pull_command(
64
+ module=module,
65
+ include_json=include_json,
66
+ workflow_sandbox_id=workflow_sandbox_id,
67
+ exclude_code=exclude_code,
68
+ )
50
69
 
51
70
 
52
71
  @main.group(aliases=["images", "image"])
vellum_cli/pull.py CHANGED
@@ -7,28 +7,38 @@ from typing import Optional
7
7
  from dotenv import load_dotenv
8
8
 
9
9
  from vellum.workflows.vellum_client import create_vellum_client
10
- from vellum_cli.config import load_vellum_cli_config
10
+ from vellum_cli.config import WorkflowConfig, load_vellum_cli_config
11
11
  from vellum_cli.logger import load_cli_logger
12
12
 
13
13
 
14
14
  def pull_command(
15
- module: Optional[str], legacy_module: Optional[bool] = None, include_json: Optional[bool] = None
15
+ module: Optional[str] = None,
16
+ workflow_sandbox_id: Optional[str] = None,
17
+ include_json: Optional[bool] = None,
18
+ exclude_code: Optional[bool] = None,
16
19
  ) -> None:
17
20
  load_dotenv()
18
21
  logger = load_cli_logger()
19
22
  config = load_vellum_cli_config()
20
23
 
21
- if not config.workflows:
22
- raise ValueError("No Workflows found in project to pull.")
23
-
24
- if len(config.workflows) > 1 and not module:
25
- raise ValueError("Multiple workflows found in project to pull. Pulling only a single workflow is supported.")
26
-
27
24
  workflow_config = (
28
- next((w for w in config.workflows if w.module == module), None) if module else config.workflows[0]
25
+ next((w for w in config.workflows if w.module == module), None)
26
+ if module
27
+ else (config.workflows[0] if config.workflows else None)
29
28
  )
29
+ save_lock_file = False
30
30
  if workflow_config is None:
31
- raise ValueError(f"No workflow config for '{module}' found in project to push.")
31
+ if module:
32
+ raise ValueError(f"No workflow config for '{module}' found in project to pull.")
33
+ elif workflow_sandbox_id:
34
+ workflow_config = WorkflowConfig(
35
+ workflow_sandbox_id=workflow_sandbox_id,
36
+ module=f"workflow_{workflow_sandbox_id.split('-')[0]}",
37
+ )
38
+ config.workflows.append(workflow_config)
39
+ save_lock_file = True
40
+ else:
41
+ raise ValueError("No workflow config found in project to pull from.")
32
42
 
33
43
  if not workflow_config.workflow_sandbox_id:
34
44
  raise ValueError("No workflow sandbox ID found in project to pull from.")
@@ -36,10 +46,10 @@ def pull_command(
36
46
  logger.info(f"Pulling workflow into {workflow_config.module}")
37
47
  client = create_vellum_client()
38
48
  query_parameters = {}
39
- if legacy_module:
40
- query_parameters["legacyModule"] = legacy_module
41
49
  if include_json:
42
50
  query_parameters["include_json"] = include_json
51
+ if exclude_code:
52
+ query_parameters["exclude_code"] = exclude_code
43
53
 
44
54
  response = client.workflows.pull(
45
55
  workflow_config.workflow_sandbox_id,
@@ -81,6 +91,11 @@ def pull_command(
81
91
  target.write(source.read().decode("utf-8"))
82
92
 
83
93
  if include_json:
84
- logger.warning("The pulled JSON representation of the Workflow should be used for debugging purposely only. Its schema should be considered unstable and subject to change at any time.")
94
+ logger.warning(
95
+ "The pulled JSON representation of the Workflow should be used for debugging purposely only. Its schema should be considered unstable and subject to change at any time."
96
+ )
97
+
98
+ if save_lock_file:
99
+ config.save()
85
100
 
86
101
  logger.info(f"Successfully pulled Workflow into {workflow_config.module}")
@@ -69,8 +69,33 @@ def test_pull(vellum_client, mock_module):
69
69
  pull_command(module)
70
70
 
71
71
  # THEN the workflow.py file is written to the module directory
72
- assert os.path.exists(os.path.join(temp_dir, *module.split("."), "workflow.py"))
73
- with open(os.path.join(temp_dir, *module.split("."), "workflow.py")) as f:
72
+ workflow_py = os.path.join(temp_dir, *module.split("."), "workflow.py")
73
+ assert os.path.exists(workflow_py)
74
+ with open(workflow_py) as f:
75
+ assert f.read() == "print('hello')"
76
+
77
+
78
+ def test_pull__sandbox_id_with_no_config(vellum_client):
79
+ # GIVEN a workflow sandbox id
80
+ workflow_sandbox_id = "87654321-0000-0000-0000-000000000000"
81
+
82
+ # AND the workflow pull API call returns a zip file
83
+ vellum_client.workflows.pull.return_value = iter([zip_file_map({"workflow.py": "print('hello')"})])
84
+
85
+ # AND we are currently in a new directory
86
+ current_dir = os.getcwd()
87
+ temp_dir = tempfile.mkdtemp()
88
+ os.chdir(temp_dir)
89
+
90
+ # WHEN the user runs the pull command with the workflow sandbox id and no module
91
+ pull_command(workflow_sandbox_id=workflow_sandbox_id)
92
+ os.chdir(current_dir)
93
+
94
+ # THEN the pull api is called with exclude_code=True
95
+ vellum_client.workflows.pull.assert_called_once()
96
+ workflow_py = os.path.join(temp_dir, "workflow_87654321", "workflow.py")
97
+ assert os.path.exists(workflow_py)
98
+ with open(workflow_py) as f:
74
99
  assert f.read() == "print('hello')"
75
100
 
76
101
 
@@ -168,3 +193,21 @@ def test_pull__include_json(vellum_client, mock_module):
168
193
  vellum_client.workflows.pull.assert_called_once()
169
194
  call_args = vellum_client.workflows.pull.call_args.kwargs
170
195
  assert call_args["request_options"]["additional_query_parameters"] == {"include_json": True}
196
+
197
+
198
+ def test_pull__exclude_code(vellum_client, mock_module):
199
+ # GIVEN a module on the user's filesystem
200
+ _, module = mock_module
201
+
202
+ # AND the workflow pull API call returns a zip file
203
+ vellum_client.workflows.pull.return_value = iter(
204
+ [zip_file_map({"workflow.py": "print('hello')", "workflow.json": "{}"})]
205
+ )
206
+
207
+ # WHEN the user runs the pull command
208
+ pull_command(module, exclude_code=True)
209
+
210
+ # THEN the pull api is called with exclude_code=True
211
+ vellum_client.workflows.pull.assert_called_once()
212
+ call_args = vellum_client.workflows.pull.call_args.kwargs
213
+ assert call_args["request_options"]["additional_query_parameters"] == {"exclude_code": True}
@@ -1,7 +1,7 @@
1
1
  from functools import cached_property
2
2
  import inspect
3
3
  from uuid import UUID
4
- from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar, get_args, get_origin, cast
4
+ from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, Type, TypeVar, cast, get_args, get_origin
5
5
 
6
6
  from vellum.workflows.nodes.bases.base import BaseNode
7
7
  from vellum.workflows.nodes.utils import get_wrapped_node, has_wrapped_node
@@ -1,5 +1,5 @@
1
1
  from uuid import UUID
2
- from typing import ClassVar, Generic, Optional, TypeVar
2
+ from typing import ClassVar, Dict, Generic, Optional, TypeVar
3
3
 
4
4
  from vellum.workflows.nodes.displayable.code_execution_node import CodeExecutionNode
5
5
  from vellum.workflows.nodes.displayable.code_execution_node.utils import read_file_from_path
@@ -20,6 +20,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType]
20
20
  output_id: ClassVar[Optional[UUID]] = None
21
21
  log_output_id: ClassVar[Optional[UUID]] = None
22
22
 
23
+ node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
24
+
23
25
  def serialize(
24
26
  self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
25
27
  ) -> JsonObject:
@@ -27,6 +29,19 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType]
27
29
  node_id = self.node_id
28
30
 
29
31
  code = read_file_from_path(raise_if_descriptor(node.filepath))
32
+ code_inputs = raise_if_descriptor(node.code_inputs)
33
+
34
+ inputs = [
35
+ create_node_input(
36
+ node_id=node_id,
37
+ input_name=variable_name,
38
+ value=variable_value,
39
+ display_context=display_context,
40
+ input_id=self.node_input_ids_by_name.get(variable_name),
41
+ )
42
+ for variable_name, variable_value in code_inputs.items()
43
+ ]
44
+
30
45
  code_node_input = create_node_input(
31
46
  node_id=node_id,
32
47
  input_name="code",
@@ -41,7 +56,7 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType]
41
56
  display_context=display_context,
42
57
  input_id=self.runtime_input_id,
43
58
  )
44
- inputs = [code_node_input, runtime_node_input]
59
+ inputs.extend([code_node_input, runtime_node_input])
45
60
 
46
61
  packages = raise_if_descriptor(node.packages)
47
62