vellum-ai 0.13.8__py3-none-any.whl → 0.13.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.
Files changed (49) hide show
  1. vellum/client/core/client_wrapper.py +1 -1
  2. vellum/plugins/vellum_mypy.py +6 -2
  3. vellum/workflows/descriptors/utils.py +1 -1
  4. vellum/workflows/nodes/bases/base.py +1 -2
  5. vellum/workflows/nodes/displayable/api_node/node.py +4 -1
  6. vellum/workflows/nodes/displayable/bases/api_node/node.py +4 -1
  7. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +4 -1
  8. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +4 -0
  9. vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py +4 -0
  10. vellum/workflows/nodes/displayable/bases/search_node.py +4 -0
  11. vellum/workflows/nodes/displayable/code_execution_node/node.py +4 -1
  12. vellum/workflows/nodes/displayable/conditional_node/node.py +4 -0
  13. vellum/workflows/nodes/displayable/final_output_node/node.py +4 -0
  14. vellum/workflows/nodes/displayable/guardrail_node/node.py +4 -1
  15. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +4 -0
  16. vellum/workflows/nodes/displayable/merge_node/node.py +3 -1
  17. vellum/workflows/nodes/displayable/note_node/node.py +4 -0
  18. vellum/workflows/nodes/displayable/prompt_deployment_node/node.py +4 -0
  19. vellum/workflows/nodes/displayable/search_node/node.py +4 -0
  20. vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py +4 -1
  21. vellum/workflows/nodes/utils.py +6 -18
  22. {vellum_ai-0.13.8.dist-info → vellum_ai-0.13.10.dist-info}/METADATA +1 -1
  23. {vellum_ai-0.13.8.dist-info → vellum_ai-0.13.10.dist-info}/RECORD +49 -48
  24. vellum_ee/workflows/display/nodes/base_node_display.py +103 -3
  25. vellum_ee/workflows/display/nodes/vellum/base_node.py +34 -105
  26. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +2 -1
  27. vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py +63 -0
  28. vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py +3 -4
  29. vellum_ee/workflows/display/nodes/vellum/try_node.py +28 -4
  30. vellum_ee/workflows/display/nodes/vellum/utils.py +1 -80
  31. vellum_ee/workflows/display/tests/test_vellum_workflow_display.py +56 -0
  32. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py +3 -2
  33. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +143 -26
  34. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +10 -10
  35. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +6 -6
  36. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +32 -34
  37. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +4 -4
  38. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py +1 -2
  39. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +5 -5
  40. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py +1 -1
  41. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py +6 -3
  42. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py +6 -3
  43. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py +3 -3
  44. vellum_ee/workflows/display/utils/vellum.py +74 -4
  45. vellum_ee/workflows/display/workflows/base_workflow_display.py +22 -24
  46. vellum_ee/workflows/display/workflows/vellum_workflow_display.py +6 -15
  47. {vellum_ai-0.13.8.dist-info → vellum_ai-0.13.10.dist-info}/LICENSE +0 -0
  48. {vellum_ai-0.13.8.dist-info → vellum_ai-0.13.10.dist-info}/WHEEL +0 -0
  49. {vellum_ai-0.13.8.dist-info → vellum_ai-0.13.10.dist-info}/entry_points.txt +0 -0
@@ -21,7 +21,7 @@ vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
21
21
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  vellum_ee/workflows/display/base.py,sha256=3ZFUYRNKL24fBqXhKpa_Dq2W1a-a86J20dmJYA3H2eY,1755
23
23
  vellum_ee/workflows/display/nodes/__init__.py,sha256=5XOcZJXYUgaLS55QgRJzyQ_W1tpeprjnYAeYVezqoGw,160
24
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=pQ-QlaDdxME3roRrQj5eYRZwZXuE9im8gjo2QFwn954,6942
24
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=aucM0ta33owcDwxP-zOvCm9Nb7q7wzjDfxrnyKPV5W4,11423
25
25
  vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=BxA-YVUJvB36NM-Q5DNCwckeqymwLKMp9DVCaTyrPbs,2253
26
26
  vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=vyKeJAevAXvEAEtWeTEdBZXD3eJQYW_DEXLKVZ5KmYc,1325
27
27
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,9 +30,9 @@ vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6m
30
30
  vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
31
31
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=_raKY9eKi_OvIFn6nGvf9xKSboKtYLHCWaWCwDQFbOc,1567
32
32
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=hoV-cUtS6H9kmRQXHd2py95GRWI_dAnnaPwvlNBkDOQ,8571
33
- vellum_ee/workflows/display/nodes/vellum/base_node.py,sha256=mZSeZpolPZg1OEe3xsLbAiYT9aTSfdw0LhiUsHNBRXY,8029
33
+ vellum_ee/workflows/display/nodes/vellum/base_node.py,sha256=BE5bn7_SQ23r2jWEFVJcS6fZzB5fXX9uaADya9NIE6Y,4799
34
34
  vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=z00Z3L0d4PsUQo4S8FRDTtOFLtjdi17TJbatNVF4nM8,4288
35
- vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=XynMt1dt1qAlDFYYNYNDAfItYBUEGWYjQl2oEgcMEW0,11052
35
+ vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=ybLIa4uclqVIy3VAQvI1ivg2tnK5Ug_1R5a69DFqL7E,11104
36
36
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=Tyx74dUmj_ef0slptoUXHtkjLbNd3f4hXeoEozFaFcw,2023
37
37
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=p-PvlnxpBQ7IKskZi2A19jKAtKnSxJ8LPbGMA83VkFk,2805
38
38
  vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=aYZSJTxknU4LMiQdWk9LcK6CkhdozeDEMiRxfAyUNEc,2202
@@ -46,28 +46,29 @@ vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=TxcAGZDl_hvJ7Y1hU
46
46
  vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=lfevlHpGEX14dEDym6qmnkw3nvzQPTB1_D2ch12B_Rk,2701
