vellum-ai 0.14.48__py3-none-any.whl → 0.14.50__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 (35) hide show
  1. vellum/__init__.py +6 -2
  2. vellum/client/core/client_wrapper.py +1 -1
  3. vellum/client/types/__init__.py +6 -2
  4. vellum/client/types/deployment_read.py +1 -1
  5. vellum/client/types/slim_workflow_execution_read.py +2 -2
  6. vellum/client/types/workflow_event_execution_read.py +2 -2
  7. vellum/client/types/{workflow_execution_usage_calculation_fulfilled_body.py → workflow_execution_usage_calculation_error.py} +5 -6
  8. vellum/client/types/workflow_execution_usage_calculation_error_code_enum.py +7 -0
  9. vellum/client/types/workflow_execution_usage_result.py +24 -0
  10. vellum/types/{workflow_execution_usage_calculation_fulfilled_body.py → workflow_execution_usage_calculation_error.py} +1 -1
  11. vellum/types/workflow_execution_usage_calculation_error_code_enum.py +3 -0
  12. vellum/types/workflow_execution_usage_result.py +3 -0
  13. vellum/workflows/nodes/core/map_node/node.py +74 -87
  14. vellum/workflows/nodes/core/map_node/tests/test_node.py +49 -0
  15. vellum/workflows/nodes/displayable/code_execution_node/node.py +6 -5
  16. vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py +112 -1
  17. vellum/workflows/nodes/displayable/code_execution_node/utils.py +23 -2
  18. vellum/workflows/state/encoder.py +4 -0
  19. vellum/workflows/types/code_execution_node_wrappers.py +10 -2
  20. vellum/workflows/workflows/base.py +8 -0
  21. {vellum_ai-0.14.48.dist-info → vellum_ai-0.14.50.dist-info}/METADATA +1 -1
  22. {vellum_ai-0.14.48.dist-info → vellum_ai-0.14.50.dist-info}/RECORD +35 -30
  23. vellum_ee/workflows/display/nodes/base_node_display.py +23 -1
  24. vellum_ee/workflows/display/nodes/get_node_display_class.py +1 -24
  25. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +2 -2
  26. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +43 -0
  27. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +51 -5
  28. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +177 -0
  29. vellum_ee/workflows/display/utils/expressions.py +22 -3
  30. vellum_ee/workflows/display/utils/vellum.py +10 -4
  31. vellum_ee/workflows/display/workflows/base_workflow_display.py +3 -24
  32. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +187 -3
  33. {vellum_ai-0.14.48.dist-info → vellum_ai-0.14.50.dist-info}/LICENSE +0 -0
  34. {vellum_ai-0.14.48.dist-info → vellum_ai-0.14.50.dist-info}/WHEEL +0 -0
  35. {vellum_ai-0.14.48.dist-info → vellum_ai-0.14.50.dist-info}/entry_points.txt +0 -0
@@ -2,7 +2,7 @@ class StringValueWrapper(str):
2
2
  def __getitem__(self, key):
3
3
  if key == "value":
4
4
  return self
5
- raise KeyError(key)
5
+ return super().__getitem__(key)
6
6
 
7
7
  def __getattr__(self, attr):
8
8
  if attr == "value":
@@ -23,6 +23,10 @@ class ListWrapper(list):
23
23
  return self
24
24
  raise AttributeError(f"'list' object has no attribute '{attr}'")
25
25
 
26
+ def __iter__(self):
27
+ for i in range(len(self)):
28
+ yield self[i]
29
+
26
30
 
27
31
  class DictWrapper(dict):
28
32
  """
@@ -52,11 +56,15 @@ class DictWrapper(dict):
52
56
  def __setattr__(self, name, value):
53
57
  self[name] = value
54
58
 
59
+ def __iter__(self):
60
+ for key in super().keys():
61
+ yield self[key]
62
+
55
63
 
56
64
  def clean_for_dict_wrapper(obj):
57
65
  if isinstance(obj, dict):
58
66
  wrapped = DictWrapper(obj)
59
- for key in wrapped:
67
+ for key in wrapped.keys():
60
68
  wrapped[key] = clean_for_dict_wrapper(wrapped[key])
61
69
 
62
70
  return wrapped
@@ -276,6 +276,14 @@ class BaseWorkflow(Generic[InputsType, StateType], metaclass=_BaseWorkflowMeta):
276
276
  """
277
277
  return cls._get_edges_from_subgraphs(cls.get_unused_subgraphs())
278
278
 
279
+ @classmethod
280
+ def get_all_nodes(cls) -> Iterator[Type[BaseNode]]:
281
+ """
282
+ Returns an iterator over all nodes in the Workflow, used or unused.
283
+ """
284
+ yield from cls.get_nodes()
285
+ yield from cls.get_unused_nodes()
286
+
279
287
  @classmethod
280
288
  def get_entrypoints(cls) -> Iterable[Type[BaseNode]]:
281
289
  return iter({e for g in cls.get_subgraphs() for e in g.entrypoints})
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.48
3
+ Version: 0.14.50
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -26,8 +26,8 @@ vellum_ee/workflows/display/base.py,sha256=EqlQFD56kpqMY02ZBJBQajzJKh33Dwi60Wo77
26
26
  vellum_ee/workflows/display/editor/__init__.py,sha256=MSAgY91xCEg2neH5d8jXx5wRdR962ftZVa6vO9BGq9k,167
