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.
- vellum/client/core/client_wrapper.py +1 -1
- vellum/workflows/events/types.py +1 -1
- vellum/workflows/nodes/core/inline_subworkflow_node/node.py +1 -0
- vellum/workflows/nodes/core/templating_node/node.py +5 -0
- vellum/workflows/nodes/displayable/api_node/node.py +1 -1
- vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +1 -2
- vellum/workflows/nodes/displayable/code_execution_node/node.py +1 -2
- vellum/workflows/nodes/displayable/code_execution_node/utils.py +13 -2
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py +10 -3
- vellum/workflows/nodes/displayable/prompt_deployment_node/node.py +6 -1
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +1 -2
- vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +1 -2
- vellum/workflows/runner/runner.py +43 -1
- vellum/workflows/types/__init__.py +5 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/METADATA +1 -1
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/RECORD +24 -24
- vellum_cli/__init__.py +23 -4
- vellum_cli/pull.py +28 -13
- vellum_cli/tests/test_pull.py +45 -2
- vellum_ee/workflows/display/nodes/base_node_display.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +17 -2
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/LICENSE +0 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/WHEEL +0 -0
- {vellum_ai-0.10.7.dist-info → vellum_ai-0.10.8.dist-info}/entry_points.txt +0 -0
@@ -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.
|
20
|
+
"X-Fern-SDK-Version": "0.10.8",
|
21
21
|
}
|
22
22
|
headers["X_API_KEY"] = self.api_key
|
23
23
|
return headers
|
vellum/workflows/events/types.py
CHANGED
@@ -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 `
|
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] -
|
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[
|
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
|
-
|
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(
|
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
|
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[
|
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[
|
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] -
|
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 -
|
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
|
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:
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
1354
|
-
vellum_ai-0.10.
|
1355
|
-
vellum_ai-0.10.
|
1356
|
-
vellum_ai-0.10.
|
1357
|
-
vellum_ai-0.10.
|
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(
|
46
|
-
|
47
|
-
|
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(
|
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]
|
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)
|
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
|
-
|
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(
|
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}")
|
vellum_cli/tests/test_pull.py
CHANGED
@@ -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
|
-
|
73
|
-
|
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
|
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
|
59
|
+
inputs.extend([code_node_input, runtime_node_input])
|
45
60
|
|
46
61
|
packages = raise_if_descriptor(node.packages)
|
47
62
|
|
File without changes
|
File without changes
|
File without changes
|