vellum-ai 1.7.9__py3-none-any.whl → 1.7.11__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.

Potentially problematic release.


This version of vellum-ai might be problematic. Click here for more details.

Files changed (33) hide show
  1. vellum/client/core/client_wrapper.py +2 -2
  2. vellum/workflows/events/tests/test_event.py +1 -0
  3. vellum/workflows/events/workflow.py +3 -0
  4. vellum/workflows/exceptions.py +3 -0
  5. vellum/workflows/integrations/mcp_service.py +7 -0
  6. vellum/workflows/integrations/tests/test_mcp_service.py +48 -0
  7. vellum/workflows/loaders/__init__.py +3 -0
  8. vellum/workflows/loaders/base.py +21 -0
  9. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +14 -5
  10. vellum/workflows/tests/triggers/test_vellum_integration_trigger.py +225 -0
  11. vellum/workflows/triggers/__init__.py +2 -1
  12. vellum/workflows/triggers/vellum_integration.py +383 -0
  13. vellum/workflows/types/__init__.py +3 -0
  14. vellum/workflows/types/tests/test_utils.py +11 -0
  15. vellum/workflows/types/trigger_exec_config.py +63 -0
  16. vellum/workflows/types/utils.py +22 -0
  17. vellum/workflows/utils/names.py +20 -0
  18. vellum/workflows/workflows/base.py +13 -1
  19. {vellum_ai-1.7.9.dist-info → vellum_ai-1.7.11.dist-info}/METADATA +1 -1
  20. {vellum_ai-1.7.9.dist-info → vellum_ai-1.7.11.dist-info}/RECORD +33 -27
  21. vellum_cli/pull.py +6 -5
  22. vellum_cli/push.py +35 -2
  23. vellum_cli/tests/test_push.py +122 -0
  24. vellum_ee/workflows/display/tests/workflow_serialization/test_list_vellum_document_serialization.py +65 -0
  25. vellum_ee/workflows/display/tests/workflow_serialization/test_slack_trigger_serialization.py +40 -155
  26. vellum_ee/workflows/display/utils/events.py +6 -3
  27. vellum_ee/workflows/display/utils/tests/test_events.py +29 -0
  28. vellum_ee/workflows/server/virtual_file_loader.py +15 -4
  29. vellum_ee/workflows/tests/test_serialize_module.py +48 -0
  30. vellum_ee/workflows/tests/test_server.py +110 -0
  31. {vellum_ai-1.7.9.dist-info → vellum_ai-1.7.11.dist-info}/LICENSE +0 -0
  32. {vellum_ai-1.7.9.dist-info → vellum_ai-1.7.11.dist-info}/WHEEL +0 -0
  33. {vellum_ai-1.7.9.dist-info → vellum_ai-1.7.11.dist-info}/entry_points.txt +0 -0
@@ -8,8 +8,8 @@ vellum_cli/init.py,sha256=WpnMXPItPmh0f0bBGIer3p-e5gu8DUGwSArT_FuoMEw,5093
8
8
  vellum_cli/logger.py,sha256=dcM_OmgqXLo93vDYswO5ylyUQQcTfnA5GTd5tbIt3wM,1446
9
9
  vellum_cli/move.py,sha256=lCHQ-U4BspgS512GxFFvUrglitaHkWfuKn1Hpfcn7-Q,2053
10
10
  vellum_cli/ping.py,sha256=p_BCCRjgPhng6JktuECtkDQLbhopt6JpmrtGoLnLJT8,1161
11
- vellum_cli/pull.py,sha256=udYyPlJ6VKDdh78rApNJOZgxHl82fcV6iGnRPSdX1LY,14750
12
- vellum_cli/push.py,sha256=epoQNdFdXUzLlfwE2ZTklfy3DW6bI4-Pgv1QRS8CZXk,11803
11
+ vellum_cli/pull.py,sha256=j7ob2s_IO3iMN7y5diI6XjobL8Z4y7l8Vl9dDQlk0vw,14740
12
+ vellum_cli/push.py,sha256=OvrOduwFd0Ez6ifSbPiBdID75SeGBb9gm9siMGCyFlE,13117
13
13
  vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  vellum_cli/tests/conftest.py,sha256=wx3PlJjVB0HRf5dr2b_idOIw27WPPl0J0FNbhIJJaVk,1689
15
15
  vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
@@ -20,7 +20,7 @@ vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k
20
20
  vellum_cli/tests/test_move.py,sha256=FIrL1xlH5oFKGX2MugcTKL8JilpopmUC7hP5OaqF5zw,5213
21
21
  vellum_cli/tests/test_ping.py,sha256=b3aQLd-N59_8w2rRiWqwpB1rlHaKEYVbAj1Y3hi7A-g,2605
22
22
  vellum_cli/tests/test_pull.py,sha256=e2XHzcHIx9k-FyuNAl7wMSNsSSebPGyP6U05JGcddFs,49447
