vellum-ai 0.14.0__py3-none-any.whl → 0.14.2__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 (51) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/prompts/blocks/compilation.py +23 -16
  3. vellum/prompts/blocks/tests/test_compilation.py +29 -0
  4. vellum/utils/templating/constants.py +6 -2
  5. vellum/utils/templating/custom_filters.py +22 -1
  6. vellum/utils/templating/render.py +5 -2
  7. vellum/utils/templating/tests/__init__.py +0 -0
  8. vellum/utils/templating/tests/test_custom_filters.py +19 -0
  9. vellum/workflows/errors/types.py +3 -0
  10. vellum/workflows/nodes/core/templating_node/node.py +3 -3
  11. vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py +66 -1
  12. vellum/workflows/nodes/displayable/code_execution_node/node.py +5 -4
  13. vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py +51 -0
  14. vellum/workflows/nodes/displayable/code_execution_node/utils.py +13 -11
  15. vellum/workflows/nodes/utils.py +9 -1
  16. vellum/workflows/state/base.py +21 -1
  17. {vellum_ai-0.14.0.dist-info → vellum_ai-0.14.2.dist-info}/METADATA +1 -1
  18. {vellum_ai-0.14.0.dist-info → vellum_ai-0.14.2.dist-info}/RECORD +51 -46
  19. vellum_cli/pull.py +3 -11
  20. vellum_ee/workflows/display/base.py +14 -0
  21. vellum_ee/workflows/display/nodes/base_node_display.py +11 -22
  22. vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +52 -0
  23. vellum_ee/workflows/display/tests/test_vellum_workflow_display.py +1 -0
  24. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +4 -1
  25. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py +1 -0
  26. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +3 -0
  27. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +4 -0
  28. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_state_serialization.py +243 -0
  29. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py +1 -0
  30. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +1 -0
  31. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py +1 -1
  32. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +1 -0
  33. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +1 -0
  34. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +1 -0
  35. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py +1 -0
  36. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py +1 -1
  37. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py +1 -0
  38. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +1 -0
  39. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py +1 -0
  40. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py +1 -0
  41. vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py +1 -0
  42. vellum_ee/workflows/display/types.py +5 -1
  43. vellum_ee/workflows/display/utils/expressions.py +26 -0
  44. vellum_ee/workflows/display/utils/vellum.py +5 -0
  45. vellum_ee/workflows/display/vellum.py +15 -1
  46. vellum_ee/workflows/display/workflows/base_workflow_display.py +30 -1
  47. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +54 -6
  48. vellum_ee/workflows/tests/local_workflow/display/workflow.py +0 -2
  49. {vellum_ai-0.14.0.dist-info → vellum_ai-0.14.2.dist-info}/LICENSE +0 -0
  50. {vellum_ai-0.14.0.dist-info → vellum_ai-0.14.2.dist-info}/WHEEL +0 -0
  51. {vellum_ai-0.14.0.dist-info → vellum_ai-0.14.2.dist-info}/entry_points.txt +0 -0