27
27
  vellum_ee/workflows/display/editor/types.py,sha256=x-tOOCJ6CF4HmiKDfCmcc3bOVfc1EBlP5o6u5WEfLoY,567
28
28
  vellum_ee/workflows/display/nodes/__init__.py,sha256=jI1aPBQf8DkmrYoZ4O-wR1duqZByOf5mDFmo_wFJPE4,307
29
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=1VoNyAw9MzgGePI2wrOShsNccrbS4bTuu3bnTii0Wu4,15480
30
- vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=gKAZfc7JBLzcwYPchnpHy2nMVMPmltAszOwLyXDrro0,2085
29
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=mzODbbNfrjOi7rVQb6FFCEjQHZkTs76nAc8L-Q5yCnQ,16491
30
+ vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=jI_kUi9LnNLDpY63QtlC4TfN8P571VN4LpzH0I1ZtLk,1149
31
31
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=Z4Mf7xLCNiblSbpKI0BrV5modQr-ZcFzhfir_OSyTTs,2997
33
33
  vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
@@ -35,7 +35,7 @@ vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqU
35
35
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
36
36
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=ZiOJsSovftbH1eVFdU0-UE4DUliIHPQZkwrFcooN-Vk,8856
37
37
  vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=rJbHZBg9A_v2bjk-R6MfWzShcrS2gcKIOyYGoqwTx8s,6353
38
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=yWYK3bOK1hNt5jvqzSwUy4RwCHCP3lHYSU1jum7zxO8,4561
38
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=L308T4U6eaL0WUJ_hQ0qrH-i8IuMBCm5XjRO2_b-Mro,4507
39
39
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=MrvyiYD0qgQf3-ZYFcurQtin3FagAHGRoT7zYGiIao0,11150
40
40
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=m2DmOXm9-jiiIl6zwkXHNfsYp5PTpBHEdt5xaIsabWo,2363
41
41
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=jUDI2FwVaw0Or4zJL58J_g0S--i59Hzik60s_Es_M-8,3098
@@ -51,7 +51,7 @@ vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=3n1qa-zWIk0p_H94u
51
51
  vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=MWLZBXHsmj5vKgqOgI2HHcHAJzLS0sqybn6idhwug8Y,2669
52
52
  vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=J84_EUfwWwpeOfUFBdRorrD1Bod0jDBFdQ6xnRyp9Ho,3338
53
53
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=-b09X3dgtRxnAuqMTp_q3T_tfE_3lRGkgohWmy8w9lE,3880
54
+ vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=ZasoqG8FmqnZDj2FfL5BGPq9fafOTJqV_4xjOKLi1gc,5434
55
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=540FoWMpJ3EN_DPjHsr9ODJWCRVcUa5hZBn-5T2GiHU,1665
56
56
  vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py,sha256=uiMB0cOxKZzos7YKnj4ef4DFa2bOvZJWIv-hfbUV6Go,1218
57
57
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_deployment_node.py,sha256=G-qJyTNJkpqJiEZ3kCJl86CXJINLeFyf2lM0bQHCCOs,3822
@@ -69,7 +69,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DE
69
69
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
70
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=XOQDDRiG46etxTC7-_RUEutoNumXc02fo7oho4GYM0c,1900
71
71
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=tsjGM-jOurPSkDIbrDFdjNLmkI1fPNPAw3J9-l9knCw,12848
72
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=m9KpVN55_bHiooZOJLm7doRewhcTK53weVYRiglCJX0,19578
72
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=rV7_NOUIsyHUrdSJ0pJFt7ha-uIC1nSLqdYpRhE9Zfg,21430
73
73
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=s6_mnk0pkztU59wYpSfOFpMhAJaRjmyfxM6WJGtnD4Y,6456
74
74
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=PkSgghJDz0fpDB72HHPjLjo8LkZk-HpUkCQzRLX-iVw,40611
75
75
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=dsJr8I9AdPwMOGszirfNDzZP2Ychd94aAKuPXAzknMk,4632
@@ -89,19 +89,20 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_
89
89
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=KkYZc_bZuq1lmDcvUz3QxIqJLpQPCZioD1FHUNsMJY8,11211
90
90
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=aZaqRDrkO3ytcmdM2eKJqHSt60MF070NMj6M2vgzOKc,7711
91
91
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=r748dpS13HtwY7t_KQFExFssxRy0xI2d-wxmhiUHRe0,3850
92
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=rp9suYcwVZPpIQ3ChlWWvahMlaUd7u-31VmesR0Mn8w,7683
92
93
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=EL5kfakuoEcwD85dGjhMta-J-PpCHRSDoc80SdbBrQk,2769
93
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=RmFUDx8dYdfsOE2CGLvdXqNNRtLLpVzXDN8dqZyMcZ8,5822
94
95
  vellum_ee/workflows/display/types.py,sha256=i4T7ElU5b5h-nA1i3scmEhO1BqmNDc4eJDHavATD88w,2821