23
- vellum_cli/tests/test_push.py,sha256=oQ3x28G6IxplmMWCcPEYY46nOYAEPaihcMVsN4quQ5Q,45000
23
+ vellum_cli/tests/test_push.py,sha256=-W8BNA-pdeFM6J0z319LioAkhna6Z0BTYt6BrmL1VGI,49049
24
24
  vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  vellum_ee/assets/node-definitions.json,sha256=FHw1RlnD7n8nHBSN9hMsrjBGq9SnM2wga7URiSCDGBY,31408
26
26
  vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -110,21 +110,22 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling
110
110
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=pLCyMScV88DTBXRH7jXaXOEA1GBq8NIipCUFwIAWnwI,2771
111
111
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=exT7U-axwtYgFylagScflSQLJEND51qIAx2UATju6JM,6023
112
112
  vellum_ee/workflows/display/tests/workflow_serialization/test_final_output_node_map_reference_serialization.py,sha256=vl3pxUJlrYRA8zzFJ-gRm7fe-5fviLNSIsUC7imnMqk,3502
113
+ vellum_ee/workflows/display/tests/workflow_serialization/test_list_vellum_document_serialization.py,sha256=ZRcDhOSVKFHvt_rBkNSL7j3VLeWKQbH-KRoJWrtWD2s,2193
113
114
  vellum_ee/workflows/display/tests/workflow_serialization/test_manual_trigger_serialization.py,sha256=L4bJWW94eq5cl6pjIaX7pQrDHoF67Gudfx-41dmmd10,2330
114
- vellum_ee/workflows/display/tests/workflow_serialization/test_slack_trigger_serialization.py,sha256=lBCzNJHmP_Z7_QEnzBO2FYvjJzVm8-lHxb9buivrqZk,4971
115
+ vellum_ee/workflows/display/tests/workflow_serialization/test_slack_trigger_serialization.py,sha256=HCZKF2_wOrn05s94PKWBP8cLl6Uw8j3y7Ec83xxQfLM,2258
115
116
  vellum_ee/workflows/display/tests/workflow_serialization/test_terminal_node_any_serialization.py,sha256=4WAmSEJZlDBLPhsD1f4GwY9ahB9F6qJKGnL6j7ZYlzQ,1740
116
117
  vellum_ee/workflows/display/tests/workflow_serialization/test_web_search_node_serialization.py,sha256=vbDFBrWUPeeW7cxjNA6SXrsHlYcbOAhlQ4C45Vdnr1c,3428
117
118
  vellum_ee/workflows/display/tests/workflow_serialization/test_workflow_input_parameterization_error.py,sha256=vAdmn3YTBDpo55znbydQxsgg9ASqHcvsUPwiBR_7wfo,1461
118
119
  vellum_ee/workflows/display/types.py,sha256=LgRIZeEtV7bQe-nvrC4A0T6vMooSWT1rFtw-uTn45BQ,3752
119
120
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
121
  vellum_ee/workflows/display/utils/auto_layout.py,sha256=f4GiLn_LazweupfqTpubcdtdfE_vrOcmZudSsnYIY9E,3906
121
- vellum_ee/workflows/display/utils/events.py,sha256=DE33uoKW78BZtITJ6L22dMZN3KR1BuZBVC98C_gIyzU,1943
122
+ vellum_ee/workflows/display/utils/events.py,sha256=WeytIG9znXDrEjOJ-Ls4BAimfV1stnxGWpoycv9UTmg,2031
122
123
  vellum_ee/workflows/display/utils/exceptions.py,sha256=E8Lvo7LY1BoZ54M_NR_opDjJsAAiCUfow1HgoHcTHmg,989
123
124
  vellum_ee/workflows/display/utils/expressions.py,sha256=9rcpoXhUIxcWy407Ziu-zJfP5OEFq3pHIh7XSZZ1Y6E,21169
124
125
  vellum_ee/workflows/display/utils/registry.py,sha256=1qXiBTdsnro6FeCX0FGBEK7CIf6wa--Jt50iZ_nEp_M,3460
125
126
  vellum_ee/workflows/display/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
127
  vellum_ee/workflows/display/utils/tests/test_auto_layout.py,sha256=vfXI769418s9vda5Gb5NFBH747WMOwSgHRXeLCTLVm8,2356
127
- vellum_ee/workflows/display/utils/tests/test_events.py,sha256=42IEBnMbaQrH8gigw5hXIt_kG3rVvrSMop9QYiL2xDs,4586
128
+ vellum_ee/workflows/display/utils/tests/test_events.py,sha256=gjC_p3UuAbRANLbQboRh4J8SL1wgMOB0AOqtpXmIj4w,5581
128
129
  vellum_ee/workflows/display/utils/vellum.py,sha256=Bt7kdLdXoBsHn5dVEY2uKcF542VL09jwu8J_30rl2vk,6413
129
130
  vellum_ee/workflows/display/vellum.py,sha256=J2mdJZ1sdLW535DDUkq_Vm8Z572vhuxHxVZF9deKSdk,391
130
131
  vellum_ee/workflows/display/workflows/__init__.py,sha256=JTB9ObEV3l4gGGdtfBHwVJtTTKC22uj-a-XjTVwXCyA,148
