vellum-ai 0.14.17__py3-none-any.whl → 0.14.19__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 (31) hide show
  1. vellum/__init__.py +2 -0
  2. vellum/client/core/client_wrapper.py +1 -1
  3. vellum/client/types/__init__.py +2 -0
  4. vellum/client/types/node_input_compiled_secret_value.py +23 -0
  5. vellum/client/types/node_input_variable_compiled_value.py +2 -0
  6. vellum/types/node_input_compiled_secret_value.py +3 -0
  7. vellum/workflows/events/workflow.py +15 -1
  8. vellum/workflows/nodes/core/inline_subworkflow_node/node.py +16 -14
  9. vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py +29 -0
  10. vellum/workflows/nodes/core/retry_node/node.py +59 -39
  11. vellum/workflows/nodes/core/templating_node/node.py +2 -2
  12. vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py +116 -0
  13. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +20 -0
  14. vellum/workflows/runner/runner.py +16 -1
  15. {vellum_ai-0.14.17.dist-info → vellum_ai-0.14.19.dist-info}/METADATA +1 -1
  16. {vellum_ai-0.14.17.dist-info → vellum_ai-0.14.19.dist-info}/RECORD +31 -28
  17. vellum_ee/workflows/display/nodes/base_node_display.py +14 -8
  18. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +7 -7
  19. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +6 -1
  20. vellum_ee/workflows/display/nodes/vellum/templating_node.py +6 -7
  21. vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +97 -0
  22. vellum_ee/workflows/display/nodes/vellum/utils.py +1 -1
  23. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +31 -0
  24. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +1 -1
  25. vellum_ee/workflows/display/vellum.py +1 -148
  26. vellum_ee/workflows/display/workflows/base_workflow_display.py +1 -1
  27. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +13 -13
  28. vellum_ee/workflows/tests/test_display_meta.py +10 -10
  29. {vellum_ai-0.14.17.dist-info → vellum_ai-0.14.19.dist-info}/LICENSE +0 -0
  30. {vellum_ai-0.14.17.dist-info → vellum_ai-0.14.19.dist-info}/WHEEL +0 -0
  31. {vellum_ai-0.14.17.dist-info → vellum_ai-0.14.19.dist-info}/entry_points.txt +0 -0
@@ -24,7 +24,7 @@ vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
24
24
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  vellum_ee/workflows/display/base.py,sha256=ak29FIsawhaFa9_paZUHThlZRFJ1xB486JWKuSt1PYY,1965
26
26
  vellum_ee/workflows/display/nodes/__init__.py,sha256=436iSAh_Ex5tC68oEYvNgPu05ZVIAVXnS4PKGrQeZ0Y,321
27
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=H7LJGtGWFkypyNhIrIhHoGYXS0hRYcP7aoYHlM90f_U,17395
27
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=qBF1uZybN8dHzyMRvjqf3rWlAl0fdODV5h6WblhGJP8,17703
28
28
  vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=ZLKQ8Xa3h9nGkj4t4V_7OeU7CBFWY3gXB9CkaCLOhEk,2699
29
29
  vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=LhV2wSo07iOTUj1clKwH2zzCzKdLiW2gk22R3Qco81E,2196
30
30
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -34,12 +34,12 @@ vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqU
34
34
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
35
35
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=hoV-cUtS6H9kmRQXHd2py95GRWI_dAnnaPwvlNBkDOQ,8571
36
36
  vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=oJAQrAm5iFQq0_fX94sMbS3RQEK1M1VsoUck4vsPs9A,5820
37
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=z00Z3L0d4PsUQo4S8FRDTtOFLtjdi17TJbatNVF4nM8,4288
37
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=uIEpWxO8SYA_sb-EK_4wdyYEwGQOnykAOExFRkZcFaE,4241
38
38
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=ybLIa4uclqVIy3VAQvI1ivg2tnK5Ug_1R5a69DFqL7E,11104
39
39
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=I1Jkp2htRINJATtv1e-zs9BrReFX842djpiVgBPHDYg,2186
40
40
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=p-PvlnxpBQ7IKskZi2A19jKAtKnSxJ8LPbGMA83VkFk,2805
41
41
  vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=aYZSJTxknU4LMiQdWk9LcK6CkhdozeDEMiRxfAyUNEc,2202
42
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=CPNW7HtKKJCGOvvE9DTn-56XVDLgAcBg2QHTfqU4N7k,8543
42
+ vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=grb2iDxZ8DiNlo1nfO3KPxs8saM_JZAskOFp-C4ZEq4,8908
43
43
  vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=MU9I8CB1X1TgL1aa1eT6DHWwNJ-2v79t74xl0oy-fBo,5510
44
44
  vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=8CPnn06HIBxBOiECevUffeVmQmCpec6WtPQnNl9gj9Y,3748
45
45
  vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=HkNMgdQELiON42jdO-xDLmqrEKdGx1RVqrz2DXNTLS8,3239
@@ -48,22 +48,23 @@ vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=LFjLUr
48
48
  vellum_ee/workflows/display/nodes/vellum/retry_node.py,sha256=LgokATi7sSS38Fil-XjqoR4t7AMOJ-GzXRw6p606Svo,3397