95
96
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
97
  vellum_ee/workflows/display/utils/exceptions.py,sha256=LSwwxCYNxFkf5XMUcFkaZKpQ13OSrI7y_bpEUwbKVk0,169
97
- vellum_ee/workflows/display/utils/expressions.py,sha256=QKzZpCbVTrDjxO-AKkc-cw7Q2uzYzL4vXpH6OCQAdLk,11731
98
+ vellum_ee/workflows/display/utils/expressions.py,sha256=qsKRgxm9zKFgAgjc9LqKEWP1rtdzXA1NDsXu9kyhf60,12416
98
99
  vellum_ee/workflows/display/utils/registry.py,sha256=fWIm5Jj-10gNFjgn34iBu4RWv3Vd15ijtSN0V97bpW8,1513
99
- vellum_ee/workflows/display/utils/vellum.py,sha256=HDe1vtIaU35OEg4oC1KC6WNwhw5Laf_mNURorzbeutQ,5418
100
+ vellum_ee/workflows/display/utils/vellum.py,sha256=mtoXmSYwR7rvrq-d6CzCW_auaJXTct0Mi1F0xpRCiNQ,5627
100
101
  vellum_ee/workflows/display/vellum.py,sha256=o7mq_vk2Yapu9DDKRz5l76h8EmCAypWGQYe6pryrbB8,3576
101
102
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
102
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=NuWlnGNe3Htcfh-l_8e37uitdUsy6WZNB7W7dYcCoUg,33355
103
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=DbjLChDtlNAs86sWL5-ojYYzwFsOjACAGfquxM3VYcw,32563
103
104
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=gxz76AeCqgAZ9D2lZeTiZzxY9eMgn3qOSfVgiqYcOh8,2028
104
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=wkB8tbGdjWyu1PlFfjE0G4y5hw3MvZwfhfN9DE0Ckk4,22142
105
+ vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=rRwXLgsXqiaSn3jzP7lc--pytRW3Jmnj2-zNq5l-FQ4,29472
105
106
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=aaKdmWrgEe5YyV4zuDY_4E3y-l59rIHQnNGiPj2OWxQ,359
106
107
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
108
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=7JphJcSO3H85qiC2DpFfBWjC3JjrbRmoynBC6KKHVsA,2710
@@ -127,12 +128,12 @@ vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIP
127
128
  vellum_ee/workflows/tests/test_display_meta.py,sha256=C25dErwghPNXio49pvSRxyOuc96srH6eYEwTAWdE2zY,2258
128
129
  vellum_ee/workflows/tests/test_server.py,sha256=SsOkS6sGO7uGC4mxvk4iv8AtcXs058P9hgFHzTWmpII,14519
129
130
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
130
- vellum/__init__.py,sha256=4UwLVTlKBQ0cTIJ3NTqxw51aEFNUPfmJ-rVYP1yVUU0,41758
131
+ vellum/__init__.py,sha256=Hqfl49WZJzzqOKzVsTGi-j9twIqFOoRmACJsrEsjL44,41918
131
132
  vellum/client/README.md,sha256=qmaVIP42MnxAu8jV7u-CsgVFfs3-pHQODrXdZdFxtaw,4749
132
133
  vellum/client/__init__.py,sha256=PEnFl7LbXQcvAi3bVN2qyt5xm2FtVtq7xWKkcWM3Tg4,120166
133
134
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
134
135
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
135
- vellum/client/core/client_wrapper.py,sha256=yyzuMHrWz7Em50rdrzRvaaI6oRcCeVgE0RNWHF_GcAo,1869
136
+ vellum/client/core/client_wrapper.py,sha256=0Uo8ifbV1rC2jIjuU95Td5DeLVDs0xqQP3DETAbhbEU,1869
136
137
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
137
138
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
138
139
  vellum/client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -200,7 +201,7 @@ vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCat
200
201
  vellum/client/resources/workspace_secrets/client.py,sha256=zlBdbeTP6sqvtyl_DlrpfG-W5hSP7tJ1NYLSygi4CLU,8205
201
202
  vellum/client/resources/workspaces/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
202
203
  vellum/client/resources/workspaces/client.py,sha256=RthwzN1o-Jxwg5yyNNodavFyNUSxfLoTv26w3mRR5g8,3595
203
- vellum/client/types/__init__.py,sha256=DODWRvaxjqdVCvpr4b6kxku_2WZKSvl7lEl6tSr_gXU,63222
204
+ vellum/client/types/__init__.py,sha256=wFQ3c_Pu8mGQFHIUy5dORq6Afmp5jdl9pnfUizIXjtI,63474
204
205
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
205
206
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
206
207
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=oDG60TpwK1YNSKhRsBbiP2O3ZF9PKR-M9chGIfKw4R4,1004
@@ -271,7 +272,7 @@ vellum/client/types/create_test_suite_test_case_request.py,sha256=3LmAy6U8tUJ75d
271
272
  vellum/client/types/deployment_history_item.py,sha256=-u7UYEFpVOlFijErPLGO99WYQxAnctZK52W-GM4KJJU,1132
272
273
  vellum/client/types/deployment_provider_payload_response.py,sha256=b0lkt0rK88ARQaMWn9MAHeWtMBsZKofDMlOAUsQvv7g,818