47
47
  vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=JVIMPR3WpveOCWZubHKZkE04mavnTdb_9QY_r3XliRg,3424
48
48
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=Nqd6mxn0sgL4sp62wDYnQVc7COxrt5wXXIveRFoYQ8c,3913
50
- vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=hB8dcGMGkuC95kk9hmZUgHsCLwEA37fHTFXj0JzbRjM,4692
51
- vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=nIZ1DYTYPRaYsVKcel9a-Fm8EniJL0N7f5PowxVGTVU,8318
49
+ vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py,sha256=mtzB8LJlFCHVFM4H5AanLp29gQfaVmnN4A4iaRGJHoI,2427
50
+ vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=3uT7Gbc0f_mQ3u8uZuCWd0mJ4GtWbz2gbUMySYaVlNE,3774
51
+ vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=tkKILq38n3QXcd2A-RfW8DeHas0I3MII3mexIYYKMtg,5985
52
+ vellum_ee/workflows/display/nodes/vellum/utils.py,sha256=aBmTg9pJloG1BxhYcqzxs5JOA-IixncLVr1XiDzANnA,4313
52
53
  vellum_ee/workflows/display/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
- vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=4jXe7Wyspw6CxghVqKAOu-_QunKFvY4U6--zOiuXvV0,3069
54
+ vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=h4bE187MyM0eT_elFnOxwsCeMHeuzSK0orjgAy8kV1k,4952
54
55
  vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
56
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=RatRmgd1O7OX1r2QfMLPs-WvGQpPLfXIjWNGE4s0yLE,2186
57
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=MtKRKcPJsUJ3le7PLz9H6iH3vmRBZDRy6c-4LUF76zE,1987
58
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=apGjJgH2KrUVA5LuD9b2etjVFFG1cqYTmNATfdkngWA,10193
59
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=nouAROR-L9_u6BfPbKUl20QjbbRpwPeElGS2wIWozLc,6239
60
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=wZekdhIZBwbBoFNAdC9bBLwUxVKk3EnFdNmMwYIdKGA,37308
61
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=os6wCZjcOyig8EJu-pTAFWXa0odMxTaR0mrbL0SS_4Y,4480
57
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=g4R4vnZDcpeZ7jCGpqZhDx8z7Kt1dH7r9iDfCLKJ56A,2252
58
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=jCvt_plgTaKlf5H7alWhYHihvc-Y4p635UhHCjQSbmM,7115
59
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=hcsK36oU9UvYNOdhdKnn2nO36IPzqM4XOxLcz6od9mE,10228
60
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=kuJek64zXtrQZPcSFENr12EST_zaypPzFh67xIr6PXU,6260
61
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=7BRX1Qz1VF_eMqazp6FhlYcOK6sj8p-qu43l7SI4JF0,37351
62
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=EbVgg_3_ipTt3MOop4RARX0fmNjwqZtkhIXzx9nGw7Y,4487
62
63
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py,sha256=bXZWxOKAVjZlbP3iLHPHGA4aPs0EguKlQqmYPNGv3cU,16391
63
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py,sha256=UPLEQPwsLzOqZdkXrB5Jo1FdCx0iQNf7ekfcq1byoFw,29392
64
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=Xn8t-SpvQocKdxNofDeDETlFnkCbBxdLGiUG8m6fM6U,48399
64
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py,sha256=uvABhpstyxNNOz50-XJMAr3SKp8gluPp1mUtJjvRL0c,29410
65
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=n3F_Eyru0DYOszBH4jplz7Mzt2FfBNxGlCkTFqvrX-M,48399
65
66
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256=QVlkczxzaKuOhwbRvVP70otPDNnJcSGDfN79j92lFyk,5534
66
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=_gv7vPxBWSOSRKMlXYv8GKj9h1JAXjXIVWkCE_XhkYE,5746
67
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=yWDykoHUjuiVYdevcJxWmYDDmbIszpHKYBu19vqR-I8,5746
67
68
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py,sha256=mEkvKUrt8U6e9bN65QRG7Zd3KdCdoMvHm96LjGwy96k,7427
68
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=-e6svaclv068n66oLnha-CFzW4ihNnhyQuqAfUyI59k,21395
69
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=luj_PdJd8e13C4JO7dkbTlNPko6N7cPFM1iAljdElW8,16043
70
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=mGk21Wp9Gyr-rRwYqhLEyenJF-ArdXjAdj_qYqcldrE,8422
69
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=CxbnZ3tB8gir9xopixjvT0hNYyjMHvT_m8BzY5kl8Dg,21497
70
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=5xXLoUNgGkZvRFPJrdPiD0fErgwdPk-ikI3rP9sCAA4,16145
71
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=ON3TQiIFDiCvasQiNEyuAZDwpTYGOtitdLDLj2kejL8,8422
71
72
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=W_d-hsjSqbqR5BA3aF3KFoEyfLV6x_yhNKmLA1ai2QY,8622
72
73
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=azUVSdXWoYyAjKuM8m9ikOoJPb5JlEvJtR5nSRR0eaA,12989
73
74
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=yq98DHxetpbqYnGVTDmcokU0A4XAD7E-NcKhrEMP66M,11295
@@ -77,12 +78,12 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_ser
77
78
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=wQ97k-y9rZwKYlZSA6Z9XGUnGRaJ5BvCFu5QnhuEp4A,7404
78
79
  vellum_ee/workflows/display/types.py,sha256=jWTpfQv3baEWjbP12duc3MBz3TK03Ja1UI5458PVQVY,4211
79
80
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- vellum_ee/workflows/display/utils/vellum.py,sha256=N5VSDYdtHUxvTeSj4zA8aMiAAKn4bAVgpKUDV_obNQ8,3632
81
+ vellum_ee/workflows/display/utils/vellum.py,sha256=0H-c3OaQYZ_sGdI4YmyxEcZ77oWn_Rfts-MLs_QWqls,7289
81
82
  vellum_ee/workflows/display/vellum.py,sha256=8xXRI8b8Tt661H-iZreTQTvLNEKUr4lf-XaKhE7_yUY,8147