49
49
  vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=TxcAGZDl_hvJ7Y1hUi9YVEVrj9Ie0hKkASdpfRL4_cs,9227
50
50
  vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=62baAElKoRKIoba0lLhnrXGWWx96B73VxKGxh7BaIxc,2612
51
- vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=wP-ZAZq6ZmkS1fj0WkFtRkYqi8c6MWKLh4CEw8JD9mg,3207
51
+ vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=5EWzdA3TSUPlbJhs4uo1KGH6eGtDXZucVhlUoc_xpl4,3242
52
52
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=ulrpoYUW-5kIxfG4Lf5F2p0k_EoYKhmahEbF3P_eruM,1648
54
54
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py,sha256=bg9INsXiWfyK047u8TD1oEOFYrqDq8GC7Hvgz69n7BE,1988
55
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py,sha256=NuIw8Yb42KUdoGi3Ur8_7VPg50IC4hNrwAkCociwqNk,2091
56
+ vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py,sha256=Us32jf_FQnLuT4Bs2o5JyHxihCTAN8ozZghWIR0pl9k,3459
56
57
  vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py,sha256=mtzB8LJlFCHVFM4H5AanLp29gQfaVmnN4A4iaRGJHoI,2427
57
58
  vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=4YUaTeD_OWF-UaPMyOTBTu9skGC1jgSHlAYrzbH7Z04,5039
58
59
  vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=0ipBZMYm521tuwefQFgHOvTyTgiWVTkzxpQtnnmOAI0,4203
59
- vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=F_0BrlSszllK_BhryPbojIleLq2dGXOfQD1rVp3fNFg,4733
60
+ vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=lY3YsvzawDy15-8w3Brb4oSnVpVaMe5FQtgMi3BE3Mo,4737
60
61
  vellum_ee/workflows/display/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
62
  vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=VD-4USiRlCcdC3Qe9WfdkxwFdircai0vqvuZCbELR84,9556
62
63
  vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
64
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
65
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=A1-tIpC5KIKG9JA_rkd1nLS8zUG3Kb4QiVdvb3boFxE,2509
65
66
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=2ZDTmpiU2CcZe4ukxoQ79SJx8V8kDRQHgUxP5Vtesus,15605
66
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=lScpUiz8fvUmJK18Cpygs9xQrfHQlkSIlmxapGYTS0g,18770
67
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=oEtjTovI6-T_OGND7UBDnBig0kjVm0bPwWMUbRCV1OU,19781
67
68
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=KgxSN8L5AWPL8EpQfSZiTqK428nAIElcWrV-sR17528,6456
68
69
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=yS8GpjbH0objjcNYK73j8rDHbhqinIbG7CcoNjnolBg,40611
69
70
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=_-ADur28OkVy4YEgMHkkVYqMbS1j3GcOtX9MTYmmvf0,4632
@@ -81,7 +82,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_s
81
82
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=-bGp82C5_XgcVxeM80zWL9viogxvE4DGk7-5H__wwxA,8649
82
83
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=elc4ak2OyI4y5P6GPnK2RwuZLcx4FL6hHlmhY3ARk6k,13008
83
84
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=BzFNl9ECeGh0krm-CUjbBQQq0g7krANsp0Sh-j5dAkc,11322
84
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=xXtW915v9yxxKlyu5ObzKHyJYMvobvev3ermX61SGx4,7818
85
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=qjaXGw0JTnPnQmDAFm7jkB3bVkApf-WQ0Gd6kptqdPA,7818
85
86
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=NdhE3lm7RMQ8DqkraPSq24IbOxNla9unbs4tsMWRzm4,3781
86
87
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=eD5686C9nWC5s6t08vbAnm9qf9t53gYQM-E1FwAa75c,3035
87
88
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=huKAOeMJ2MKmp6XtbvMJTUadqynoV40Ypoz9jsBEBEQ,7431
@@ -89,11 +90,11 @@ vellum_ee/workflows/display/types.py,sha256=ixfmcQn51Rhsm4_0hWfG0_WpzLE89ZrDZpeY
89
90
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
91
  vellum_ee/workflows/display/utils/expressions.py,sha256=9FpOslDI-RCR5m4TgAu9KCHh4aTVnh7CHR2ykyMUDw0,1151
91
92
  vellum_ee/workflows/display/utils/vellum.py,sha256=EVPQUSsZ3OIeLTEbV6LHPor37t9fnj9kJxDqP4PmTLQ,8234