@@ -132,7 +133,7 @@ vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=rY-mK4dLou
132
133
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=gxz76AeCqgAZ9D2lZeTiZzxY9eMgn3qOSfVgiqYcOh8,2028
133
134
  vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=lg-c_3P3ldtqWq2VFsk_2Mkn3pVdXWuT59QpH7QwXVs,39764
134
135
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
- vellum_ee/workflows/server/virtual_file_loader.py,sha256=7JphJcSO3H85qiC2DpFfBWjC3JjrbRmoynBC6KKHVsA,2710
136
+ vellum_ee/workflows/server/virtual_file_loader.py,sha256=3egb-Xsfxy6I_AGVH09Fgd74qofDMKtiVzJitW8sRHw,3265
136
137
  vellum_ee/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
138
  vellum_ee/workflows/tests/local_files/__init__.py,sha256=UyP6kKkRqr9cTKHQF4MVLdLk5MM9GGcLuqxXsQGm22Y,51
138
139
  vellum_ee/workflows/tests/local_files/base_class.py,sha256=UuiC7J68MVr6A4949QYiBpXOLdsvFG_Cw1muEPiHT6I,298
@@ -154,15 +155,15 @@ vellum_ee/workflows/tests/local_workflow/nodes/templating_node.py,sha256=NQwFN61
154
155
  vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIPLsmrVS_aVEZEc-wULSv787Q,393
155
156
  vellum_ee/workflows/tests/test_display_meta.py,sha256=PkXJVnMZs9GNooDkd59n4YTBAX3XGPQWeSSVbhehVFM,5112
156
157
  vellum_ee/workflows/tests/test_registry.py,sha256=B8xRIuEyLWfSqrYoPldNQXhKPfe50PllvtAZoI8-uPs,6066
157
- vellum_ee/workflows/tests/test_serialize_module.py,sha256=zleQTcGZa5_nzwu4zpFoqEHhk7pb64hGrhObR4anhPQ,4471
158
- vellum_ee/workflows/tests/test_server.py,sha256=RmLE2s9Cs7NejvWf7aPRNuAeEER-hGk-9Q9fYrn5wps,26013
158
+ vellum_ee/workflows/tests/test_serialize_module.py,sha256=thzGsNzYCRXXdaC5yk1ZjtXrIO6uPdSnzdapKLCOsC8,6241
159
+ vellum_ee/workflows/tests/test_server.py,sha256=2_n84q_QZN_zW2rZgDenQUXM3x43TcPsRs1fDA6BK1U,29805
159
160
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
160
161
  vellum/__init__.py,sha256=6dkyRHmIKuQPzL_z3QLVUrbkAF-HJKDhDSMCnf4ZsKw,49502
161
162
  vellum/client/README.md,sha256=flqu57ubZNTfpq60CdLtJC9gp4WEkyjb_n_eZ4OYf9w,6497
162
163
  vellum/client/__init__.py,sha256=rMnKRqL5-356SBc-rfm56MkO87PuAi2mtcfBszcJU1M,74316
163
164
  vellum/client/core/__init__.py,sha256=lTcqUPXcx4112yLDd70RAPeqq6tu3eFMe1pKOqkW9JQ,1562
164
165
  vellum/client/core/api_error.py,sha256=44vPoTyWN59gonCIZMdzw7M1uspygiLnr3GNFOoVL2Q,614
165
- vellum/client/core/client_wrapper.py,sha256=SDfeITPfYIuFYtFxDzo3M3ePxfx4Mu0Yw6Y3QEnkCts,2840
166
+ vellum/client/core/client_wrapper.py,sha256=KKrmb0ch50fjF5NTYG5BivGPOkXNmN6adUXv_VzzS9s,2842
166
167
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
167
168
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
168
169
  vellum/client/core/force_multipart.py,sha256=awxh5MtcRYe74ehY8U76jzv6fYM_w_D3Rur7KQQzSDk,429
@@ -1818,10 +1819,10 @@ vellum/workflows/events/relational_threads.py,sha256=zmLrBCBYpdpQV0snKH3HleST-_h
1818
1819
  vellum/workflows/events/stream.py,sha256=xhXJTZirFi0xad5neAQNogrIQ4h47fpnKbVC3vCM5Js,889
1819
1820
  vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1820
1821
  vellum/workflows/events/tests/test_basic_workflow.py,sha256=Pj6orHsXz37jWC5FARi0Sx2Gjf99Owri2Cvr6Chb79k,1765
1821
- vellum/workflows/events/tests/test_event.py,sha256=a-_vwiKhZWTxmRvDPB-aveWuGBOMqr5nY9t6uFmtL-o,21431
1822
+ vellum/workflows/events/tests/test_event.py,sha256=R9H_W9RuZAY1b_ElnfyekS-Fl6Z02lldOf8EkCJssBE,21476
1822
1823
  vellum/workflows/events/types.py,sha256=mVrqAH9Hs9SpXm08Hcxdyap_ImQPwGsxRr56rSNMP34,5043