82
83
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
83
- vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=cLmW-oMMaP2BSwXCTVJ_KxhKmyfTRRJ_TGhkW3AQYXA,14324
84
+ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=x4C621UTH_SZLJYmVBiC1q-D-wadJlTiSGlKAI6CUbA,14082
84
85
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=kp0u8LN_2IwshLrhMImhpZx1hRyAcD5gXY-kDuuaGMQ,1269
85
- vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=V0edhtohqAWbaHvHkj9Sth4ieaIVejsrsRIr7aCCoVc,16871
86
+ vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=ReEaGb0IBWYeTmEvP5ObcJlTe6RtAogOZlemHkEwBcM,16486
86
87
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
88
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=X_DdNK7MfyOjKWekk6YQpOSCT6klKcdjT6nVJcBH1sM,1481
88
89
  vellum_ee/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -111,7 +112,7 @@ vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
111
112
  vellum/client/__init__.py,sha256=8nZt88C9SVwWanjLbIQMU3rzb32h5UZfFMBx3VPHB50,111887
112
113
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
113
114
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
114
- vellum/client/core/client_wrapper.py,sha256=NnIgNorh26bh1LnC042Vcmf_kylY4hdObVYLpA5mq6k,1868
115
+ vellum/client/core/client_wrapper.py,sha256=QFtPX3r8rOjA_HWWWzqeN6YXR94sGx14HQGv7kmubTA,1869
115
116
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
116
117
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
117
118
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -691,7 +692,7 @@ vellum/evaluations/utils/paginator.py,sha256=rEED_BJAXAM6tM1yMwHePNzszjq_tTq4NbQ
691
692
  vellum/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
692
693
  vellum/plugins/pydantic.py,sha256=dNtZWHo-IdseG52C2RoTanxyTJg0AhPZrH-9lbNqwYg,2604
693
694
  vellum/plugins/utils.py,sha256=U9ZY9KdE3RRvbcG01hXxu9CvfJD6Fo7nJDgcHjQn0FI,606
694
- vellum/plugins/vellum_mypy.py,sha256=7JmyuTX723-XWnWoE6afiUNOkHyAufCUZwxck9BP2aI,27784
695
+ vellum/plugins/vellum_mypy.py,sha256=QTuMSq6PiZW1dyTUZ5Bf1d4XkgFj0TKAgZLP8f4UgL4,27914
695
696
  vellum/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
696
697
  vellum/prompts/blocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
697
698
  vellum/prompts/blocks/compilation.py,sha256=ISuvDHaeVCPb1L7l4umORCECkDn0-rvE49hopz6c2gM,9222
@@ -1251,7 +1252,7 @@ vellum/workflows/context.py,sha256=R8qdsFbD_0p7B6PWnyvSrZ_aOgMtGw-_uk0P0UAmwLA,1
1251
1252
  vellum/workflows/descriptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1252
1253
  vellum/workflows/descriptors/base.py,sha256=gSib3vJpcI_UC8y8jhdp-hOK3_TGTF-SuwdhxF6x5iQ,14332
1253
1254
  vellum/workflows/descriptors/tests/test_utils.py,sha256=63w1P6PELNhWzpg1BqL8y2XQZ8XRt0RUkHgLcsXyOQE,4592
1254
- vellum/workflows/descriptors/utils.py,sha256=lO_dbr5g3PXpHPtVBkdguAK4-1qayZ7RXjl3BgAhrMM,3795
1255
+ vellum/workflows/descriptors/utils.py,sha256=nE51MR0KMy3SVHPBg0wjJ3CSJBTLM3tZnVUC_enQEIw,3826
1255
1256
  vellum/workflows/edges/__init__.py,sha256=wSkmAnz9xyi4vZwtDbKxwlplt2skD7n3NsxkvR_pUus,50
1256
1257
  vellum/workflows/edges/edge.py,sha256=N0SnY3gKVuxImPAdCbPMPlHJIXbkQ3fwq_LbJRvVMFc,677
1257
1258
  vellum/workflows/emitters/__init__.py,sha256=YyOgaoLtVW8eFNEWODzCYb0HzL0PoSeNRf4diJ1Y0dk,80
@@ -1305,7 +1306,7 @@ vellum/workflows/inputs/base.py,sha256=1kMgr0WqCYdWUqgFvgSoAMw2067FAlgwhGXLgbIOr
1305
1306
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1306
1307
  vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
1307
1308
  vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
1308
- vellum/workflows/nodes/bases/base.py,sha256=CcWQBMR3cx5vftqQp_oJ_GncULJIbOLMyNP4KZNgU10,14487
1309
+ vellum/workflows/nodes/bases/base.py,sha256=iYn8XmKZKj43vCx_xs5AbnnLgBydmjlElwjb-0xe63I,14459
1309
1310
  vellum/workflows/nodes/bases/base_adornment_node.py,sha256=eFTgsPCYb3eyGS0-kw7C6crFnwFx437R5wh9-8bWYts,2905
1310
1311
  vellum/workflows/nodes/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1311
1312
  vellum/workflows/nodes/bases/tests/test_base_node.py,sha256=51CueFVty9XYASC0rKr1cXWejho5WElmhfhp6cCONy0,3811
@@ -1333,50 +1334,50 @@ vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW
1333
1334
  vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=Wc2kLl-MkffsBxl3IiFaqLd16e2Iosxhk7qBnojPvQg,4092
1334
1335
  vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
1335
1336
  vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
1336
- vellum/workflows/nodes/displayable/api_node/node.py,sha256=ocXjg0Sp52V6DllTDZXUgOp9qBw6l_KbtWcaxowsDM4,2070
1337
+ vellum/workflows/nodes/displayable/api_node/node.py,sha256=KHuDTzOeXO3lCQm3lQqusAEhj84dhvszVpO1Xsx4qPM,2175
1337
1338
  vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
1338
1339
  vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