92
- vellum_ee/workflows/display/vellum.py,sha256=7mqQaKZPPrLMcXSAQkPIxCy5x8HkKs5PbCu3GRaC2o8,8507
93
+ vellum_ee/workflows/display/vellum.py,sha256=ROvXFoLmnEXmJJ_Nc0ZVz94LZf6opU4O1TWbGnAfHug,5028
93
94
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
94
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=QKMSmV--UoE8L7pYmKvZqtaatygrxmSm9PDSH71Yr0Y,19937
95
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=-14UlLZlmfWDqNtxhY9GxXlrlPcgzEpAIffd94QPEvU,19932
95
96
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=kp0u8LN_2IwshLrhMImhpZx1hRyAcD5gXY-kDuuaGMQ,1269
96
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=eCBCssh2J0hhGAKiv5pVxYKxMEUQCtFX-FKn49xercA,8576
97
+ vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=Ny9VWjCxc1_w8Z5xiQEJmNmEwtjlDlxgFCrmCWSmFmA,8511
97
98
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=mbAzCpswOek34ITeTkesbVreCXpulj4NFjIg3RcdVZ8,18243
98
99
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
100
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=X_DdNK7MfyOjKWekk6YQpOSCT6klKcdjT6nVJcBH1sM,1481
@@ -116,15 +117,15 @@ vellum_ee/workflows/tests/local_workflow/nodes/__init__.py,sha256=1F6jxUpSKfPXPj
116
117
  vellum_ee/workflows/tests/local_workflow/nodes/final_output.py,sha256=ZX7zBv87zirg0w9VKUW3QVDSdBLDqcqAMZjCL_oWbpU,297
117
118
  vellum_ee/workflows/tests/local_workflow/nodes/templating_node.py,sha256=NQwFN61QkHfI3Vssz-B0NKGfupK8PU0FDSAIAhYBLi0,325
118
119
  vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIPLsmrVS_aVEZEc-wULSv787Q,393
119
- vellum_ee/workflows/tests/test_display_meta.py,sha256=xLQ7QtIXIiIm61pm2lyl588Ohzc3pjyq1nDp-qVu2Fs,2295
120
+ vellum_ee/workflows/tests/test_display_meta.py,sha256=C25dErwghPNXio49pvSRxyOuc96srH6eYEwTAWdE2zY,2258
120
121
  vellum_ee/workflows/tests/test_server.py,sha256=M6vvQ2hjIpDWtQdDM9EPbMvUrZ93niAuYnxMNJWOjPA,511
121
122
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
122
- vellum/__init__.py,sha256=Vh9jxpBVXB2fTCyoUMlLdGL1Ujf0zNNNvqhNu5II8KI,36466
123
+ vellum/__init__.py,sha256=qJRjommzKdcsfZUNkqN2k1BuOwVVSuX4Nuv9ITCz1AM,36536
123
124
  vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
124
125
  vellum/client/__init__.py,sha256=tKtdM1_GqmGq1gpi9ydWD_T-MM7fPn8QdHh8ww19cNI,117564
125
126
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
126
127
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
127
- vellum/client/core/client_wrapper.py,sha256=lp2PrDTuF-fVxozBobWF7i3EJRnKs7ggqOiSWj5wuL4,1869
128
+ vellum/client/core/client_wrapper.py,sha256=ZLOoZbFrHfMWTwl3j2UlsGsUsTrHJM0L9ZyltUPXo1g,1869
128
129
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
129
130
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
130
131
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -189,7 +190,7 @@ vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCat
189
190
  vellum/client/resources/workspace_secrets/client.py,sha256=h7UzXLyTttPq1t-JZGMg1BWxypxJvBGUdqg7KGT7MK4,8027
190
191
  vellum/client/resources/workspaces/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
191
192
  vellum/client/resources/workspaces/client.py,sha256=RthwzN1o-Jxwg5yyNNodavFyNUSxfLoTv26w3mRR5g8,3595
192
- vellum/client/types/__init__.py,sha256=D6j2QfxOV3WULH0inmz9q-gdOQcytrr6_R8WYaC5ZZk,54894
193
+ vellum/client/types/__init__.py,sha256=H2K-qwJM2gg5ZOMIXT56gwK1Vr0iV45hb11ON5z_dL4,55005
193
194
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
194
195
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
195
196
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=Bfvf1d_dkmshxRACVM5vcxbH_7AQY23RmrrnPc0ytYY,939
@@ -415,8 +416,9 @@ vellum/client/types/node_input_compiled_function_call_value.py,sha256=Q9vrORvrPD
415
416
  vellum/client/types/node_input_compiled_json_value.py,sha256=ketb8FNY9DQjAxgJd4SPDE6ErHJYY0NEkW0-STapBkw,679
416
417
  vellum/client/types/node_input_compiled_number_value.py,sha256=Olc4UpYsm-v7ZhlTVXsp7JVQE0ytLsBSd9HolCYWmZ4,680
417
418
  vellum/client/types/node_input_compiled_search_results_value.py,sha256=A2SnHYZAt2_VsQDXL4B2CF3KYgDJeUAQ5L0RbI8flH0,763
419
+ vellum/client/types/node_input_compiled_secret_value.py,sha256=yY-OBwHZ4k9uCf_1dQpV6wFZTW_tcC7RSq41Xj-ToPU,703
418
420
  vellum/client/types/node_input_compiled_string_value.py,sha256=V4HKhHW6B2iUvYqYbuwcOHTxiui3nfOe0DKOiTXshJQ,678