1823
- vellum/workflows/events/workflow.py,sha256=uoSnZFyG-oHvmvmAA3LYRJOMc_vOrbfa64stnSzNePs,9494
1824
- vellum/workflows/exceptions.py,sha256=cizNaHgmGdIoYSV3Mn6_HlpUvs2Nq9KgpX1ewMZdBa0,2157
1824
+ vellum/workflows/events/workflow.py,sha256=zsyCbcM93P9XqRvYoN8e7vIsOe15Bn2sjXuDoSRrwBU,9637
1825
+ vellum/workflows/exceptions.py,sha256=l_ZklQQVvbsIdbmbn89aEeTL7x6x08m5kCwKXXPnTDc,2277
1825
1826
  vellum/workflows/executable.py,sha256=um-gLJMVYfGJwGJfZIPlCRHhHIYm6pn8PUEfeqrNx5k,218
1826
1827
  vellum/workflows/expressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1827
1828
  vellum/workflows/expressions/accessor.py,sha256=3lu1-_-dBfZdJvtX-q66jbmRAZtqIfdsh_3_JNuzg1E,4462
@@ -1878,11 +1879,13 @@ vellum/workflows/inputs/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
1878
1879
  vellum/workflows/inputs/tests/test_inputs.py,sha256=E6I2pEfGjCeQg0GAsjvKFEjO32bQ3H9VeRnLv3ry9O0,2828
1879
1880
  vellum/workflows/integrations/__init__.py,sha256=KoA7tGX_UiImu6erJKJ5tmLFpNFEqblsWFGPoWNsS1U,220
1880
1881
  vellum/workflows/integrations/composio_service.py,sha256=rSliaZtNiBcDSvDxz9k5i1KkyUIrbxyegu0yU9cDByU,6023
1881
- vellum/workflows/integrations/mcp_service.py,sha256=9DYb8dg2_kgc1UOu830kxhaFlt9yTbhKPhK3L6kb1t4,9831
1882
+ vellum/workflows/integrations/mcp_service.py,sha256=m2oakuI2jVh9LY34lQvWnULnjjRkwOYmdvKDX4HIEpg,10218
1882
1883
  vellum/workflows/integrations/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1883
- vellum/workflows/integrations/tests/test_mcp_service.py,sha256=q_DYrDkIqI4sQBNgID4YdbM4e9tneLVWY8YmI4R26d8,8859
1884
+ vellum/workflows/integrations/tests/test_mcp_service.py,sha256=6R5ghZitzYXyHHjmX6oWdce4YNyCSworrktjg9mSLGE,10830
1884
1885
  vellum/workflows/integrations/tests/test_vellum_integration_service.py,sha256=QGJmaW5EF7E2fkZotd4rc2HItQc-1z3cpgwaKUFWpgg,11956
1885
1886
  vellum/workflows/integrations/vellum_integration_service.py,sha256=qhFoLzHlMli1PC8oh5phvWuSpJ9IqL1g2eaGhypBTqs,5266
1887
+ vellum/workflows/loaders/__init__.py,sha256=qdghamOwKDs8XR5cGTIMn3Bd99pSNAr5DCdXf0bPQk0,95
1888
+ vellum/workflows/loaders/base.py,sha256=ZTnf_1pxSf6i3chiLasMEbACULuuc2EBVyFcOF3OLuM,533
1886
1889
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1887
1890
  vellum/workflows/nodes/__init__.py,sha256=zymtc3_iW2rFmMR-sayTLuN6ZsAw8VnJweWPsjQk2-Q,1197
1888
1891
  vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
@@ -1924,7 +1927,7 @@ vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=cOYaIqimzDL6TuX
1924
1927
  vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1925
1928
  vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py,sha256=5C59vn_yg4r5EWioKIr658Jr1MSGX3YF4yKJokY37Xc,4726
1926
1929
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1927
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=w02vgydiwNoKru324QLSkH3BiGUvHTgKbf05BEx945s,4657
1930
+ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=ZIAXMreHcs3OR-djlkXgqF6tw7-Qfl8KUvjmJ7qRU3U,5204
1928
1931
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1929
1932
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=ITxAa1HWF6OPdcKg0DdTK7YP94ezzzWVyZzCRMiybIg,18638
1930
1933
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -2041,7 +2044,8 @@ vellum/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
2041
2044
  vellum/workflows/tests/test_dataset_row.py,sha256=S8aIiYU9TRzJ8GTl5qCjnJ-fuHdxatHJFGLlKTVHPr4,4174
2042
2045
  vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVik6ZVTfVOA,1826
2043
2046
  vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
2044
- vellum/workflows/triggers/__init__.py,sha256=rhsIq3fsKkLaPshO4QnYpopNyIMyieZrdiCGjmiyhbc,322
2047
+ vellum/workflows/tests/triggers/test_vellum_integration_trigger.py,sha256=L1eUKbxgRI09G1tZ2ziVeLsp_CXS_CT5a1Fk6A3YAEQ,8017
2048
+ vellum/workflows/triggers/__init__.py,sha256=_T7PTZpwv9aFitmpGu2Tu_kJpLAwPnNhfh0XGlHBAgw,432
2045
2049
  vellum/workflows/triggers/base.py,sha256=sLH0qzfRYbJRQX6ukGzSy6PaXxlDUSobdFSz8G_4v98,10140