1339
- vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=ywPwCxDesgnE86Wjyf2ZyG2Dr2O7xW8D4tPHZB5Se_s,2477
1340
+ vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=kKiwrz8XGJkvFjipBthxs9h1e2ndWPgmpEzZiYs0I5I,2579
1340
1341
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1341
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=w9HfUhVHtF3Y95duj9bsAj5XHmObN6S6vvfI67u7RyY,2156
1342
+ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=reDW1aHetmkesyq9iVrbTtesql-SFUsd2LygGLfdJPo,2258
1342
1343
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1343
1344
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1344
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=TKoxReiGGQfafwrZyy7FLvVGYPlk_NT-bTRX04ozRB8,6311
1345
- vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=rm23ZebJ4nj3wakfLI8bcuHZAydXCk1d7IPdXhiQHys,5039
1346
- vellum/workflows/nodes/displayable/bases/search_node.py,sha256=m37Ukjb75U6e5ehxV9YKz8r0J1e3p_Tv-f8pTvaH4RI,5245
1345
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=j6AKAVIl_uU77a6JMGnMTyFnnK-jsfPVthxrgbltQRE,6453
1346
+ vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=FAY6cR3rlIWsufprA6WXefOaU2J1LK0HFfQkBxCQ-yI,5181
1347
+ vellum/workflows/nodes/displayable/bases/search_node.py,sha256=3UtbqY3QO4kzfJHbmUNZGnEEfJmaoiF892u8H6TGjp8,5381
1347
1348
  vellum/workflows/nodes/displayable/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1348
1349
  vellum/workflows/nodes/displayable/bases/tests/test_utils.py,sha256=uQM9RTVmC-fMQ4hd4481QZbviokshwYSxk1ee9leh3A,2406
1349
1350
  vellum/workflows/nodes/displayable/bases/types.py,sha256=C37B2Qh2YP7s7pUjd-EYKc2Zl1TbnCgI_mENuUSb8bo,1706
1350
1351
  vellum/workflows/nodes/displayable/bases/utils.py,sha256=hlbIRLAAeqRhzZPLK7WDvBzUT2b6tupaXYOF54iYvS0,4973
1351
1352
  vellum/workflows/nodes/displayable/code_execution_node/__init__.py,sha256=0FLWMMktpzSnmBMizQglBpcPrP80fzVsoJwJgf822Cg,76
1352
- vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=JgyTgZRSb-gSXL4ccHn4VkPcPZFOkVK5ohPazPqSWFw,8652
1353
+ vellum/workflows/nodes/displayable/code_execution_node/node.py,sha256=Hzc0h9sogX8DfFbJqdDLxGU2CMY1WvGosZ7taJC4sPE,8754
1353
1354
  vellum/workflows/nodes/displayable/code_execution_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1354
1355
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1355
1356
  vellum/workflows/nodes/displayable/code_execution_node/tests/fixtures/main.py,sha256=5QsbmkzSlSbcbWTG_JmIqcP-JNJzOPTKxGzdHos19W4,79
1356
1357
  vellum/workflows/nodes/displayable/code_execution_node/tests/test_code_execution_node.py,sha256=s93M_EnU-4n60iSKv3FCf0kppwzFH5FNi9o9E58fQ3I,7510
1357
1358
  vellum/workflows/nodes/displayable/code_execution_node/utils.py,sha256=LfI3kj2zQz6UGMld_uA9z2LjZobqRcgxQO4jdUWkg7o,376
1358
1359
  vellum/workflows/nodes/displayable/conditional_node/__init__.py,sha256=AS_EIqFdU1F9t8aLmbZU-rLh9ry6LCJ0uj0D8F0L5Uw,72
1359
- vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=REFZdEVetXGyOK1RbIN1T6yRblrP0hfyZUls2KfjTKg,1016
1360
+ vellum/workflows/nodes/displayable/conditional_node/node.py,sha256=Qjfl33gZ3JEgxBA1EgzSUebboGvsARthIxxcQyvx5Gg,1152
1360
1361
  vellum/workflows/nodes/displayable/final_output_node/__init__.py,sha256=G7VXM4OWpubvSJtVkGmMNeqgb9GkM7qZT838eL18XU4,72
1361
- vellum/workflows/nodes/displayable/final_output_node/node.py,sha256=iH3ZPOstPku_rg4h97Xz5FMaHWVRCjypaamAFzoJzJ0,1854
1362
+ vellum/workflows/nodes/displayable/final_output_node/node.py,sha256=TFbDZLGEtmg2cOQeJ56pUQdAkuHRa_qjBRIOGZU7Fy4,1990
1362
1363
  vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
1363
- vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=7Ep7Ff7FtFry3Jwxhg_npF_-jT2P6TGKp5MRNnCZ8Tc,3923
1364
+ vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=h5nIBzQxbXTrdTq1wjDcekk1RV4-rKUNCshqdBAiJJY,4025
1364
1365
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1365
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=OPjdEK5mL3D2cwL68GiBFlRJ2b0tgatxsfeUEPeQDxI,2146
1366
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=UWOxIa3kizhDa5joAmEDlh0P66EaqatqxzLLbvbUybw,2294
1366
1367
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1367
1368
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=57JYbHvfZAjEGfa4CvYSpAt5yLDj0bPIr1_RoG8n9oI,4725
1368
1369
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
1369
- vellum/workflows/nodes/displayable/merge_node/node.py,sha256=ZyPvcTgfPOneOm5Dc2kUOoPkwNJqwRPZSj232akXynA,324
1370
+ vellum/workflows/nodes/displayable/merge_node/node.py,sha256=nZtGGVAvY4fvGg8vwV6sTQ8_QLRnigeXt0vf2FL272A,450
1370
1371
  vellum/workflows/nodes/displayable/note_node/__init__.py,sha256=KWA3P4fyYJ-fOTky8qNGlcOotQ-HeHJ9AjZt6mRQmCE,58