273
274
  vellum/client/types/deployment_provider_payload_response_payload.py,sha256=xHLQnWFN0AZRZdrOiKawwpoKK7BTmnZfp0P7FCc2ZqE,188
274
- vellum/client/types/deployment_read.py,sha256=TYhgfS9rU_pyLfdSq7Ek-6WAMLEiryGJkB6Z-sZaj7A,1975
275
+ vellum/client/types/deployment_read.py,sha256=l6cy00p4y7JncJ-BwVl_NdCVWPNRjZqFz6DdL2vTTqY,1977
275
276
  vellum/client/types/deployment_release_tag_deployment_history_item.py,sha256=df4qKHT1f-z0jnRS4UmP8MQe6u3PwYej_d8KDF7EL88,631
276
277
  vellum/client/types/deployment_release_tag_read.py,sha256=dUrTOz9LH1gAvC_ktMB_7NztkeBnlNSX_9x15Ld3D3I,1278
277
278
  vellum/client/types/docker_service_token.py,sha256=T0icNHBKsIs6TrEiDRjckM_f37hcF1DMwEE8161tTvY,614
@@ -565,7 +566,7 @@ vellum/client/types/slim_document.py,sha256=HJiymYPvRxfxhBUkD8epW0hQ2Vt9PQtv398Q
565
566
  vellum/client/types/slim_document_document_to_document_index.py,sha256=vo7WbRRzbApQxT0MZu_NkjQmsFD8LoezmyeKBeGZpI8,1346
566
567
  vellum/client/types/slim_release_review.py,sha256=7DXmD1AVa_Wj7e0qiR7GUN9cSqwkk1JloYmp_3oluQQ,783
567
568
  vellum/client/types/slim_workflow_deployment.py,sha256=Js-ycMFZ8-kNFPsd4bZew9nI_eN2M_58LzDHeCjkfTg,2009
568
- vellum/client/types/slim_workflow_execution_read.py,sha256=yZvOqC9z9qa3jlnRgrSlSybwPeY-cX-xuTmZXkPVops,1968
569
+ vellum/client/types/slim_workflow_execution_read.py,sha256=Opm1HTYVMz_D2USQCB-5ZoJ4EjKKfrDhoXc0hETldVM,1936
569
570
  vellum/client/types/span_link.py,sha256=2NISI8V94W0MeIdos7aSKFmpVJgEEunuSEnKlWTUH5c,1353
570
571
  vellum/client/types/span_link_type_enum.py,sha256=NaBXnHnOKMZvgHfjhwJJNqM4wuTOxtGkMIXjN2hU-6A,130
571
572
  vellum/client/types/streaming_ad_hoc_execute_prompt_event.py,sha256=NdgmJ3AZMp6io-whZIGnGb49aiqz6__KafsrzjEF_9o,1183
@@ -717,7 +718,7 @@ vellum/client/types/workflow_deployment_release_workflow_deployment.py,sha256=ir
717
718
  vellum/client/types/workflow_deployment_release_workflow_version.py,sha256=V1Eb3goBX2lle851LkhR1tbCFa0z_O-yhMuQWCN6c-g,773
718
719
  vellum/client/types/workflow_error.py,sha256=EQajkEmLS64T0wYm0goHQl0rT7Lguurk8pLwkhjsgAI,282
719
720
  vellum/client/types/workflow_event_error.py,sha256=HIewu_kh3KNPpWegAQArvAGHCp-cBIXqlUAAc_dBZhc,687
720
- vellum/client/types/workflow_event_execution_read.py,sha256=S3o33XQYfo4JPmkXUJ-ZxCqvLfcemFeWrmOc4SGzV74,2040
721
+ vellum/client/types/workflow_event_execution_read.py,sha256=TQaBs2ZkOOJOjCkdmgI9ZX7c4XgIaNIBozCmZlOoZp8,2008
721
722
  vellum/client/types/workflow_execution_actual.py,sha256=YL5WL4O4CyaZWSrxqpE4chJ28EJlyScj5JeaLttegEg,843
722
723
  vellum/client/types/workflow_execution_actual_chat_history_request.py,sha256=L6U8tgM7SiU4qGJMZChFzj6HfHgO-YAlTXfbT7ZIaE4,1993
723
724
  vellum/client/types/workflow_execution_actual_json_request.py,sha256=5QYaPCSOwFnjH_kTrB2bTznTMFExSZdBhTkmelf1h4Q,1931
@@ -741,7 +742,9 @@ vellum/client/types/workflow_execution_span.py,sha256=3vHEx3k31fLacQaV2iMT-vibjw
741
742
  vellum/client/types/workflow_execution_span_attributes.py,sha256=SRW7mD-6uS8eA57EU6q2thBqSFfJSH4tXI9H3szZwYQ,575
742
743
  vellum/client/types/workflow_execution_streaming_body.py,sha256=phni9pJKkFGsQ5IcS4ogtG1EjBzpdBiYpN9CPbkjxH8,746
743
744
  vellum/client/types/workflow_execution_streaming_event.py,sha256=_xazehYJ5ZwTDc5cC7rpX7nDir_4glPOnx9c9ZPod1g,1551