2046
2050
  vellum/workflows/triggers/integration.py,sha256=hAWQMoIubosKgM56rrsAJVhPnc4MjA5YBPRpDgl6J08,2221
2047
2051
  vellum/workflows/triggers/manual.py,sha256=PgbZ92gcK25yz6REXm98zWic1QBfhxLKfGCeHpZEUx4,1266
@@ -2049,7 +2053,8 @@ vellum/workflows/triggers/slack.py,sha256=NBc4Af3PdnhiqTzeS-zyPf7JkrPG0FHT7uP0qN
2049
2053
  vellum/workflows/triggers/tests/__init__.py,sha256=R8lag_iCRyulijHMK4e3Gf6YVB5NplfvwZeTkaRj8gQ,30
2050
2054
  vellum/workflows/triggers/tests/test_integration.py,sha256=mODupO0eOG4G2ooDH1meWKRtA8NRtsm_fii6tijvSqQ,4046
2051
2055
  vellum/workflows/triggers/tests/test_slack.py,sha256=aFTVPj7e3bjblHgbZleKEoh0wayrcC_88nDpXmVowMY,5569
2052
- vellum/workflows/types/__init__.py,sha256=fZ3Xxly7YSsu4kCIYD5aYpYucNM97zTyInb9CA24mf0,102
2056
+ vellum/workflows/triggers/vellum_integration.py,sha256=03YWZ3UpcZSLzenvuJZqOPYvjaEbcDU9HbYGbTbY_QQ,16866
2057
+ vellum/workflows/types/__init__.py,sha256=P3KhHAeoAj8cQti89o3nyPgCfC4BjK1LOFv58A76ktM,290
2053
2058
  vellum/workflows/types/code_execution_node_wrappers.py,sha256=fewX9bqF_4TZuK-gZYIn12s31-k03vHMGRpvFAPm11Y,3206
2054
2059
  vellum/workflows/types/core.py,sha256=R7snCd7ci4tiRuHi5ALGh_5DIIF0T9eze3sf6EnJN-c,1126
2055
2060
  vellum/workflows/types/definition.py,sha256=Qof2MAjSNB0AN2XkSKmk-owuY59YcxDVHYpno6-StPA,8058
@@ -2057,12 +2062,13 @@ vellum/workflows/types/generics.py,sha256=8jptbEx1fnJV0Lhj0MpCJOT6yNiEWeTOYOwrEA
2057
2062
  vellum/workflows/types/stack.py,sha256=h7NE0vXR7l9DevFBIzIAk1Zh59K-kECQtDTKOUunwMY,1314
2058
2063
  vellum/workflows/types/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2059
2064
  vellum/workflows/types/tests/test_definition.py,sha256=QUI9_Wsm2k-ZxQTXogsB0L4csSvVFOvLXHb-asC6K2w,7193
2060
- vellum/workflows/types/tests/test_utils.py,sha256=UnZog59tR577mVwqZRqqWn2fScoOU1H6up0EzS8zYhw,2536
2061
- vellum/workflows/types/utils.py,sha256=mTctHITBybpt4855x32oCKALBEcMNLn-9cCmfEKgJHQ,6498
2065
+ vellum/workflows/types/tests/test_utils.py,sha256=-kMF1mxYlW4Njh8fKjbo45Wc-jOJ7GBYKKjIviuzd4I,2837
2066
+ vellum/workflows/types/trigger_exec_config.py,sha256=3KOKAMMz0JylrQpDqo2I4yX081XcWQQXkgwfCoIak0o,2813
2067
+ vellum/workflows/types/utils.py,sha256=pCC3HlnLaT4HcCKA_JSoWLnDB1czB3HwjirTiP9RDQs,7680
2062
2068
  vellum/workflows/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2063
2069
  vellum/workflows/utils/functions.py,sha256=uIg8As0c1BGwXmwectbAQWLWWIWoeHCduGhhoOqQVVU,13157
2064
2070
  vellum/workflows/utils/hmac.py,sha256=JJCczc6pyV6DuE1Oa0QVfYPUN_of3zEYmGFib3OZnrE,1135
2065
- vellum/workflows/utils/names.py,sha256=QtHquoaGqRseu5gg2OcVGI2d_CMcEOvjb9KspwH4C-A,552
2071
+ vellum/workflows/utils/names.py,sha256=kuuDKMILbYrgqmgfTGtkD7VZ6foWwJUfJJjyTxJ3LkI,1221
2066
2072
  vellum/workflows/utils/pydantic_schema.py,sha256=eR_bBtY-T0pttJP-ARwagSdCOnwPUtiT3cegm2lzDTQ,1310
2067
2073
  vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2068
2074
  vellum/workflows/utils/tests/test_functions.py,sha256=J_WEyVX1yE3lUhoX8etgkbPuwQOWHf-tpIQbKYcLKho,25360
@@ -2074,13 +2080,13 @@ vellum/workflows/utils/vellum_variables.py,sha256=X3lZn-EoWengRWBWRhTNW7hqbj7LkV
2074
2080
  vellum/workflows/utils/zip.py,sha256=HVg_YZLmBOTXKaDV3Xhaf3V6sYnfqqZXQ8CpuafkbPY,1181