1371
- vellum/workflows/nodes/displayable/note_node/node.py,sha256=8rwP7RS1OOyQJ-ZuZBXTCtT2ZW8J6eGD59iKmq_pB24,258
1372
+ vellum/workflows/nodes/displayable/note_node/node.py,sha256=sIN1VBQ7zeT3GhN0kupXbFfdpvgedWV79k4woJNp5IQ,394
1372
1373
  vellum/workflows/nodes/displayable/prompt_deployment_node/__init__.py,sha256=krX1Hds-TSVYZsx0wJFX4wsAKkEFYOX1ifwRGiIM-EA,82
1373
- vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=cpOrqQQanZ0xO4B4B3mgyBWKcnkT5b0DFxOSeS8otrI,2528
1374
+ vellum/workflows/nodes/displayable/prompt_deployment_node/node.py,sha256=ruOgvpg_9KV_HkovPQeu6TKpur9DT_J4CYQo50tULCY,2680
1374
1375
  vellum/workflows/nodes/displayable/search_node/__init__.py,sha256=hpBpvbrDYf43DElRZFLzieSn8weXiwNiiNOJurERQbs,62
1375
- vellum/workflows/nodes/displayable/search_node/node.py,sha256=yhFWulbNmSQoDAwtTSGD4AtKmBbcykezRGRG16xga_0,1311
1376
+ vellum/workflows/nodes/displayable/search_node/node.py,sha256=_VHHuTNN4icZBgc7O5U9SVKrv1zgKipU72fOtxTyrQU,1453
1376
1377
  vellum/workflows/nodes/displayable/search_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1377
1378
  vellum/workflows/nodes/displayable/search_node/tests/test_node.py,sha256=2-QCV7Vk_-YMls33p0GOUtCv3f2uPNZCjkB2CRjek7o,6562
1378
1379
  vellum/workflows/nodes/displayable/subworkflow_deployment_node/__init__.py,sha256=9yYM6001YZeqI1VOk1QuEM_yrffk_EdsO7qaPzINKds,92
1379
- vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=FgS1ZMnIBliqEMNKX2ChE80bw4IVHEQ6IGiTDvF0RZw,7226
1380
+ vellum/workflows/nodes/displayable/subworkflow_deployment_node/node.py,sha256=rDBB94bs9k-I9zmf3C0L_5wO3wW4WBuRXi5ry0rTGRY,7328
1380
1381
  vellum/workflows/nodes/displayable/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1381
1382
  vellum/workflows/nodes/displayable/tests/test_inline_text_prompt_node.py,sha256=CI7iMyyIlnds1rkVSjICOFg2UY0yV51NTKtKpfeEME4,4677
1382
1383
  vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=VepO5z1277c1y5N6LLIC31nnWD1aak2m5oPFplfJHHs,6935
@@ -1385,7 +1386,7 @@ vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrra
1385
1386
  vellum/workflows/nodes/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1386
1387
  vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
1387
1388
  vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=1EGeiaT-Zoo6pttQFKKBcdf3dmhAbjKGaErYD5FFwlc,10185
1388
- vellum/workflows/nodes/utils.py,sha256=chSsmKe_BsvMIJpzSxO5TWYlr3sAuxiwkfB5azkuN5Q,2715
1389
+ vellum/workflows/nodes/utils.py,sha256=tjBsootwm7vUq9qU4ttDL3CWH0C9Sd6QlX7IhfCCy34,2512
1389
1390
  vellum/workflows/outputs/__init__.py,sha256=AyZ4pRh_ACQIGvkf0byJO46EDnSix1ZCAXfvh-ms1QE,94
1390
1391
  vellum/workflows/outputs/base.py,sha256=a7W6rNSDSawwGAXYjNTF2iHb9lnZu7WFSOagZIyy__k,7976
1391
1392
  vellum/workflows/ports/__init__.py,sha256=bZuMt-R7z5bKwpu4uPW7LlJeePOQWmCcDSXe5frUY5g,101
@@ -1440,8 +1441,8 @@ vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528
1440
1441
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1441
1442
  vellum/workflows/workflows/base.py,sha256=k0kUWWko4fHyCqLSU_1cBK_pXZpl9MXekWiG-bdOAo0,18353
1442
1443
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
1443
- vellum_ai-0.13.8.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1444
- vellum_ai-0.13.8.dist-info/METADATA,sha256=DslQiu2NfpU6727w1BqOFezu5H0uKbP0EiBP1ALlB1Y,5334
1445
- vellum_ai-0.13.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1446
- vellum_ai-0.13.8.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1447
- vellum_ai-0.13.8.dist-info/RECORD,,
1444
+ vellum_ai-0.13.10.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1445
+ vellum_ai-0.13.10.dist-info/METADATA,sha256=qsbrVIIP35E7Q0tVUt2vd_NXWi9dYkUcksWgKYnCPy8,5335
1446
+ vellum_ai-0.13.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1447
+ vellum_ai-0.13.10.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1448
+ vellum_ai-0.13.10.dist-info/RECORD,,
@@ -16,15 +16,28 @@ from typing import (
16
16
  get_origin,
17
17
  )
18
18
 
19
+ from vellum.workflows.descriptors.base import BaseDescriptor
20
+ from vellum.workflows.expressions.between import BetweenExpression
21
+ from vellum.workflows.expressions.is_nil import IsNilExpression
22
+ from vellum.workflows.expressions.is_not_nil import IsNotNilExpression
23
+ from vellum.workflows.expressions.is_not_null import IsNotNullExpression
24
+ from vellum.workflows.expressions.is_not_undefined import IsNotUndefinedExpression
25
+ from vellum.workflows.expressions.is_null import IsNullExpression
26
+ from vellum.workflows.expressions.is_undefined import IsUndefinedExpression
27
+ from vellum.workflows.expressions.not_between import NotBetweenExpression
19
28
  from vellum.workflows.nodes.bases.base import BaseNode
20
29
  from vellum.workflows.ports import Port
21
30
  from vellum.workflows.references import OutputReference