744
- vellum/client/types/workflow_execution_usage_calculation_fulfilled_body.py,sha256=TyEIbdTWfvRjS3TGx44Mwttc274gRzLB9YjvkE0BmTw,729
745
+ vellum/client/types/workflow_execution_usage_calculation_error.py,sha256=O44pAaA3pOpn6dqxfsAFx4QnXeVfIggGWbgmTzQV4Ms,754
746
+ vellum/client/types/workflow_execution_usage_calculation_error_code_enum.py,sha256=O8CGCaWKuhnRjmQXTsw4gQn5hfDFiKED8bJYzP8R0LM,258
747
+ vellum/client/types/workflow_execution_usage_result.py,sha256=wZdRqzG_Lwi8gqDHGEU6ayx3pvO9oe8hIPzDDePELz8,928
745
748
  vellum/client/types/workflow_execution_view_online_eval_metric_result.py,sha256=1qxIHqBRhEMfbOhBpztOPhcH3mqe7bfezO7PUHUfDg4,759
746
749
  vellum/client/types/workflow_execution_workflow_result_event.py,sha256=gjyXmojwtAOtAzpILpFkJB9tM02okSXqYRw9-3rTVDA,939
747
750
  vellum/client/types/workflow_expand_meta_request.py,sha256=-6I1Zveo3wFJEWbmSsN9OiOI7ekCJxF4xEL_ApB6XE8,1151
@@ -1415,7 +1418,9 @@ vellum/types/workflow_execution_span.py,sha256=qnyiKgPrKKl0lvVtmpm09zOMTWKDBZ9nD
1415
1418
  vellum/types/workflow_execution_span_attributes.py,sha256=LCyfr-e1lwrTpMge9agbjtVDxt1l1FTZK8koMqxy6VM,172
1416
1419
  vellum/types/workflow_execution_streaming_body.py,sha256=MjkV8RLMtFj1r0yGPIuhf4Dz_EFeVU2tN8Oz6-cPssQ,171
1417
1420
  vellum/types/workflow_execution_streaming_event.py,sha256=XDEyaGRMfR9cpaRJ-WCb0O-o4LAdoMPCbjRLdYI1r-0,172
1418
- vellum/types/workflow_execution_usage_calculation_fulfilled_body.py,sha256=Vabch9oglYZehKyAvOuAKhbASKAoLWqK0dg7pqaa3s4,189
1421
+ vellum/types/workflow_execution_usage_calculation_error.py,sha256=tMF1PYRRKjC0N-GL_Az2A8Mv-1H8tS3oln_NPh6k3zo,180
1422
+ vellum/types/workflow_execution_usage_calculation_error_code_enum.py,sha256=HMqRue9gC5NRgbqt_FhANKGeNz8Vgu9fjZpEvRTek9o,190
1423
+ vellum/types/workflow_execution_usage_result.py,sha256=SrVrcv5xngwbS-6eCWU4XJ9QyyUwGJ1mPfgHPOhNqbs,169
1419
1424
  vellum/types/workflow_execution_view_online_eval_metric_result.py,sha256=dLnk3CfQOAeYIO5kiR0U8SY4JcqFWvVYwkDL-LkA5Co,187
1420
1425
  vellum/types/workflow_execution_workflow_result_event.py,sha256=3bNxtChEfqny5eEazFcGmqQpmC8283Q0J2hxLje-uks,178
1421
1426
  vellum/types/workflow_expand_meta_request.py,sha256=Ahb7gjZekJ5qI0HGHLCbn3hCpkX08EnzeXEH_3ivB4E,166
@@ -1551,9 +1556,9 @@ vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=rgcjc3gaCEX9u
1551
1556
  vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1552
1557
  vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=kUqwcRMMxjTHALbwGUXCJT_aJBrHS1bkg49oL8R0JO8,4337
1553
1558
  vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
1554
- vellum/workflows/nodes/core/map_node/node.py,sha256=bmI48fv-UAmS14ZVV4VWrIUIYFytYGIVM6Gm7yFz8pM,9288
1559
+ vellum/workflows/nodes/core/map_node/node.py,sha256=rbF7fLAU0vUDEpgtWqeQTZFlhWOhJw38tgxWJ6exud8,9313
1555
1560
  vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1556
- vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=A_M4WfdThNO5FdB7nyCyyVQBEeJWQaxmIDvvSrtO96A,5324
1561
+ vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=f3lSPYAU1vJUCLCujNOo0EAeBbOM9hnY5A1Wy58korc,6905
1557
1562
  vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
1558
1563
  vellum/workflows/nodes/core/retry_node/node.py,sha256=abtGvinLfi1tKqYIsWQKZtBUisF2Qw2yT1YoPw9cVk4,5297
1559
1564
  vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1587,12 +1592,12 @@ vellum/workflows/nodes/displayable/bases/tests/test_utils.py,sha256=eqdqbKNRWVMD
1587
1592
  vellum/workflows/nodes/displayable/bases/types.py,sha256=C37B2Qh2YP7s7pUjd-EYKc2Zl1TbnCgI_mENuUSb8bo,1706
1588
1593
  vellum/workflows/nodes/displayable/bases/utils.py,sha256=ckMUenSsNkiYmSw6FmjSMHYaCk8Y8_sUjL6lkFFEqts,5412
