vellum-ai 1.3.8__py3-none-any.whl → 1.3.10__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.
- vellum/client/core/client_wrapper.py +2 -2
- vellum/client/reference.md +71 -0
- vellum/client/resources/workflows/client.py +80 -0
- vellum/client/resources/workflows/raw_client.py +98 -0
- vellum/client/types/vellum_error.py +2 -1
- vellum/client/types/vellum_error_request.py +2 -1
- vellum/workflows/errors/types.py +3 -1
- vellum/workflows/events/tests/test_event.py +1 -0
- vellum/workflows/exceptions.py +11 -2
- vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py +2 -0
- vellum/workflows/types/definition.py +32 -1
- vellum/workflows/utils/tests/test_vellum_variables.py +7 -1
- vellum/workflows/utils/vellum_variables.py +42 -3
- {vellum_ai-1.3.8.dist-info → vellum_ai-1.3.10.dist-info}/METADATA +1 -1
- {vellum_ai-1.3.8.dist-info → vellum_ai-1.3.10.dist-info}/RECORD +38 -38
- vellum_ee/workflows/display/editor/types.py +2 -0
- vellum_ee/workflows/display/nodes/base_node_display.py +42 -14
- vellum_ee/workflows/display/nodes/tests/test_base_node_display.py +64 -0
- vellum_ee/workflows/display/nodes/vellum/final_output_node.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/retry_node.py +1 -1
- vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py +12 -12
- vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py +4 -4
- vellum_ee/workflows/display/nodes/vellum/try_node.py +1 -1
- vellum_ee/workflows/display/tests/test_base_workflow_display.py +46 -0
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +1 -1
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py +8 -8
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +1 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +1 -0
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py +2 -1
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +2 -1
- vellum_ee/workflows/display/utils/events.py +7 -1
- vellum_ee/workflows/display/utils/expressions.py +35 -42
- vellum_ee/workflows/display/utils/tests/test_events.py +4 -4
- vellum_ee/workflows/display/workflows/base_workflow_display.py +1 -1
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +10 -10
- {vellum_ai-1.3.8.dist-info → vellum_ai-1.3.10.dist-info}/LICENSE +0 -0
- {vellum_ai-1.3.8.dist-info → vellum_ai-1.3.10.dist-info}/WHEEL +0 -0
- {vellum_ai-1.3.8.dist-info → vellum_ai-1.3.10.dist-info}/entry_points.txt +0 -0
@@ -476,3 +476,49 @@ def test_serialize_workflow_with_node_display_data():
|
|
476
476
|
|
477
477
|
assert test_node is not None, "TestNode not found in serialized nodes"
|
478
478
|
assert test_node["display_data"] == {"position": {"x": 100, "y": 200}, "z_index": 10, "width": 300, "height": 150}
|
479
|
+
|
480
|
+
|
481
|
+
def test_serialize_workflow_with_node_icon_and_color():
|
482
|
+
"""
|
483
|
+
Tests that nodes with icon and color serialize correctly in workflow context.
|
484
|
+
"""
|
485
|
+
|
486
|
+
# GIVEN a workflow with a node that has icon and color
|
487
|
+
class TestNode(BaseNode):
|
488
|
+
class Outputs(BaseNode.Outputs):
|
489
|
+
result: str
|
490
|
+
|
491
|
+
class TestWorkflow(BaseWorkflow):
|
492
|
+
graph = TestNode
|
493
|
+
|
494
|
+
class Outputs(BaseWorkflow.Outputs):
|
495
|
+
final_result = TestNode.Outputs.result
|
496
|
+
|
497
|
+
class TestNodeDisplay(BaseNodeDisplay[TestNode]):
|
498
|
+
display_data = NodeDisplayData(position=NodeDisplayPosition(x=100, y=200), icon="vellum:icon:cog", color="navy")
|
499
|
+
|
500
|
+
class TestWorkflowDisplay(BaseWorkflowDisplay[TestWorkflow]):
|
501
|
+
pass
|
502
|
+
|
503
|
+
# WHEN we serialize the workflow
|
504
|
+
display = get_workflow_display(
|
505
|
+
base_display_class=TestWorkflowDisplay,
|
506
|
+
workflow_class=TestWorkflow,
|
507
|
+
)
|
508
|
+
serialized_workflow = display.serialize()
|
509
|
+
|
510
|
+
# THEN the node should include icon and color in display_data
|
511
|
+
workflow_raw_data = cast(Dict[str, Any], serialized_workflow["workflow_raw_data"])
|
512
|
+
nodes = cast(List[Dict[str, Any]], workflow_raw_data["nodes"])
|
513
|
+
|
514
|
+
test_node = None
|
515
|
+
for node in nodes:
|
516
|
+
if node.get("type") == "GENERIC":
|
517
|
+
definition = node.get("definition")
|
518
|
+
if isinstance(definition, dict) and definition.get("name") == "TestNode":
|
519
|
+
test_node = node
|
520
|
+
break
|
521
|
+
|
522
|
+
assert test_node is not None, "TestNode not found in serialized nodes"
|
523
|
+
assert test_node["display_data"]["icon"] == "vellum:icon:cog"
|
524
|
+
assert test_node["display_data"]["color"] == "navy"
|
@@ -293,7 +293,7 @@ def test_serialize_node__workflow_input_as_nested_chat_history():
|
|
293
293
|
"type": "DICTIONARY_REFERENCE",
|
294
294
|
"entries": [
|
295
295
|
{
|
296
|
-
"id": "
|
296
|
+
"id": "07513ab1-cf47-490e-8b43-5da226332a00",
|
297
297
|
"key": "hello",
|
298
298
|
"value": {
|
299
299
|
"type": "WORKFLOW_INPUT",
|
@@ -219,7 +219,7 @@ def test_serialize_workflow():
|
|
219
219
|
"type": "DICTIONARY_REFERENCE",
|
220
220
|
"entries": [
|
221
221
|
{
|
222
|
-
"id": "
|
222
|
+
"id": "6eb6687c-f894-4398-8e62-7dc89e96a0a4",
|
223
223
|
"key": "noun",
|
224
224
|
"value": {
|
225
225
|
"type": "WORKFLOW_INPUT",
|
@@ -521,37 +521,37 @@ def test_serialize_workflow_with_nested_descriptor_blocks():
|
|
521
521
|
{
|
522
522
|
"entries": [
|
523
523
|
{
|
524
|
-
"id": "
|
524
|
+
"id": "4e61fbcf-13b3-4d5f-b5fb-2bf919a92045",
|
525
525
|
"key": "block_type",
|
526
526
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "CHAT_MESSAGE"}},
|
527
527
|
},
|
528
528
|
{
|
529
|
-
"id": "
|
529
|
+
"id": "79dd757e-46db-4c36-9ffc-ddb763d14f27",
|
530
530
|
"key": "state",
|
531
531
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": None}},
|
532
532
|
},
|
533
533
|
{
|
534
|
-
"id": "
|
534
|
+
"id": "2f8164e8-5495-4b9c-8268-d75618cd0842",
|
535
535
|
"key": "cache_config",
|
536
536
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": None}},
|
537
537
|
},
|
538
538
|
{
|
539
|
-
"id": "
|
539
|
+
"id": "0e8dc132-de9a-40dc-9845-336bc957df5a",
|
540
540
|
"key": "chat_role",
|
541
541
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "SYSTEM"}},
|
542
542
|
},
|
543
543
|
{
|
544
|
-
"id": "
|
544
|
+
"id": "755a45d2-2420-4414-b318-5790880f84ec",
|
545
545
|
"key": "chat_source",
|
546
546
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": None}},
|
547
547
|
},
|
548
548
|
{
|
549
|
-
"id": "
|
549
|
+
"id": "3a563cdb-d130-497f-bac6-c324a4349a3c",
|
550
550
|
"key": "chat_message_unterminated",
|
551
551
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": None}},
|
552
552
|
},
|
553
553
|
{
|
554
|
-
"id": "
|
554
|
+
"id": "2d0c084e-c54f-48f5-9444-a17f8aeb8f76",
|
555
555
|
"key": "blocks",
|
556
556
|
"value": {
|
557
557
|
"items": [
|
@@ -131,6 +131,7 @@ def test_serialize_workflow():
|
|
131
131
|
"id": "1381c078-efa2-4255-89a1-7b4cb742c7fc",
|
132
132
|
"label": "Start Node",
|
133
133
|
"type": "GENERIC",
|
134
|
+
"should_file_merge": True,
|
134
135
|
"display_data": {"position": {"x": 200.0, "y": -50.0}},
|
135
136
|
"base": {"name": "BaseNode", "module": ["vellum", "workflows", "nodes", "bases", "base"]},
|
136
137
|
"definition": {
|
vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py
CHANGED
@@ -118,6 +118,7 @@ def test_serialize_workflow():
|
|
118
118
|
"id": "baf6d316-dc75-41e8-96c0-015aede96309",
|
119
119
|
"label": "Iteration",
|
120
120
|
"type": "GENERIC",
|
121
|
+
"should_file_merge": True,
|
121
122
|
"display_data": {"position": {"x": 200.0, "y": -50.0}},
|
122
123
|
"base": {
|
123
124
|
"name": "BaseNode",
|
@@ -155,6 +155,7 @@ def test_serialize_workflow():
|
|
155
155
|
"id": "1381c078-efa2-4255-89a1-7b4cb742c7fc",
|
156
156
|
"label": "Start Node",
|
157
157
|
"type": "GENERIC",
|
158
|
+
"should_file_merge": True,
|
158
159
|
"display_data": {"position": {"x": 200.0, "y": -50.0}},
|
159
160
|
"base": {
|
160
161
|
"name": "BaseNode",
|
@@ -400,7 +401,7 @@ def test_serialize_workflow():
|
|
400
401
|
"type": "DICTIONARY_REFERENCE",
|
401
402
|
"entries": [
|
402
403
|
{
|
403
|
-
"id": "
|
404
|
+
"id": "8eb8b551-9b48-43b3-861f-52adb5c585a8",
|
404
405
|
"key": "question",
|
405
406
|
"value": {
|
406
407
|
"type": "WORKFLOW_INPUT",
|
@@ -42,6 +42,7 @@ def test_serialize_workflow():
|
|
42
42
|
"id": "21f29cac-da87-495f-bba1-093d423f4e46",
|
43
43
|
"label": "Get Current Weather Node",
|
44
44
|
"type": "GENERIC",
|
45
|
+
"should_file_merge": True,
|
45
46
|
"display_data": {
|
46
47
|
"position": {"x": 200.0, "y": -50.0},
|
47
48
|
"comment": {
|
@@ -169,7 +170,7 @@ def test_serialize_workflow():
|
|
169
170
|
"type": "DICTIONARY_REFERENCE",
|
170
171
|
"entries": [
|
171
172
|
{
|
172
|
-
"id": "
|
173
|
+
"id": "8eb8b551-9b48-43b3-861f-52adb5c585a8",
|
173
174
|
"key": "question",
|
174
175
|
"value": {
|
175
176
|
"type": "WORKFLOW_INPUT",
|
@@ -1,3 +1,6 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
from vellum import Vellum
|
1
4
|
from vellum.workflows.events.workflow import WorkflowExecutionInitiatedEvent
|
2
5
|
from vellum_ee.workflows.display.utils.registry import (
|
3
6
|
get_parent_display_context_from_event,
|
@@ -25,7 +28,9 @@ def _should_mark_workflow_dynamic(event: WorkflowExecutionInitiatedEvent) -> boo
|
|
25
28
|
return True
|
26
29
|
|
27
30
|
|
28
|
-
def event_enricher(
|
31
|
+
def event_enricher(
|
32
|
+
event: WorkflowExecutionInitiatedEvent, client: Optional[Vellum] = None
|
33
|
+
) -> WorkflowExecutionInitiatedEvent:
|
29
34
|
if event.name != "workflow.execution.initiated":
|
30
35
|
return event
|
31
36
|
|
@@ -33,6 +38,7 @@ def event_enricher(event: WorkflowExecutionInitiatedEvent) -> WorkflowExecutionI
|
|
33
38
|
workflow_display = get_workflow_display(
|
34
39
|
workflow_class=workflow_definition,
|
35
40
|
parent_display_context=get_parent_display_context_from_event(event),
|
41
|
+
client=client,
|
36
42
|
dry_run=True,
|
37
43
|
)
|
38
44
|
register_workflow_display_context(event.span_id, workflow_display.display_context)
|
@@ -2,6 +2,7 @@ from dataclasses import asdict, is_dataclass
|
|
2
2
|
import inspect
|
3
3
|
from io import StringIO
|
4
4
|
import sys
|
5
|
+
from uuid import UUID
|
5
6
|
from typing import TYPE_CHECKING, Any, Dict, List, cast
|
6
7
|
|
7
8
|
from pydantic import BaseModel
|
@@ -50,7 +51,6 @@ from vellum.workflows.references.state_value import StateValueReference
|
|
50
51
|
from vellum.workflows.references.vellum_secret import VellumSecretReference
|
51
52
|
from vellum.workflows.references.workflow_input import WorkflowInputReference
|
52
53
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
53
|
-
from vellum.workflows.types.definition import DeploymentDefinition
|
54
54
|
from vellum.workflows.types.generics import is_workflow_class
|
55
55
|
from vellum.workflows.utils.functions import compile_function_definition
|
56
56
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
@@ -157,7 +157,9 @@ def get_child_descriptor(value: LazyReference, display_context: "WorkflowDisplay
|
|
157
157
|
return value._get()
|
158
158
|
|
159
159
|
|
160
|
-
def _serialize_condition(
|
160
|
+
def _serialize_condition(
|
161
|
+
executable_id: UUID, display_context: "WorkflowDisplayContext", condition: BaseDescriptor
|
162
|
+
) -> JsonObject:
|
161
163
|
if isinstance(
|
162
164
|
condition,
|
163
165
|
(
|
@@ -171,16 +173,16 @@ def _serialize_condition(display_context: "WorkflowDisplayContext", condition: B
|
|
171
173
|
ParseJsonExpression,
|
172
174
|
),
|
173
175
|
):
|
174
|
-
lhs = serialize_value(display_context, condition._expression)
|
176
|
+
lhs = serialize_value(executable_id, display_context, condition._expression)
|
175
177
|
return {
|
176
178
|
"type": "UNARY_EXPRESSION",
|
177
179
|
"lhs": lhs,
|
178
180
|
"operator": convert_descriptor_to_operator(condition),
|
179
181
|
}
|
180
182
|
elif isinstance(condition, (BetweenExpression, NotBetweenExpression)):
|
181
|
-
base = serialize_value(display_context, condition._value)
|
182
|
-
lhs = serialize_value(display_context, condition._start)
|
183
|
-
rhs = serialize_value(display_context, condition._end)
|
183
|
+
base = serialize_value(executable_id, display_context, condition._value)
|
184
|
+
lhs = serialize_value(executable_id, display_context, condition._start)
|
185
|
+
rhs = serialize_value(executable_id, display_context, condition._end)
|
184
186
|
|
185
187
|
return {
|
186
188
|
"type": "TERNARY_EXPRESSION",
|
@@ -214,8 +216,8 @@ def _serialize_condition(display_context: "WorkflowDisplayContext", condition: B
|
|
214
216
|
OrExpression,
|
215
217
|
),
|
216
218
|
):
|
217
|
-
lhs = serialize_value(display_context, condition._lhs)
|
218
|
-
rhs = serialize_value(display_context, condition._rhs)
|
219
|
+
lhs = serialize_value(executable_id, display_context, condition._lhs)
|
220
|
+
rhs = serialize_value(executable_id, display_context, condition._rhs)
|
219
221
|
|
220
222
|
return {
|
221
223
|
"type": "BINARY_EXPRESSION",
|
@@ -226,9 +228,9 @@ def _serialize_condition(display_context: "WorkflowDisplayContext", condition: B
|
|
226
228
|
elif isinstance(condition, AccessorExpression):
|
227
229
|
return {
|
228
230
|
"type": "BINARY_EXPRESSION",
|
229
|
-
"lhs": serialize_value(display_context, condition._base),
|
231
|
+
"lhs": serialize_value(executable_id, display_context, condition._base),
|
230
232
|
"operator": "accessField",
|
231
|
-
"rhs": serialize_value(display_context, condition._field),
|
233
|
+
"rhs": serialize_value(executable_id, display_context, condition._field),
|
232
234
|
}
|
233
235
|
|
234
236
|
raise UnsupportedSerializationException(f"Unsupported condition type: {condition.__class__.__name__}")
|
@@ -248,16 +250,27 @@ def serialize_key(key: Any) -> str:
|
|
248
250
|
_UNDEFINED_SENTINEL: JsonObject = {"__undefined__": True}
|
249
251
|
|
250
252
|
|
251
|
-
def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> JsonObject:
|
253
|
+
def serialize_value(executable_id: UUID, display_context: "WorkflowDisplayContext", value: Any) -> JsonObject:
|
254
|
+
"""
|
255
|
+
Serialize a value to a JSON object.
|
256
|
+
|
257
|
+
Args:
|
258
|
+
executable_id: node id or workflow id
|
259
|
+
display_context: workflow display context
|
260
|
+
value: value to serialize
|
261
|
+
|
262
|
+
Returns:
|
263
|
+
serialized value
|
264
|
+
"""
|
252
265
|
if value is undefined:
|
253
266
|
return _UNDEFINED_SENTINEL
|
254
267
|
|
255
268
|
if isinstance(value, ConstantValueReference):
|
256
|
-
return serialize_value(display_context, value._value)
|
269
|
+
return serialize_value(executable_id, display_context, value._value)
|
257
270
|
|
258
271
|
if isinstance(value, LazyReference):
|
259
272
|
child_descriptor = get_child_descriptor(value, display_context)
|
260
|
-
return serialize_value(display_context, child_descriptor)
|
273
|
+
return serialize_value(executable_id, display_context, child_descriptor)
|
261
274
|
|
262
275
|
if isinstance(value, WorkflowInputReference):
|
263
276
|
try:
|
@@ -324,7 +337,7 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
|
|
324
337
|
if isinstance(value, list):
|
325
338
|
serialized_items = []
|
326
339
|
for item in value:
|
327
|
-
serialized_item = serialize_value(display_context, item)
|
340
|
+
serialized_item = serialize_value(executable_id, display_context, item)
|
328
341
|
if serialized_item != _UNDEFINED_SENTINEL:
|
329
342
|
serialized_items.append(serialized_item)
|
330
343
|
|
@@ -355,16 +368,16 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
|
|
355
368
|
|
356
369
|
if is_dataclass(value) and not isinstance(value, type):
|
357
370
|
dict_value = asdict(value)
|
358
|
-
return serialize_value(display_context, dict_value)
|
371
|
+
return serialize_value(executable_id, display_context, dict_value)
|
359
372
|
|
360
373
|
if isinstance(value, dict):
|
361
374
|
serialized_entries: List[Dict[str, Any]] = []
|
362
375
|
for key, val in value.items():
|
363
|
-
serialized_val = serialize_value(display_context, val)
|
376
|
+
serialized_val = serialize_value(executable_id, display_context, val)
|
364
377
|
if serialized_val != _UNDEFINED_SENTINEL:
|
365
378
|
serialized_entries.append(
|
366
379
|
{
|
367
|
-
"id": str(uuid4_from_hash(f"{
|
380
|
+
"id": str(uuid4_from_hash(f"{executable_id}|{key}")),
|
368
381
|
"key": serialize_key(key),
|
369
382
|
"value": serialized_val,
|
370
383
|
}
|
@@ -411,30 +424,10 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
|
|
411
424
|
},
|
412
425
|
}
|
413
426
|
|
414
|
-
if isinstance(value, DeploymentDefinition):
|
415
|
-
workflow_deployment_release = display_context.client.workflow_deployments.retrieve_workflow_deployment_release(
|
416
|
-
value.deployment, value.release_tag
|
417
|
-
)
|
418
|
-
name = workflow_deployment_release.deployment.name or value.deployment
|
419
|
-
description = workflow_deployment_release.description or f"Workflow Deployment for {name}"
|
420
|
-
|
421
|
-
return {
|
422
|
-
"type": "CONSTANT_VALUE",
|
423
|
-
"value": {
|
424
|
-
"type": "JSON",
|
425
|
-
"value": {
|
426
|
-
"type": "WORKFLOW_DEPLOYMENT",
|
427
|
-
"name": name,
|
428
|
-
"description": description,
|
429
|
-
"deployment": value.deployment,
|
430
|
-
"release_tag": value.release_tag,
|
431
|
-
},
|
432
|
-
},
|
433
|
-
}
|
434
|
-
|
435
427
|
if isinstance(value, BaseModel):
|
436
|
-
|
437
|
-
|
428
|
+
context = {"executable_id": executable_id, "client": display_context.client}
|
429
|
+
dict_value = value.model_dump(context=context)
|
430
|
+
return serialize_value(executable_id, display_context, dict_value)
|
438
431
|
|
439
432
|
if callable(value):
|
440
433
|
function_definition = compile_function_definition(value)
|
@@ -447,7 +440,7 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
|
|
447
440
|
if inputs:
|
448
441
|
serialized_inputs = {}
|
449
442
|
for param_name, input_ref in inputs.items():
|
450
|
-
serialized_inputs[param_name] = serialize_value(display_context, input_ref)
|
443
|
+
serialized_inputs[param_name] = serialize_value(executable_id, display_context, input_ref)
|
451
444
|
|
452
445
|
model_data = function_definition.model_dump()
|
453
446
|
model_data["inputs"] = serialized_inputs
|
@@ -485,4 +478,4 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
|
|
485
478
|
|
486
479
|
# If it's not any of the references we know about,
|
487
480
|
# then try to serialize it as a nested value
|
488
|
-
return _serialize_condition(display_context, value)
|
481
|
+
return _serialize_condition(executable_id, display_context, value)
|
@@ -47,7 +47,7 @@ from vellum_ee.workflows.display.utils.events import event_enricher
|
|
47
47
|
),
|
48
48
|
],
|
49
49
|
)
|
50
|
-
def test_event_enricher_static_workflow(is_dynamic: bool, expected_config: Optional[dict]):
|
50
|
+
def test_event_enricher_static_workflow(vellum_client, is_dynamic: bool, expected_config: Optional[dict]):
|
51
51
|
"""Test event_enricher with a static workflow (is_dynamic=False)."""
|
52
52
|
# GIVEN a workflow class with the specified is_dynamic value
|
53
53
|
_is_dynamic = is_dynamic
|
@@ -65,7 +65,7 @@ def test_event_enricher_static_workflow(is_dynamic: bool, expected_config: Optio
|
|
65
65
|
)
|
66
66
|
|
67
67
|
# WHEN the event_enricher is called with mocked dependencies
|
68
|
-
event_enricher(event)
|
68
|
+
event_enricher(event, vellum_client)
|
69
69
|
|
70
70
|
# THEN workflow_version_exec_config is set to the expected config
|
71
71
|
assert event.body.workflow_version_exec_config == expected_config
|
@@ -76,7 +76,7 @@ def test_event_enricher_static_workflow(is_dynamic: bool, expected_config: Optio
|
|
76
76
|
assert hasattr(event.body.display_context, "workflow_outputs")
|
77
77
|
|
78
78
|
|
79
|
-
def test_event_enricher_marks_subworkflow_deployment_as_dynamic():
|
79
|
+
def test_event_enricher_marks_subworkflow_deployment_as_dynamic(vellum_client):
|
80
80
|
"""Test that event_enricher treats subworkflow deployments as dynamic."""
|
81
81
|
|
82
82
|
class TestWorkflow(BaseWorkflow):
|
@@ -110,7 +110,7 @@ def test_event_enricher_marks_subworkflow_deployment_as_dynamic():
|
|
110
110
|
),
|
111
111
|
)
|
112
112
|
|
113
|
-
enriched_event = event_enricher(event)
|
113
|
+
enriched_event = event_enricher(event, vellum_client)
|
114
114
|
|
115
115
|
assert hasattr(enriched_event.body, "workflow_version_exec_config")
|
116
116
|
assert enriched_event.body.workflow_version_exec_config is not None
|
@@ -302,7 +302,7 @@ class BaseWorkflowDisplay(Generic[WorkflowType]):
|
|
302
302
|
output_values.append(
|
303
303
|
{
|
304
304
|
"output_variable_id": str(workflow_output_display.id),
|
305
|
-
"value": serialize_value(self.display_context, workflow_output.instance),
|
305
|
+
"value": serialize_value(self.workflow_id, self.display_context, workflow_output.instance),
|
306
306
|
}
|
307
307
|
)
|
308
308
|
|
@@ -706,12 +706,12 @@ def test_serialize_workflow__dict_reference():
|
|
706
706
|
"type": "DICTIONARY_REFERENCE",
|
707
707
|
"entries": [
|
708
708
|
{
|
709
|
-
"id": "
|
709
|
+
"id": "7689f0df-e0bc-4e53-a63f-dbee027f58b9",
|
710
710
|
"key": "key1",
|
711
711
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant1"}},
|
712
712
|
},
|
713
713
|
{
|
714
|
-
"id": "
|
714
|
+
"id": "89e01555-b0b5-42d5-a0a7-bce72716cf65",
|
715
715
|
"key": "key2",
|
716
716
|
"value": {
|
717
717
|
"type": "NODE_OUTPUT",
|
@@ -720,12 +720,12 @@ def test_serialize_workflow__dict_reference():
|
|
720
720
|
},
|
721
721
|
},
|
722
722
|
{
|
723
|
-
"id": "
|
723
|
+
"id": "2dc84109-b85c-4732-aa60-8c10a1a377d2",
|
724
724
|
"key": "key3",
|
725
725
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant2"}},
|
726
726
|
},
|
727
727
|
{
|
728
|
-
"id": "
|
728
|
+
"id": "d1b3ce75-1b1e-45e3-b798-beafe6c4826f",
|
729
729
|
"key": "key4",
|
730
730
|
"value": {
|
731
731
|
"type": "NODE_OUTPUT",
|
@@ -745,18 +745,18 @@ def test_serialize_workflow__dict_reference():
|
|
745
745
|
"type": "DICTIONARY_REFERENCE",
|
746
746
|
"entries": [
|
747
747
|
{
|
748
|
-
"id": "
|
748
|
+
"id": "7689f0df-e0bc-4e53-a63f-dbee027f58b9",
|
749
749
|
"key": "key1",
|
750
750
|
"value": {
|
751
751
|
"type": "DICTIONARY_REFERENCE",
|
752
752
|
"entries": [
|
753
753
|
{
|
754
|
-
"id": "
|
754
|
+
"id": "7689f0df-e0bc-4e53-a63f-dbee027f58b9",
|
755
755
|
"key": "key1",
|
756
756
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant1"}},
|
757
757
|
},
|
758
758
|
{
|
759
|
-
"id": "
|
759
|
+
"id": "89e01555-b0b5-42d5-a0a7-bce72716cf65",
|
760
760
|
"key": "key2",
|
761
761
|
"value": {
|
762
762
|
"type": "NODE_OUTPUT",
|
@@ -768,18 +768,18 @@ def test_serialize_workflow__dict_reference():
|
|
768
768
|
},
|
769
769
|
},
|
770
770
|
{
|
771
|
-
"id": "
|
771
|
+
"id": "89e01555-b0b5-42d5-a0a7-bce72716cf65",
|
772
772
|
"key": "key2",
|
773
773
|
"value": {
|
774
774
|
"type": "DICTIONARY_REFERENCE",
|
775
775
|
"entries": [
|
776
776
|
{
|
777
|
-
"id": "
|
777
|
+
"id": "7689f0df-e0bc-4e53-a63f-dbee027f58b9",
|
778
778
|
"key": "key1",
|
779
779
|
"value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant2"}},
|
780
780
|
},
|
781
781
|
{
|
782
|
-
"id": "
|
782
|
+
"id": "89e01555-b0b5-42d5-a0a7-bce72716cf65",
|
783
783
|
"key": "key2",
|
784
784
|
"value": {
|
785
785
|
"type": "NODE_OUTPUT",
|
File without changes
|
File without changes
|
File without changes
|