2075
2081
  vellum/workflows/vellum_client.py,sha256=3iDR7VV_NgLSm1iZQCKDvrmfEaX1bOJiU15QrxyHpv0,1237
2076
2082
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
2077
- vellum/workflows/workflows/base.py,sha256=9ILdqYIfB6rIpP-3QeQTOgYeCohjR7xC6c9BqCuAvb4,30977
2083
+ vellum/workflows/workflows/base.py,sha256=m9yaLhUPUBdAPR912Rf8lrU5fA8_JwFTM-zDDC46w6g,31620
2078
2084
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
2079
2085
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2080
2086
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=Boa-_m9ii2Qsa1RvVM-VYniF7zCpzGgEGy-OnPZkrHg,23941
2081
2087
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
2082
- vellum_ai-1.7.9.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
2083
- vellum_ai-1.7.9.dist-info/METADATA,sha256=W9uh0R7Qv8FtGnts5F2-3PAMz4ki8JwFXCa43kinV8U,5547
2084
- vellum_ai-1.7.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
2085
- vellum_ai-1.7.9.dist-info/entry_points.txt,sha256=xVavzAKN4iF_NbmhWOlOkHluka0YLkbN_pFQ9pW3gLI,117
2086
- vellum_ai-1.7.9.dist-info/RECORD,,
2088
+ vellum_ai-1.7.11.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
2089
+ vellum_ai-1.7.11.dist-info/METADATA,sha256=p2zWh-k4nsa4OIxTQD0lXIlEvmphl3BdF0EMszAVpV0,5548
2090
+ vellum_ai-1.7.11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
2091
+ vellum_ai-1.7.11.dist-info/entry_points.txt,sha256=xVavzAKN4iF_NbmhWOlOkHluka0YLkbN_pFQ9pW3gLI,117
2092
+ vellum_ai-1.7.11.dist-info/RECORD,,
vellum_cli/pull.py CHANGED
@@ -7,11 +7,11 @@ import zipfile
7
7
  from typing import Optional
8
8
 
9
9
  from dotenv import load_dotenv
10
- from pydash import snake_case
11
10
 
12
11
  from vellum.client.core.api_error import ApiError
13
12
  from vellum.client.core.pydantic_utilities import UniversalBaseModel
14
13
  from vellum.utils.uuid import is_valid_uuid
14
+ from vellum.workflows.utils.names import create_module_name
15
15
  from vellum.workflows.vellum_client import create_vellum_client