1589
1594
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1590
- vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=Ko_Dy17AjfSx2A4u5Xno5R0KH2p5akEHq8L0rQkySGs,9576
1595
+ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=U21jXW8XZoC51vP0pvbbUQzQidR6Ej2lMdGypIUyF3I,9708
1591
1596
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1592
1597
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1593
1598
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1594
- vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=Vl4huLXAQNNveDJTg1HF-scxbBVNuuElDUn-IRB6pkg,28343
1595
- vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=oCI8HS_Y-hsNhvGIC8HgbIzKIZeWOkXMLaknDRf-qus,2928
1599
+ vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=N5SZeYyxEDrkbTagEvbnsTLgOeqrYEfIUOheM5qgjiU,31423
1600
+ vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=VRTKms59vrSR9mDk99cojParZVAP4lzjEeDwDNXU1tk,3837
1596
1601
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1597
1602
  vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=Qjfl33gZ3JEgxBA1EgzSUebboGvsARthIxxcQyvx5Gg,1152
1598
1603
  vellum/workflows/nodes/displayable/conftest.py,sha256=K2kLM2JGAfcrmmd92u8DXInUO5klFdggPWblg5RVcx4,5729
@@ -1668,7 +1673,7 @@ vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2
1668
1673
  vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
1669
1674
  vellum/workflows/state/base.py,sha256=ZXDmVafs6sExcbx1azrZjEGQsmuY68mSRWfI7t2PT4c,22330
1670
1675
  vellum/workflows/state/context.py,sha256=KOAI1wEGn8dGmhmAemJaf4SZbitP3jpIBcwKfznQaRE,3076
1671
- vellum/workflows/state/encoder.py,sha256=TnOQojc5lTQ83g9QbpA4UCqShJvutmTMxbpKt-9gNe4,1911
1676
+ vellum/workflows/state/encoder.py,sha256=z7Mk6jQC-92wCj6XTK7VEnJ8px_lU8qy0BINqwGDN4I,2063
1672
1677
  vellum/workflows/state/store.py,sha256=uVe-oN73KwGV6M6YLhwZMMUQhzTQomsVfVnb8V91gVo,1147
1673
1678
  vellum/workflows/state/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1674
1679
  vellum/workflows/state/tests/test_state.py,sha256=YOiC9qZAzkdiqb7nRarNWeDwxo7xHv3y3czlHl81ezg,6741
@@ -1676,7 +1681,7 @@ vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
1676
1681
  vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
1677
1682
  vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
1678
1683
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1679
- vellum/workflows/types/code_execution_node_wrappers.py,sha256=li3EuMWq6s3QrZ63Z36kSsvJudWjIwTVpBrZ594LVJ8,2169
1684
+ vellum/workflows/types/code_execution_node_wrappers.py,sha256=zPnfvhxpDS3vvM6hX1X6sPfvo1bu1kcPQfhNoJD9vtM,2362
1680
1685
  vellum/workflows/types/core.py,sha256=kMQremh_I8egXpiKmtMQbB6e3OczAWiRnnTq5V6xlD0,928
1681
1686
  vellum/workflows/types/definition.py,sha256=z81CL_u0FJol-9yUIqoXNTYAARtU8x__c6s-f4rb5c8,2335
1682
1687
  vellum/workflows/types/generics.py,sha256=tKXz0LwWJGKw1YGudyl9_yFDrRgU6yYV1yJV1Zv-LTw,1430
@@ -1696,13 +1701,13 @@ vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrg
1696
1701
  vellum/workflows/utils/vellum_variables.py,sha256=UiGlUh0a8vel2FbW3w-xbHxSv_jNutkDdqMVtP_b42A,3385
1697
1702
  vellum/workflows/vellum_client.py,sha256=xkfoucodxNK5JR2-lbRqZx3xzDgExWkP6kySrpi_Ubc,1079
1698
1703
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1699
- vellum/workflows/workflows/base.py,sha256=9dGZzoXbVVtw19pVhmawIA1wd1iLQttAKypuVFWb0fU,23793
1704
+ vellum/workflows/workflows/base.py,sha256=V60RZat8mG0XmMuIjprkHnacD_MpUdxGcN9t4TaP_Pg,24044
1700
1705
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
1701
1706
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1702
1707
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=8P5YIsNMO78_CR1NNK6wkEdkMB4b3Q_Ni1qxh78OnHo,20481
1703
1708
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1704
- vellum_ai-0.14.48.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1705
- vellum_ai-0.14.48.dist-info/METADATA,sha256=c8B1dqvOh4tPOrZqgNT8aZdq9fy7L1F010JaK0QD1gE,5484
1706
- vellum_ai-0.14.48.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1707
- vellum_ai-0.14.48.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1708
- vellum_ai-0.14.48.dist-info/RECORD,,
1709
+ vellum_ai-0.14.50.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1710
+ vellum_ai-0.14.50.dist-info/METADATA,sha256=E3j3kzjmM-9HAa1xAKCgCf5JsoBVzbm7vadnxywpahY,5484
1711
+ vellum_ai-0.14.50.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1712
+ vellum_ai-0.14.50.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1713
+ vellum_ai-0.14.50.dist-info/RECORD,,
@@ -44,18 +44,40 @@ if TYPE_CHECKING:
44
44
  _NodeDisplayAttrType = TypeVar("_NodeDisplayAttrType")