@@ -25,6 +25,8 @@ from vellum_ee.workflows.display.vellum import (
25
25
  EntrypointVellumDisplay,
26
26
  EntrypointVellumDisplayOverrides,
27
27
  NodeDisplayData,
28
+ StateValueVellumDisplay,
29
+ StateValueVellumDisplayOverrides,
28
30
  WorkflowInputsVellumDisplay,
29
31
  WorkflowInputsVellumDisplayOverrides,
30
32
  WorkflowMetaVellumDisplay,
@@ -44,6 +46,8 @@ class VellumWorkflowDisplay(
44
46
  WorkflowMetaVellumDisplayOverrides,
45
47
  WorkflowInputsVellumDisplay,
46
48
  WorkflowInputsVellumDisplayOverrides,
49
+ StateValueVellumDisplay,
50
+ StateValueVellumDisplayOverrides,
47
51
  BaseNodeDisplay,
48
52
  EntrypointVellumDisplay,
49
53
  EntrypointVellumDisplayOverrides,
@@ -76,6 +80,25 @@ class VellumWorkflowDisplay(
76
80
  }
77
81
  )
78
82
 
83
+ state_variables: JsonArray = []
84
+ for state_value, state_value_display in self.display_context.state_value_displays.items():
85
+ default = primitive_to_vellum_value(state_value.instance) if state_value.instance else None
86
+ required = (
87
+ state_value_display.required
88
+ if state_value_display.required is not None
89
+ else type(None) not in state_value.types
90
+ )
91
+ state_variables.append(
92
+ {
93
+ "id": str(state_value_display.id),
94
+ "key": state_value_display.name or state_value.name,
95
+ "type": infer_vellum_variable_type(state_value),
96
+ "default": default.dict() if default else None,
97
+ "required": required,
98
+ "extensions": {"color": state_value_display.color},
99
+ }
100
+ )
101
+
79
102
  nodes: JsonArray = []
80
103
  edges: JsonArray = []
81
104
 
@@ -153,6 +176,16 @@ class VellumWorkflowDisplay(
153
176
  except IndexError:
154
177
  source_node_display = None
155
178
 
179
+ synthetic_target_handle_id = (
180
+ str(workflow_output_display.target_handle_id)
181
+ if workflow_output_display.target_handle_id
182
+ else str(uuid4_from_hash(f"{self.workflow_id}|target_handle_id|{workflow_output_display.name}"))
183
+ )
184
+ synthetic_display_data = (
185
+ workflow_output_display.display_data.dict()
186
+ if workflow_output_display.display_data
187
+ else NodeDisplayData().dict()
188
+ )
156
189
  nodes.append(
157
190
  {
158
191
  "id": str(final_output_node_id),
@@ -160,13 +193,13 @@ class VellumWorkflowDisplay(
160
193
  "data": {
161
194
  "label": workflow_output_display.label,
162
195
  "name": workflow_output_display.name,
163
- "target_handle_id": str(workflow_output_display.target_handle_id),
196
+ "target_handle_id": synthetic_target_handle_id,
164
197
  "output_id": str(workflow_output_display.id),
165
198
  "output_type": inferred_type,
166
199
  "node_input_id": str(node_input.id),
167
200
  },
168
201
  "inputs": [node_input.dict()],
169
- "display_data": workflow_output_display.display_data.dict(),
202
+ "display_data": synthetic_display_data,
170
203
  "base": final_output_node_base,
171
204
  "definition": None,
172
205
  }
@@ -188,7 +221,7 @@ class VellumWorkflowDisplay(
188
221
  "source_node_id": str(source_node_display.node_id),
189
222
  "source_handle_id": str(source_handle_id),
190
223
  "target_node_id": str(workflow_output_display.node_id),
191
- "target_handle_id": str(workflow_output_display.target_handle_id),
224
+ "target_handle_id": synthetic_target_handle_id,
192
225
  "type": "DEFAULT",
193
226
  }
194
227
  )
@@ -244,6 +277,7 @@ class VellumWorkflowDisplay(
244
277
  },
245
278
  },
246
279
  "input_variables": input_variables,
280
+ "state_variables": state_variables,
247
281
  "output_variables": output_variables,
248
282
  }
249
283
 
@@ -283,6 +317,23 @@ class VellumWorkflowDisplay(
283
317
 
284
318
  return WorkflowInputsVellumDisplay(id=workflow_input_id, name=name, required=required, color=color)
285
319
 
320
+ def _generate_state_value_display(
321
+ self, state_value: BaseDescriptor, overrides: Optional[StateValueVellumDisplayOverrides] = None
322
+ ) -> StateValueVellumDisplay:
323
+ state_value_id: UUID
324
+ name = None
325
+ required = None
326
+ color = None
327
+ if overrides:
328
+ state_value_id = overrides.id
329
+ name = overrides.name
330
+ required = overrides.required
331
+ color = overrides.color
332
+ else:
333
+ state_value_id = uuid4_from_hash(f"{self.workflow_id}|state_values|id|{state_value.name}")
334
+
335
+ return StateValueVellumDisplay(id=state_value_id, name=name, required=required, color=color)
336
+
286
337
  def _generate_entrypoint_display(
287
338
  self,
288
339
  entrypoint: Type[BaseNode],
@@ -331,15 +382,12 @@ class VellumWorkflowDisplay(
331
382
 
332
383
  output_id = uuid4_from_hash(f"{self.workflow_id}|id|{output.name}")
333
384
  node_id = uuid4_from_hash(f"{self.workflow_id}|node_id|{output.name}")
334
- target_handle_id = uuid4_from_hash(f"{self.workflow_id}|target_handle_id|{output.name}")
335
385
 
336
386
  return WorkflowOutputVellumDisplay(
337
387
  id=output_id,
338
388
  node_id=node_id,
339
389
  name=output.name,
340
390
  label="Final Output",
341
- target_handle_id=target_handle_id,
342
- display_data=NodeDisplayData(),
343
391
  )
344
392
 
345
393
  def _generate_edge_display(
@@ -50,7 +50,5 @@ class WorkflowDisplay(VellumWorkflowDisplay[Workflow]):
50
50
  node_id=UUID("f3ef4b2b-fec9-4026-9cc6-e5eac295307f"),
51
51
  name="final-output",
52
52
  label="Final Output",
53
- target_handle_id=UUID("3ec34f6e-da48-40d5-a65b-a48fefa75763"),
54
- display_data=NodeDisplayData(position=NodeDisplayPosition(x=2750, y=210), width=459, height=234),
55
53
  )
56
54
  }