419
- vellum/client/types/node_input_variable_compiled_value.py,sha256=ahG5KdRDQ97w3Ljhfz9EssY0FD1DKeE4C5y393QOS78,1046
421
+ vellum/client/types/node_input_variable_compiled_value.py,sha256=h3AovF98U2Wkuo35DAjD6GlUSBo8KbdNt2hyMBDEJuM,1155
420
422
  vellum/client/types/node_output_compiled_array_value.py,sha256=-lUee9E-IrlndzNS-tzfAQrEOZv-ZcgAmm06_kcqOr8,1176
421
423
  vellum/client/types/node_output_compiled_chat_history_value.py,sha256=rAAnJ2PcXGxKusMpq2NEhJdBSRrPB9da5uN19x92Wu4,962
422
424
  vellum/client/types/node_output_compiled_error_value.py,sha256=dkgT_h463S8AF3QHVZdvy9HGF3A2LhxuNnAQouAYQlE,922
@@ -1007,6 +1009,7 @@ vellum/types/node_input_compiled_function_call_value.py,sha256=KAQGyfyBZCsMZUxRI
1007
1009
  vellum/types/node_input_compiled_json_value.py,sha256=RZ0qcWJ8XgTxQuOxTNaJmzObEaTDE66797ySeKrr6Hg,168
1008
1010
  vellum/types/node_input_compiled_number_value.py,sha256=H-92wifgPNQxIWzxBBpPO6x8i_HRfHaJWn5xPDDB_qk,170
1009
1011
  vellum/types/node_input_compiled_search_results_value.py,sha256=5pqbGkgX_r4fKiMlnPcovPzHhkl9yhenoPx_zz1rizc,178
1012
+ vellum/types/node_input_compiled_secret_value.py,sha256=FGS_HTzO41MQ0g-RH0hp61ePLDIoClHZ5yQgBrw5QrM,170
1010
1013
  vellum/types/node_input_compiled_string_value.py,sha256=lZfKVBkffPKbONZjljxKMrcBUXvSwBpKb2YSq9TiApo,170
1011
1014
  vellum/types/node_input_variable_compiled_value.py,sha256=DHrIaSM4AOAzy5JCjSNoQnlr_yvarntDWjpVgo3Ni7w,172
1012
1015
  vellum/types/node_output_compiled_array_value.py,sha256=6sodx6QYM2IyVtPiYsAm6g4vQ4U_tqBXcQ6_OeBkmYQ,170
@@ -1319,7 +1322,7 @@ vellum/workflows/events/node.py,sha256=jbmNHjdp331Q1IRK-AWtAxwF6Lidb9R7__N5rQuil
1319
1322
  vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1320
1323
  vellum/workflows/events/tests/test_event.py,sha256=sHcKhZPDPtzZfTmehL4NORA_StR4M6nZDcx9kz3Avo0,16866
1321
1324
  vellum/workflows/events/types.py,sha256=AeTJaQt_fNHDLI4nyBzo7XrW9QQybRC09AKzu3kEYEE,3575
1322
- vellum/workflows/events/workflow.py,sha256=QoSHyIOpuVacbR7POf7h104miTOhCjtO2udnYximJGs,6851
1325
+ vellum/workflows/events/workflow.py,sha256=xdqU6WOexaAqzJbU2Zw42o2LJhK7SDPtTFO5REGv17I,7293
1323
1326
  vellum/workflows/exceptions.py,sha256=NiBiR3ggfmPxBVqD-H1SqmjI-7mIn0EStSN1BqApvCM,1213
1324
1327
  vellum/workflows/expressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1325
1328
  vellum/workflows/expressions/accessor.py,sha256=ItZF7fMLzVTqsdAiaXb5SiDupXmX0X9xbIus1W6hRds,1870
@@ -1373,19 +1376,19 @@ vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT
1373
1376
  vellum/workflows/nodes/core/error_node/__init__.py,sha256=g7RRnlHhqu4qByfLjBwCunmgGA8dI5gNsjS3h6TwlSI,60
1374
1377
  vellum/workflows/nodes/core/error_node/node.py,sha256=MFHU5vITYSK-L9CuMZ49In2ZeNLWnhZD0f8r5dWvb5Y,1270
1375
1378
  vellum/workflows/nodes/core/inline_subworkflow_node/__init__.py,sha256=nKNEH1QTl-1PcvmYoqSWEl0-t6gAur8GLTXHzklRQfM,84
1376
- vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=B1ant-Pwg1AGFs5BYXynHf2i4rAen1bkr7nbLmiVwHo,6175
1379
+ vellum/workflows/nodes/core/inline_subworkflow_node/node.py,sha256=1RZ9x69qwziPupR5pkUQVTQnEaF4ieaJ8Uvx2gSbiow,6382
1377
1380
  vellum/workflows/nodes/core/inline_subworkflow_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1378
- vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=6AG-oTyJaw5a1KWGQFNZaKl6_Pu_fW3nI_WA3XNRFWY,2439
1381
+ vellum/workflows/nodes/core/inline_subworkflow_node/tests/test_node.py,sha256=BLmwLeWxgn6RgRKL8gi8bvV2ZfWnCTsqZDykTgJOjXg,3529
1379
1382
  vellum/workflows/nodes/core/map_node/__init__.py,sha256=MXpZYmGfhsMJHqqlpd64WiJRtbAtAMQz-_3fCU_cLV0,56