45
45
 
46
46
 
47
+ def _get_node_input_ids_by_ref(node_class: Type[BaseNode], path: str, inst: Any):
48
+ if isinstance(inst, dict):
49
+ node_input_ids_by_name: Dict[str, UUID] = {}
50
+ for key, value in inst.items():
51
+ node_input_ids_by_name.update(_get_node_input_ids_by_ref(node_class, f"{path}.{key}", value))
52
+ return node_input_ids_by_name
53
+
54
+ return {path: uuid4_from_hash(f"{node_class.__id__}|{path}")}
55
+
56
+
47
57
  class BaseNodeDisplayMeta(type):
48
58
  def __new__(mcs, name: str, bases: Tuple[Type, ...], dct: Dict[str, Any]) -> Any:
49
59
  cls = cast(Type["BaseNodeDisplay"], super().__new__(mcs, name, bases, dct))
60
+ # This cast shouldn't be necessary, but it's a workaround for a mypy bug
61
+ node_class = cast(Type[BaseNode], cls.infer_node_class() if name != "BaseNodeDisplay" else BaseNode)
50
62
 
51
63
  if not dct.get("output_display"):
52
- node_class = cls.infer_node_class()
53
64
  cls.output_display = {
54
65
  ref: NodeOutputDisplay(id=node_class.__output_ids__[ref.name], name=ref.name)
55
66
  for ref in node_class.Outputs
56
67
  if ref.name in node_class.__output_ids__
57
68
  }
58
69
 
70
+ if not dct.get("node_input_ids_by_name"):
71
+ node_input_ids_by_name: Dict[str, UUID] = {}
72
+ for ref in node_class:
73
+ if ref not in cls.__serializable_inputs__:
74
+ continue
75
+
76
+ node_input_ids_by_name.update(_get_node_input_ids_by_ref(node_class, ref.name, ref.instance))
77
+
78
+ if node_input_ids_by_name:
79
+ cls.node_input_ids_by_name = node_input_ids_by_name
80
+
59
81
  return cls.__annotate_node__()
60
82
 
61
83
  def __annotate_node__(cls):
@@ -1,9 +1,7 @@
1
1
  import types
2
- from uuid import UUID
3
- from typing import TYPE_CHECKING, Any, Dict, Generic, Type, TypeVar
2
+ from typing import TYPE_CHECKING, Generic, Type, TypeVar
4
3
 
5
4
  from vellum.workflows.types.generics import NodeType
6
- from vellum.workflows.utils.uuids import uuid4_from_hash
7
5
  from vellum_ee.workflows.display.utils.registry import get_from_node_display_registry
8
6
 
9
7
  if TYPE_CHECKING:
@@ -22,30 +20,9 @@ def get_node_display_class(node_class: Type[NodeType]) -> Type["BaseNodeDisplay"
22
20
  # `base_node_display_class` is always a Generic class, so it's safe to index into it
23
21
  NodeDisplayBaseClass = base_node_display_class[_NodeClassType] # type: ignore[index]
24
22
 
25
- def _get_node_input_ids_by_ref(path: str, inst: Any):
26
- if isinstance(inst, dict):
27
- node_input_ids_by_name: Dict[str, UUID] = {}
28
- for key, value in inst.items():
29
- node_input_ids_by_name.update(_get_node_input_ids_by_ref(f"{path}.{key}", value))
30
- return node_input_ids_by_name
31
-
32
- return {path: uuid4_from_hash(f"{node_class.__id__}|{path}")}
33
-
34
- def exec_body(ns: Dict):
35
- node_input_ids_by_name: Dict[str, UUID] = {}
36
- for ref in node_class:
37
- if ref not in base_node_display_class.__serializable_inputs__:
38
- continue
39
-
40
- node_input_ids_by_name.update(_get_node_input_ids_by_ref(ref.name, ref.instance))
41
-
42
- if node_input_ids_by_name:
43
- ns["node_input_ids_by_name"] = node_input_ids_by_name
44
-
45
23
  NodeDisplayClass = types.new_class(
46
24
  f"{node_class.__name__}Display",
47
25
  bases=(NodeDisplayBaseClass, Generic[_NodeClassType]),
48
- exec_body=exec_body,
49
26
  )
50
27
 
51
28
  return NodeDisplayClass
@@ -79,8 +79,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeDisplay[_CodeExecutionNodeType], Gene
79
79
 
80
80
  packages = raise_if_descriptor(node.packages)
81
81
 
82
- _, output_display = display_context.global_node_output_displays[node.Outputs.result]
83
- _, log_output_display = display_context.global_node_output_displays[node.Outputs.log]
82
+ output_display = self.output_display[node.Outputs.result]
83
+ log_output_display = self.output_display[node.Outputs.log]
84
84
 
85
85
  output_type = primitive_type_to_vellum_variable_type(node.get_output_type())
86
86
 
@@ -2,7 +2,9 @@ import pytest
2
2
  from uuid import UUID
3
3
  from typing import Type
4
4
 
5
+ from vellum.client.core.api_error import ApiError
5
6
  from vellum.workflows.nodes.displayable.code_execution_node.node import CodeExecutionNode
7
+ from vellum.workflows.references.vellum_secret import VellumSecretReference
6
8
  from vellum.workflows.workflows.base import BaseWorkflow
7
9
  from vellum_ee.workflows.display.nodes.vellum.code_execution_node import BaseCodeExecutionNodeDisplay
8
10
  from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
@@ -110,3 +112,44 @@ def test_serialize_node__code_node_inputs(GetDisplayClass, expected_input_id):
110
112
  },