16
16
  from vellum_cli.config import (
17
17
  DEFAULT_WORKSPACE_CONFIG,
@@ -257,10 +257,11 @@ def pull_command(
257
257
  workflow_config.container_image_tag = "latest"
258
258
  if not workflow_config.workflow_sandbox_id and pull_contents_metadata.workflow_sandbox_id:
259
259
  workflow_config.workflow_sandbox_id = str(pull_contents_metadata.workflow_sandbox_id)
260
- if not workflow_config.module and workflow_deployment and pull_contents_metadata.deployment_name:
261
- workflow_config.module = snake_case(pull_contents_metadata.deployment_name)
262
- if not workflow_config.module and pull_contents_metadata.label:
263
- workflow_config.module = snake_case(pull_contents_metadata.label)
260
+ if not workflow_config.module:
261
+ deployment_name = pull_contents_metadata.deployment_name if workflow_deployment else None
262
+ workflow_config.module = create_module_name(
263
+ deployment_name=deployment_name, label=pull_contents_metadata.label
264
+ )
264
265
 
265
266
  # Save or update the deployment info when pulling with --workflow-deployment
266
267
  if workflow_deployment:
vellum_cli/push.py CHANGED
@@ -77,7 +77,20 @@ def push_command(
77
77
 
78
78
  logger.info(f"Loading workflow from {workflow_config.module}")
79
79
  resolved_workspace = workspace or workflow_config.workspace or DEFAULT_WORKSPACE_CONFIG.name
80
- workspace_config = next((w for w in config.workspaces if w.name == resolved_workspace), DEFAULT_WORKSPACE_CONFIG)
80
+ workspace_config = next((w for w in config.workspaces if w.name == resolved_workspace), None)
81
+
82
+ if workspace_config is None:
83
+ if resolved_workspace == DEFAULT_WORKSPACE_CONFIG.name:
84
+ workspace_config = DEFAULT_WORKSPACE_CONFIG
85
+ else:
86
+ available_workspaces = sorted(set([w.name for w in config.workspaces] + [DEFAULT_WORKSPACE_CONFIG.name]))
87
+ handle_cli_error(
88
+ logger,
89
+ title=f"Workspace '{resolved_workspace}' not found in config",
90
+ message=f"Available workspaces: {', '.join(available_workspaces)}",
91
+ )
92
+ return
93
+
81
94
  api_key = os.getenv(workspace_config.api_key)
82
95
  if not api_key:
83
96
  raise ValueError(f"No API key value found in environment for workspace '{workspace_config.name}'.")
@@ -181,12 +194,14 @@ def push_command(
181
194
  artifact.seek(0)
182
195
  artifact.name = f"{workflow_config.module.replace('.', '__')}.tar.gz"
183
196
 
197
+ provided_id = workflow_config.workflow_sandbox_id or workflow_sandbox_id
198
+
184
199
  try:
185
200
  response = client.workflows.push(
186
201
  # Remove this once we could serialize using the artifact in Vembda
187
202
  # https://app.shortcut.com/vellum/story/5585
188
203
  exec_config=json.dumps(exec_config),
189
- workflow_sandbox_id=workflow_config.workflow_sandbox_id or workflow_sandbox_id,
204
+ workflow_sandbox_id=provided_id,
190
205
  artifact=artifact,
191
206
  # We should check with fern if we could auto-serialize typed object fields for us
192
207
  # https://app.shortcut.com/vellum/story/5568
@@ -195,6 +210,24 @@ def push_command(
195
210
  strict=strict,
196
211
  )
197
212
  except ApiError as e:
213
+ if e.status_code == 404:
214
+ if provided_id:
215
+ handle_cli_error(
216
+ logger,
217
+ title="Workflow Sandbox not found",
218
+ message=f"Could not find Workflow Sandbox with ID '{provided_id}' "
219
+ f"in workspace '{resolved_workspace}'.",
220
+ )
221
+ else:
222
+ error_detail = e.body.get("detail") if isinstance(e.body, dict) else None
223
+ default_message = "The `/workflows/push` endpoint failed with a 404 response."
224
+ handle_cli_error(
225
+ logger,
226
+ title="Workflow Sandbox not found",
227
+ message=error_detail or default_message,
228
+ )
229
+ return
230
+
198
231
  if e.status_code == 400 and isinstance(e.body, dict) and "diffs" in e.body:
199
232
  diffs: dict = e.body["diffs"]
200
233
  generated_only = diffs.get("generated_only", [])
@@ -592,6 +592,84 @@ def test_push__push_fails_due_to_400_error(mock_module, vellum_client):
592
592
  assert "Traceback" not in result.output
593
593
 
594
594
 
595
+ def test_push__push_fails_due_to_404_error_with_id(mock_module, vellum_client):
596
+ """
597
+ Tests that a 404 error with a workflow sandbox ID shows a helpful error message.
598
+ """
599
+
600
+ # GIVEN a single workflow configured with a workflow_sandbox_id
601
+ temp_dir = mock_module.temp_dir
602
+ module = mock_module.module
603
+
604
+ # AND a workflow exists in the module successfully
605
+ _ensure_workflow_py(temp_dir, module)
606
+
607
+ # AND the push API call returns a 404 response
608
+ vellum_client.workflows.push.side_effect = ApiError(
609
+ status_code=404,
610
+ body={},
611
+ )
612
+
613
+ # WHEN calling `vellum push`
614
+ runner = CliRunner()
615
+ result = runner.invoke(cli_main, ["push", module])
616
+
617
+ # THEN it should fail with a user error code
618
+ assert result.exit_code == 1
619
+
620
+ # AND the error message should be in the error message
621
+ assert "Workflow Sandbox not found" in result.output
622
+ assert mock_module.workflow_sandbox_id in result.output
623
+ assert "workspace" in result.output
624
+
625
+ # AND the stack trace should not be present
626
+ assert "Traceback" not in result.output
627
+
628
+
629
+ def test_push__push_fails_due_to_404_error_without_id(tmp_path, vellum_client, monkeypatch):
630
+ """
631
+ Tests that a 404 error without a workflow sandbox ID shows a helpful error message.
632
+ """
633
+
634
+ # GIVEN a workflow module exists but has no workflow_sandbox_id configured
635
+ module = "examples.mock.test_push__404_without_id"
636
+ module_dir = tmp_path / "examples" / "mock" / "test_push__404_without_id"
637
+ module_dir.mkdir(parents=True)
638
+
639
+ # AND a workflow.py file exists
640
+ workflow_file = module_dir / "workflow.py"
641
+ workflow_file.write_text(
642
+ "from vellum.workflows import BaseWorkflow\n\nclass ExampleWorkflow(BaseWorkflow):\n pass\n"
643
+ )
644
+
645
+ # AND the pyproject.toml file exists without workflow_sandbox_id
646
+ pyproject_file = tmp_path / "pyproject.toml"
647
+ pyproject_file.write_text(f'[tool.vellum]\n[[tool.vellum.workflows]]\nmodule = "{module}"\n')
648
+
649
+ monkeypatch.chdir(tmp_path)
650
+
651
+ # AND the push API call returns a 404 response
652
+ vellum_client.workflows.push.side_effect = ApiError(
653
+ status_code=404,
654
+ body={},
655
+ )
656
+
657
+ # WHEN calling `vellum push`
658
+ runner = CliRunner()
659
+ result = runner.invoke(cli_main, ["push", module])
660
+
661
+ # THEN it should fail with a user error code
662
+ assert result.exit_code == 1
663
+
664
+ # AND the error message should be in the output
665
+ assert "Workflow Sandbox not found" in result.output
666
+ assert "/workflows/push" in result.output
667
+ assert "404 response" in result.output
668
+
669
+ # AND the stack trace should not be present
670
+ assert "Traceback" not in result.output
671
+
672
+
595
673
  @pytest.mark.parametrize(
596
674
  "file_data",
597
675
  [
@@ -1220,3 +1298,47 @@ MY_CUSTOM_VELLUM_API_KEY=custom-key-xyz
1220
1298
  assert len(lock_file_content["workflows"]) == 1
1221
1299
  assert lock_file_content["workflows"][0]["workspace"] == "my_custom_workspace"
1222
1300
  assert lock_file_content["workflows"][0]["workflow_sandbox_id"] == workflow_sandbox_id
1301
+
1302
+
1303
+ def test_push__workspace_option__nonexistent_workspace_should_fail(mock_module):
1304
+ """
1305
+ Tests that pushing with a nonexistent workspace that isn't default should fail.
1306
+ """
1307
+
1308
+ # GIVEN a single workflow configured
1309
+ temp_dir = mock_module.temp_dir
1310
+ module = mock_module.module
1311
+ set_pyproject_toml = mock_module.set_pyproject_toml
1312
+
1313
+ # AND a custom workspace is configured
1314
+ set_pyproject_toml(
1315
+ {
1316
+ "workflows": [
1317
+ {
1318
+ "module": module,
1319
+ }
1320
+ ],
1321
+ "workspaces": [
1322
+ {
1323
+ "name": "my_custom_workspace",
1324
+ "api_key": "MY_CUSTOM_VELLUM_API_KEY",
1325
+ }
1326
+ ],
1327
+ }
1328
+ )
1329
+
1330
+ # AND a workflow exists in the module successfully
1331
+ _ensure_workflow_py(temp_dir, module)
1332
+
1333
+ # WHEN calling `vellum push` with a nonexistent workspace
1334
+ runner = CliRunner()
1335
+ result = runner.invoke(cli_main, ["push", module, "--workspace", "nonexistent_workspace"])
1336
+
1337
+ # THEN it should exit with an error
1338
+ assert result.exit_code == 1
1339
+
1340
+ # AND the error message should indicate the workspace doesn't exist
1341
+ assert "Workspace 'nonexistent_workspace' not found in config" in result.output
1342
+ assert "Available workspaces:" in result.output
1343
+ assert "default" in result.output
1344
+ assert "my_custom_workspace" in result.output
@@ -0,0 +1,65 @@
1
+ from typing import List
2
+
3
+ from vellum import VellumDocument
4
+ from vellum.workflows import BaseWorkflow
5
+ from vellum.workflows.inputs import BaseInputs
6
+ from vellum.workflows.nodes.displayable import FinalOutputNode
7
+ from vellum.workflows.outputs import BaseOutputs
8
+ from vellum.workflows.state import BaseState
9
+ from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
10
+
11
+
12
+ class Inputs(BaseInputs):
13
+ documents: List[VellumDocument]
14
+
15
+
16
+ class MyFinalOutputNode(FinalOutputNode):
17
+ class Outputs(BaseOutputs):
18
+ value = Inputs.documents
19
+
20
+
21
+ class WorkflowWithListVellumDocument(BaseWorkflow[Inputs, BaseState]):
22
+ """A workflow that takes a list of VellumDocument as input."""
23
+
24
+ graph = MyFinalOutputNode
25
+
26
+ class Outputs(BaseOutputs):
27
+ result = MyFinalOutputNode.Outputs.value
28
+
29
+
30
+ def test_serialize_workflow_with_list_vellum_document():
31
+ """Tests that we can serialize a workflow with List[VellumDocument] input."""
32
+
33
+ workflow_display = get_workflow_display(workflow_class=WorkflowWithListVellumDocument)
34
+
35
+ # WHEN we serialize it
36
+ serialized_workflow: dict = workflow_display.serialize()
37
+
38
+ # THEN we should get a serialized representation of the Workflow
39
+ assert serialized_workflow.keys() == {
40
+ "workflow_raw_data",
41
+ "input_variables",
42
+ "state_variables",
43
+ "output_variables",
44
+ }
45
+
46
+ input_variables = serialized_workflow["input_variables"]
47
+ assert len(input_variables) == 1
48
+
49
+ input_var = input_variables[0]
50
+ assert input_var["key"] == "documents"
51
+ assert input_var["type"] == "JSON"
52
+ # NOTE: Once custom type serialization is supported, we will want to represent this using an openapi spec
53
+ assert input_var["required"] is True
54
+ assert input_var["default"] is None
55
+ assert input_var["extensions"] == {"color": None}
56
+
57
+ output_variables = serialized_workflow["output_variables"]
58
+ assert len(output_variables) == 1
59
+
60
+ output_var = output_variables[0]
61
+ assert output_var["key"] == "result"
62
+
63
+ workflow_raw_data = serialized_workflow["workflow_raw_data"]
64
+ assert len(workflow_raw_data["nodes"]) == 2
65
+ assert len(workflow_raw_data["edges"]) == 1