31
+ from vellum.workflows.references.execution_count import ExecutionCountReference
32
+ from vellum.workflows.references.vellum_secret import VellumSecretReference
33
+ from vellum.workflows.references.workflow_input import WorkflowInputReference
22
34
  from vellum.workflows.types.core import JsonObject
23
35
  from vellum.workflows.types.generics import NodeType
24
36
  from vellum.workflows.types.utils import get_original_base
25
37
  from vellum.workflows.utils.names import pascal_to_title_case
26
38
  from vellum.workflows.utils.uuids import uuid4_from_hash
27
39
  from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay, PortDisplay, PortDisplayOverrides
40
+ from vellum_ee.workflows.display.utils.vellum import convert_descriptor_to_operator, primitive_to_vellum_value
28
41
  from vellum_ee.workflows.display.vellum import CodeResourceDefinition
29
42
 
30
43
  if TYPE_CHECKING:
@@ -76,12 +89,15 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
76
89
  )
77
90
  return node_definition
78
91
 
79
- def get_node_output_display(self, output: OutputReference) -> NodeOutputDisplay:
92
+ def get_trigger_id(self) -> UUID:
93
+ return uuid4_from_hash(f"{self.node_id}|trigger")
94
+
95
+ def get_node_output_display(self, output: OutputReference) -> Tuple[Type[BaseNode], NodeOutputDisplay]:
80
96
  explicit_display = self.output_display.get(output)
81
97
  if explicit_display:
82
- return explicit_display
98
+ return self._node, explicit_display
83
99
 
84
- return NodeOutputDisplay(id=uuid4_from_hash(f"{self.node_id}|{output.name}"), name=output.name)
100
+ return (self._node, NodeOutputDisplay(id=uuid4_from_hash(f"{self.node_id}|{output.name}"), name=output.name))
85
101
 
86
102
  def get_node_port_display(self, port: Port) -> PortDisplay:
87
103
  overrides = self.port_displays.get(port)
@@ -174,3 +190,87 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
174
190
 
175
191
  node_class = cls.infer_node_class()
176
192
  cls._node_display_registry[node_class] = cls
193
+
194
+ def serialize_condition(self, display_context: "WorkflowDisplayContext", condition: BaseDescriptor) -> JsonObject:
195
+ if isinstance(
196
+ condition,
197
+ (
198
+ IsNullExpression,
199
+ IsNotNullExpression,
200
+ IsNilExpression,
201
+ IsNotNilExpression,
202
+ IsUndefinedExpression,
203
+ IsNotUndefinedExpression,
204
+ ),
205
+ ):
206
+ lhs = self.serialize_value(display_context, condition._expression)
207
+ return {
208
+ "type": "UNARY_EXPRESSION",
209
+ "lhs": lhs,
210
+ "operator": convert_descriptor_to_operator(condition),
211
+ }
212
+ elif isinstance(condition, (BetweenExpression, NotBetweenExpression)):
213
+ base = self.serialize_value(display_context, condition._value)
214
+ lhs = self.serialize_value(display_context, condition._start)
215
+ rhs = self.serialize_value(display_context, condition._end)
216
+
217
+ return {
218
+ "type": "TERNARY_EXPRESSION",
219
+ "base": base,
220
+ "operator": convert_descriptor_to_operator(condition),
221
+ "lhs": lhs,
222
+ "rhs": rhs,
223
+ }
224
+ else:
225
+ lhs = self.serialize_value(display_context, condition._lhs) # type: ignore[attr-defined]
226
+ rhs = self.serialize_value(display_context, condition._rhs) # type: ignore[attr-defined]
227
+
228
+ return {
229
+ "type": "BINARY_EXPRESSION",
230
+ "lhs": lhs,
231
+ "operator": convert_descriptor_to_operator(condition),
232
+ "rhs": rhs,
233
+ }
234
+
235
+ def serialize_value(self, display_context: "WorkflowDisplayContext", value: BaseDescriptor) -> JsonObject:
236
+ if isinstance(value, WorkflowInputReference):
237
+ workflow_input_display = display_context.global_workflow_input_displays[value]
238
+ return {
239
+ "type": "WORKFLOW_INPUT",
240
+ "input_variable_id": str(workflow_input_display.id),
241
+ }
242
+
243
+ if isinstance(value, OutputReference):
244
+ upstream_node, output_display = display_context.global_node_output_displays[value]
245
+ upstream_node_display = display_context.global_node_displays[upstream_node]
246
+
247
+ return {
248
+ "type": "NODE_OUTPUT",
249
+ "node_id": str(upstream_node_display.node_id),
250
+ "node_output_id": str(output_display.id),
251
+ }
252
+
253
+ if isinstance(value, VellumSecretReference):
254
+ return {
255
+ "type": "VELLUM_SECRET",
256
+ "vellum_secret_name": value.name,
257
+ }
258
+
259
+ if isinstance(value, ExecutionCountReference):
260
+ node_class_display = display_context.global_node_displays[value.node_class]
261
+
262
+ return {
263
+ "type": "EXECUTION_COUNTER",
264
+ "node_id": str(node_class_display.node_id),
265
+ }
266
+
267
+ if not isinstance(value, BaseDescriptor):
268
+ vellum_value = primitive_to_vellum_value(value)
269
+ return {
270
+ "type": "CONSTANT_VALUE",
271
+ "value": vellum_value.dict(),
272
+ }
273
+
274
+ # If it's not any of the references we know about,
275
+ # then try to serialize it as a nested value
276
+ return self.serialize_condition(display_context, value)
@@ -1,41 +1,37 @@
1
- from typing import Any, Generic, TypeVar, cast
1
+ import inspect
2
+ from uuid import UUID
3
+ from typing import Any, Generic, Optional, TypeVar, cast
2
4
 
3
5
  from vellum.workflows.constants import UNDEF
4
6
  from vellum.workflows.descriptors.base import BaseDescriptor