111
113
  },
112
114
  ]
115
+
116
+
117
+ def test_serialize_node__with_unresolved_secret_references(vellum_client):
118
+ # GIVEN a node has access to a secret reference
119
+ class MyNode(CodeExecutionNode):
120
+ code_inputs = {"api_key": VellumSecretReference("MY_API_KEY")}
121
+
122
+ # AND the secret is not found
123
+ vellum_client.workspace_secrets.retrieve.side_effect = ApiError(
124
+ status_code=404,
125
+ body="Secret not found",
126
+ )
127
+
128
+ # AND a workflow with the code node
129
+ class Workflow(BaseWorkflow):
130
+ graph = MyNode
131
+
132
+ # WHEN we serialize the workflow
133
+ workflow_display = get_workflow_display(workflow_class=Workflow)
134
+ data: dict = workflow_display.serialize()
135
+
136
+ # THEN the condition should be serialized correctly
137
+ node = next(node for node in data["workflow_raw_data"]["nodes"] if node["type"] == "CODE_EXECUTION")
138
+ assert node["inputs"][0]["value"] == {
139
+ "combinator": "OR",
140
+ "rules": [
141
+ {
142
+ "type": "WORKSPACE_SECRET",
143
+ "data": {
144
+ "type": "STRING",
145
+ "workspace_secret_id": None,
146
+ },
147
+ }
148
+ ],
149
+ }
150
+
151
+ # AND we should have a warning of the invalid reference
152
+ # TODO: Come up with a proposal for how nodes should propagate warnings
153
+ # warnings = list(workflow_display.errors)
154
+ # assert len(warnings) == 1
155
+ # assert "Failed to resolve secret reference 'MY_API_KEY'" in str(warnings[0])
@@ -1,4 +1,3 @@
1
- import pytest
2
1
  from uuid import uuid4
3
2
  from typing import List
4
3
 
@@ -257,11 +256,58 @@ def test_serialize_node__workflow_input_as_nested_chat_history():
257
256
 
258
257
  # WHEN the workflow is serialized
259
258
  workflow_display = get_workflow_display(workflow_class=Workflow)
260
- with pytest.raises(Exception) as exc_info:
261
- workflow_display.serialize()
259
+ serialized_workflow: dict = workflow_display.serialize()
260
+
261
+ # THEN the node should properly serialize the attribute reference
262
+ generic_node = next(
263
+ node for node in serialized_workflow["workflow_raw_data"]["nodes"] if node["id"] == str(GenericNode.__id__)
264
+ )
262
265
 
263
- # THEN we should raise a user facing error
264
- assert str(exc_info.value) == "Failed to serialize attribute 'attr': Nested references are not supported."
266
+ assert not DeepDiff(
267
+ {
268
+ "id": "11be9d37-0069-4695-a317-14a3b6519d4e",
269
+ "label": "test_serialize_node__workflow_input_as_nested_chat_history.<locals>.GenericNode",
270
+ "type": "GENERIC",
271
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
272
+ "base": {"name": "BaseNode", "module": ["vellum", "workflows", "nodes", "bases", "base"]},
273
+ "definition": {
274
+ "name": "GenericNode",
275
+ "module": [
276
+ "vellum_ee",
277
+ "workflows",
278
+ "display",
279
+ "tests",
280
+ "workflow_serialization",
281
+ "generic_nodes",
282
+ "test_attributes_serialization",
283
+ ],
284
+ },
285
+ "trigger": {"id": "d4548468-85a4-449e-92e0-e2d8b8fd097c", "merge_behavior": "AWAIT_ATTRIBUTES"},
286
+ "ports": [{"id": "c4a9a57d-1380-4689-8500-e8a0b6477291", "name": "default", "type": "DEFAULT"}],
287
+ "adornments": None,
288
+ "attributes": [
289
+ {
290
+ "id": "e878bbc9-1231-461e-9e9d-947604da116e",
291
+ "name": "attr",
292
+ "value": {
293
+ "type": "DICTIONARY_REFERENCE",
294
+ "entries": [
295
+ {
296
+ "key": "hello",
297
+ "value": {
298
+ "type": "WORKFLOW_INPUT",
299
+ "input_variable_id": "f727c3f9-f27f-4ac9-abd7-12bf612a094e",
300
+ },
301
+ }
302
+ ],
303
+ },
304
+ }
305
+ ],
306
+ "outputs": [],
307
+ },
308
+ generic_node,
309
+ ignore_order=True,
310
+ )
265
311
 
266
312
 
267
313
  def test_serialize_node__node_output(serialize_node):