vellum-ai 0.14.16__py3-none-any.whl → 0.14.18__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vellum/__init__.py +2 -0
- vellum/client/core/client_wrapper.py +1 -1
- vellum/client/types/__init__.py +2 -0
- vellum/client/types/release.py +21 -0
- vellum/client/types/workflow_release_tag_read.py +7 -1
- vellum/prompts/blocks/compilation.py +14 -0
- vellum/types/release.py +3 -0
- vellum/workflows/events/workflow.py +15 -1
- vellum/workflows/nodes/bases/base.py +7 -7
- vellum/workflows/nodes/bases/base_adornment_node.py +2 -0
- vellum/workflows/nodes/core/retry_node/node.py +60 -40
- vellum/workflows/nodes/core/templating_node/node.py +2 -2
- vellum/workflows/nodes/core/try_node/node.py +1 -1
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +4 -0
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +27 -1
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py +0 -0
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py +298 -0
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py +24 -1
- vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py +7 -1
- vellum/workflows/runner/runner.py +16 -1
- vellum/workflows/utils/tests/test_vellum_variables.py +7 -1
- vellum/workflows/utils/vellum_variables.py +4 -0
- {vellum_ai-0.14.16.dist-info → vellum_ai-0.14.18.dist-info}/METADATA +1 -1
- {vellum_ai-0.14.16.dist-info → vellum_ai-0.14.18.dist-info}/RECORD +39 -34
- vellum_ee/workflows/display/nodes/base_node_display.py +35 -29
- vellum_ee/workflows/display/nodes/get_node_display_class.py +0 -9
- vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +38 -18
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +6 -0
- vellum_ee/workflows/display/nodes/vellum/templating_node.py +6 -7
- vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py +97 -0
- vellum_ee/workflows/display/nodes/vellum/utils.py +1 -1
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py +1 -1
- vellum_ee/workflows/display/vellum.py +1 -148
- vellum_ee/workflows/display/workflows/base_workflow_display.py +1 -1
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +61 -17
- vellum_ee/workflows/tests/test_display_meta.py +10 -10
- {vellum_ai-0.14.16.dist-info → vellum_ai-0.14.18.dist-info}/LICENSE +0 -0
- {vellum_ai-0.14.16.dist-info → vellum_ai-0.14.18.dist-info}/WHEEL +0 -0
- {vellum_ai-0.14.16.dist-info → vellum_ai-0.14.18.dist-info}/entry_points.txt +0 -0
@@ -24,22 +24,22 @@ 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=
|
27
|
+
vellum_ee/workflows/display/nodes/base_node_display.py,sha256=H7LJGtGWFkypyNhIrIhHoGYXS0hRYcP7aoYHlM90f_U,17395
|
28
28
|
vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=ZLKQ8Xa3h9nGkj4t4V_7OeU7CBFWY3gXB9CkaCLOhEk,2699
|
29
|
-
vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=
|
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
|
31
31
|
vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=QqR3Ly0RNrXwOeLdW5nERDFt0gRPf76n1bPES6o5UN4,1093
|
32
32
|
vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
|
33
33
|
vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
|
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
|
-
vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=
|
36
|
+
vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=oJAQrAm5iFQq0_fX94sMbS3RQEK1M1VsoUck4vsPs9A,5820
|
37
37
|
vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=z00Z3L0d4PsUQo4S8FRDTtOFLtjdi17TJbatNVF4nM8,4288
|
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=
|
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,15 +48,16 @@ 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=
|
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=
|
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
|
@@ -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=
|
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=
|
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
|
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=
|
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=
|
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=
|
123
|
+
vellum/__init__.py,sha256=Vh9jxpBVXB2fTCyoUMlLdGL1Ujf0zNNNvqhNu5II8KI,36466
|
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=
|
128
|
+
vellum/client/core/client_wrapper.py,sha256=uLm2G6JmYjhKSyX55XTjjoXumxodrRRDWg6-C5GmXLI,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=
|
193
|
+
vellum/client/types/__init__.py,sha256=D6j2QfxOV3WULH0inmz9q-gdOQcytrr6_R8WYaC5ZZk,54894
|
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
|
@@ -482,6 +483,7 @@ vellum/client/types/rejected_execute_prompt_response.py,sha256=YyY9KGTbJ53DmwiXH
|
|
482
483
|
vellum/client/types/rejected_execute_workflow_workflow_result_event.py,sha256=6k6GRr2TnVSM0DxS3H3hczwV7962UDG92yLh6j8OjcM,882
|
483
484
|
vellum/client/types/rejected_prompt_execution_meta.py,sha256=4Oidh3XBBHzgjOys2kuETxqWc_MOqS50UpB0o8YNZd8,844
|
484
485
|
vellum/client/types/rejected_workflow_node_result_event.py,sha256=o9AUc9hT60F8ckMkCx8HtKxtj4y82LBoJduB9u8w0TM,1319
|
486
|
+
vellum/client/types/release.py,sha256=lfB3zKIS8UIc19Lb7zAOEAHCvuN7wW23aXEkZMio5-Q,597
|
485
487
|
vellum/client/types/release_tag_source.py,sha256=YavosOXZ976yfXTNWRTZwh2HhRiYmSDk0bQCkl-jCoQ,158
|
486
488
|
vellum/client/types/replace_test_suite_test_case_request.py,sha256=c1GT1RUCei1yWxyZy4Gv40PkXYisvK5OkzlqQ6WeBYA,1906
|
487
489
|
vellum/client/types/rich_text_child_block.py,sha256=X_ACKFKSUx5SXT1cLp0Y5-7VrNxcGOggPm67Lk2442U,270
|
@@ -672,7 +674,7 @@ vellum/client/types/workflow_output_string.py,sha256=_jclzbQ-Wlf-7FEVTWXhs9h5FWf
|
|
672
674
|
vellum/client/types/workflow_push_deployment_config_request.py,sha256=pG6bZtlw7S0TcXtNRQNa7y_2NodZe7dp5SchIrgRUVU,745
|
673
675
|
vellum/client/types/workflow_push_exec_config.py,sha256=6TaVMVqhSOz4DnY46l8axPDtytSioXDl9nHvFXSxH1g,94
|
674
676
|
vellum/client/types/workflow_push_response.py,sha256=1vUSZmZ1GK1242dAkNwJnJI0rL3pBT3_0HOLLjdiutw,724
|
675
|
-
vellum/client/types/workflow_release_tag_read.py,sha256=
|
677
|
+
vellum/client/types/workflow_release_tag_read.py,sha256=M-zNVQw7h0t9uzNSkp7Xl3SESERacqALu3mGemNpKRg,1263
|
676
678
|
vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py,sha256=pjWobdk9mZD3Px86rwFHfs_PYJBGXDKQUkxsgNEe6EA,825
|
677
679
|
vellum/client/types/workflow_request_chat_history_input_request.py,sha256=WCZvwDuNS8ylWOOoKD3t7fHLSYB0h-fVCqeDRzqPoPA,898
|
678
680
|
vellum/client/types/workflow_request_input_request.py,sha256=wgbKgKy-ftTzc6VMsgPkIiHaAujSiJjLizp2GfksX-A,632
|
@@ -725,7 +727,7 @@ vellum/plugins/utils.py,sha256=cPmxE9R2CK1bki2jKE8rB-G9zMf2pzHjSPDHFPXwd3Q,878
|
|
725
727
|
vellum/plugins/vellum_mypy.py,sha256=QTuMSq6PiZW1dyTUZ5Bf1d4XkgFj0TKAgZLP8f4UgL4,27914
|
726
728
|
vellum/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
727
729
|
vellum/prompts/blocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
728
|
-
vellum/prompts/blocks/compilation.py,sha256=
|
730
|
+
vellum/prompts/blocks/compilation.py,sha256=qeC_4La5auQkm4EyzCMpN34F5R8mjiGcLV7IxKgVf3k,9973
|
729
731
|
vellum/prompts/blocks/exceptions.py,sha256=vmk5PV6Vyw9nKjZYQDUDW0LH8MfQNIgFvFb_mFWdIRI,50
|
730
732
|
vellum/prompts/blocks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
731
733
|
vellum/prompts/blocks/tests/test_compilation.py,sha256=EOUtdzJDFGbGhoc_y5XTMyO0HOpOM7FYJssPzd_yRVg,5235
|
@@ -1073,6 +1075,7 @@ vellum/types/rejected_execute_prompt_response.py,sha256=hznSDSGod3eOrTS6Z-8EUDnG
|
|
1073
1075
|
vellum/types/rejected_execute_workflow_workflow_result_event.py,sha256=zyaUrnK5FRxkK8iQ71Il8exrNjC6W6lWsleJk6SSBxM,185
|
1074
1076
|
vellum/types/rejected_prompt_execution_meta.py,sha256=ev1iT8IFkHn7YGg04DHdOGinBHQfIaKa0sEa2yuOjTw,168
|
1075
1077
|
vellum/types/rejected_workflow_node_result_event.py,sha256=RbaaRh7xZUueiyOzfPZqwfYiRdRgeudbvk8jhqmBrew,173
|
1078
|
+
vellum/types/release.py,sha256=HNZgTcYeUxHyI25_6YncMzEvlswJ1zVESJ82bKO04Ak,145
|
1076
1079
|
vellum/types/release_tag_source.py,sha256=71AVUOydv6hauj65Wj5l2qBa35jTLTheLpMIsgz3noI,156
|
1077
1080
|
vellum/types/replace_test_suite_test_case_request.py,sha256=qMI4-4s_EXTOo29mZR14opoOTPp5_zIylPJU5ZPCvAc,174
|
1078
1081
|
vellum/types/rich_text_child_block.py,sha256=W8xJl-2DOKrpht1-Dx9EcVa4XDO5t7CS1B5Zt_bS9ow,159
|
@@ -1317,7 +1320,7 @@ vellum/workflows/events/node.py,sha256=jbmNHjdp331Q1IRK-AWtAxwF6Lidb9R7__N5rQuil
|
|
1317
1320
|
vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1318
1321
|
vellum/workflows/events/tests/test_event.py,sha256=sHcKhZPDPtzZfTmehL4NORA_StR4M6nZDcx9kz3Avo0,16866
|
1319
1322
|
vellum/workflows/events/types.py,sha256=AeTJaQt_fNHDLI4nyBzo7XrW9QQybRC09AKzu3kEYEE,3575
|
1320
|
-
vellum/workflows/events/workflow.py,sha256=
|
1323
|
+
vellum/workflows/events/workflow.py,sha256=xdqU6WOexaAqzJbU2Zw42o2LJhK7SDPtTFO5REGv17I,7293
|
1321
1324
|
vellum/workflows/exceptions.py,sha256=NiBiR3ggfmPxBVqD-H1SqmjI-7mIn0EStSN1BqApvCM,1213
|
1322
1325
|
vellum/workflows/expressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1323
1326
|
vellum/workflows/expressions/accessor.py,sha256=ItZF7fMLzVTqsdAiaXb5SiDupXmX0X9xbIus1W6hRds,1870
|
@@ -1363,8 +1366,8 @@ vellum/workflows/inputs/tests/test_inputs.py,sha256=g--YqWTNWzMk5Ktoj__gq988kvBR
|
|
1363
1366
|
vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
|
1364
1367
|
vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
|
1365
1368
|
vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
|
1366
|
-
vellum/workflows/nodes/bases/base.py,sha256=
|
1367
|
-
vellum/workflows/nodes/bases/base_adornment_node.py,sha256=
|
1369
|
+
vellum/workflows/nodes/bases/base.py,sha256=eW-3RSkBgtuGY8x2nmbHYiUg_HXS5U57n3k6Fh-dJ9s,15330
|
1370
|
+
vellum/workflows/nodes/bases/base_adornment_node.py,sha256=afMwJLHK2Ke7sBpceVLnNdZMlU2O-6UgyG7lBt9SAQ8,3039
|
1368
1371
|
vellum/workflows/nodes/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1369
1372
|
vellum/workflows/nodes/bases/tests/test_base_node.py,sha256=4SOdZzvugVtN8CIuo5RrapAxSYGXnxUwQ77dXJ64oTU,6295
|
1370
1373
|
vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT9JL18-mRR4,455
|
@@ -1379,14 +1382,14 @@ vellum/workflows/nodes/core/map_node/node.py,sha256=dY27Xm11LHsqD7hnZnVYYDIazZ-X
|
|
1379
1382
|
vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1380
1383
|
vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=uMR0AyIFn539LqTKHdwuBswnx1i-PHyqPpgtYrnmYMY,3496
|
1381
1384
|
vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
|
1382
|
-
vellum/workflows/nodes/core/retry_node/node.py,sha256=
|
1385
|
+
vellum/workflows/nodes/core/retry_node/node.py,sha256=SoDQaizjoj6kKLr454rkXu4bdzN7hXrBBn7T2_cp1CA,5261
|
1383
1386
|
vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1384
1387
|
vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=fNgDufkIsrTC-6ftvogqSpWhqqBj9iNESdfK19B1Yx0,5159
|
1385
1388
|
vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
|
1386
|
-
vellum/workflows/nodes/core/templating_node/node.py,sha256
|
1389
|
+
vellum/workflows/nodes/core/templating_node/node.py,sha256=iqBmr2i-f-BqhisNQJiDfewjol0ur7-XpupLStyMJsg,3731
|
1387
1390
|
vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=MHofz-BwAgt7EXkab8VIyacYznDEIJ7Er7MJUaxNQQo,9614
|
1388
1391
|
vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
|
1389
|
-
vellum/workflows/nodes/core/try_node/node.py,sha256=
|
1392
|
+
vellum/workflows/nodes/core/try_node/node.py,sha256=RbxL0NRXS0IxRP0MJAnLABolF6dkwVniiqsagzy-lwk,4445
|
1390
1393
|
vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1391
1394
|
vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=h6eUc3SggvhzBWlOD0PrPUlkoCSQHwjqYn81VkxSIxU,4948
|
1392
1395
|
vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
|
@@ -1398,10 +1401,12 @@ vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN
|
|
1398
1401
|
vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
|
1399
1402
|
vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=Ev_So7D_4Qfvl2_E8veVfxAxWfbJIA2ujyW5istLg5I,4066
|
1400
1403
|
vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
|
1401
|
-
vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=
|
1404
|
+
vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=HGNoGLJ9lbqflGdYFDIiuHFyi0iJ-agJu4kkJ7D3dGs,3212
|
1402
1405
|
vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
|
1403
1406
|
vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
|
1404
|
-
vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=
|
1407
|
+
vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=fTQ7KS5u7xCO_nJsWT5_LWgwGnYZg4U06slvXxHAzTU,8449
|
1408
|
+
vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1409
|
+
vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py,sha256=ZCXCZs-_OyPk4nqCpuWY-vw87lg92TDZ2tK_gckJ7mg,10450
|
1405
1410
|
vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=UIyNUUr8ii6rIx1gQL5vIPqTAww4ExxxJkFMoglc8LE,5794
|
1406
1411
|
vellum/workflows/nodes/displayable/bases/search_node.py,sha256=3UtbqY3QO4kzfJHbmUNZGnEEfJmaoiF892u8H6TGjp8,5381
|
1407
1412
|
vellum/workflows/nodes/displayable/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -1424,7 +1429,7 @@ vellum/workflows/nodes/displayable/final_output_node/tests/test_node.py,sha256=E
|
|
1424
1429
|
vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
|
1425
1430
|
vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=h5nIBzQxbXTrdTq1wjDcekk1RV4-rKUNCshqdBAiJJY,4025
|
1426
1431
|
vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
|
1427
|
-
vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=
|
1432
|
+
vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=8RXZqWMzViUjFfbpmcy1gkSsKnEpci8BGwsuPYv4xMQ,3380
|
1428
1433
|
vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1429
1434
|
vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=Qg1oGXecGH2Hp9oBAY42bTfKHBvNHHoJ6vUPPEj8Lq0,8539
|
1430
1435
|
vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
|
@@ -1450,7 +1455,7 @@ vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha
|
|
1450
1455
|
vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
|
1451
1456
|
vellum/workflows/nodes/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1452
1457
|
vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
|
1453
|
-
vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=
|
1458
|
+
vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=cKI2Ls25L-JVt4z4a2ozQa-YBeVy21Z7BQ32Sj7iBPE,10460
|
1454
1459
|
vellum/workflows/nodes/mocks.py,sha256=a1FjWEIocseMfjzM-i8DNozpUsaW0IONRpZmXBoWlyc,10455
|
1455
1460
|
vellum/workflows/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1456
1461
|
vellum/workflows/nodes/tests/test_mocks.py,sha256=mfPvrs75PKcsNsbJLQAN6PDFoVqs9TmQxpdyFKDdO60,7837
|
@@ -1477,7 +1482,7 @@ vellum/workflows/references/workflow_input.py,sha256=86IuhlBz-9cGxeUzizyjdp482aj
|
|
1477
1482
|
vellum/workflows/resolvers/__init__.py,sha256=eH6hTvZO4IciDaf_cf7aM2vs-DkBDyJPycOQevJxQnI,82
|
1478
1483
|
vellum/workflows/resolvers/base.py,sha256=WHra9LRtlTuB1jmuNqkfVE2JUgB61Cyntn8f0b0WZg4,411
|
1479
1484
|
vellum/workflows/runner/__init__.py,sha256=i1iG5sAhtpdsrlvwgH6B-m49JsINkiWyPWs8vyT-bqM,72
|
1480
|
-
vellum/workflows/runner/runner.py,sha256=
|
1485
|
+
vellum/workflows/runner/runner.py,sha256=pK_cRWS75x_sX7zrnltz3IykCTgoAWA7AW19Ih5BaB4,31759
|
1481
1486
|
vellum/workflows/sandbox.py,sha256=GVJzVjMuYzOBnSrboB0_6MMRZWBluAyQ2o7syeaeBd0,2235
|
1482
1487
|
vellum/workflows/state/__init__.py,sha256=yUUdR-_Vl7UiixNDYQZ-GEM_kJI9dnOia75TtuNEsnE,60
|
1483
1488
|
vellum/workflows/state/base.py,sha256=Vkhneko3VlQrPsMLU1PYSzXU_W1u7_AraJsghiv5O-4,15512
|
@@ -1503,9 +1508,9 @@ vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
1503
1508
|
vellum/workflows/utils/tests/test_functions.py,sha256=ytdruS55aO2egsb5sAv8_9jf68L1cJoZu2uKV2iamrg,8083
|
1504
1509
|
vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
|
1505
1510
|
vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
|
1506
|
-
vellum/workflows/utils/tests/test_vellum_variables.py,sha256=
|
1511
|
+
vellum/workflows/utils/tests/test_vellum_variables.py,sha256=maI5e7Od7UlpMwlrOrcdlXqnFhonkXGnWq8G2-YQLi8,1155
|
1507
1512
|
vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrgTY,739
|
1508
|
-
vellum/workflows/utils/vellum_variables.py,sha256=
|
1513
|
+
vellum/workflows/utils/vellum_variables.py,sha256=UiGlUh0a8vel2FbW3w-xbHxSv_jNutkDdqMVtP_b42A,3385
|
1509
1514
|
vellum/workflows/vellum_client.py,sha256=GxOy3dX6A04xiY69vPv1S4YGuQ_TMxwHi6WRMimQBBE,762
|
1510
1515
|
vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
|
1511
1516
|
vellum/workflows/workflows/base.py,sha256=TSS2BHC8LAi-N5GdEa75BeChwzwTzL7yldFnTlLINro,22665
|
@@ -1513,8 +1518,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
|
|
1513
1518
|
vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1514
1519
|
vellum/workflows/workflows/tests/test_base_workflow.py,sha256=NRteiICyJvDM5zrtUfq2fZoXcGQVaWC9xmNlLLVW0cU,7979
|
1515
1520
|
vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
|
1516
|
-
vellum_ai-0.14.
|
1517
|
-
vellum_ai-0.14.
|
1518
|
-
vellum_ai-0.14.
|
1519
|
-
vellum_ai-0.14.
|
1520
|
-
vellum_ai-0.14.
|
1521
|
+
vellum_ai-0.14.18.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
|
1522
|
+
vellum_ai-0.14.18.dist-info/METADATA,sha256=jfwatBq_nGnqnh-_g3EkOaoxQtBIU5O4Gn7n-v3F_do,5408
|
1523
|
+
vellum_ai-0.14.18.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
1524
|
+
vellum_ai-0.14.18.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
|
1525
|
+
vellum_ai-0.14.18.dist-info/RECORD,,
|
@@ -59,7 +59,16 @@ _NodeDisplayAttrType = TypeVar("_NodeDisplayAttrType")
|
|
59
59
|
|
60
60
|
class BaseNodeDisplayMeta(type):
|
61
61
|
def __new__(mcs, name: str, bases: Tuple[Type, ...], dct: Dict[str, Any]) -> Any:
|
62
|
-
cls = super().__new__(mcs, name, bases, dct)
|
62
|
+
cls = cast(Type["BaseNodeDisplay"], super().__new__(mcs, name, bases, dct))
|
63
|
+
|
64
|
+
if not dct.get("output_display"):
|
65
|
+
node_class = cls.infer_node_class()
|
66
|
+
cls.output_display = {
|
67
|
+
ref: NodeOutputDisplay(id=node_class.__output_ids__[ref.name], name=ref.name)
|
68
|
+
for ref in node_class.Outputs
|
69
|
+
if ref.name in node_class.__output_ids__
|
70
|
+
}
|
71
|
+
|
63
72
|
return cls.__annotate_node__()
|
64
73
|
|
65
74
|
def __annotate_node__(cls):
|
@@ -73,22 +82,36 @@ class BaseNodeDisplayMeta(type):
|
|
73
82
|
# Display classes are able to override the id of the node class it's parameterized by
|
74
83
|
node_class.__id__ = display_node_id
|
75
84
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
continue
|
82
|
-
if not isinstance(node_output_display, NodeOutputDisplay):
|
83
|
-
continue
|
85
|
+
for reference, node_output_display in base_node_display_class.output_display.items():
|
86
|
+
if not isinstance(reference, OutputReference):
|
87
|
+
continue
|
88
|
+
if not isinstance(node_output_display, NodeOutputDisplay):
|
89
|
+
continue
|
84
90
|
|
85
|
-
|
91
|
+
node_class.__output_ids__[reference.name] = node_output_display.id
|
86
92
|
|
87
93
|
return cls
|
88
94
|
|
95
|
+
def infer_node_class(cls) -> Type[BaseNode]:
|
96
|
+
original_base = get_original_base(cls)
|
97
|
+
node_class = get_args(original_base)[0]
|
98
|
+
if isinstance(node_class, TypeVar):
|
99
|
+
bounded_class = node_class.__bound__
|
100
|
+
if inspect.isclass(bounded_class) and issubclass(bounded_class, BaseNode):
|
101
|
+
return bounded_class
|
102
|
+
|
103
|
+
if isinstance(bounded_class, ForwardRef) and bounded_class.__forward_arg__ == BaseNode.__name__:
|
104
|
+
return BaseNode
|
105
|
+
|
106
|
+
if issubclass(node_class, BaseNode):
|
107
|
+
return node_class
|
108
|
+
|
109
|
+
raise ValueError(f"Node {cls.__name__} must be a subclass of {BaseNode.__name__}")
|
110
|
+
|
89
111
|
|
90
112
|
class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
|
91
|
-
|
113
|
+
# Default values set by the metaclass
|
114
|
+
output_display: Dict[OutputReference, NodeOutputDisplay]
|
92
115
|
port_displays: Dict[Port, PortDisplayOverrides] = {}
|
93
116
|
node_input_ids_by_name: ClassVar[Dict[str, UUID]] = {}
|
94
117
|
|
@@ -235,23 +258,6 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
|
|
235
258
|
def get_from_node_display_registry(cls, node_class: Type[NodeType]) -> Optional[Type["BaseNodeDisplay"]]:
|
236
259
|
return cls._node_display_registry.get(node_class)
|
237
260
|
|
238
|
-
@classmethod
|
239
|
-
def infer_node_class(cls) -> Type[NodeType]:
|
240
|
-
original_base = get_original_base(cls)
|
241
|
-
node_class = get_args(original_base)[0]
|
242
|
-
if isinstance(node_class, TypeVar):
|
243
|
-
bounded_class = node_class.__bound__
|
244
|
-
if inspect.isclass(bounded_class) and issubclass(bounded_class, BaseNode):
|
245
|
-
return cast(Type[NodeType], bounded_class)
|
246
|
-
|
247
|
-
if isinstance(bounded_class, ForwardRef) and bounded_class.__forward_arg__ == BaseNode.__name__:
|
248
|
-
return cast(Type[NodeType], BaseNode)
|
249
|
-
|
250
|
-
if issubclass(node_class, BaseNode):
|
251
|
-
return node_class
|
252
|
-
|
253
|
-
raise ValueError(f"Node {cls.__name__} must be a subclass of {BaseNode.__name__}")
|
254
|
-
|
255
261
|
@cached_property
|
256
262
|
def node_id(self) -> UUID:
|
257
263
|
"""Can be overridden as a class attribute to specify a custom node id."""
|
@@ -264,7 +270,7 @@ class BaseNodeDisplay(Generic[NodeType], metaclass=BaseNodeDisplayMeta):
|
|
264
270
|
|
265
271
|
@property
|
266
272
|
def _node(self) -> Type[NodeType]:
|
267
|
-
return self.infer_node_class()
|
273
|
+
return cast(Type[NodeType], self.__class__.infer_node_class())
|
268
274
|
|
269
275
|
@classmethod
|
270
276
|
def _get_explicit_node_display_attr(
|
@@ -5,7 +5,6 @@ from typing import TYPE_CHECKING, Any, Dict, Optional, Type
|
|
5
5
|
from vellum.workflows.descriptors.base import BaseDescriptor
|
6
6
|
from vellum.workflows.types.generics import NodeType
|
7
7
|
from vellum.workflows.utils.uuids import uuid4_from_hash
|
8
|
-
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
9
8
|
|
10
9
|
if TYPE_CHECKING:
|
11
10
|
from vellum_ee.workflows.display.types import NodeDisplayType
|
@@ -43,14 +42,6 @@ def get_node_display_class(
|
|
43
42
|
return {}
|
44
43
|
|
45
44
|
def exec_body(ns: Dict):
|
46
|
-
output_display = {
|
47
|
-
ref: NodeOutputDisplay(id=node_class.__output_ids__[ref.name], name=ref.name)
|
48
|
-
for ref in node_class.Outputs
|
49
|
-
if ref.name in node_class.__output_ids__
|
50
|
-
}
|
51
|
-
if output_display:
|
52
|
-
ns["output_display"] = output_display
|
53
|
-
|
54
45
|
node_input_ids_by_name: Dict[str, UUID] = {}
|
55
46
|
for ref in node_class:
|
56
47
|
node_input_ids_by_name.update(_get_node_input_ids_by_ref(ref.name, ref.instance))
|
@@ -3,7 +3,6 @@ import types
|
|
3
3
|
from uuid import UUID
|
4
4
|
from typing import Any, Callable, Dict, Generic, Optional, Type, TypeVar, cast
|
5
5
|
|
6
|
-
from vellum.workflows.nodes.bases.base import BaseNode
|
7
6
|
from vellum.workflows.nodes.bases.base_adornment_node import BaseAdornmentNode
|
8
7
|
from vellum.workflows.nodes.utils import get_wrapped_node
|
9
8
|
from vellum.workflows.types.core import JsonArray, JsonObject
|
@@ -12,6 +11,7 @@ from vellum.workflows.utils.uuids import uuid4_from_hash
|
|
12
11
|
from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
|
13
12
|
from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
|
14
13
|
from vellum_ee.workflows.display.nodes.get_node_display_class import get_node_display_class
|
14
|
+
from vellum_ee.workflows.display.nodes.types import NodeOutputDisplay
|
15
15
|
from vellum_ee.workflows.display.types import WorkflowDisplayContext
|
16
16
|
|
17
17
|
_BaseAdornmentNodeType = TypeVar("_BaseAdornmentNodeType", bound=BaseAdornmentNode)
|
@@ -44,12 +44,17 @@ class BaseAdornmentNodeDisplay(BaseNodeVellumDisplay[_BaseAdornmentNodeType], Ge
|
|
44
44
|
return serialized_wrapped_node
|
45
45
|
|
46
46
|
@classmethod
|
47
|
-
def wrap(cls, **kwargs: Any) -> Callable[..., Type[BaseNodeDisplay]]:
|
47
|
+
def wrap(cls, node_id: Optional[UUID] = None, **kwargs: Any) -> Callable[..., Type[BaseNodeDisplay]]:
|
48
48
|
NodeDisplayType = TypeVar("NodeDisplayType", bound=BaseNodeDisplay)
|
49
49
|
|
50
|
-
def decorator(
|
51
|
-
node_class =
|
52
|
-
|
50
|
+
def decorator(wrapped_node_display_class: Type[NodeDisplayType]) -> Type[NodeDisplayType]:
|
51
|
+
node_class = wrapped_node_display_class.infer_node_class()
|
52
|
+
if not issubclass(node_class, BaseAdornmentNode):
|
53
|
+
raise ValueError(f"Node {node_class.__name__} must be wrapped with a {BaseAdornmentNode.__name__}")
|
54
|
+
|
55
|
+
wrapped_node_class = node_class.__wrapped_node__
|
56
|
+
if not wrapped_node_class:
|
57
|
+
raise ValueError(f"Node {node_class.__name__} must be used as an adornment with the `wrap` method.")
|
53
58
|
|
54
59
|
# `mypy` is wrong here, `cls` is indexable bc it's Generic
|
55
60
|
BaseAdornmentDisplay = cls[node_class] # type: ignore[index]
|
@@ -58,36 +63,51 @@ class BaseAdornmentNodeDisplay(BaseNodeVellumDisplay[_BaseAdornmentNodeType], Ge
|
|
58
63
|
for key, kwarg in kwargs.items():
|
59
64
|
ns[key] = kwarg
|
60
65
|
|
61
|
-
|
62
|
-
ns["node_id"] = uuid4_from_hash(node_class.__qualname__)
|
66
|
+
ns["node_id"] = node_id or uuid4_from_hash(node_class.__qualname__)
|
63
67
|
|
64
68
|
AdornmentDisplay = types.new_class(
|
65
69
|
re.sub(r"^Base", "", cls.__name__), bases=(BaseAdornmentDisplay,), exec_body=exec_body
|
66
70
|
)
|
67
71
|
|
68
|
-
setattr(
|
72
|
+
setattr(wrapped_node_display_class, "__adorned_by__", AdornmentDisplay)
|
69
73
|
|
70
74
|
# We must edit the node display class to use __wrapped_node__ everywhere it
|
71
75
|
# references the adorned node class, which is three places:
|
72
76
|
|
73
77
|
# 1. The node display class' parameterized type
|
74
|
-
original_base_node_display = get_original_base(
|
78
|
+
original_base_node_display = get_original_base(wrapped_node_display_class)
|
75
79
|
original_base_node_display.__args__ = (wrapped_node_class,)
|
76
|
-
|
77
|
-
|
80
|
+
wrapped_node_display_class._node_display_registry[wrapped_node_class] = wrapped_node_display_class
|
81
|
+
wrapped_node_display_class.__annotate_node__()
|
78
82
|
|
79
83
|
# 2. The node display class' output displays
|
80
|
-
|
81
|
-
|
82
|
-
new_output
|
83
|
-
|
84
|
+
for old_output in node_class.Outputs:
|
85
|
+
new_output = getattr(wrapped_node_class.Outputs, old_output.name, None)
|
86
|
+
if new_output is None:
|
87
|
+
# If the adornment is adding a new output, such as TryNode adding an "error" output,
|
88
|
+
# we skip it, since it should not be included in the adorned node's output displays
|
89
|
+
wrapped_node_display_class.output_display.pop(old_output, None)
|
90
|
+
continue
|
91
|
+
|
92
|
+
if old_output not in wrapped_node_display_class.output_display:
|
93
|
+
# If the adorned node doesn't have an output display defined for this output, we define one
|
94
|
+
wrapped_node_display_class.output_display[new_output] = NodeOutputDisplay(
|
95
|
+
id=wrapped_node_class.__output_ids__[old_output.name],
|
96
|
+
name=old_output.name,
|
97
|
+
)
|
98
|
+
else:
|
99
|
+
wrapped_node_display_class.output_display[new_output] = (
|
100
|
+
wrapped_node_display_class.output_display.pop(old_output)
|
101
|
+
)
|
84
102
|
|
85
103
|
# 3. The node display class' port displays
|
86
|
-
old_ports = list(
|
104
|
+
old_ports = list(wrapped_node_display_class.port_displays.keys())
|
87
105
|
for old_port in old_ports:
|
88
106
|
new_port = getattr(wrapped_node_class.Ports, old_port.name)
|
89
|
-
|
107
|
+
wrapped_node_display_class.port_displays[new_port] = wrapped_node_display_class.port_displays.pop(
|
108
|
+
old_port
|
109
|
+
)
|
90
110
|
|
91
|
-
return
|
111
|
+
return wrapped_node_display_class
|
92
112
|
|
93
113
|
return decorator
|
@@ -32,6 +32,7 @@ class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType],
|
|
32
32
|
|
33
33
|
_, output_display = display_context.global_node_output_displays[node.Outputs.text]
|
34
34
|
_, array_display = display_context.global_node_output_displays[node.Outputs.results]
|
35
|
+
_, json_display = display_context.global_node_output_displays[node.Outputs.json]
|
35
36
|
node_blocks = raise_if_descriptor(node.blocks)
|
36
37
|
function_definitions = raise_if_descriptor(node.functions)
|
37
38
|
|
@@ -70,6 +71,11 @@ class BaseInlinePromptNodeDisplay(BaseNodeVellumDisplay[_InlinePromptNodeType],
|
|
70
71
|
"display_data": self.get_display_data().dict(),
|
71
72
|
"base": self.get_base().dict(),
|
72
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
|
+
],
|
73
79
|
}
|
74
80
|
|
75
81
|
def _generate_node_and_prompt_inputs(
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from uuid import UUID
|
2
|
-
from typing import
|
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 =
|
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.
|
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=
|
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
|
+
]
|