1380
1383
  vellum/workflows/nodes/core/map_node/node.py,sha256=dY27Xm11LHsqD7hnZnVYYDIazZ-XfL4_zatvWKTi6CU,9243
1381
1384
  vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1382
1385
  vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=uMR0AyIFn539LqTKHdwuBswnx1i-PHyqPpgtYrnmYMY,3496
1383
1386
  vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
1384
- vellum/workflows/nodes/core/retry_node/node.py,sha256=eRfDj54idq4JXkzgFyHNh18qnEMI6vLOtNgn7MsFg1o,4359
1387
+ vellum/workflows/nodes/core/retry_node/node.py,sha256=SoDQaizjoj6kKLr454rkXu4bdzN7hXrBBn7T2_cp1CA,5261
1385
1388
  vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1386
1389
  vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=fNgDufkIsrTC-6ftvogqSpWhqqBj9iNESdfK19B1Yx0,5159
1387
1390
  vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
1388
- vellum/workflows/nodes/core/templating_node/node.py,sha256=-JIqLUv6Xpx_LTVZt7whQ2X2VatgHDdTxjMrz64luEs,3721
1391
+ vellum/workflows/nodes/core/templating_node/node.py,sha256=iqBmr2i-f-BqhisNQJiDfewjol0ur7-XpupLStyMJsg,3731
1389
1392
  vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=MHofz-BwAgt7EXkab8VIyacYznDEIJ7Er7MJUaxNQQo,9614
1390
1393
  vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
1391
1394
  vellum/workflows/nodes/core/try_node/node.py,sha256=RbxL0NRXS0IxRP0MJAnLABolF6dkwVniiqsagzy-lwk,4445
@@ -1405,7 +1408,7 @@ vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=H
1405
1408
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1406
1409
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=fTQ7KS5u7xCO_nJsWT5_LWgwGnYZg4U06slvXxHAzTU,8449
1407
1410
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1408
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py,sha256=kodL6T6booHtdTLMJ9wSk_JHFgPNkTz3U8AJDB2cxtU,6696
1411
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py,sha256=ZCXCZs-_OyPk4nqCpuWY-vw87lg92TDZ2tK_gckJ7mg,10450
1409
1412
  vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=UIyNUUr8ii6rIx1gQL5vIPqTAww4ExxxJkFMoglc8LE,5794
1410
1413
  vellum/workflows/nodes/displayable/bases/search_node.py,sha256=3UtbqY3QO4kzfJHbmUNZGnEEfJmaoiF892u8H6TGjp8,5381
1411
1414
  vellum/workflows/nodes/displayable/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1428,7 +1431,7 @@ vellum/workflows/nodes/displayable/final_output_node/tests/test_node.py,sha256=E
1428
1431
  vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
1429
1432
  vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=h5nIBzQxbXTrdTq1wjDcekk1RV4-rKUNCshqdBAiJJY,4025
1430
1433
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1431
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=BaBfIfQX10sfoJ03H6zAnheae8bcJgi6Ff3SkYvmCKo,2523
1434
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=8RXZqWMzViUjFfbpmcy1gkSsKnEpci8BGwsuPYv4xMQ,3380
1432
1435
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1433
1436
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=Qg1oGXecGH2Hp9oBAY42bTfKHBvNHHoJ6vUPPEj8Lq0,8539
1434
1437
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
@@ -1481,7 +1484,7 @@ vellum/workflows/references/workflow_input.py,sha256=86IuhlBz-9cGxeUzizyjdp482aj
1481
1484
  vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
1482
1485
  vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
1483
1486
  vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
1484
- vellum/workflows/runner/runner.py,sha256=fS21u0LIyhxT4T6YQPgonVuH8X8TgD5BrsbVxPUWfuM,31071
1487
+ vellum/workflows/runner/runner.py,sha256=pK_cRWS75x_sX7zrnltz3IykCTgoAWA7AW19Ih5BaB4,31759
1485
1488
  vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2235
1486
1489
  vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
1487
1490
  vellum/workflows/state/base.py,sha256=Vkhneko3VlQrPsMLU1PYSzXU_W1u7_AraJsghiv5O-4,15512
@@ -1517,8 +1520,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1517
1520
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1518
1521
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=NRteiICyJvDM5zrtUfq2fZoXcGQVaWC9xmNlLLVW0cU,7979
1519
1522
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1520
- vellum_ai-0.14.17.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1521
- vellum_ai-0.14.17.dist-info/METADATA,sha256=DPUjnu7ydH6sKPprPiI_A0qW2RVB6JwGh5LV0DUZwk4,5408
1522
- vellum_ai-0.14.17.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1523
- vellum_ai-0.14.17.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1524
- vellum_ai-0.14.17.dist-info/RECORD,,
1523
+ vellum_ai-0.14.19.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1524
+ vellum_ai-0.14.19.dist-info/METADATA,sha256=_Ot_Bgq5LluSkVWep3mE9BIZn1f5WMD1VbDLEhGECw0,5408
1525
+ vellum_ai-0.14.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1526
+ vellum_ai-0.14.19.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1527
+ vellum_ai-0.14.19.dist-info/RECORD,,
@@ -129,13 +129,16 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
129
129
  continue
