vellum-ai 1.0.5__py3-none-any.whl → 1.0.7__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 (38) hide show
  1. vellum/__init__.py +0 -8
  2. vellum/client/core/client_wrapper.py +2 -2
  3. vellum/client/types/__init__.py +0 -8
  4. vellum/client/types/organization_read.py +1 -2
  5. vellum/workflows/events/context.py +111 -0
  6. vellum/workflows/integrations/__init__.py +0 -0
  7. vellum/workflows/integrations/composio_service.py +138 -0
  8. vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py +8 -2
  9. vellum/workflows/nodes/displayable/bases/api_node/node.py +36 -9
  10. vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py +0 -0
  11. vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py +124 -0
  12. vellum/workflows/nodes/displayable/tool_calling_node/node.py +2 -2
  13. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py +63 -58
  14. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +147 -2
  15. vellum/workflows/nodes/displayable/tool_calling_node/utils.py +61 -41
  16. vellum/workflows/types/definition.py +4 -2
  17. vellum/workflows/utils/functions.py +29 -2
  18. vellum/workflows/utils/tests/test_functions.py +115 -1
  19. {vellum_ai-1.0.5.dist-info → vellum_ai-1.0.7.dist-info}/METADATA +1 -3
  20. {vellum_ai-1.0.5.dist-info → vellum_ai-1.0.7.dist-info}/RECORD +29 -33
  21. vellum_cli/push.py +11 -2
  22. vellum_cli/tests/test_push.py +57 -1
  23. vellum_ee/workflows/display/nodes/vellum/code_execution_node.py +2 -0
  24. vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py +16 -0
  25. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py +3 -0
  26. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +8 -2
  27. vellum/client/types/name_enum.py +0 -7
  28. vellum/client/types/organization_limit_config.py +0 -25
  29. vellum/client/types/quota.py +0 -22
  30. vellum/client/types/vembda_service_tier_enum.py +0 -5
  31. vellum/types/name_enum.py +0 -3
  32. vellum/types/organization_limit_config.py +0 -3
  33. vellum/types/quota.py +0 -3
  34. vellum/types/vembda_service_tier_enum.py +0 -3
  35. vellum/workflows/nodes/displayable/tool_calling_node/composio_service.py +0 -83
  36. {vellum_ai-1.0.5.dist-info → vellum_ai-1.0.7.dist-info}/LICENSE +0 -0
  37. {vellum_ai-1.0.5.dist-info → vellum_ai-1.0.7.dist-info}/WHEEL +0 -0
  38. {vellum_ai-1.0.5.dist-info → vellum_ai-1.0.7.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  import dataclasses
2
2
  import inspect
3
- from typing import TYPE_CHECKING, Any, Callable, Dict, Literal, Optional, Type, Union, get_args, get_origin
3
+ from typing import TYPE_CHECKING, Annotated, Any, Callable, Dict, Literal, Optional, Type, Union, get_args, get_origin
4
4
 
5
5
  from pydantic import BaseModel
6
6
  from pydantic_core import PydanticUndefined
@@ -53,6 +53,21 @@ def compile_annotation(annotation: Optional[Any], defs: dict[str, Any]) -> dict:
53
53
  item_type = get_args(annotation)[0]
54
54
  return {"type": "array", "items": compile_annotation(item_type, defs)}
55
55
 
56
+ if get_origin(annotation) is tuple:
57
+ args = get_args(annotation)
58
+ if len(args) == 2 and args[1] is Ellipsis:
59
+ # Tuple[int, ...] with homogeneous items
60
+ return {"type": "array", "items": compile_annotation(args[0], defs)}
61
+ else:
62
+ # Tuple[int, str] with fixed length items
63
+ result = {
64
+ "type": "array",
65
+ "prefixItems": [compile_annotation(arg, defs) for arg in args],
66
+ "minItems": len(args),
67
+ "maxItems": len(args),
68
+ }
69
+ return result
70
+
56
71
  if dataclasses.is_dataclass(annotation):
57
72
  if annotation.__name__ not in defs:
58
73
  properties = {}
@@ -127,7 +142,19 @@ def compile_function_definition(function: Callable) -> FunctionDefinition:
127
142
  required = []
128
143
  defs: dict[str, Any] = {}
129
144
  for param in signature.parameters.values():
130
- properties[param.name] = compile_annotation(param.annotation, defs)
145
+ # Check if parameter uses Annotated type hint
146
+ if get_origin(param.annotation) is Annotated:
147
+ args = get_args(param.annotation)
148
+ actual_type = args[0]
149
+ # Extract description from metadata
150
+ description = args[1] if len(args) > 1 and isinstance(args[1], str) else None
151
+
152
+ properties[param.name] = compile_annotation(actual_type, defs)
153
+ if description:
154
+ properties[param.name]["description"] = description
155
+ else:
156
+ properties[param.name] = compile_annotation(param.annotation, defs)
157
+
131
158
  if param.default is inspect.Parameter.empty:
132
159
  required.append(param.name)
133
160
  else:
@@ -2,7 +2,7 @@ import pytest
2
2
  from dataclasses import dataclass
3
3
  from enum import Enum
4
4
  from unittest.mock import Mock
5
- from typing import Dict, List, Literal, Optional, Union
5
+ from typing import Annotated, Dict, List, Literal, Optional, Tuple, Union
6
6
 
7
7
  from pydantic import BaseModel
8
8
 
@@ -612,3 +612,117 @@ def test_compile_function_definition__literal_type_not_in_map():
612
612
  compiled_function = compile_function_definition(my_function)
613
613
  assert isinstance(compiled_function.parameters, dict)
614
614
  assert compiled_function.parameters["properties"]["a"] == {"enum": [MyEnum.FOO, MyEnum.BAR]}
615
+
616
+
617
+ def test_compile_function_definition__annotated_descriptions():
618
+ # GIVEN a function with annotated parameters that include descriptions
619
+ def my_function(
620
+ bar: Annotated[str, "My bar parameter"],
621
+ other: Annotated[int, "My other parameter"],
622
+ regular_param: str,
623
+ optional_param: Annotated[bool, "Optional boolean parameter"] = True,
624
+ ):
625
+ """Test function with annotated parameters."""
626
+ pass
627
+
628
+ # WHEN compiling the function
629
+ compiled_function = compile_function_definition(my_function)
630
+
631
+ # THEN it should return the compiled function definition with descriptions
632
+ assert compiled_function == FunctionDefinition(
633
+ name="my_function",
634
+ description="Test function with annotated parameters.",
635
+ parameters={
636
+ "type": "object",
637
+ "properties": {
638
+ "bar": {"type": "string", "description": "My bar parameter"},
639
+ "other": {"type": "integer", "description": "My other parameter"},
640
+ "regular_param": {"type": "string"},
641
+ "optional_param": {"type": "boolean", "description": "Optional boolean parameter", "default": True},
642
+ },
643
+ "required": ["bar", "other", "regular_param"],
644
+ },
645
+ )
646
+
647
+
648
+ def test_compile_function_definition__annotated_without_description():
649
+ # GIVEN a function with annotated parameters but no description metadata
650
+ def my_function(param: Annotated[str, None]):
651
+ pass
652
+
653
+ # WHEN compiling the function
654
+ compiled_function = compile_function_definition(my_function)
655
+
656
+ # THEN it should return the compiled function definition without description
657
+ assert compiled_function == FunctionDefinition(
658
+ name="my_function",
659
+ parameters={
660
+ "type": "object",
661
+ "properties": {
662
+ "param": {"type": "string"},
663
+ },
664
+ "required": ["param"],
665
+ },
666
+ )
667
+
668
+
669
+ def test_compile_function_definition__annotated_complex_types():
670
+ # GIVEN a function with annotated types
671
+ def my_function(
672
+ location: Annotated[Literal["New York", "Portland"], "The location you found"],
673
+ items: Annotated[List[str], "List of string items"],
674
+ config: Annotated[Dict[str, int], "Configuration mapping"],
675
+ ):
676
+ pass
677
+
678
+ # WHEN compiling the function
679
+ compiled_function = compile_function_definition(my_function)
680
+
681
+ # THEN it should return the compiled function definition with descriptions for complex types
682
+ assert compiled_function == FunctionDefinition(
683
+ name="my_function",
684
+ parameters={
685
+ "type": "object",
686
+ "properties": {
687
+ "location": {
688
+ "type": "string",
689
+ "enum": ["New York", "Portland"],
690
+ "description": "The location you found",
691
+ },
692
+ "items": {"type": "array", "items": {"type": "string"}, "description": "List of string items"},
693
+ "config": {
694
+ "type": "object",
695
+ "additionalProperties": {"type": "integer"},
696
+ "description": "Configuration mapping",
697
+ },
698
+ },
699
+ "required": ["location", "items", "config"],
700
+ },
701
+ )
702
+
703
+
704
+ @pytest.mark.parametrize(
705
+ "annotation,expected_schema",
706
+ [
707
+ (
708
+ Tuple[int, ...],
709
+ {"type": "array", "items": {"type": "integer"}},
710
+ ),
711
+ (
712
+ Tuple[int, str],
713
+ {
714
+ "type": "array",
715
+ "prefixItems": [{"type": "integer"}, {"type": "string"}],
716
+ "minItems": 2,
717
+ "maxItems": 2,
718
+ },
719
+ ),
720
+ ],
721
+ )
722
+ def test_compile_function_definition__tuples(annotation, expected_schema):
723
+ def my_function(a: annotation): # type: ignore
724
+ pass
725
+
726
+ compiled_function = compile_function_definition(my_function)
727
+ assert isinstance(compiled_function.parameters, dict)
728
+ assert compiled_function.parameters["properties"]["a"] == expected_schema
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 1.0.5
3
+ Version: 1.0.7
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -22,8 +22,6 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Dist: Jinja2 (>=3.1.0,<4.0.0)
24
24
  Requires-Dist: click (>=8.1.7,<9.0.0)
25
- Requires-Dist: composio-client (>=1.5.0,<2.0.0)
26
- Requires-Dist: composio-core (>=0.7.20,<1.0.0)
27
25
  Requires-Dist: docker (>=7.1.0,<8.0.0)
28
26
  Requires-Dist: httpx (>=0.21.2)
29
27
  Requires-Dist: openai (>=1.0.0,<2.0.0)
@@ -8,7 +8,7 @@ vellum_cli/init.py,sha256=WpnMXPItPmh0f0bBGIer3p-e5gu8DUGwSArT_FuoMEw,5093
8
8
  vellum_cli/logger.py,sha256=dcM_OmgqXLo93vDYswO5ylyUQQcTfnA5GTd5tbIt3wM,1446
9
9
  vellum_cli/ping.py,sha256=p_BCCRjgPhng6JktuECtkDQLbhopt6JpmrtGoLnLJT8,1161
10
10
  vellum_cli/pull.py,sha256=udYyPlJ6VKDdh78rApNJOZgxHl82fcV6iGnRPSdX1LY,14750
11
- vellum_cli/push.py,sha256=3icrAKRu2ZbOvtVsk-m6pSM9Hau4MrmtMje-fKHMt8A,10940
11
+ vellum_cli/push.py,sha256=d1947A_QwFKSZyDimK6dEK1abf_o8e1uzjpI_A_SCwM,11459
12
12
  vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  vellum_cli/tests/conftest.py,sha256=wx3PlJjVB0HRf5dr2b_idOIw27WPPl0J0FNbhIJJaVk,1689
14
14
  vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
@@ -18,7 +18,7 @@ vellum_cli/tests/test_init.py,sha256=8UOc_ThfouR4ja5cCl_URuLk7ohr9JXfCnG4yka1OUQ
18
18
  vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
19
19
  vellum_cli/tests/test_ping.py,sha256=b3aQLd-N59_8w2rRiWqwpB1rlHaKEYVbAj1Y3hi7A-g,2605
20
20
  vellum_cli/tests/test_pull.py,sha256=hxMbW_j0weDDrkzVGpvLpFcwNQdn-fxTv4wBHeYizzc,49904
21
- vellum_cli/tests/test_push.py,sha256=wk9jQTV565TeukR0Vz-2AUQyJa3VlOJrmWxkSTX_Ptw,37860
21
+ vellum_cli/tests/test_push.py,sha256=H9ZU0_E-I1F98SBvj-I_1ooe3RzOlhMTTmEFg6CRrYY,40384
22
22
  vellum_ee/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  vellum_ee/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -36,7 +36,7 @@ vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqU
36
36
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
37
37
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=lGS-C9cd-nlYVZuaXmArJUJFdwPUMLNJwf1bpa7Ufys,9400
38
38
  vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=FHhPoGmmny4Xcxi2pm12Sk3ZOREanWEVrOWcjRhncH4,6337
39
- vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=6lavdBw297GwAQqyxjnPUtx5pHv6k5V9Vkuq7s2D0TM,4508
39
+ vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=zG0u5Wvvo8B6yM0JSWtDdLxsULus3VD3cxYVOHRAgAU,4635
40
40
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=OEw8QRPliL4P8J6oEZdQH8Oc-0u7aFa_Jqx0RyL6F-M,11656
41
41
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=YhMsi2TG1zSR8E7IpxzzSncOyVLcvqTuGa3mr4RqHd8,2364
42
42
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=zo-nalsuayMqeb2GwR2OB9SFK3y2U5aG-rtwrsjdasQ,3089
@@ -53,7 +53,7 @@ vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=w
53
53
  vellum_ee/workflows/display/nodes/vellum/templating_node.py,sha256=TdIJWh2l8p4tw7ejRexGOFQKnviirUqie3WYwsrVQ4g,3339
54
54
  vellum_ee/workflows/display/nodes/vellum/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_api_node.py,sha256=DQAtsabvn6BE6xWwKNHzMOppzoy1-1dssNnrwbHUdRU,1490
56
- vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=ZasoqG8FmqnZDj2FfL5BGPq9fafOTJqV_4xjOKLi1gc,5434
56
+ vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha256=JFjhOABsFwR1LHZBSU5O7uzPdAuvkOvc0qNDsEH_CSY,6021
57
57
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=540FoWMpJ3EN_DPjHsr9ODJWCRVcUa5hZBn-5T2GiHU,1665
58
58
  vellum_ee/workflows/display/nodes/vellum/tests/test_inline_subworkflow_node.py,sha256=SKOYan-dxY4gsO0R4JyQUyWrABHBN8XImKw9Eeo4wGo,3535
59
59
  vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py,sha256=uiMB0cOxKZzos7YKnj4ef4DFa2bOvZJWIv-hfbUV6Go,1218
@@ -94,9 +94,9 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_
94
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=XWrhHg_acLsRHwjstBAii9Pmes9oXFtAUWSAVF1oSBc,11225
95
95
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=V8b6gKghLlO7PJI8xeNdnfn8aII0W_IFQvSQBQM62UQ,7721
96
96
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=hDWtKXmGI1CKhTwTNqpu_d5RkE5n7SolMLtgd87KqTI,3856
97
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py,sha256=esCCiOXM7Syb9tFyVdZTu95lnP8yiADfBPXw-oUy4zk,3719
97
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py,sha256=gonapBCyDDt3qc7U02PCuKyPS8f3YiSAZ7QD86CH1Fw,3794
98
98
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py,sha256=4t1lkN2nsZF6lFqP6QnskUQWJlhasF8C2_f6atzk8ZY,26298
99
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=1hoakUkh5kHZYIfY1moJBZYzXgAafkgWsIf4lmZ12vg,9521
99
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=B0rDsCvO24qPp0gkmj8SdTDY5CxZYkvKwknsKBuAPyA,10017
100
100
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_workflow_deployment_serialization.py,sha256=mova0sPD3evHiHIN1O0VynxlCp-uOcEIKve5Pd_oCDg,4069
101
101
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=pLCyMScV88DTBXRH7jXaXOEA1GBq8NIipCUFwIAWnwI,2771
102
102
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=J4ouI8KxbMfxQP2Zq_9cWMGYgbjCWmKzjCJEtnSJb0I,5829
@@ -140,12 +140,12 @@ vellum_ee/workflows/tests/test_display_meta.py,sha256=PkXJVnMZs9GNooDkd59n4YTBAX
140
140
  vellum_ee/workflows/tests/test_serialize_module.py,sha256=EVrCRAP0lpvd0GIDlg2tnGfJzDNooNDXPfGFPLAqmbI,1870
141
141
  vellum_ee/workflows/tests/test_server.py,sha256=SsOkS6sGO7uGC4mxvk4iv8AtcXs058P9hgFHzTWmpII,14519
142
142
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
143
- vellum/__init__.py,sha256=v-QZCDKBW8F_J5j4iE7eSjcrhHQA2JeBDB6Hxn8mnEI,43273
143
+ vellum/__init__.py,sha256=tD6Fm-ml3pDVFPucRvSr5p0uRoEodHXxs6FHATqQU5o,43103
144
144
  vellum/client/README.md,sha256=Dle5iytCXxP1pNeNd7uZyhFo0rl7tp7vU7s8gmi10OQ,4863
145
145
  vellum/client/__init__.py,sha256=KmkyOgReuTsjmXF3WC_dPQ9QqJgYrB3Sr8_LcSUIQyI,125258
146
146
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
147
147
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
148
- vellum/client/core/client_wrapper.py,sha256=70UredlOjsMiKycnRj65YT1Wa5H3gtf4_h3_2Ip7LOs,2383
148
+ vellum/client/core/client_wrapper.py,sha256=4HIoFVgVHLgCMAKnGSlXru4ZVIHjc4LSqpYHg9GPlAI,2383
149
149
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
150
150
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
151
151
  vellum/client/core/http_client.py,sha256=cKs2w0ybDBk1wHQf-fTALm_MmvaMe3cZKcYJxqmCxkE,19539
@@ -215,7 +215,7 @@ vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCat
215
215
  vellum/client/resources/workspace_secrets/client.py,sha256=l1FOj0f-IB5_oQ7iWiHopFK3lDXBqiaIc9g10W9PHFU,8381
216
216
  vellum/client/resources/workspaces/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
217
217
  vellum/client/resources/workspaces/client.py,sha256=61eFS8USOtHf4cFoT3dZmAMs6KGAVPbXjAolws2ftsQ,3683
218
- vellum/client/types/__init__.py,sha256=zNkFXLVQBQSKVO_yBZ8PGzmAwuwGEOqZ1apSQAuly8E,65526
218
+ vellum/client/types/__init__.py,sha256=rmRNYcVM3VMP28jEp-ChnFQKPgHJxSLoA_07CSL_jyc,65257
219
219
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
220
220
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
221
221
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=oDG60TpwK1YNSKhRsBbiP2O3ZF9PKR-M9chGIfKw4R4,1004
@@ -429,7 +429,6 @@ vellum/client/types/metric_node_result.py,sha256=YdKq1DZiBD1RBtjyMejImylv3BqrwY8
429
429
  vellum/client/types/ml_model_read.py,sha256=Vr5KjaS2Tca0GXsltfSYQpuyGYpgIahPEFfS6HfFGSo,706
430
430
  vellum/client/types/ml_model_usage.py,sha256=WcZ2F1hfxyTwe-spOVwv-qJYDjs4hf9sn7BF2abawPo,910
431
431
  vellum/client/types/ml_model_usage_wrapper.py,sha256=Vi7urVmTn1E_aZV6TxnW-qjDayRv7A_6JDk84KqAIa0,645
432
- vellum/client/types/name_enum.py,sha256=5y6CNh1LNmWC_CTje_rD-N53Z57PckS9avbCxmqjAMk,210
433
432
  vellum/client/types/named_scenario_input_chat_history_variable_value_request.py,sha256=aVZmAxu-47c34NyhSkfi9tQqIPy29cdJ7Pb4MIgKeNw,862
434
433
  vellum/client/types/named_scenario_input_json_variable_value_request.py,sha256=UgnKv70zFviv1kl4nM7aM7IFA-7xyDOtglW4Y3GBZ28,757
435
434
  vellum/client/types/named_scenario_input_request.py,sha256=Pi8l377OHvKBwvPu9slZ1omf_NJ9S1mCQ5Wr-Ux5KVg,611
@@ -501,8 +500,7 @@ vellum/client/types/open_ai_vectorizer_text_embedding_3_small.py,sha256=T_-P7qGj
501
500
  vellum/client/types/open_ai_vectorizer_text_embedding_3_small_request.py,sha256=-lwNeWj7ExP-JLncUp1Uyd20FxweVIDu-aEnenPB98A,841
502
501
  vellum/client/types/open_ai_vectorizer_text_embedding_ada_002.py,sha256=c4vNlR6lRvUjq-67M06sroDMNMG_qC4JUBqwmKEJQ2I,812
503
502
  vellum/client/types/open_ai_vectorizer_text_embedding_ada_002_request.py,sha256=FdpkkNBGgRwfqFjBwpfH4t2zKIM0pIYminX2iZQUzvY,841
504
- vellum/client/types/organization_limit_config.py,sha256=-RXRY_Rpt8hHbJtNxJZvfKo1cUEnlvvGCRhk401jLU0,956
505
- vellum/client/types/organization_read.py,sha256=c5Wl5KY6plC7DuPJq6zAK_UTH2XVhT7H8OdEtxLqN98,854
503
+ vellum/client/types/organization_read.py,sha256=QDFpX4pZCjGSRXZ6FF65SDzRxFqkI87DEEUXtaVoTAs,837
506
504
  vellum/client/types/paginated_container_image_read_list.py,sha256=7lwIgs1q7Z0xDYPGWPnjSNC1kU_peu79CotzaaQfRdA,801
507
505
  vellum/client/types/paginated_deployment_release_tag_read_list.py,sha256=hp7D74CxPY14dEPRZ-fnTCwp63upxkYquL1e74oYXh4,826
508
506
  vellum/client/types/paginated_document_index_read_list.py,sha256=bO7pm3KCZi5LDO17YXgr_lUF9SRdAfMu6wOutX91ANw,797
@@ -542,7 +540,6 @@ vellum/client/types/prompt_request_json_input.py,sha256=vLhwvCWL_yjVfDzT4921xK4Q
542
540
  vellum/client/types/prompt_request_string_input.py,sha256=8GSFhtN3HeYssbDRY7B5SCh5Qrp67340D9c3oINpCmw,714
543
541
  vellum/client/types/prompt_settings.py,sha256=gITevU-SWiStXFKLfpwG5dQJ-bic5CxnM0OHsT9KR0s,635
544
542
  vellum/client/types/prompt_version_build_config_sandbox.py,sha256=SXU62bAueVpoWo178bLIMYi8aNVpsBGTtOQxHcg6Dmo,678
545
- vellum/client/types/quota.py,sha256=3NXzWkznGopK9AdoltadaF-BzfGFbC_WYbvqulweilc,672
546
543
  vellum/client/types/raw_prompt_execution_overrides_request.py,sha256=x4Chkm_NxXySOEyA6s6J_mhhiM91KCcQbu6pQETB8RI,927
547
544
  vellum/client/types/reducto_chunker_config.py,sha256=by_Dj0hZPkLQAf7l1KAudRB8X2XnlfHiRTsyiR-DTRY,654
548
545
  vellum/client/types/reducto_chunker_config_request.py,sha256=RnulU2a_PUtvRE2qhARQhsCkWI--K_MYkobzLNRGEz4,661
@@ -740,7 +737,6 @@ vellum/client/types/vellum_variable.py,sha256=BDcccISJsycsrW3E5A5RTIOfxS_83ofkle
740
737
  vellum/client/types/vellum_variable_extensions.py,sha256=PsrRo0STOKhxrkSFRrOXCPlf1x5Uxpy3vVMJz02O20E,685
741
738
  vellum/client/types/vellum_variable_type.py,sha256=epYV-PY0NkvUntKzgzqelWMq9Dzmh7Y32c19GB_2mh0,411
742
739
  vellum/client/types/vellum_workflow_execution_event.py,sha256=H8rP3_6a6LTvemoHfsmI2THpTRf8PYrZQcjoeTzf-44,934
743
- vellum/client/types/vembda_service_tier_enum.py,sha256=zIQq6j0BNu1niKkK_G4a_hE5kqkZ5s43k4g5Zj2qiAI,161
744
740
  vellum/client/types/workflow_deployment_event_executions_response.py,sha256=_X9hfsfpCf7DaQpfg83AAcbadZxEVi1NKNf2PZ7PRY8,1190
745
741
  vellum/client/types/workflow_deployment_history_item.py,sha256=w5yqAtmYWw8kTljYEVBa8-fLxKsrBA8Img7IC3GjZG4,1226
746
742
  vellum/client/types/workflow_deployment_parent_context.py,sha256=QwGpZnSNX6RCfkjbxmfln8QefrP8lFHkZ1DAC-oj9-Q,1699
@@ -1130,7 +1126,6 @@ vellum/types/metric_node_result.py,sha256=Q_bUgbdRnSP26nEcJ-vZD7k2oLIcThN3JjW9hX
1130
1126
  vellum/types/ml_model_read.py,sha256=d_CPwZ3bhXtC8c5jwXkuNVvobDqPI-I_byZ6WnVla1Q,151
1131
1127
  vellum/types/ml_model_usage.py,sha256=Q-7_W6GfL8rMnqjhSiZirw8oB60GFc0p_mNYdZdlMjY,152
1132
1128
  vellum/types/ml_model_usage_wrapper.py,sha256=anoup7KWug4Mrt-JhsB_S1zuKcdq9ncXsz3y8t_I52g,160
1133
- vellum/types/name_enum.py,sha256=YrE8Nx14GVcIUZgM_ackw2n9qYXTX0wQywYGKUdUOSY,147
1134
1129
  vellum/types/named_scenario_input_chat_history_variable_value_request.py,sha256=Sfwba1cvocP8UR6CCDEjE7HsI5Xs6Dopk1W88Zf1ng8,194
1135
1130
  vellum/types/named_scenario_input_json_variable_value_request.py,sha256=1kZ4Y7TttH8O897rmtkEIMraql5dTIyEVvFZn0I5Py8,186
1136
1131
  vellum/types/named_scenario_input_request.py,sha256=E7TcL4YRw7dcEyMEws3AsiCw7GSHnrXpktBKOoVSytA,166
@@ -1202,7 +1197,6 @@ vellum/types/open_ai_vectorizer_text_embedding_3_small.py,sha256=5gsPjLdttszz8Nq
1202
1197
  vellum/types/open_ai_vectorizer_text_embedding_3_small_request.py,sha256=kqph8wL-8Cn6vVoJMEYIkFc4kvERvF3pzHjUQxFZAOM,187
1203
1198
  vellum/types/open_ai_vectorizer_text_embedding_ada_002.py,sha256=VTile8qzbXfjXgALK7Lr58U4sWGcEOWJ830gdHNpJhY,179
1204
1199
  vellum/types/open_ai_vectorizer_text_embedding_ada_002_request.py,sha256=345s9jJCbxvgIWb_ejW2pVWOz51d4NnkiyWB4J0qQpE,187
1205
- vellum/types/organization_limit_config.py,sha256=wJoKIE_HPe0jbUVQx18QCnNVdAkhK05TAZxu8uSPtQY,163
1206
1200
  vellum/types/organization_read.py,sha256=3VdzuCxr_jNaXSL8P_Imk6vNK6BaJ6b1TX1IHKMiQ_Y,155
1207
1201
  vellum/types/paginated_container_image_read_list.py,sha256=dKnIbX8_sYqWo6tS0W694jojAWKybB8pe9Zw8-hvlo8,173
1208
1202
  vellum/types/paginated_deployment_release_tag_read_list.py,sha256=B-fCqNhU5KiYqIvnrybZr7MZCyOBmihHkrDsEhEzOjg,180
@@ -1243,7 +1237,6 @@ vellum/types/prompt_request_json_input.py,sha256=OlXiUPchxe184SWbmIvbmARpY9YWPi8
1243
1237
  vellum/types/prompt_request_string_input.py,sha256=1V-fTtuyhEw5H4EpqIkCqX7aHGJivUzzc_LMeszPjnc,165
1244
1238
  vellum/types/prompt_settings.py,sha256=6_AzrH73lBHSDxKxidI6zhDjAeWh_nZcaIGlrzJhypU,153
1245
1239
  vellum/types/prompt_version_build_config_sandbox.py,sha256=thz3Ty7FMZr1NWrrtPS1QN32kPpZo9hg9VIN6c6biuc,173
1246
- vellum/types/quota.py,sha256=hhIYDiHDilEV0FJ7LSD-TTzLaDL0kfuJIA9tReithZg,143
1247
1240
  vellum/types/raw_prompt_execution_overrides_request.py,sha256=NvCoHH8ehO0UortbDuDQvwOdxQzXw0_PMGsJc7DtvoA,176
1248
1241
  vellum/types/reducto_chunker_config.py,sha256=6hu2m_WTavxTfKs46BWZGiuOsLE4HYgoP-VdDGS6KTI,160
1249
1242
  vellum/types/reducto_chunker_config_request.py,sha256=KjIZYQu27OIA--0e6RjgUwWmY3iE8s9rlehdhfZRzhQ,168
@@ -1441,7 +1434,6 @@ vellum/types/vellum_variable.py,sha256=rmjuD8hMydLF480--5tWlHbvu6qNaz0Hs9bSrJ8DP
1441
1434
  vellum/types/vellum_variable_extensions.py,sha256=wwKDv_yxtP7gQmfz5HF3zab-FOLt-0OMUYIsHgvrOC0,164
1442
1435
  vellum/types/vellum_variable_type.py,sha256=d3Zkf0ued1QrO90CMGTUnlyg2xT8nKGM4Nv6-L6W_Pg,158
1443
1436
  vellum/types/vellum_workflow_execution_event.py,sha256=EI7XANl17nOtYskD9b4FmdejkKsK7cFDwe9asr2xGC8,169
1444
- vellum/types/vembda_service_tier_enum.py,sha256=IMC8Ftntkplp7lt1OIqPZjFP_1C3t0-EbspoyWXgFQ4,162
1445
1437
  vellum/types/workflow_deployment_event_executions_response.py,sha256=375mHiA7sucHeFSr0LlaLcVgV7F2QicMZaQiOrC5yOg,183
1446
1438
  vellum/types/workflow_deployment_history_item.py,sha256=dp5pwzOVO83KPwAbYeO3NXlKKHswGa0MTGX82nIhAIg,170
1447
1439
  vellum/types/workflow_deployment_parent_context.py,sha256=kB0eeRXagHqRnuDVA9B8aDlvBZVOmQ702JYXD8evh24,172
@@ -1551,6 +1543,7 @@ vellum/workflows/environment/environment.py,sha256=Ck3RPKXJvtMGx_toqYQQQF-ZwXm5i
1551
1543
  vellum/workflows/errors/__init__.py,sha256=tWGPu5xyAU8gRb8_bl0fL7OfU3wxQ9UH6qVwy4X4P_Q,113
1552
1544
  vellum/workflows/errors/types.py,sha256=nUWuniEfrhdtb-_2GzoDGlYnSJ_yuNUGjVkaKLNr-rM,4049
1553
1545
  vellum/workflows/events/__init__.py,sha256=V4mh766fyA70WvHelm9kfVZGrUgEKcJ9tJt8EepfQYU,832
1546
+ vellum/workflows/events/context.py,sha256=81367zwg23PUBsrDJyF0rbcswNOIMTwWveAjmqy9GcM,4501
1554
1547
  vellum/workflows/events/node.py,sha256=n3JdlCmeZ6tFTu_x5tu1oSCe5EBE8B1Cy3CzSWK5B08,5453
1555
1548
  vellum/workflows/events/stream.py,sha256=xhXJTZirFi0xad5neAQNogrIQ4h47fpnKbVC3vCM5Js,889
1556
1549
  vellum/workflows/events/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1603,6 +1596,8 @@ vellum/workflows/inputs/__init__.py,sha256=AbFEteIYEvCb14fM3EK7bhM-40-6s494rSlIh
1603
1596
  vellum/workflows/inputs/base.py,sha256=w3owT5B3rLBmIj-v-jL2l-HD4yd3hXK9RmHVd557BpA,5126
1604
1597
  vellum/workflows/inputs/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1605
1598
  vellum/workflows/inputs/tests/test_inputs.py,sha256=lioA8917mFLYq7Ml69UNkqUjcWbbxkxnpIEJ4FBaYBk,2206
1599
+ vellum/workflows/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1600
+ vellum/workflows/integrations/composio_service.py,sha256=p3V9l7OlOV1zZK9aIgvfhLiDsxbxeSVZJ3MBSedo7Pw,5008
1606
1601
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1607
1602
  vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
1608
1603
  vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
@@ -1637,10 +1632,12 @@ vellum/workflows/nodes/displayable/__init__.py,sha256=zH7SFotr4i8sO-r5_k53yPipQw
1637
1632
  vellum/workflows/nodes/displayable/api_node/__init__.py,sha256=MoxdQSnidIj1Nf_d-hTxlOxcZXaZnsWFDbE-PkTK24o,56
1638
1633
  vellum/workflows/nodes/displayable/api_node/node.py,sha256=F7ucsuEmrVYlTKMIoi60fFJ_ELYgGuc7jEmJCEyQczw,2956
1639
1634
  vellum/workflows/nodes/displayable/api_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1640
- vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py,sha256=qp6v-MrgpNVDt16Kp0EOyeQx3LpzflTlaNSL1EYZ1nE,9185
1635
+ vellum/workflows/nodes/displayable/api_node/tests/test_api_node.py,sha256=DZQGyq-iI9P9qvM5qtIUzb6fubyLnlJ3WbHwMUFsRs8,9527
1641
1636
  vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN03vWGMuI1WrrLZeMLT2Cl2c,304
1642
1637
  vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
1643
- vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=JDYe21Ou8WGkVRxO5RYdW10yld-IYv3Ugt13L8f6-s0,5247
1638
+ vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=iUtdPsbJs1jwo3V5bA6qGab56z3K44_VOpLR5MDXzBQ,6640
1639
+ vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1640
+ vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py,sha256=Pf51DIyhtUxx-pCu0zJYDB4Z5_IW5mRwkJIoPT53_9I,3894
1644
1641
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1645
1642
  vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=EJsGaz8Umss6-JWGGYbJp93ZHx3IlZQWAySlHAdNYtY,4466
1646
1643
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
@@ -1698,14 +1695,13 @@ vellum/workflows/nodes/displayable/tests/test_search_node_error_handling.py,sha2
1698
1695
  vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=VepO5z1277c1y5N6LLIC31nnWD1aak2m5oPFplfJHHs,6935
1699
1696
  vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=dc3EEn1sOICpr3GdS8eyeFtExaGwWWcw9eHSdkRhQJU,2584
1700
1697
  vellum/workflows/nodes/displayable/tool_calling_node/__init__.py,sha256=3n0-ysmFKsr40CVxPthc0rfJgqVJeZuUEsCmYudLVRg,117
1701
- vellum/workflows/nodes/displayable/tool_calling_node/composio_service.py,sha256=C53hgStA-BHe7EFu4j_N650LqsLBOiMovs_nGW8J7nc,2669
1702
- vellum/workflows/nodes/displayable/tool_calling_node/node.py,sha256=BRA6YRCEOk0Nw3DCIT13WY7WCZ7Gx30s-egJe_md0FA,6504
1698
+ vellum/workflows/nodes/displayable/tool_calling_node/node.py,sha256=KRI1NMgXZTUgQqq9uOA9W_D8k8sy7ZAq6v53-YVno1k,6545
1703
1699
  vellum/workflows/nodes/displayable/tool_calling_node/state.py,sha256=oQg_GAtc349nPB5BL_oeDYYD7q1qSDPAqjj8iA8OoAw,215
1704
1700
  vellum/workflows/nodes/displayable/tool_calling_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1705
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py,sha256=BOb4LTAELS-cX5xPH8fH4E2CKl1IBBjiOBYhQl51PpI,4758
1701
+ vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py,sha256=UV0vZpU7-_tHcwnIq36WKwHrJXNurU4bdC3rfaw8eoU,4804
1706
1702
  vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py,sha256=raY_E5-EgtYNXEPbO2I-Ythe4YeuFdGsXGZ_BAN98uI,7979
1707
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py,sha256=aCK4TDcD4TcgoYbOs712qFiNCVRVffCb5HZCZQGDiUc,2449
1708
- vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=Vbdt6wsQozK6PWJq5chtda9pwasjNpx7IE0IMkWPSak,15622
1703
+ vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py,sha256=Ku_fUUoqQFeKLZ6o1DPCi7ax9PdkbaxkEEj6rAwjytM,7858
1704
+ vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=uRZGCJA3FBRt1ZPQWOF2R8D49aajrW4Yjxvn3kIcrAQ,16545
1709
1705
  vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
1710
1706
  vellum/workflows/nodes/experimental/__init__.py,sha256=jCQgvZEknXKfuNhGSOou4XPfrPqZ1_XBj5F0n0fgiWM,106
1711
1707
  vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
@@ -1753,7 +1749,7 @@ vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83y
1753
1749
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1754
1750
  vellum/workflows/types/code_execution_node_wrappers.py,sha256=3MNIoFZKzVzNS5qFLVuDwMV17QJw72zo7NRf52yMq5A,3074
1755
1751
  vellum/workflows/types/core.py,sha256=6MW_BRLcx4oEJpItQWQa64xfCrsk76suZSsMKKEsJLg,1314
1756
- vellum/workflows/types/definition.py,sha256=Oq2E5Ae6AsvqAOLWzP0k6H5M7su00JZP_QFhlV2rz7s,3721
1752
+ vellum/workflows/types/definition.py,sha256=K1evpjoxHpZysx8HBcA-IY0fS_p1afS4QcvG2HZ-r0o,3815
1757
1753
  vellum/workflows/types/generics.py,sha256=8jptbEx1fnJV0Lhj0MpCJOT6yNiEWeTOYOwrEAb5CRU,1576
1758
1754
  vellum/workflows/types/stack.py,sha256=h7NE0vXR7l9DevFBIzIAk1Zh59K-kECQtDTKOUunwMY,1314
1759
1755
  vellum/workflows/types/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1761,11 +1757,11 @@ vellum/workflows/types/tests/test_definition.py,sha256=c3GczPtWxuH3BOULwZacxYTQl
1761
1757
  vellum/workflows/types/tests/test_utils.py,sha256=UnZog59tR577mVwqZRqqWn2fScoOU1H6up0EzS8zYhw,2536
1762
1758
  vellum/workflows/types/utils.py,sha256=mTctHITBybpt4855x32oCKALBEcMNLn-9cCmfEKgJHQ,6498
1763
1759
  vellum/workflows/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1764
- vellum/workflows/utils/functions.py,sha256=4pHaaaOXwvYTLVThTkLYpESBkzNKuZdiyRBGRpcWxqY,7623
1760
+ vellum/workflows/utils/functions.py,sha256=ksvyxPWTbsldlXSlqh20e_1hl9GHipWwggYLfp3NRiE,8735
1765
1761
  vellum/workflows/utils/names.py,sha256=QLUqfJ1tmSEeUwBKTTiv_Qk3QGbInC2RSmlXfGXc8Wo,380
1766
1762
  vellum/workflows/utils/pydantic_schema.py,sha256=eR_bBtY-T0pttJP-ARwagSdCOnwPUtiT3cegm2lzDTQ,1310
1767
1763
  vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1768
- vellum/workflows/utils/tests/test_functions.py,sha256=xIk1r0XwbPcbQLHwN5NFUrztfKa3fGtUnfjvhOrYNNg,19449
1764
+ vellum/workflows/utils/tests/test_functions.py,sha256=uaxjsIdtTQdz3r0ACbBegDx-5LMAYyVsI83VgxUlE8o,23520
1769
1765
  vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
1770
1766
  vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
1771
1767
  vellum/workflows/utils/tests/test_vellum_variables.py,sha256=vbnKgm41aB5OXlO-ZIPbhQ6xDiZkT8KMxCLqz4zocWY,1791
@@ -1778,8 +1774,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1778
1774
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1779
1775
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=ptMntHzVyy8ZuzNgeTuk7hREgKQ5UBdgq8VJFSGaW4Y,20832
1780
1776
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1781
- vellum_ai-1.0.5.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1782
- vellum_ai-1.0.5.dist-info/METADATA,sha256=FIbEOXz7OKYnan91KlabwU9Z_BqNdMXNgKp11ZA8olI,5649
1783
- vellum_ai-1.0.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1784
- vellum_ai-1.0.5.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1785
- vellum_ai-1.0.5.dist-info/RECORD,,
1777
+ vellum_ai-1.0.7.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1778
+ vellum_ai-1.0.7.dist-info/METADATA,sha256=-x_ul0guh3O6FHWJQn5INiN0RWn4W4IBRFk_JZgcUGQ,5554
1779
+ vellum_ai-1.0.7.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1780
+ vellum_ai-1.0.7.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1781
+ vellum_ai-1.0.7.dist-info/RECORD,,
vellum_cli/push.py CHANGED
@@ -16,6 +16,7 @@ from vellum.resources.workflows.client import OMIT
16
16
  from vellum.workflows.vellum_client import create_vellum_client
17
17
  from vellum_cli.config import DEFAULT_WORKSPACE_CONFIG, WorkflowConfig, WorkflowDeploymentConfig, load_vellum_cli_config
18
18
  from vellum_cli.logger import handle_cli_error, load_cli_logger
19
+ from vellum_ee.workflows.display.nodes.utils import to_kebab_case
19
20
  from vellum_ee.workflows.display.workflows.base_workflow_display import BaseWorkflowDisplay
20
21
 
21
22
 
@@ -131,9 +132,10 @@ def push_command(
131
132
  )
132
133
 
133
134
  try:
135
+ module_name = workflow_config.module.split(".")[-1]
134
136
  deployment_config = WorkflowPushDeploymentConfigRequest(
135
137
  label=deployment_label or cli_deployment_config.label,
136
- name=deployment_name or cli_deployment_config.name,
138
+ name=deployment_name or cli_deployment_config.name or to_kebab_case(module_name),
137
139
  description=deployment_description or cli_deployment_config.description,
138
140
  release_tags=release_tags or cli_deployment_config.release_tags,
139
141
  )
@@ -274,7 +276,14 @@ Visit at: {base_url}/workflow-sandboxes/{response.workflow_sandbox_id}"""
274
276
  workflow_config.workflow_sandbox_id = response.workflow_sandbox_id
275
277
 
276
278
  if not workflow_config.deployments and response.workflow_deployment_id:
277
- workflow_config.deployments.append(WorkflowDeploymentConfig(id=UUID(response.workflow_deployment_id)))
279
+ stored_deployment_config = WorkflowDeploymentConfig(
280
+ id=UUID(response.workflow_deployment_id),
281
+ label=deployment_config.label if deploy else None,
282
+ name=deployment_config.name if deploy else None,
283
+ description=deployment_config.description if deploy else None,
284
+ release_tags=deployment_config.release_tags if deploy else None,
285
+ )
286
+ workflow_config.deployments.append(stored_deployment_config)
278
287
 
279
288
  config.save()
280
289
  logger.info("Updated vellum.lock.json file.")
@@ -13,6 +13,7 @@ from vellum.client.core.api_error import ApiError
13
13
  from vellum.client.types.workflow_push_response import WorkflowPushResponse
14
14
  from vellum.utils.uuid import is_valid_uuid
15
15
  from vellum_cli import main as cli_main
16
+ from vellum_ee.workflows.display.nodes.utils import to_kebab_case
16
17
 
17
18
 
18
19
  def _extract_tar_gz(tar_gz_bytes: bytes) -> dict[str, str]:
@@ -391,7 +392,9 @@ def test_push__deployment(mock_module, vellum_client, base_command):
391
392
  assert json.loads(call_args["exec_config"])["workflow_raw_data"]["definition"]["name"] == "ExampleWorkflow"
392
393
  assert is_valid_uuid(call_args["workflow_sandbox_id"])
393
394
  assert call_args["artifact"].name == expected_artifact_name
394
- assert call_args["deployment_config"] == "{}"
395
+ expected_deployment_name = to_kebab_case(module.split(".")[-1])
396
+ deployment_config = json.loads(call_args["deployment_config"])
397
+ assert deployment_config["name"] == expected_deployment_name
395
398
 
396
399
  extracted_files = _extract_tar_gz(call_args["artifact"].read())
397
400
  assert extracted_files["workflow.py"] == workflow_py_file_content
@@ -1039,3 +1042,56 @@ def test_push__deploy_with_release_tags_success(mock_module, vellum_client):
1039
1042
  # AND should show success message
1040
1043
  assert "Successfully pushed" in result.output
1041
1044
  assert "Updated vellum.lock.json file." in result.output
1045
+
1046
+
1047
+ def test_push__deploy_stores_deployment_config_in_lock_file(mock_module, vellum_client):
1048
+ # GIVEN a single workflow
1049
+ temp_dir = mock_module.temp_dir
1050
+ module = mock_module.module
1051
+
1052
+ # AND a workflow exists in the module successfully
1053
+ _ensure_workflow_py(temp_dir, module)
1054
+
1055
+ # AND the push API call returns successfully with a deployment
1056
+ workflow_deployment_id = str(uuid4())
1057
+ vellum_client.workflows.push.return_value = WorkflowPushResponse(
1058
+ workflow_sandbox_id=str(uuid4()),
1059
+ workflow_deployment_id=workflow_deployment_id,
1060
+ )
1061
+
1062
+ # WHEN calling `vellum workflows push --deploy` for the first time
1063
+ runner = CliRunner()
1064
+ result = runner.invoke(cli_main, ["workflows", "push", module, "--deploy"])
1065
+
1066
+ # THEN it should succeed
1067
+ assert result.exit_code == 0, result.output
1068
+
1069
+ # AND the deployment config should be stored in the lock file with the deployment ID and module name
1070
+ with open(os.path.join(temp_dir, "vellum.lock.json")) as f:
1071
+ lock_data = json.loads(f.read())
1072
+ assert len(lock_data["workflows"][0]["deployments"]) == 1
1073
+ deployment = lock_data["workflows"][0]["deployments"][0]
1074
+ assert str(deployment["id"]) == workflow_deployment_id
1075
+ assert deployment["name"] == "test-push-deploy-stores-deployment-config-in-lock-file"
1076
+ assert deployment.get("label") is None
1077
+ assert deployment.get("description") is None
1078
+ assert deployment.get("release_tags") is None
1079
+
1080
+ # AND when we do a second push
1081
+ vellum_client.workflows.push.reset_mock()
1082
+ vellum_client.workflows.push.return_value = WorkflowPushResponse(
1083
+ workflow_sandbox_id=str(uuid4()),
1084
+ workflow_deployment_id=workflow_deployment_id,
1085
+ )
1086
+
1087
+ result = runner.invoke(cli_main, ["workflows", "push", module, "--deploy"])
1088
+
1089
+ # THEN it should succeed
1090
+ assert result.exit_code == 0, result.output
1091
+
1092
+ # AND we should have called the push API with the module name as deployment name
1093
+ vellum_client.workflows.push.assert_called_once()
1094
+ call_args = vellum_client.workflows.push.call_args.kwargs
1095
+ deployment_config_str = call_args["deployment_config"]
1096
+ deployment_config = json.loads(deployment_config_str)
1097
+ assert deployment_config["name"] == "test-push-deploy-stores-deployment-config-in-lock-file"
@@ -40,6 +40,8 @@ class BaseCodeExecutionNodeDisplay(BaseNodeDisplay[_CodeExecutionNodeType], Gene
40
40
  node_filepath=node_file_path,
41
41
  script_filepath=filepath,
42
42
  )
43
+ if not file_code:
44
+ raise Exception(f"Filepath '{filepath}' of node {node.__name__} does not exist")
43
45
  code_value = file_code
44
46
  else:
45
47
  code_value = ""
@@ -153,3 +153,19 @@ def test_serialize_node__with_unresolved_secret_references(vellum_client):
153
153
  # warnings = list(workflow_display.errors)
154
154
  # assert len(warnings) == 1
155
155
  # assert "Failed to resolve secret reference 'MY_API_KEY'" in str(warnings[0])
156
+
157
+
158
+ def test_serialize_node__with_non_exist_code_input_path():
159
+ # GIVEN a code node with a non-existent code input path
160
+ class MyNode(CodeExecutionNode):
161
+ filepath = "non_existent_file.py"
162
+
163
+ # AND a workflow with the code node
164
+ class Workflow(BaseWorkflow):
165
+ graph = MyNode
166
+
167
+ # WHEN we serialize the workflow
168
+ workflow_display = get_workflow_display(workflow_class=Workflow)
169
+ with pytest.raises(Exception) as exc_info:
170
+ workflow_display.serialize()
171
+ assert "Filepath 'non_existent_file.py' of node MyNode does not exist" in str(exc_info.value)
@@ -54,6 +54,9 @@ def test_serialize_workflow():
54
54
  "action": "GITHUB_CREATE_AN_ISSUE",
55
55
  "description": "Create a new issue in a GitHub repository",
56
56
  "display_name": "Create GitHub Issue",
57
+ "parameters": None,
58
+ "version": None,
59
+ "tags": None,
57
60
  }
58
61
 
59
62
  # AND the rest of the node structure should be correct
@@ -140,13 +140,19 @@ def test_serialize_workflow():
140
140
  "description": "\n Get the current weather in a given location.\n ",
141
141
  "parameters": {
142
142
  "type": "object",
143
- "properties": {"location": {"type": "string"}, "unit": {"type": "string"}},
143
+ "properties": {
144
+ "location": {
145
+ "type": "string",
146
+ "description": "The location to get the weather for",
147
+ },
148
+ "unit": {"type": "string", "description": "The unit of temperature"},
149
+ },
144
150
  "required": ["location", "unit"],
145
151
  },
146
152
  "forced": None,
147
153
  "strict": None,
148
154
  },
149
- "src": 'import math\n\n\ndef get_current_weather(location: str, unit: str) -> str:\n """\n Get the current weather in a given location.\n """\n return f"The current weather in {location} is sunny with a temperature of {get_temperature(70.1)} degrees {unit}."\n\n\ndef get_temperature(temperature: float) -> int:\n """\n Get the temperature in a given location.\n """\n return math.floor(temperature)\n', # noqa: E501
155
+ "src": 'import math\nfrom typing import Annotated\n\n\ndef get_current_weather(\n location: Annotated[str, "The location to get the weather for"], unit: Annotated[str, "The unit of temperature"]\n) -> str:\n """\n Get the current weather in a given location.\n """\n return f"The current weather in {location} is sunny with a temperature of {get_temperature(70.1)} degrees {unit}."\n\n\ndef get_temperature(temperature: float) -> int:\n """\n Get the temperature in a given location.\n """\n return math.floor(temperature)\n', # noqa: E501
150
156
  }
151
157
  ],
152
158
  },
@@ -1,7 +0,0 @@
1
- # This file was auto-generated by Fern from our API Definition.
2
-
3
- import typing
4
-
5
- NameEnum = typing.Union[
6
- typing.Literal["workflow_executions", "prompt_executions", "workflow_runtime_seconds"], typing.Any
7
- ]