5
- from vellum.workflows.expressions.between import BetweenExpression
6
- from vellum.workflows.expressions.is_nil import IsNilExpression
7
- from vellum.workflows.expressions.is_not_nil import IsNotNilExpression
8
- from vellum.workflows.expressions.is_not_null import IsNotNullExpression
9
- from vellum.workflows.expressions.is_not_undefined import IsNotUndefinedExpression
10
- from vellum.workflows.expressions.is_null import IsNullExpression
11
- from vellum.workflows.expressions.is_undefined import IsUndefinedExpression
12
- from vellum.workflows.expressions.not_between import NotBetweenExpression
13
7
  from vellum.workflows.nodes.bases.base import BaseNode
14
- from vellum.workflows.references.execution_count import ExecutionCountReference
15
- from vellum.workflows.references.output import OutputReference
16
- from vellum.workflows.references.vellum_secret import VellumSecretReference
17
- from vellum.workflows.references.workflow_input import WorkflowInputReference
8
+ from vellum.workflows.nodes.utils import get_wrapped_node
18
9
  from vellum.workflows.types.core import JsonArray, JsonObject
19
10
  from vellum.workflows.utils.uuids import uuid4_from_hash
20
11
  from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
12
+ from vellum.workflows.workflows.base import BaseWorkflow
21
13
  from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
22
- from vellum_ee.workflows.display.nodes.vellum.utils import convert_descriptor_to_operator
14
+ from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
23
15
  from vellum_ee.workflows.display.types import WorkflowDisplayContext
24
- from vellum_ee.workflows.display.utils.vellum import primitive_to_vellum_value
25
16
  from vellum_ee.workflows.display.vellum import GenericNodeDisplayData
26
17
 
27
18
  _BaseNodeType = TypeVar("_BaseNodeType", bound=BaseNode)
28
19
 
29
20
 
30
21
  class BaseNodeDisplay(BaseNodeVellumDisplay[_BaseNodeType], Generic[_BaseNodeType]):
31
- def serialize(self, display_context: WorkflowDisplayContext, **kwargs: Any) -> JsonObject:
22
+ def serialize(
23
+ self, display_context: WorkflowDisplayContext, adornments: Optional[JsonArray] = None, **kwargs: Any
24
+ ) -> JsonObject:
32
25
  node = self._node
33
26
  node_id = self.node_id
34
27
 
35
28
  attributes: JsonArray = []
36
29
  for attribute in node:
37
- id = str(uuid4_from_hash(f"{node_id}|{attribute.name}"))
30
+ if inspect.isclass(attribute.instance) and issubclass(attribute.instance, BaseWorkflow):
31
+ # We don't need to serialize generic node attributes containing a subworkflow
32
+ continue
38
33
 