130
130
 
131
131
  id = str(uuid4_from_hash(f"{node_id}|{attribute.name}"))
132
- attributes.append(
133
- {
134
- "id": id,
135
- "name": attribute.name,
136
- "value": self.serialize_value(display_context, cast(BaseDescriptor, attribute.instance)),
137
- }
138
- )
132
+ try:
133
+ attributes.append(
134
+ {
135
+ "id": id,
136
+ "name": attribute.name,
137
+ "value": self.serialize_value(display_context, attribute.instance),
138
+ }
139
+ )
140
+ except ValueError as e:
141
+ raise ValueError(f"Failed to serialize attribute '{attribute.name}': {e}")
139
142
 
140
143
  adornments = kwargs.get("adornments", None)
141
144
  wrapped_node = get_wrapped_node(node)
@@ -369,7 +372,7 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
369
372
  "rhs": rhs,
370
373
  }
371
374
 
372
- def serialize_value(self, display_context: "WorkflowDisplayContext", value: BaseDescriptor) -> JsonObject:
375
+ def serialize_value(self, display_context: "WorkflowDisplayContext", value: Any) -> JsonObject:
373
376
  if isinstance(value, ConstantValueReference):
374
377
  return self.serialize_value(display_context, value._value)
375
378
 
@@ -415,6 +418,9 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
415
418
  "node_id": str(node_class_display.node_id),
416
419
  }
417
420
 
421
+ if isinstance(value, dict) and any(isinstance(v, BaseDescriptor) for v in value.values()):
422
+ raise ValueError("Nested references are not supported.")
423
+
418
424
  if not isinstance(value, BaseDescriptor):
419
425
  vellum_value = primitive_to_vellum_value(value)
420
426
  return {
@@ -15,9 +15,6 @@ _CodeExecutionNodeType = TypeVar("_CodeExecutionNodeType", bound=CodeExecutionNo
15
15
 
16
16
 
17
17
  class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType], Generic[_CodeExecutionNodeType]):
18
- code_input_id: ClassVar[Optional[UUID]] = None
19
- runtime_input_id: ClassVar[Optional[UUID]] = None
20
-
21
18
  output_id: ClassVar[Optional[UUID]] = None
22
19
  log_output_id: ClassVar[Optional[UUID]] = None
23
20
 
@@ -52,19 +49,22 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType]
52
49
  for variable_name, variable_value in code_inputs.items()
53
50
  ]
54
51
 
52
+ code_input_id = self.node_input_ids_by_name.get(CodeExecutionNode.code.name)
55
53
  code_node_input = create_node_input(
56
54
  node_id=node_id,
57
55
  input_name="code",
58
56
  value=code_value,
59
57
  display_context=display_context,
60
- input_id=self.code_input_id,
58
+ input_id=code_input_id,
61
59
  )
60
+
61
+ runtime_input_id = self.node_input_ids_by_name.get(CodeExecutionNode.runtime.name)
62
62
  runtime_node_input = create_node_input(
63
63
  node_id=node_id,
64
64
  input_name="runtime",
65
65
  value=node.runtime,
66
66
  display_context=display_context,
67
- input_id=self.runtime_input_id,
67
+ input_id=runtime_input_id,
68
68
  )
69
69
  inputs.extend([code_node_input, runtime_node_input])
70
70
 
@@ -84,8 +84,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeVellumDisplay[_CodeExecutionNodeType]
84
84
  "error_output_id": str(error_output_id) if error_output_id else None,
85
85
  "source_handle_id": str(self.get_source_handle_id(display_context.port_displays)),
86
86
  "target_handle_id": str(self.get_target_handle_id()),
87
- "code_input_id": str(self.code_input_id) if self.code_input_id else code_node_input.id,
88
- "runtime_input_id": str(self.runtime_input_id) if self.runtime_input_id else runtime_node_input.id,
87
+ "code_input_id": code_node_input.id,
88
+ "runtime_input_id": runtime_node_input.id,
89
89
  "output_type": output_type,
90
90
  "packages": [package.dict() for package in packages] if packages is not None else [],
91
91
  "output_id": str(self.output_id) if self.output_id else str(output_display.id),
@@ -19,7 +19,6 @@ _InlinePromptNodeType = TypeVar("_InlinePromptNodeType", bound=InlinePromptNode)
19
19
  class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType], Generic[_InlinePromptNodeType]):
20
20
  output_id: ClassVar[Optional[UUID]] = None
21
21
  array_output_id: ClassVar[Optional[UUID]] = None
22
- json_output_id: ClassVar[Optional[UUID]] = None
23
22
  prompt_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
24
23
 
25
24
  def serialize(
@@ -33,6 +32,7 @@ class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType],
33
32
 
34
33
  _, output_display = display_context.global_node_output_displays[node.Outputs.text]
35
34
  _, array_display = display_context.global_node_output_displays[node.Outputs.results]
35
+ _, json_display = display_context.global_node_output_displays[node.Outputs.json]
36
36
  node_blocks = raise_if_descriptor(node.blocks)
