vellum-ai 0.11.0__py3-none-any.whl → 0.11.3__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 (54) hide show
  1. vellum/__init__.py +18 -0
  2. vellum/client/core/client_wrapper.py +1 -1
  3. vellum/client/types/__init__.py +30 -0
  4. vellum/client/types/document_document_to_document_index.py +6 -0
  5. vellum/client/types/slim_document.py +2 -2
  6. vellum/client/types/slim_document_document_to_document_index.py +43 -0
  7. vellum/client/types/test_suite_run_exec_config.py +7 -1
  8. vellum/client/types/test_suite_run_exec_config_request.py +8 -0
  9. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config.py +31 -0
  10. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py +27 -0
  11. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py +27 -0
  12. vellum/client/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py +31 -0
  13. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config.py +31 -0
  14. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data.py +27 -0
  15. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_data_request.py +27 -0
  16. vellum/client/types/test_suite_run_workflow_sandbox_history_item_exec_config_request.py +31 -0
  17. vellum/types/slim_document_document_to_document_index.py +3 -0
  18. vellum/types/test_suite_run_prompt_sandbox_history_item_exec_config.py +3 -0
  19. vellum/types/test_suite_run_prompt_sandbox_history_item_exec_config_data.py +3 -0
  20. vellum/types/test_suite_run_prompt_sandbox_history_item_exec_config_data_request.py +3 -0
  21. vellum/types/test_suite_run_prompt_sandbox_history_item_exec_config_request.py +3 -0
  22. vellum/types/test_suite_run_workflow_sandbox_history_item_exec_config.py +3 -0
  23. vellum/types/test_suite_run_workflow_sandbox_history_item_exec_config_data.py +3 -0
  24. vellum/types/test_suite_run_workflow_sandbox_history_item_exec_config_data_request.py +3 -0
  25. vellum/types/test_suite_run_workflow_sandbox_history_item_exec_config_request.py +3 -0
  26. vellum/workflows/context.py +42 -0
  27. vellum/workflows/descriptors/base.py +1 -1
  28. vellum/workflows/nodes/bases/tests/test_base_node.py +1 -1
  29. vellum/workflows/nodes/core/inline_subworkflow_node/node.py +13 -7
  30. vellum/workflows/nodes/core/map_node/node.py +27 -4
  31. vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py +21 -0
  32. vellum/workflows/nodes/displayable/api_node/node.py +3 -2
  33. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +9 -0
  34. vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +10 -1
  35. vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +10 -1
  36. vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py +1 -1
  37. vellum/workflows/runner/runner.py +74 -70
  38. vellum/workflows/workflows/event_filters.py +4 -1
  39. {vellum_ai-0.11.0.dist-info → vellum_ai-0.11.3.dist-info}/METADATA +1 -1
  40. {vellum_ai-0.11.0.dist-info → vellum_ai-0.11.3.dist-info}/RECORD +54 -35
  41. vellum_cli/pull.py +3 -1
  42. vellum_cli/tests/test_pull.py +18 -0
  43. vellum_ee/workflows/display/base.py +1 -2
  44. vellum_ee/workflows/display/nodes/vellum/api_node.py +53 -54
  45. vellum_ee/workflows/display/nodes/vellum/merge_node.py +20 -1
  46. vellum_ee/workflows/display/nodes/vellum/templating_node.py +15 -4
  47. vellum_ee/workflows/display/nodes/vellum/utils.py +26 -6
  48. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +29 -1
  49. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +2 -2
  50. vellum_ee/workflows/display/vellum.py +4 -4
  51. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +18 -9
  52. {vellum_ai-0.11.0.dist-info → vellum_ai-0.11.3.dist-info}/LICENSE +0 -0
  53. {vellum_ai-0.11.0.dist-info → vellum_ai-0.11.3.dist-info}/WHEEL +0 -0
  54. {vellum_ai-0.11.0.dist-info → vellum_ai-0.11.3.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  from uuid import UUID
2
- from typing import Any, List, Optional, cast
2
+ from typing import Any, List, Optional, Type, cast
3
3
 
4
4
  from vellum.workflows.descriptors.base import BaseDescriptor
5
5
  from vellum.workflows.expressions.coalesce_expression import CoalesceExpression
@@ -13,6 +13,8 @@ from vellum_ee.workflows.display.vellum import (
13
13
  NodeInput,
14
14
  NodeInputValuePointer,
15
15
  NodeInputValuePointerRule,
16
+ WorkspaceSecretData,
17
+ WorkspaceSecretPointer,
16
18
  )
17
19
 
18
20
 
@@ -22,6 +24,7 @@ def create_node_input(
22
24
  value: Any,
23
25
  display_context: WorkflowDisplayContext,
24
26
  input_id: Optional[UUID],
27
+ pointer_type: Optional[Type[NodeInputValuePointerRule]] = ConstantValuePointer,
25
28
  ) -> NodeInput:
26
29
  input_id = input_id or uuid4_from_hash(f"{node_id}|{input_name}")
27
30
  if (
@@ -33,7 +36,7 @@ def create_node_input(
33
36
  if wrapped_node._is_wrapped_node:
34
37
  value = getattr(wrapped_node.Outputs, value.name)
35
38
 
36
- rules = create_node_input_value_pointer_rules(value, display_context)
39
+ rules = create_node_input_value_pointer_rules(value, display_context, pointer_type=pointer_type)
37
40
  return NodeInput(
38
41
  id=str(input_id),
39
42
  key=input_name,
@@ -48,6 +51,7 @@ def create_node_input_value_pointer_rules(
48
51
  value: Any,
49
52
  display_context: WorkflowDisplayContext,
50
53
  existing_rules: Optional[List[NodeInputValuePointerRule]] = None,
54
+ pointer_type: Optional[Type[NodeInputValuePointerRule]] = None,
51
55
  ) -> List[NodeInputValuePointerRule]:
52
56
  node_input_value_pointer_rules: List[NodeInputValuePointerRule] = existing_rules or []
53
57
 
@@ -59,18 +63,34 @@ def create_node_input_value_pointer_rules(
59
63
 
60
64
  if isinstance(value, CoalesceExpression):
61
65
  # Recursively handle the left-hand side
62
- lhs_rules = create_node_input_value_pointer_rules(value.lhs, display_context, [])
66
+ lhs_rules = create_node_input_value_pointer_rules(value.lhs, display_context, [], pointer_type=pointer_type)
63
67
  node_input_value_pointer_rules.extend(lhs_rules)
64
68
 
65
69
  # Handle the right-hand side
66
70
  if not isinstance(value.rhs, CoalesceExpression):
67
- rhs_rules = create_node_input_value_pointer_rules(value.rhs, display_context, [])
71
+ rhs_rules = create_node_input_value_pointer_rules(
72
+ value.rhs, display_context, [], pointer_type=pointer_type
73
+ )
68
74
  node_input_value_pointer_rules.extend(rhs_rules)
69
75
  else:
70
76
  # Non-CoalesceExpression case
71
77
  node_input_value_pointer_rules.append(create_node_input_value_pointer_rule(value, display_context))
72
78
  else:
73
- vellum_variable_value = primitive_to_vellum_value(value)
74
- node_input_value_pointer_rules.append(ConstantValuePointer(type="CONSTANT_VALUE", data=vellum_variable_value))
79
+ pointer = create_pointer(value, pointer_type)
80
+ node_input_value_pointer_rules.append(pointer)
75
81
 
76
82
  return node_input_value_pointer_rules
83
+
84
+
85
+ def create_pointer(
86
+ value: Any,
87
+ pointer_type: Optional[Type[NodeInputValuePointerRule]] = None,
88
+ ) -> NodeInputValuePointerRule:
89
+ if value is None:
90
+ if pointer_type is WorkspaceSecretPointer:
91
+ return WorkspaceSecretPointer(
92
+ type="WORKSPACE_SECRET", data=WorkspaceSecretData(type="STRING", workspace_secret_id=None)
93
+ )
94
+
95
+ vellum_variable_value = primitive_to_vellum_value(value)
96
+ return ConstantValuePointer(type="CONSTANT_VALUE", data=vellum_variable_value)
@@ -119,6 +119,16 @@ def test_serialize_workflow(vellum_client):
119
119
  "combinator": "OR",
120
120
  },
121
121
  },
122
+ {
123
+ "id": "fee5e3c9-442a-4922-ba80-5ee07361cea7",
124
+ "key": "bearer_token_value",
125
+ "value": {
126
+ "rules": [
127
+ {"type": "WORKSPACE_SECRET", "data": {"type": "STRING", "workspace_secret_id": None}}
128
+ ],
129
+ "combinator": "OR",
130
+ },
131
+ },
122
132
  {
123
133
  "id": "2fcdfbc3-8095-4277-bb4a-a201fd326b54",
124
134
  "key": "api_key_header_key",
@@ -143,6 +153,24 @@ def test_serialize_workflow(vellum_client):
143
153
  "combinator": "OR",
144
154
  },
145
155
  },
156
+ {
157
+ "id": "57c31247-998a-430d-bb62-bf50eca7df35",
158
+ "key": "additional_header_key",
159
+ "value": {
160
+ "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "additional_header"}}],
161
+ "combinator": "OR",
162
+ },
163
+ },
164
+ {
165
+ "id": "47b32274-f19b-4c15-b788-55c069c311c5",
166
+ "key": "additional_header_value",
167
+ "value": {
168
+ "rules": [
169
+ {"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "additional header value"}}
170
+ ],
171
+ "combinator": "OR",
172
+ },
173
+ },
146
174
  ],
147
175
  "data": {
148
176
  "label": "Simple A P I Node",
@@ -153,7 +181,7 @@ def test_serialize_workflow(vellum_client):
153
181
  "method_input_id": "fd61b5ac-39f9-4cfe-a839-f8ce78c202df",
154
182
  "body_input_id": "c3a17ceb-e201-4025-b18a-9162aac7705e",
155
183
  "authorization_type_input_id": "3092bf23-3202-4f3e-874c-9a33ccc73459",
156
- "bearer_token_value_input_id": None,
184
+ "bearer_token_value_input_id": "fee5e3c9-442a-4922-ba80-5ee07361cea7",
157
185
  "api_key_header_key_input_id": "2fcdfbc3-8095-4277-bb4a-a201fd326b54",
158
186
  "api_key_header_value_input_id": "d794bb51-a419-4fd8-be63-dfaf4166e831",
159
187
  "additional_headers": [
@@ -218,7 +218,7 @@ def test_serialize_workflow__await_all():
218
218
  "source_node_id": "59243c65-053f-4ea6-9157-3f3edb1477bf",
219
219
  "source_handle_id": "b9c5f52b-b714-46e8-a09c-38b4e770dd36",
220
220
  "target_node_id": "37c10e8a-771b-432b-a767-31f5007851f0",
221
- "target_handle_id": "0efd256f-f5f6-45fe-9adb-651780f5e63d",
221
+ "target_handle_id": "42eeb66c-9792-4609-8c71-3a56f668f4dc",
222
222
  "type": "DEFAULT",
223
223
  },
224
224
  {
@@ -226,7 +226,7 @@ def test_serialize_workflow__await_all():
226
226
  "source_node_id": "127ef456-91bc-43c6-bd8b-1772db5e3cb5",
227
227
  "source_handle_id": "b0bd17f3-4ce6-4232-9666-ec8afa161bf2",
228
228
  "target_node_id": "37c10e8a-771b-432b-a767-31f5007851f0",
229
- "target_handle_id": "0efd256f-f5f6-45fe-9adb-651780f5e63d",
229
+ "target_handle_id": "f40ff7fb-de1b-4aa4-ba3c-7630f7357cbf",
230
230
  "type": "DEFAULT",
231
231
  },
232
232
  {
@@ -74,7 +74,9 @@ class WorkflowMetaVellumDisplay(WorkflowMetaVellumDisplayOverrides):
74
74
 
75
75
  @dataclass
76
76
  class WorkflowInputsVellumDisplayOverrides(WorkflowInputsDisplay, WorkflowInputsDisplayOverrides):
77
- pass
77
+ name: Optional[str] = None
78
+ required: Optional[bool] = None
79
+ color: Optional[str] = None
78
80
 
79
81
 
80
82
  @dataclass
@@ -115,8 +117,6 @@ class WorkflowOutputVellumDisplayOverrides(WorkflowOutputDisplay, WorkflowOutput
115
117
  target_handle_id: UUID
116
118
  display_data: NodeDisplayData
117
119
  edge_id: UUID
118
- # source_node_id: Optional[UUID]
119
- # source_handle_id: Optional[UUID]
120
120
 
121
121
 
122
122
  @dataclass
@@ -202,7 +202,7 @@ class InputVariablePointer(UniversalBaseModel):
202
202
 
203
203
  class WorkspaceSecretData(UniversalBaseModel):
204
204
  type: VellumVariableType
205
- workspace_secret_id: str
205
+ workspace_secret_id: Optional[str] = None
206
206
 
207
207
 
208
208
  class WorkspaceSecretPointer(UniversalBaseModel):
@@ -12,9 +12,9 @@ from vellum.workflows.references import WorkflowInputReference
12
12
  from vellum.workflows.references.output import OutputReference
13
13
  from vellum.workflows.types.core import JsonArray, JsonObject
14
14
  from vellum.workflows.types.generics import WorkflowType
15
+ from vellum_ee.workflows.display.nodes import BaseMergeNodeDisplay
15
16
  from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
16
17
  from vellum_ee.workflows.display.nodes.types import PortDisplay
17
- from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
18
18
  from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
19
19
  from vellum_ee.workflows.display.utils.uuids import uuid4_from_hash
20
20
  from vellum_ee.workflows.display.utils.vellum import infer_vellum_variable_type, primitive_to_vellum_value
@@ -57,17 +57,17 @@ class VellumWorkflowDisplay(
57
57
  def serialize(self, raise_errors: bool = True) -> JsonObject:
58
58
  input_variables: JsonArray = []
59
59
  for workflow_input, workflow_input_display in self.display_context.workflow_input_displays.items():
60
- default = (
61
- primitive_to_vellum_value(raise_if_descriptor(workflow_input.instance))
62
- if workflow_input.instance
63
- else None
60
+ default = primitive_to_vellum_value(workflow_input.instance) if workflow_input.instance else None
61
+ required = (
62
+ workflow_input_display.required
63
+ if workflow_input_display.required is not None
64
+ else type(None) not in workflow_input.types
64
65
  )
65
- required = type(None) not in workflow_input.types
66
66
 
67
67
  input_variables.append(
68
68
  {
69
69
  "id": str(workflow_input_display.id),
70
- "key": workflow_input.name,
70
+ "key": workflow_input_display.name or workflow_input.name,
71
71
  "type": infer_vellum_variable_type(workflow_input),
72
72
  "default": default.dict() if default else None,
73
73
  "required": required,
@@ -270,12 +270,16 @@ class VellumWorkflowDisplay(
270
270
  self, workflow_input: WorkflowInputReference, overrides: Optional[WorkflowInputsVellumDisplayOverrides] = None
271
271
  ) -> WorkflowInputsVellumDisplay:
272
272
  workflow_input_id: UUID
273
+ required = None
274
+ color = None
273
275
  if overrides:
274
276
  workflow_input_id = overrides.id
277
+ required = overrides.required
278
+ color = overrides.color
275
279
  else:
276
280
  workflow_input_id = uuid4_from_hash(f"{self.workflow_id}|inputs|id|{workflow_input.name}")
277
281
 
278
- return WorkflowInputsVellumDisplay(id=workflow_input_id)
282
+ return WorkflowInputsVellumDisplay(id=workflow_input_id, required=required, color=color)
279
283
 
280
284
  def _generate_entrypoint_display(
281
285
  self,
@@ -363,7 +367,12 @@ class VellumWorkflowDisplay(
363
367
 
364
368
  target_node_display = node_displays[target_node]
365
369
  target_node_id = target_node_display.node_id
366
- target_handle_id = target_node_display.get_target_handle_id()
370
+
371
+ target_handle_id: UUID
372
+ if isinstance(target_node_display, BaseMergeNodeDisplay):
373
+ target_handle_id = target_node_display.get_target_handle_id_by_source_node_id(source_node_id)
374
+ else:
375
+ target_handle_id = target_node_display.get_target_handle_id()
367
376
 
368
377
  return self._generate_edge_display_from_source(
369
378
  source_node_id, source_handle_id, target_node_id, target_handle_id, overrides