34
+ id = str(uuid4_from_hash(f"{node_id}|{attribute.name}"))
39
35
  attributes.append(
40
36
  {
41
37
  "id": id,
@@ -44,9 +40,23 @@ class BaseNodeDisplay(BaseNodeVellumDisplay[_BaseNodeType], Generic[_BaseNodeTyp
44
40
  }
45
41
  )
46
42
 
43
+ wrapped_node = get_wrapped_node(node)
44
+ if wrapped_node is not None:
45
+ display_class = get_node_display_class(BaseNodeDisplay, wrapped_node)
46
+
47
+ adornment: JsonObject = {
48
+ "id": str(node_id),
49
+ "label": node.__qualname__,
50
+ "base": self.get_base().dict(),
51
+ "attributes": attributes,
52
+ }
53
+
54
+ existing_adornments = adornments if adornments is not None else []
55
+ return display_class().serialize(display_context, adornments=existing_adornments + [adornment])
56
+
47
57
  ports: JsonArray = []
48
- for idx, port in enumerate(node.Ports):
49
- id = str(uuid4_from_hash(f"{node_id}|{idx}"))
58
+ for port in node.Ports:
59
+ id = str(self.get_node_port_display(port).id)
50
60
 
51
61
  if port._condition_type:
52
62
  ports.append(
@@ -94,99 +104,18 @@ class BaseNodeDisplay(BaseNodeVellumDisplay[_BaseNodeType], Generic[_BaseNodeTyp
94
104
  "base": self.get_base().dict(),
95
105
  "definition": self.get_definition().dict(),
96
106
  "trigger": {
97
- "id": str(uuid4_from_hash(f"{node_id}|trigger")),
107
+ "id": str(self.get_trigger_id()),
98
108
  "merge_behavior": node.Trigger.merge_behavior.value,
99
109
  },
100
110
  "ports": ports,
101
- "adornments": None,
111
+ "adornments": adornments,
102
112
  "attributes": attributes,
103
113
  "outputs": outputs,
104
114
  }
105
115
 
116
+ def get_target_handle_id(self) -> UUID:
117
+ return self.get_trigger_id()
118
+
106
119
  def get_generic_node_display_data(self) -> GenericNodeDisplayData:
107
120
  explicit_value = self._get_explicit_node_display_attr("display_data", GenericNodeDisplayData)
108
121
  return explicit_value if explicit_value else GenericNodeDisplayData()
109
-
110
- def serialize_condition(self, display_context: WorkflowDisplayContext, condition: BaseDescriptor) -> JsonObject:
111
- if isinstance(
112
- condition,
113
- (
114
- IsNullExpression,
115
- IsNotNullExpression,
116
- IsNilExpression,
117
- IsNotNilExpression,
118
- IsUndefinedExpression,
119
- IsNotUndefinedExpression,
120
- ),
121
- ):
122
- lhs = self.serialize_value(display_context, condition._expression)
123
- return {
124
- "type": "UNARY_EXPRESSION",
125
- "lhs": lhs,
126
- "operator": convert_descriptor_to_operator(condition),
127
- }
128
- elif isinstance(condition, (BetweenExpression, NotBetweenExpression)):
129
- base = self.serialize_value(display_context, condition._value)
130
- lhs = self.serialize_value(display_context, condition._start)
131
- rhs = self.serialize_value(display_context, condition._end)
132
-
133
- return {
134
- "type": "TERNARY_EXPRESSION",
135
- "base": base,
136
- "operator": convert_descriptor_to_operator(condition),
137
- "lhs": lhs,
138
- "rhs": rhs,
139
- }
140
- else:
141
- lhs = self.serialize_value(display_context, condition._lhs) # type: ignore[attr-defined]
142
- rhs = self.serialize_value(display_context, condition._rhs) # type: ignore[attr-defined]
143
-
144
- return {
145
- "type": "BINARY_EXPRESSION",
146
- "lhs": lhs,
147
- "operator": convert_descriptor_to_operator(condition),
148
- "rhs": rhs,
149
- }
150
-
151
- def serialize_value(self, display_context: WorkflowDisplayContext, value: BaseDescriptor) -> JsonObject:
152
- if isinstance(value, WorkflowInputReference):
153
- workflow_input_display = display_context.global_workflow_input_displays[value]
154
- return {
155
- "type": "WORKFLOW_INPUT",
156
- "input_variable_id": str(workflow_input_display.id),
157
- }
158
-
159
- if isinstance(value, OutputReference):
160
- upstream_node, output_display = display_context.global_node_output_displays[value]
161
- upstream_node_display = display_context.global_node_displays[upstream_node]
162
-
163
- return {
164
- "type": "NODE_OUTPUT",
165
- "node_id": str(upstream_node_display.node_id),
166
- "node_output_id": str(output_display.id),
167
- }
168
-
169
- if isinstance(value, VellumSecretReference):
170
- return {
171
- "type": "VELLUM_SECRET",
172
- "vellum_secret_name": value.name,
173
- }
174
-
175
- if isinstance(value, ExecutionCountReference):
176
- node_class_display = display_context.global_node_displays[value.node_class]
177
-
178
- return {
179
- "type": "EXECUTION_COUNTER",
180
- "node_id": str(node_class_display.node_id),
181
- }
182
-
183
- if not isinstance(value, BaseDescriptor):
184
- vellum_value = primitive_to_vellum_value(value)
185
- return {
186
- "type": "CONSTANT_VALUE",
187
- "value": vellum_value.dict(),
188
- }
189
-
190
- # If it's not any of the references we know about,
191
- # then try to serialize it as a nested value
192
- return self.serialize_condition(display_context, value)
@@ -17,8 +17,9 @@ from vellum.workflows.nodes.displayable import ConditionalNode
17
17
  from vellum.workflows.types.core import ConditionType, JsonObject
18
18
  from vellum.workflows.utils.uuids import uuid4_from_hash
19
19
  from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
20
- from vellum_ee.workflows.display.nodes.vellum.utils import convert_descriptor_to_operator, create_node_input
20
+ from vellum_ee.workflows.display.nodes.vellum.utils import create_node_input
21
21
  from vellum_ee.workflows.display.types import WorkflowDisplayContext
22
+ from vellum_ee.workflows.display.utils.vellum import convert_descriptor_to_operator
22
23
  from vellum_ee.workflows.display.vellum import NodeInput
23
24
 
24
25
  _ConditionalNodeType = TypeVar("_ConditionalNodeType", bound=ConditionalNode)
@@ -0,0 +1,63 @@
1
+ from typing import Any, Dict, cast
2
+
3
+ from vellum.workflows import BaseWorkflow
4
+ from vellum.workflows.nodes.bases.base import BaseNode
5
+ from vellum.workflows.nodes.core.templating_node.node import TemplatingNode
6
+ from vellum.workflows.nodes.core.try_node.node import TryNode
7
+ from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
8
+ from vellum_ee.workflows.display.workflows.vellum_workflow_display import VellumWorkflowDisplay
9
+
10
+
11
+ def test_try_node_display__serialize_with_error_output() -> None:
12
+ # GIVEN a Base Node wrapped with a TryNode
13
+ @TryNode.wrap()
14
+ class MyNode(BaseNode):
15
+ class Outputs(BaseNode.Outputs):
16
+ hello = "world"
17
+
18
+ # AND a displayable node referencing
19
+ class OtherNode(TemplatingNode):
20
+ template = "{{ hello }} {{ error }}"
21
+ inputs = {
22
+ "hello": MyNode.Outputs.hello,
23
+ "error": MyNode.Outputs.error,
24
+ }
25
+
26
+ # AND a workflow referencing the two nodes
27
+ class MyWorkflow(BaseWorkflow):
28
+ graph = MyNode >> OtherNode
29
+
30
+ # WHEN we serialize the workflow
31
+ workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=MyWorkflow)
32
+ serialized_workflow = cast(Dict[str, Any], workflow_display.serialize())
33
+
34
+ # THEN the correct inputs should be serialized on the node
35
+ serialized_node = next(
36
+ node for node in serialized_workflow["workflow_raw_data"]["nodes"] if node["id"] == str(OtherNode.__id__)
37
+ )
38
+ hello_input_value = next(input["value"] for input in serialized_node["inputs"] if input["key"] == "hello")
39
+ error_input_value = next(input["value"] for input in serialized_node["inputs"] if input["key"] == "error")
40
+ assert hello_input_value == {
41
+ "combinator": "OR",
42
+ "rules": [
43
+ {
44
+ "data": {
45
+ "node_id": str(MyNode.__wrapped_node__.__id__),
46
+ "output_id": "c8fbe459-c9ee-4639-a82d-961180cf9411",
47
+ },
48
+ "type": "NODE_OUTPUT",
49
+ }
50
+ ],
51
+ }
52
+ assert error_input_value == {
53
+ "combinator": "OR",
54
+ "rules": [
55
+ {
56
+ "data": {
57
+ "node_id": str(MyNode.__wrapped_node__.__id__),
58
+ "output_id": "efe6e307-3ea4-4862-a26f-4c4416bb4537",
59
+ },
60
+ "type": "NODE_OUTPUT",
61
+ }
62
+ ],
63
+ }