37
37
  function_definitions = raise_if_descriptor(node.functions)
38
38
 
@@ -71,6 +71,11 @@ class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType],
71
71
  "display_data": self.get_display_data().dict(),
72
72
  "base": self.get_base().dict(),
73
73
  "definition": self.get_definition().dict(),
74
+ "outputs": [
75
+ {"id": str(json_display.id), "name": "json", "type": "JSON", "value": None},
76
+ {"id": str(output_display.id), "name": "text", "type": "STRING", "value": None},
77
+ {"id": str(array_display.id), "name": "results", "type": "ARRAY", "value": None},
78
+ ],
74
79
  }
75
80
 
76
81
  def _generate_node_and_prompt_inputs(
@@ -1,5 +1,5 @@
1
1
  from uuid import UUID
2
- from typing import ClassVar, Generic, Optional, TypeVar
2
+ from typing import Generic, Optional, TypeVar
3
3
 
4
4
  from vellum.workflows.nodes.core.templating_node import TemplatingNode
5
5
  from vellum.workflows.types.core import JsonObject
@@ -11,23 +11,21 @@ from vellum_ee.workflows.display.types import WorkflowDisplayContext
11
11
 
12
12
  _TemplatingNodeType = TypeVar("_TemplatingNodeType", bound=TemplatingNode)
13
13
 
14
- TEMPLATE_INPUT_NAME = "template"
14
+ TEMPLATE_INPUT_NAME = TemplatingNode.template.name
15
15
 
16
16
 
17
17
  class BaseTemplatingNodeDisplay(BaseNodeVellumDisplay[_TemplatingNodeType], Generic[_TemplatingNodeType]):
18
- template_input_id: ClassVar[Optional[UUID]] = None
19
-
20
18
  def serialize(
21
19
  self, display_context: WorkflowDisplayContext, error_output_id: Optional[UUID] = None, **kwargs
22
20
  ) -> JsonObject:
23
21
  node = self._node
24
22
  node_id = self.node_id
25
23
 
26
- template_input_id = self.template_input_id or self.node_input_ids_by_name.get(TEMPLATE_INPUT_NAME)
24
+ template_input_id = self.node_input_ids_by_name.get(TEMPLATE_INPUT_NAME)
27
25
 
28
26
  template_node_input = create_node_input(
29
27
  node_id=node_id,
30
- input_name="template",
28
+ input_name=TEMPLATE_INPUT_NAME,
31
29
  value=node.template,
32
30
  display_context=display_context,
33
31
  input_id=template_input_id,
@@ -39,7 +37,8 @@ class BaseTemplatingNodeDisplay(BaseNodeVellumDisplay[_TemplatingNodeType], Gene
39
37
  input_name=variable_name,
40
38
  value=variable_value,
41
39
  display_context=display_context,
42
- input_id=self.node_input_ids_by_name.get(variable_name),
40
+ input_id=self.node_input_ids_by_name.get(f"{TemplatingNode.inputs.name}.{variable_name}")
41
+ or self.node_input_ids_by_name.get(variable_name),
43
42
  )
44
43
  for variable_name, variable_value in template_node_inputs.items()
45
44
  if variable_name != TEMPLATE_INPUT_NAME
@@ -0,0 +1,97 @@
1
+ import pytest
2
+ from uuid import UUID
3
+ from typing import Type
4
+
5
+ from vellum.workflows import BaseWorkflow
6
+ from vellum.workflows.nodes.core.templating_node.node import TemplatingNode
7
+ from vellum_ee.workflows.display.nodes.vellum.templating_node import BaseTemplatingNodeDisplay
8
+ from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
9
+ from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
10
+
11
+
12
+ def _no_display_class(Node: Type[TemplatingNode]):
13
+ return None
14
+
15
+
16
+ def _display_class_with_node_input_ids_by_name(Node: Type[TemplatingNode]):
17
+ class TemplatingNodeDisplay(BaseTemplatingNodeDisplay[Node]): # type: ignore[valid-type]
18
+ node_input_ids_by_name = {"foo": UUID("fba6a4d5-835a-4e99-afb7-f6a4aed15110")}
19
+
20
+ return TemplatingNodeDisplay
21
+
22
+
23
+ def _display_class_with_node_input_ids_by_name_with_inputs_prefix(Node: Type[TemplatingNode]):
24
+ class TemplatingNodeDisplay(BaseTemplatingNodeDisplay[Node]): # type: ignore[valid-type]
25
+ node_input_ids_by_name = {"inputs.foo": UUID("fba6a4d5-835a-4e99-afb7-f6a4aed15110")}
26
+
27
+ return TemplatingNodeDisplay
28
+
29
+
30
+ @pytest.mark.parametrize(
31
+ ["GetDisplayClass", "expected_input_id"],
32
+ [
33
+ (_no_display_class, "d3519cec-590c-416d-8eb1-96051aed5ddd"),
34
+ (_display_class_with_node_input_ids_by_name, "fba6a4d5-835a-4e99-afb7-f6a4aed15110"),
35
+ (_display_class_with_node_input_ids_by_name_with_inputs_prefix, "fba6a4d5-835a-4e99-afb7-f6a4aed15110"),
36
+ ],
37
+ ids=[
38
+ "no_display_class",
39
+ "display_class_with_node_input_ids_by_name",
40
+ "display_class_with_node_input_ids_by_name_with_inputs_prefix",
41
+ ],
42
+ )
43
+ def test_serialize_node__templating_node_inputs(GetDisplayClass, expected_input_id):
44
+ # GIVEN a templating node with inputs
45
+ class MyTemplatingNode(TemplatingNode):
46
+ inputs = {"foo": "bar"}
47
+
48
+ # AND a workflow with the templating node
49
+ class Workflow(BaseWorkflow):
50
+ graph = MyTemplatingNode
51
+
52
+ # AND a display class
53
+ GetDisplayClass(MyTemplatingNode)
54
+
55
+ # WHEN the workflow is serialized
56
+ workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=Workflow)
57
+ serialized_workflow: dict = workflow_display.serialize()
58
+
59
+ # THEN the node should properly serialize the inputs
60
+ my_templating_node = next(
61
+ node for node in serialized_workflow["workflow_raw_data"]["nodes"] if node["type"] == "TEMPLATING"
62
+ )
63
+
64
+ assert my_templating_node["inputs"] == [
65
+ {
66
+ "id": "b7d971ee-9156-46b2-9bf0-9292875211f8",
67
+ "key": "template",
68
+ "value": {
69
+ "combinator": "OR",
70
+ "rules": [
71
+ {
72
+ "type": "CONSTANT_VALUE",
73
+ "data": {
74
+ "type": "STRING",
75
+ "value": "",
76
+ },
77
+ }
78
+ ],
79
+ },
80
+ },
81
+ {
82
+ "id": expected_input_id,
83
+ "key": "foo",
84
+ "value": {
85
+ "combinator": "OR",
86
+ "rules": [
87
+ {
88
+ "type": "CONSTANT_VALUE",
89
+ "data": {
90
+ "type": "STRING",
91
+ "value": "bar",
92
+ },
93
+ }
94
+ ],
95
+ },
96
+ },
97
+ ]
@@ -54,7 +54,7 @@ def create_node_input_value_pointer_rules(
54
54
 
55
55
  if isinstance(value, BaseDescriptor):
56
56
  if isinstance(value, NodeReference):
57
- if not value.instance:
57
+ if value.instance is None:
58
58
  raise ValueError(f"Expected NodeReference {value.name} to have an instance")
59
59
  value = cast(BaseDescriptor, value.instance)
60
60
 
@@ -1,12 +1,16 @@
1
+ import pytest
1
2
  from uuid import uuid4
3
+ from typing import List
2
4
 
3
5
  from deepdiff import DeepDiff
4
6
 
7
+ from vellum.client.types.chat_message import ChatMessage
5
8
  from vellum.workflows.inputs.base import BaseInputs
6
9
  from vellum.workflows.nodes.bases.base import BaseNode
7
10
  from vellum.workflows.references.constant import ConstantValueReference
8
11
  from vellum.workflows.references.lazy import LazyReference
9
12
  from vellum.workflows.references.vellum_secret import VellumSecretReference
13
+ from vellum.workflows.state.base import BaseState
10
14
  from vellum.workflows.workflows.base import BaseWorkflow
11
15
  from vellum_ee.workflows.display.base import WorkflowInputsDisplay
12
16
  from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
@@ -237,6 +241,33 @@ def test_serialize_node__workflow_input(serialize_node):
237
241
  )
238
242
 
239
243
 
244
+ def test_serialize_node__workflow_input_as_nested_chat_history():
245
+ # GIVEN workflow inputs as chat history
246
+ class Inputs(BaseInputs):
247
+ chat_history: List[ChatMessage]
248
+
249
+ # AND a node referencing the workflow input
250
+ class GenericNode(BaseNode):
251
+ attr = {
252
+ "hello": Inputs.chat_history,
253
+ }
254
+
255
+ # AND a workflow with the node
256
+ class Workflow(BaseWorkflow[Inputs, BaseState]):
257
+ graph = GenericNode
258
+
259
+ # WHEN the workflow is serialized
260
+ workflow_display = get_workflow_display(
261
+ base_display_class=VellumWorkflowDisplay,
262
+ workflow_class=Workflow,
263
+ )
264
+ with pytest.raises(Exception) as exc_info:
265
+ workflow_display.serialize()
266
+
267
+ # THEN we should raise a user facing error
268
+ assert str(exc_info.value) == "Failed to serialize attribute 'attr': Nested references are not supported."
269
+
270
+
240
271
  def test_serialize_node__node_output(serialize_node):
241
272
  class NodeWithOutput(BaseNode):
242
273
  class Outputs(BaseNode.Outputs):
@@ -85,7 +85,7 @@ def test_serialize_workflow():
85
85
  },
86
86
  },
87
87
  {
88
- "id": "bb712499-4265-4d71-bc14-0c3d8ca6a7de",
88
+ "id": "e6c9d062-1a4f-4d4d-a258-59b75c6062fc",
89
89
  "key": "info",
90
90
  "value": {
91
91
  "rules": [