vellum-ai 0.14.15__py3-none-any.whl → 0.14.17__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 (40) hide show
  1. vellum/__init__.py +2 -0
  2. vellum/client/core/client_wrapper.py +1 -1
  3. vellum/client/resources/document_indexes/client.py +0 -55
  4. vellum/client/types/__init__.py +2 -0
  5. vellum/client/types/document_index_read.py +0 -10
  6. vellum/client/types/release.py +21 -0
  7. vellum/client/types/workflow_release_tag_read.py +7 -1
  8. vellum/plugins/pydantic.py +14 -4
  9. vellum/prompts/blocks/compilation.py +14 -0
  10. vellum/types/release.py +3 -0
  11. vellum/workflows/nodes/bases/base.py +7 -7
  12. vellum/workflows/nodes/bases/base_adornment_node.py +2 -0
  13. vellum/workflows/nodes/core/retry_node/node.py +1 -1
  14. vellum/workflows/nodes/core/try_node/node.py +1 -1
  15. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +4 -0
  16. vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py +27 -1
  17. vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py +0 -0
  18. vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py +182 -0
  19. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +4 -1
  20. vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py +7 -1
  21. vellum/workflows/utils/tests/test_vellum_variables.py +7 -1
  22. vellum/workflows/utils/vellum_variables.py +4 -0
  23. vellum/workflows/vellum_client.py +9 -5
  24. {vellum_ai-0.14.15.dist-info → vellum_ai-0.14.17.dist-info}/METADATA +1 -1
  25. {vellum_ai-0.14.15.dist-info → vellum_ai-0.14.17.dist-info}/RECORD +40 -35
  26. vellum_cli/image_push.py +76 -42
  27. vellum_cli/tests/test_image_push.py +56 -0
  28. vellum_ee/workflows/display/nodes/base_node_display.py +35 -29
  29. vellum_ee/workflows/display/nodes/get_node_display_class.py +0 -9
  30. vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py +38 -18
  31. vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py +1 -0
  32. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py +29 -33
  33. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py +91 -106
  34. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py +33 -38
  35. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py +138 -153
  36. vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py +23 -26
  37. vellum_ee/workflows/display/workflows/tests/test_workflow_display.py +51 -7
  38. {vellum_ai-0.14.15.dist-info → vellum_ai-0.14.17.dist-info}/LICENSE +0 -0
  39. {vellum_ai-0.14.15.dist-info → vellum_ai-0.14.17.dist-info}/WHEEL +0 -0
  40. {vellum_ai-0.14.15.dist-info → vellum_ai-0.14.17.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,7 @@
1
1
  import json
2
- from typing import Iterator
2
+ from typing import Any, Dict, Iterator, Type, Union
3
3
 
4
+ from vellum.workflows.constants import undefined
4
5
  from vellum.workflows.errors import WorkflowErrorCode
5
6
  from vellum.workflows.exceptions import NodeException
6
7
  from vellum.workflows.nodes.displayable.bases import BaseInlinePromptNode as BaseInlinePromptNode
@@ -30,9 +31,11 @@ class InlinePromptNode(BaseInlinePromptNode[StateType]):
30
31
  The outputs of the InlinePromptNode.
31
32
 
32
33
  text: str - The result of the Prompt Execution
34
+ json: Optional[Dict[Any, Any]] - The result of the Prompt Execution in JSON format
33
35
  """
34
36
 
35
37
  text: str
38
+ json: Union[Dict[Any, Any], Type[undefined]] = undefined
36
39
 
37
40
  def run(self) -> Iterator[BaseOutput]:
38
41
  outputs = yield from self._process_prompt_event_stream()
@@ -27,6 +27,7 @@ from vellum import (
27
27
  StringVellumValue,
28
28
  VellumAudio,
29
29
  VellumError,
30
+ VellumImage,
30
31
  )
31
32
  from vellum.prompts.blocks.compilation import compile_prompt_blocks
32
33
  from vellum.prompts.blocks.types import CompiledChatMessagePromptBlock
@@ -202,7 +203,7 @@ class OpenAIChatCompletionNode(InlinePromptNode[StateType]):
202
203
  json_content_item: ChatCompletionContentPartTextParam = {"type": "text", "text": json.dumps(json_value)}
203
204
  content.append(json_content_item)
204
205
  elif block.content.type == "IMAGE":
205
- image_value = cast(VellumAudio, block.content.value)
206
+ image_value = cast(VellumImage, block.content.value)
206
207
  image_content_item: ChatCompletionContentPartImageParam = {
207
208
  "type": "image_url",
208
209
  "image_url": {"url": image_value.src},
@@ -251,6 +252,11 @@ class OpenAIChatCompletionNode(InlinePromptNode[StateType]):
251
252
  }
252
253
 
253
254
  content.append(audio_content_item)
255
+ elif block.content.type == "DOCUMENT":
256
+ raise NodeException(
257
+ code=WorkflowErrorCode.PROVIDER_ERROR,
258
+ message="Document chat message content type is not currently supported",
259
+ )
254
260
  else:
255
261
  raise NodeException(
256
262
  code=WorkflowErrorCode.INTERNAL_ERROR,
@@ -1,7 +1,7 @@
1
1
  import pytest
2
2
  from typing import List, Optional
3
3
 
4
- from vellum import ChatMessage, SearchResult
4
+ from vellum import ChatMessage, SearchResult, VellumAudio, VellumDocument, VellumImage
5
5
  from vellum.workflows.types.core import Json
6
6
  from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
7
7
 
@@ -21,6 +21,12 @@ from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_var
21
21
  (Optional[List[SearchResult]], "SEARCH_RESULTS"),
22
22
  (Json, "JSON"),
23
23
  (Optional[Json], "JSON"),
24
+ (VellumDocument, "DOCUMENT"),
25
+ (Optional[VellumDocument], "DOCUMENT"),
26
+ (VellumAudio, "AUDIO"),
27
+ (Optional[VellumAudio], "AUDIO"),
28
+ (VellumImage, "IMAGE"),
29
+ (Optional[VellumImage], "IMAGE"),
24
30
  ],
25
31
  )
26
32
  def test_primitive_type_to_vellum_variable_type(type_, expected):
@@ -10,6 +10,8 @@ from vellum import (
10
10
  SearchResultRequest,
11
11
  VellumAudio,
12
12
  VellumAudioRequest,
13
+ VellumDocument,
14
+ VellumDocumentRequest,
13
15
  VellumError,
14
16
  VellumErrorRequest,
15
17
  VellumImage,
@@ -62,6 +64,8 @@ def primitive_type_to_vellum_variable_type(type_: Union[Type, BaseDescriptor]) -
62
64
  return "IMAGE"
63
65
  elif _is_type_optionally_in(type_, (VellumAudio, VellumAudioRequest)):
64
66
  return "AUDIO"
67
+ elif _is_type_optionally_in(type_, (VellumDocument, VellumDocumentRequest)):
68
+ return "DOCUMENT"
65
69
  elif _is_type_optionally_in(type_, (VellumError, VellumErrorRequest)):
66
70
  return "ERROR"
67
71
  elif _is_type_optionally_in(type_, (List[ChatMessage], List[ChatMessageRequest])):
@@ -10,9 +10,13 @@ def create_vellum_client(api_key: Optional[str] = None) -> Vellum:
10
10
 
11
11
  return Vellum(
12
12
  api_key=api_key,
13
- environment=VellumEnvironment(
14
- default=os.getenv("VELLUM_DEFAULT_API_URL", os.getenv("VELLUM_API_URL", "https://api.vellum.ai")),
15
- documents=os.getenv("VELLUM_DOCUMENTS_API_URL", os.getenv("VELLUM_API_URL", "https://documents.vellum.ai")),
16
- predict=os.getenv("VELLUM_PREDICT_API_URL", os.getenv("VELLUM_API_URL", "https://predict.vellum.ai")),
17
- ),
13
+ environment=create_vellum_environment(),
14
+ )
15
+
16
+
17
+ def create_vellum_environment() -> VellumEnvironment:
18
+ return VellumEnvironment(
19
+ default=os.getenv("VELLUM_DEFAULT_API_URL", os.getenv("VELLUM_API_URL", "https://api.vellum.ai")),
20
+ documents=os.getenv("VELLUM_DOCUMENTS_API_URL", os.getenv("VELLUM_API_URL", "https://documents.vellum.ai")),
21
+ predict=os.getenv("VELLUM_PREDICT_API_URL", os.getenv("VELLUM_API_URL", "https://predict.vellum.ai")),
18
22
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.15
3
+ Version: 0.14.17
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -3,7 +3,7 @@ vellum_cli/README.md,sha256=2NudRoLzWxNKqnuVy1JuQ7DerIaxWGYkrH8kMd-asIE,90
3
3
  vellum_cli/__init__.py,sha256=7aO9XFnaEVRiVshn86cFudebFUccT-gV8xIARJWqKYo,12257
4
4
  vellum_cli/aliased_group.py,sha256=ugW498j0yv4ALJ8vS9MsO7ctDW7Jlir9j6nE_uHAP8c,3363
5
5
  vellum_cli/config.py,sha256=aKnhvM5B8QdPA4cQC5Sqg7ImP-vNcVdSkZmk_OBpQTw,9309
6
- vellum_cli/image_push.py,sha256=4auU15Pb6c8DTGvT-AQ5HHXXrvIvEDs6L02d4OvJYI8,5199
6
+ vellum_cli/image_push.py,sha256=8DDvRDJEZ-FukUCqGW1827bg1ybF4xBbx9WyqWYQE-g,6816
7
7
  vellum_cli/init.py,sha256=WpnMXPItPmh0f0bBGIer3p-e5gu8DUGwSArT_FuoMEw,5093
8
8
  vellum_cli/logger.py,sha256=PuRFa0WCh4sAGFS5aqWB0QIYpS6nBWwPJrIXpWxugV4,1022
9
9
  vellum_cli/ping.py,sha256=lWyJw6sziXjyTopTYRdFF5hV-sYPVDdX0yVbG5fzcY4,585
@@ -12,6 +12,7 @@ vellum_cli/push.py,sha256=xjTNbLwOVFNU3kpBrm56Bk5QkSRrJ9z86qceghCzfIA,9655
12
12
  vellum_cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  vellum_cli/tests/conftest.py,sha256=AFYZryKA2qnUuCPBxBKmHLFoPiE0WhBFFej9tNwSHdc,1526
14
14
  vellum_cli/tests/test_config.py,sha256=uvKGDc8BoVyT9_H0Z-g8469zVxomn6Oi3Zj-vK7O_wU,2631
15
+ vellum_cli/tests/test_image_push.py,sha256=i3lJuW8nFRwL1M1OF6752IZYvGAFgKmkB2hd_rYlsmg,2028
15
16
  vellum_cli/tests/test_init.py,sha256=8UOc_ThfouR4ja5cCl_URuLk7ohr9JXfCnG4yka1OUQ,18754
16
17
  vellum_cli/tests/test_main.py,sha256=qDZG-aQauPwBwM6A2DIu1494n47v3pL28XakTbLGZ-k,272
17
18
  vellum_cli/tests/test_ping.py,sha256=QtbhYKMYn1DFnDyBij2mkQO32j9KOpZ5Pf0yek7k_Ao,1284
@@ -23,22 +24,22 @@ vellum_ee/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
23
24
  vellum_ee/workflows/display/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
25
  vellum_ee/workflows/display/base.py,sha256=ak29FIsawhaFa9_paZUHThlZRFJ1xB486JWKuSt1PYY,1965
25
26
  vellum_ee/workflows/display/nodes/__init__.py,sha256=436iSAh_Ex5tC68oEYvNgPu05ZVIAVXnS4PKGrQeZ0Y,321
26
- vellum_ee/workflows/display/nodes/base_node_display.py,sha256=pYmIdmC2dxLyRlZEBlgARIJMLcBX3GxZPpWZISv5Bbg,17170
27
+ vellum_ee/workflows/display/nodes/base_node_display.py,sha256=H7LJGtGWFkypyNhIrIhHoGYXS0hRYcP7aoYHlM90f_U,17395
27
28
  vellum_ee/workflows/display/nodes/base_node_vellum_display.py,sha256=ZLKQ8Xa3h9nGkj4t4V_7OeU7CBFWY3gXB9CkaCLOhEk,2699
28
- vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=RWCGm29-Tabi-qgVEIi_sdTWBv4bEzxAgwAoYI5T-Cc,2566
29
+ vellum_ee/workflows/display/nodes/get_node_display_class.py,sha256=LhV2wSo07iOTUj1clKwH2zzCzKdLiW2gk22R3Qco81E,2196
29
30
  vellum_ee/workflows/display/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  vellum_ee/workflows/display/nodes/tests/test_base_node_display.py,sha256=QqR3Ly0RNrXwOeLdW5nERDFt0gRPf76n1bPES6o5UN4,1093
31
32
  vellum_ee/workflows/display/nodes/types.py,sha256=St1BB6no528OyELGiyRabWao0GGw6mLhstQAvEACbGk,247
32
33
  vellum_ee/workflows/display/nodes/utils.py,sha256=sloya5TpXsnot1HURc9L51INwflRqUzHxRVnCS9Cd-4,973
33
34
  vellum_ee/workflows/display/nodes/vellum/__init__.py,sha256=nUIgH2s0-7IbQRNrBhLPyRNe8YIrx3Yo9HeeW-aXXFk,1668
34
35
  vellum_ee/workflows/display/nodes/vellum/api_node.py,sha256=hoV-cUtS6H9kmRQXHd2py95GRWI_dAnnaPwvlNBkDOQ,8571
35
- vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=t-KSaai6cXRLkNkzCvEbM5SHh03B9fqPwVTH-Gei_-0,4419
36
+ vellum_ee/workflows/display/nodes/vellum/base_adornment_node.py,sha256=oJAQrAm5iFQq0_fX94sMbS3RQEK1M1VsoUck4vsPs9A,5820
36
37
  vellum_ee/workflows/display/nodes/vellum/code_execution_node.py,sha256=z00Z3L0d4PsUQo4S8FRDTtOFLtjdi17TJbatNVF4nM8,4288
37
38
  vellum_ee/workflows/display/nodes/vellum/conditional_node.py,sha256=ybLIa4uclqVIy3VAQvI1ivg2tnK5Ug_1R5a69DFqL7E,11104
38
39
  vellum_ee/workflows/display/nodes/vellum/error_node.py,sha256=I1Jkp2htRINJATtv1e-zs9BrReFX842djpiVgBPHDYg,2186
39
40
  vellum_ee/workflows/display/nodes/vellum/final_output_node.py,sha256=p-PvlnxpBQ7IKskZi2A19jKAtKnSxJ8LPbGMA83VkFk,2805
40
41
  vellum_ee/workflows/display/nodes/vellum/guardrail_node.py,sha256=aYZSJTxknU4LMiQdWk9LcK6CkhdozeDEMiRxfAyUNEc,2202
41
- vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=aNZhjw5CwpUO8IcLJ2nhYrzn96RJ3FWeJXdfDizuPzw,8491
42
+ vellum_ee/workflows/display/nodes/vellum/inline_prompt_node.py,sha256=CPNW7HtKKJCGOvvE9DTn-56XVDLgAcBg2QHTfqU4N7k,8543
42
43
  vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=MU9I8CB1X1TgL1aa1eT6DHWwNJ-2v79t74xl0oy-fBo,5510
43
44
  vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=8CPnn06HIBxBOiECevUffeVmQmCpec6WtPQnNl9gj9Y,3748
44
45
  vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=HkNMgdQELiON42jdO-xDLmqrEKdGx1RVqrz2DXNTLS8,3239
@@ -61,11 +62,11 @@ vellum_ee/workflows/display/tests/test_vellum_workflow_display.py,sha256=VD-4USi
61
62
  vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
63
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
64
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=A1-tIpC5KIKG9JA_rkd1nLS8zUG3Kb4QiVdvb3boFxE,2509
64
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=mFmxXfnUPrwndaBurW9E-VSBUQjF3cGv3JpRuNmwWh8,15475
65
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=1cszL6N6FNGVm61MOa7AEiHnF0QjZWqDQuPOp4yiG94,18277
66
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=-12ZkZb3f5gyoNASV2yeQtMo5HmNsVEo8nXwL6IC-I8,6261
67
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=FD94h96w5wWYlLVC8_tqr2aUHPyO2UQh4f03jDX4re4,39783
68
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=EbVgg_3_ipTt3MOop4RARX0fmNjwqZtkhIXzx9nGw7Y,4487
65
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=2ZDTmpiU2CcZe4ukxoQ79SJx8V8kDRQHgUxP5Vtesus,15605
66
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=lScpUiz8fvUmJK18Cpygs9xQrfHQlkSIlmxapGYTS0g,18770
67
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=KgxSN8L5AWPL8EpQfSZiTqK428nAIElcWrV-sR17528,6456
68
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=yS8GpjbH0objjcNYK73j8rDHbhqinIbG7CcoNjnolBg,40611
69
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=_-ADur28OkVy4YEgMHkkVYqMbS1j3GcOtX9MTYmmvf0,4632
69
70
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_api_node_serialization.py,sha256=IRazH2QR6F8RGqNemEnHueyj5DtEa6rFTYhT16S4jI8,15917
70
71
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_code_execution_node_serialization.py,sha256=V__y7uu-dy6TJjPeu4UDvaoO2yYwBRbPiW9uJdzWRx4,29828
71
72
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py,sha256=R8DW1DUb0DOSLtnF2E1HaCTmtpG-ski0LfcM2WeLVNo,47672
@@ -92,7 +93,7 @@ vellum_ee/workflows/display/vellum.py,sha256=7mqQaKZPPrLMcXSAQkPIxCy5x8HkKs5PbCu
92
93
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
93
94
  vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=QKMSmV--UoE8L7pYmKvZqtaatygrxmSm9PDSH71Yr0Y,19937
94
95
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=kp0u8LN_2IwshLrhMImhpZx1hRyAcD5gXY-kDuuaGMQ,1269
95
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=TzLziIh1fJ429LRUYoe88yd_HZflEQAw60TW8PAvvnk,6917
96
+ vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=eCBCssh2J0hhGAKiv5pVxYKxMEUQCtFX-FKn49xercA,8576
96
97
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=mbAzCpswOek34ITeTkesbVreCXpulj4NFjIg3RcdVZ8,18243
97
98
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
99
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=X_DdNK7MfyOjKWekk6YQpOSCT6klKcdjT6nVJcBH1sM,1481
@@ -118,12 +119,12 @@ vellum_ee/workflows/tests/local_workflow/workflow.py,sha256=A4qOzOPNwePYxWbcAgIP
118
119
  vellum_ee/workflows/tests/test_display_meta.py,sha256=xLQ7QtIXIiIm61pm2lyl588Ohzc3pjyq1nDp-qVu2Fs,2295
119
120
  vellum_ee/workflows/tests/test_server.py,sha256=M6vvQ2hjIpDWtQdDM9EPbMvUrZ93niAuYnxMNJWOjPA,511
120
121
  vellum_ee/workflows/tests/test_virtual_files.py,sha256=TJEcMR0v2S8CkloXNmCHA0QW0K6pYNGaIjraJz7sFvY,2762
121
- vellum/__init__.py,sha256=a_aM1_A04XGma4MAIDNeBF9BKzWbiQaVVMRzImHuxjA,36438
122
+ vellum/__init__.py,sha256=Vh9jxpBVXB2fTCyoUMlLdGL1Ujf0zNNNvqhNu5II8KI,36466
122
123
  vellum/client/README.md,sha256=JkCJjmMZl4jrPj46pkmL9dpK4gSzQQmP5I7z4aME4LY,4749
123
124
  vellum/client/__init__.py,sha256=tKtdM1_GqmGq1gpi9ydWD_T-MM7fPn8QdHh8ww19cNI,117564
124
125
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
125
126
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
126
- vellum/client/core/client_wrapper.py,sha256=x6cZlx3EA5bHNlGRnX0klOVCrqkvqWv_oUW4xjYEehU,1869
127
+ vellum/client/core/client_wrapper.py,sha256=lp2PrDTuF-fVxozBobWF7i3EJRnKs7ggqOiSWj5wuL4,1869
127
128
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
128
129
  vellum/client/core/file.py,sha256=X9IbmkZmB2bB_DpmZAO3crWdXagOakAyn6UCOCImCPg,2322
129
130
  vellum/client/core/http_client.py,sha256=R0pQpCppnEtxccGvXl4uJ76s7ro_65Fo_erlNNLp_AI,19228
@@ -150,7 +151,7 @@ vellum/client/resources/deployments/types/__init__.py,sha256=29GVdoLOJsADSSSqZwb
150
151
  vellum/client/resources/deployments/types/deployments_list_request_status.py,sha256=CxlQD16KZXme7x31YYCe_3aAgEueutDTeJo5A4Au-aU,174
151
152
  vellum/client/resources/deployments/types/list_deployment_release_tags_request_source.py,sha256=hRGgWMYZL9uKCmD_2dU8-u9RCPUUGItpNn1tUY-NXKY,180
152
153
  vellum/client/resources/document_indexes/__init__.py,sha256=YpOl_9IV7xOlH4OmusQxtAJB11kxQfCSMDyT1_UD0oM,165
153
- vellum/client/resources/document_indexes/client.py,sha256=XDrceFkbX1MtrR4hoFR4b-UIC2PFS1AAlKPCWR6OcZQ,37520
154
+ vellum/client/resources/document_indexes/client.py,sha256=UcznU0NyvdNBpV4UCsTqG3Ejj6w4dK4UBmgrTWzZFtw,35438
154
155
  vellum/client/resources/document_indexes/types/__init__.py,sha256=IoFqKHN_VBdEhC7VL8_6Jbatrn0e0zuYEJAJUahcUR0,196
155
156
  vellum/client/resources/document_indexes/types/document_indexes_list_request_status.py,sha256=sfUEB0cvOSmlE2iITqnMVyHv05Zy2fWP4QjCIYqMg0M,178
156
157
  vellum/client/resources/documents/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
@@ -188,7 +189,7 @@ vellum/client/resources/workspace_secrets/__init__.py,sha256=FTtvy8EDg9nNNg9WCat
188
189
  vellum/client/resources/workspace_secrets/client.py,sha256=h7UzXLyTttPq1t-JZGMg1BWxypxJvBGUdqg7KGT7MK4,8027
189
190
  vellum/client/resources/workspaces/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
190
191
  vellum/client/resources/workspaces/client.py,sha256=RthwzN1o-Jxwg5yyNNodavFyNUSxfLoTv26w3mRR5g8,3595
191
- vellum/client/types/__init__.py,sha256=_1pPNxQxjYSBB4L-j9HM1CHRaOEQNZa6XekVrKrseqg,54850
192
+ vellum/client/types/__init__.py,sha256=D6j2QfxOV3WULH0inmz9q-gdOQcytrr6_R8WYaC5ZZk,54894
192
193
  vellum/client/types/ad_hoc_execute_prompt_event.py,sha256=bCjujA2XsOgyF3bRZbcEqV2rOIymRgsLoIRtZpB14xg,607
193
194
  vellum/client/types/ad_hoc_expand_meta.py,sha256=1gv-NCsy_6xBYupLvZH979yf2VMdxAU-l0y0ynMKZaw,1331
194
195
  vellum/client/types/ad_hoc_fulfilled_prompt_execution_meta.py,sha256=Bfvf1d_dkmshxRACVM5vcxbH_7AQY23RmrrnPc0ytYY,939
@@ -266,7 +267,7 @@ vellum/client/types/document_index_chunking.py,sha256=TU0Y7z0Xacm3dhzEDuDIG3ZKJC
266
267
  vellum/client/types/document_index_chunking_request.py,sha256=g9BKCsHKg5kzjG7YYeMNQ_5R8TXLeSgumJlMXoSfBcs,435
267
268
  vellum/client/types/document_index_indexing_config.py,sha256=xL1pCzUOkw5sSie1OrBpasE3bVnv0UyZBn7uZztbhbs,781
268
269
  vellum/client/types/document_index_indexing_config_request.py,sha256=Wt-ys1o_acHNyLU0c1laG2PVT7rgCfwO54f5nudAxk4,832
269
- vellum/client/types/document_index_read.py,sha256=cXL115A4h-TFiGc29tAkXb1pkuK0RzIquyOu1Pv7Jug,1469
270
+ vellum/client/types/document_index_read.py,sha256=ePngiRszr65HLl9D0_FUdhAdMe84nRwyM3cKbr8rFpg,1177
270
271
  vellum/client/types/document_processing_state.py,sha256=ISlurj7jQzwHzxPzDZTqeAIgSIIGMBBPgcOSoe04pTU,211
271
272
  vellum/client/types/document_prompt_block.py,sha256=sgFxN48PILFuuF2KUIwks6PbJ3XH6sCE_8ydLEE_doU,1019
272
273
  vellum/client/types/document_read.py,sha256=6nwEvVvVe-6y2vtPNYB7KtcFoaydH2ow-WhCmCAvMQ8,1713
@@ -481,6 +482,7 @@ vellum/client/types/rejected_execute_prompt_response.py,sha256=YyY9KGTbJ53DmwiXH
481
482
  vellum/client/types/rejected_execute_workflow_workflow_result_event.py,sha256=6k6GRr2TnVSM0DxS3H3hczwV7962UDG92yLh6j8OjcM,882
482
483
  vellum/client/types/rejected_prompt_execution_meta.py,sha256=4Oidh3XBBHzgjOys2kuETxqWc_MOqS50UpB0o8YNZd8,844
483
484
  vellum/client/types/rejected_workflow_node_result_event.py,sha256=o9AUc9hT60F8ckMkCx8HtKxtj4y82LBoJduB9u8w0TM,1319
485
+ vellum/client/types/release.py,sha256=lfB3zKIS8UIc19Lb7zAOEAHCvuN7wW23aXEkZMio5-Q,597
484
486
  vellum/client/types/release_tag_source.py,sha256=YavosOXZ976yfXTNWRTZwh2HhRiYmSDk0bQCkl-jCoQ,158
485
487
  vellum/client/types/replace_test_suite_test_case_request.py,sha256=c1GT1RUCei1yWxyZy4Gv40PkXYisvK5OkzlqQ6WeBYA,1906
486
488
  vellum/client/types/rich_text_child_block.py,sha256=X_ACKFKSUx5SXT1cLp0Y5-7VrNxcGOggPm67Lk2442U,270
@@ -671,7 +673,7 @@ vellum/client/types/workflow_output_string.py,sha256=_jclzbQ-Wlf-7FEVTWXhs9h5FWf
671
673
  vellum/client/types/workflow_push_deployment_config_request.py,sha256=pG6bZtlw7S0TcXtNRQNa7y_2NodZe7dp5SchIrgRUVU,745
672
674
  vellum/client/types/workflow_push_exec_config.py,sha256=6TaVMVqhSOz4DnY46l8axPDtytSioXDl9nHvFXSxH1g,94
673
675
  vellum/client/types/workflow_push_response.py,sha256=1vUSZmZ1GK1242dAkNwJnJI0rL3pBT3_0HOLLjdiutw,724
674
- vellum/client/types/workflow_release_tag_read.py,sha256=hevIvlmqfWnZWBLXAcXC7jxXQfnG4YUaV13DIvBycPQ,1155
676
+ vellum/client/types/workflow_release_tag_read.py,sha256=M-zNVQw7h0t9uzNSkp7Xl3SESERacqALu3mGemNpKRg,1263
675
677
  vellum/client/types/workflow_release_tag_workflow_deployment_history_item.py,sha256=pjWobdk9mZD3Px86rwFHfs_PYJBGXDKQUkxsgNEe6EA,825
676
678
  vellum/client/types/workflow_request_chat_history_input_request.py,sha256=WCZvwDuNS8ylWOOoKD3t7fHLSYB0h-fVCqeDRzqPoPA,898
677
679
  vellum/client/types/workflow_request_input_request.py,sha256=wgbKgKy-ftTzc6VMsgPkIiHaAujSiJjLizp2GfksX-A,632
@@ -719,12 +721,12 @@ vellum/evaluations/utils/env.py,sha256=Xj_nxsoU5ox06EOTjRopR4lrigQI6Le6qbWGltYoE
719
721
  vellum/evaluations/utils/exceptions.py,sha256=dXMAkzqbHV_AP5FjjbegPlfUE0zQDlpA3qOsoOJUxfg,49
720
722
  vellum/evaluations/utils/paginator.py,sha256=rEED_BJAXAM6tM1yMwHePNzszjq_tTq4NbQvi1jWQ_Q,697
721
723
  vellum/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
722
- vellum/plugins/pydantic.py,sha256=BMUwC4OkxtNf6hpLwb0T4MBUKgkGy55T_5Ww7GHpHYo,3068
724
+ vellum/plugins/pydantic.py,sha256=XpQQs_o8DQY_5gFFDzJzaXahUqR_l5TEI4b5ZoH9ob8,3528
723
725
  vellum/plugins/utils.py,sha256=cPmxE9R2CK1bki2jKE8rB-G9zMf2pzHjSPDHFPXwd3Q,878
724
726
  vellum/plugins/vellum_mypy.py,sha256=QTuMSq6PiZW1dyTUZ5Bf1d4XkgFj0TKAgZLP8f4UgL4,27914
725
727
  vellum/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
726
728
  vellum/prompts/blocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
727
- vellum/prompts/blocks/compilation.py,sha256=lpGVuquFaHnGglON7-S8fIHgUIZyo6TdXOmBtG_Si-0,9497
729
+ vellum/prompts/blocks/compilation.py,sha256=qeC_4La5auQkm4EyzCMpN34F5R8mjiGcLV7IxKgVf3k,9973
728
730
  vellum/prompts/blocks/exceptions.py,sha256=vmk5PV6Vyw9nKjZYQDUDW0LH8MfQNIgFvFb_mFWdIRI,50
729
731
  vellum/prompts/blocks/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
730
732
  vellum/prompts/blocks/tests/test_compilation.py,sha256=EOUtdzJDFGbGhoc_y5XTMyO0HOpOM7FYJssPzd_yRVg,5235
@@ -1072,6 +1074,7 @@ vellum/types/rejected_execute_prompt_response.py,sha256=hznSDSGod3eOrTS6Z-8EUDnG
1072
1074
  vellum/types/rejected_execute_workflow_workflow_result_event.py,sha256=zyaUrnK5FRxkK8iQ71Il8exrNjC6W6lWsleJk6SSBxM,185
1073
1075
  vellum/types/rejected_prompt_execution_meta.py,sha256=ev1iT8IFkHn7YGg04DHdOGinBHQfIaKa0sEa2yuOjTw,168
1074
1076
  vellum/types/rejected_workflow_node_result_event.py,sha256=RbaaRh7xZUueiyOzfPZqwfYiRdRgeudbvk8jhqmBrew,173
1077
+ vellum/types/release.py,sha256=HNZgTcYeUxHyI25_6YncMzEvlswJ1zVESJ82bKO04Ak,145
1075
1078
  vellum/types/release_tag_source.py,sha256=71AVUOydv6hauj65Wj5l2qBa35jTLTheLpMIsgz3noI,156
1076
1079
  vellum/types/replace_test_suite_test_case_request.py,sha256=qMI4-4s_EXTOo29mZR14opoOTPp5_zIylPJU5ZPCvAc,174
1077
1080
  vellum/types/rich_text_child_block.py,sha256=W8xJl-2DOKrpht1-Dx9EcVa4XDO5t7CS1B5Zt_bS9ow,159
@@ -1362,8 +1365,8 @@ vellum/workflows/inputs/tests/test_inputs.py,sha256=g--YqWTNWzMk5Ktoj__gq988kvBR
1362
1365
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1363
1366
  vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
1364
1367
  vellum/workflows/nodes/bases/__init__.py,sha256=cniHuz_RXdJ4TQgD8CBzoiKDiPxg62ErdVpCbWICX64,58
1365
- vellum/workflows/nodes/bases/base.py,sha256=Y5xv0tFSSDafKDhVsxC5xTNrH15sj93jok6POzgWO0E,15351
1366
- vellum/workflows/nodes/bases/base_adornment_node.py,sha256=eFTgsPCYb3eyGS0-kw7C6crFnwFx437R5wh9-8bWYts,2905
1368
+ vellum/workflows/nodes/bases/base.py,sha256=eW-3RSkBgtuGY8x2nmbHYiUg_HXS5U57n3k6Fh-dJ9s,15330
1369
+ vellum/workflows/nodes/bases/base_adornment_node.py,sha256=afMwJLHK2Ke7sBpceVLnNdZMlU2O-6UgyG7lBt9SAQ8,3039
1367
1370
  vellum/workflows/nodes/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1368
1371
  vellum/workflows/nodes/bases/tests/test_base_node.py,sha256=4SOdZzvugVtN8CIuo5RrapAxSYGXnxUwQ77dXJ64oTU,6295
1369
1372
  vellum/workflows/nodes/core/__init__.py,sha256=5zDMCmyt1v0HTJzlUBwq3U9L825yZGZhT9JL18-mRR4,455
@@ -1378,14 +1381,14 @@ vellum/workflows/nodes/core/map_node/node.py,sha256=dY27Xm11LHsqD7hnZnVYYDIazZ-X
1378
1381
  vellum/workflows/nodes/core/map_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1379
1382
  vellum/workflows/nodes/core/map_node/tests/test_node.py,sha256=uMR0AyIFn539LqTKHdwuBswnx1i-PHyqPpgtYrnmYMY,3496
1380
1383
  vellum/workflows/nodes/core/retry_node/__init__.py,sha256=lN2bIy5a3Uzhs_FYCrooADyYU6ZGShtvLKFWpelwPvo,60
1381
- vellum/workflows/nodes/core/retry_node/node.py,sha256=Vt3fx4G-DRIb9a-IHIUfaAclgfbzOPEQVkcumwhl9HE,4355
1384
+ vellum/workflows/nodes/core/retry_node/node.py,sha256=eRfDj54idq4JXkzgFyHNh18qnEMI6vLOtNgn7MsFg1o,4359
1382
1385
  vellum/workflows/nodes/core/retry_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1383
1386
  vellum/workflows/nodes/core/retry_node/tests/test_node.py,sha256=fNgDufkIsrTC-6ftvogqSpWhqqBj9iNESdfK19B1Yx0,5159
1384
1387
  vellum/workflows/nodes/core/templating_node/__init__.py,sha256=GmyuYo81_A1_Bz6id69ozVFS6FKiuDsZTiA3I6MaL2U,70
1385
1388
  vellum/workflows/nodes/core/templating_node/node.py,sha256=-JIqLUv6Xpx_LTVZt7whQ2X2VatgHDdTxjMrz64luEs,3721
1386
1389
  vellum/workflows/nodes/core/templating_node/tests/test_templating_node.py,sha256=MHofz-BwAgt7EXkab8VIyacYznDEIJ7Er7MJUaxNQQo,9614
1387
1390
  vellum/workflows/nodes/core/try_node/__init__.py,sha256=JVD4DrldTIqFQQFrubs9KtWCCc0YCAc7Fzol5ZWIWeM,56
1388
- vellum/workflows/nodes/core/try_node/node.py,sha256=5ux1l2HO12FBFFyhz6j-4yfBYVrqgT2maTAne_GnNDk,4434
1391
+ vellum/workflows/nodes/core/try_node/node.py,sha256=RbxL0NRXS0IxRP0MJAnLABolF6dkwVniiqsagzy-lwk,4445
1389
1392
  vellum/workflows/nodes/core/try_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1390
1393
  vellum/workflows/nodes/core/try_node/tests/test_node.py,sha256=h6eUc3SggvhzBWlOD0PrPUlkoCSQHwjqYn81VkxSIxU,4948
1391
1394
  vellum/workflows/nodes/displayable/__init__.py,sha256=6F_4DlSwvHuilWnIalp8iDjjDXl0Nmz4QzJV2PYe5RI,1023
@@ -1397,10 +1400,12 @@ vellum/workflows/nodes/displayable/bases/__init__.py,sha256=0mWIx3qUrzllV7jqt7wN
1397
1400
  vellum/workflows/nodes/displayable/bases/api_node/__init__.py,sha256=1jwx4WC358CLA1jgzl_UD-rZmdMm2v9Mps39ndwCD7U,64
1398
1401
  vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=Ev_So7D_4Qfvl2_E8veVfxAxWfbJIA2ujyW5istLg5I,4066
1399
1402
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1400
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=nvhoWb8EyRlgtyotYp-wh194n30yQP81UnOH_a8FghY,3140
1403
+ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=HGNoGLJ9lbqflGdYFDIiuHFyi0iJ-agJu4kkJ7D3dGs,3212
1401
1404
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1402
1405
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/constants.py,sha256=fnjiRWLoRlC4Puo5oQcpZD5Hd-EesxsAo9l5tGAkpZQ,270
1403
- vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=FBE3_1F3WwgEKK28afD73cw2Zbm3BOk7SMpXuxDmYPw,7117
1406
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=fTQ7KS5u7xCO_nJsWT5_LWgwGnYZg4U06slvXxHAzTU,8449
1407
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1408
+ vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/test_inline_prompt_node.py,sha256=kodL6T6booHtdTLMJ9wSk_JHFgPNkTz3U8AJDB2cxtU,6696
1404
1409
  vellum/workflows/nodes/displayable/bases/prompt_deployment_node.py,sha256=UIyNUUr8ii6rIx1gQL5vIPqTAww4ExxxJkFMoglc8LE,5794
1405
1410
  vellum/workflows/nodes/displayable/bases/search_node.py,sha256=3UtbqY3QO4kzfJHbmUNZGnEEfJmaoiF892u8H6TGjp8,5381
1406
1411
  vellum/workflows/nodes/displayable/bases/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1423,7 +1428,7 @@ vellum/workflows/nodes/displayable/final_output_node/tests/test_node.py,sha256=E
1423
1428
  vellum/workflows/nodes/displayable/guardrail_node/__init__.py,sha256=Ab5eXmOoBhyV4dMWdzh32HLUmnPIBEK_zFCT38C4Fng,68
1424
1429
  vellum/workflows/nodes/displayable/guardrail_node/node.py,sha256=h5nIBzQxbXTrdTq1wjDcekk1RV4-rKUNCshqdBAiJJY,4025
1425
1430
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1426
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=UWOxIa3kizhDa5joAmEDlh0P66EaqatqxzLLbvbUybw,2294
1431
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=BaBfIfQX10sfoJ03H6zAnheae8bcJgi6Ff3SkYvmCKo,2523
1427
1432
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1428
1433
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=Qg1oGXecGH2Hp9oBAY42bTfKHBvNHHoJ6vUPPEj8Lq0,8539
1429
1434
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
@@ -1449,7 +1454,7 @@ vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha
1449
1454
  vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
1450
1455
  vellum/workflows/nodes/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1451
1456
  vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
1452
- vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=1EGeiaT-Zoo6pttQFKKBcdf3dmhAbjKGaErYD5FFwlc,10185
1457
+ vellum/workflows/nodes/experimental/openai_chat_completion_node/node.py,sha256=cKI2Ls25L-JVt4z4a2ozQa-YBeVy21Z7BQ32Sj7iBPE,10460
1453
1458
  vellum/workflows/nodes/mocks.py,sha256=a1FjWEIocseMfjzM-i8DNozpUsaW0IONRpZmXBoWlyc,10455
1454
1459
  vellum/workflows/nodes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1455
1460
  vellum/workflows/nodes/tests/test_mocks.py,sha256=mfPvrs75PKcsNsbJLQAN6PDFoVqs9TmQxpdyFKDdO60,7837
@@ -1502,18 +1507,18 @@ vellum/workflows/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
1502
1507
  vellum/workflows/utils/tests/test_functions.py,sha256=ytdruS55aO2egsb5sAv8_9jf68L1cJoZu2uKV2iamrg,8083
1503
1508
  vellum/workflows/utils/tests/test_names.py,sha256=aOqpyvMsOEK_9mg_-yaNxQDW7QQfwqsYs37PseyLhxw,402
1504
1509
  vellum/workflows/utils/tests/test_uuids.py,sha256=i77ABQ0M3S-aFLzDXHJq_yr5FPkJEWCMBn1HJ3DObrE,437
1505
- vellum/workflows/utils/tests/test_vellum_variables.py,sha256=6H-BpmbIEmVRO75QQ3Rfy4bEUMMP2qwGzx2Gp1uXbfw,879
1510
+ vellum/workflows/utils/tests/test_vellum_variables.py,sha256=maI5e7Od7UlpMwlrOrcdlXqnFhonkXGnWq8G2-YQLi8,1155
1506
1511
  vellum/workflows/utils/uuids.py,sha256=DFzPv9RCvsKhvdTEIQyfSek2A31D6S_QcmeLPbgrgTY,739
1507
- vellum/workflows/utils/vellum_variables.py,sha256=fC2aSLvlS31D15dOWu43LBRR0QsgUKNXBiCUvvaLXSs,3231
1508
- vellum/workflows/vellum_client.py,sha256=ODrq_TSl-drX2aezXegf7pizpWDVJuTXH-j6528t75s,683
1512
+ vellum/workflows/utils/vellum_variables.py,sha256=UiGlUh0a8vel2FbW3w-xbHxSv_jNutkDdqMVtP_b42A,3385
1513
+ vellum/workflows/vellum_client.py,sha256=GxOy3dX6A04xiY69vPv1S4YGuQ_TMxwHi6WRMimQBBE,762
1509
1514
  vellum/workflows/workflows/__init__.py,sha256=KY45TqvavCCvXIkyCFMEc0dc6jTMOUci93U2DUrlZYc,66
1510
1515
  vellum/workflows/workflows/base.py,sha256=TSS2BHC8LAi-N5GdEa75BeChwzwTzL7yldFnTlLINro,22665
1511
1516
  vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnadGsrSZGa7t7LpJA,2008
1512
1517
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1513
1518
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=NRteiICyJvDM5zrtUfq2fZoXcGQVaWC9xmNlLLVW0cU,7979
1514
1519
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1515
- vellum_ai-0.14.15.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1516
- vellum_ai-0.14.15.dist-info/METADATA,sha256=8TM16vJdsQpUXVDgasscuRmbLESHxIgmMj8QlKoLUQU,5408
1517
- vellum_ai-0.14.15.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1518
- vellum_ai-0.14.15.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1519
- vellum_ai-0.14.15.dist-info/RECORD,,
1520
+ vellum_ai-0.14.17.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1521
+ vellum_ai-0.14.17.dist-info/METADATA,sha256=DPUjnu7ydH6sKPprPiI_A0qW2RVB6JwGh5LV0DUZwk4,5408
1522
+ vellum_ai-0.14.17.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1523
+ vellum_ai-0.14.17.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1524
+ vellum_ai-0.14.17.dist-info/RECORD,,
vellum_cli/image_push.py CHANGED
@@ -8,7 +8,7 @@ import docker
8
8
  from docker import DockerClient
9
9
  from dotenv import load_dotenv
10
10
 
11
- from vellum.workflows.vellum_client import create_vellum_client
11
+ from vellum.workflows.vellum_client import create_vellum_client, create_vellum_environment
12
12
  from vellum_cli.logger import load_cli_logger
13
13
 
14
14
  _SUPPORTED_ARCHITECTURE = "amd64"
@@ -19,6 +19,21 @@ def image_push_command(image: str, tags: Optional[List[str]] = None) -> None:
19
19
  logger = load_cli_logger()
20
20
  vellum_client = create_vellum_client()
21
21
 
22
+ # Check if we are self hosted by looking at our base url
23
+ api_url = create_vellum_environment().default
24
+ is_self_hosted = not api_url.endswith("vellum.ai") and "localhost:" not in api_url and "127.0.0.1" not in api_url
25
+ if is_self_hosted:
26
+ logger.info("Self hosted install detected...")
27
+
28
+ if is_self_hosted and "/" not in image:
29
+ logger.error(
30
+ "For adding images to your self hosted install you must include the "
31
+ "repository address in the provided image name. You must also have "
32
+ "already pushed the image to the docker repository that your self "
33
+ "hosted install is using."
34
+ )
35
+ exit(1)
36
+
22
37
  # We're using docker python SDK here instead of subprocess since it connects to the docker host directly
23
38
  # instead of using the command line so it seemed like it would possibly be a little more robust since
24
39
  # it might avoid peoples' wonky paths, unfortunately it doesn't support the manifest command which we need for
@@ -29,59 +44,78 @@ def image_push_command(image: str, tags: Optional[List[str]] = None) -> None:
29
44
  docker_client = docker.from_env()
30
45
  check_architecture(docker_client, image, logger)
31
46
 
32
- logger.info("Authenticating...")
33
- auth = vellum_client.container_images.docker_service_token()
34
-
35
- docker_client.login(
36
- username="oauth2accesstoken",
37
- password=auth.access_token,
38
- registry=auth.repository,
39
- )
40
-
41
47
  repo_split = image.split("/")
42
48
  tag_split = repo_split[-1].split(":")
43
49
  image_name = tag_split[0]
44
50
  main_tag = tag_split[1] if len(tag_split) > 1 else "latest"
45
-
46
51
  all_tags = [main_tag, *(tags or [])]
47
- for tag in all_tags:
48
- vellum_image_name = f"{auth.repository}/{image_name}:{tag}"
49
-
50
- docker_client.api.tag(image, vellum_image_name)
51
-
52
- push_result = docker_client.images.push(repository=vellum_image_name, stream=True)
53
-
54
- # Here were trying to mime the output you would get from a normal docker push, which
55
- # the python sdk makes as hard as possible.
56
- for raw_line in push_result:
57
- try:
58
- for sub_line in raw_line.decode("utf-8").split("\r\n"):
59
- line = json.loads(sub_line)
60
- error_message = line.get("errorDetail", {}).get("message")
61
- status = line.get("status")
62
- id = line.get("id", "")
63
-
64
- if error_message:
65
- logger.error(error_message)
66
- exit(1)
67
- elif status == "Waiting":
68
- continue
69
- elif status:
70
- logger.info(f"{id}{': ' if id else ''}{status}")
71
- else:
72
- logger.info(line)
73
- except Exception:
74
- continue
75
52
 
76
- result = subprocess.run(
53
+ if is_self_hosted:
54
+ # Include the repo for self hosted since we skip pushing it to our internal repo and expect
55
+ # the user the push it themselves and provide us with the repo name.
56
+ image_name = image.split(":")[0]
57
+
58
+ logger.info("Checking if image already exists in repository...")
59
+ exists_result = subprocess.run(
60
+ ["docker", "manifest", "inspect", image],
61
+ stdout=subprocess.PIPE,
62
+ stderr=subprocess.PIPE,
63
+ )
64
+
65
+ if exists_result.returncode != 0:
66
+ logger.error(
67
+ "Image does not exist in repository. Push the image to the "
68
+ "repository your self hosted install is using and try again."
69
+ )
70
+ exit(1)
71
+ else:
72
+ logger.info("Authenticating...")
73
+ auth = vellum_client.container_images.docker_service_token()
74
+
75
+ docker_client.login(
76
+ username="oauth2accesstoken",
77
+ password=auth.access_token,
78
+ registry=auth.repository,
79
+ )
80
+
81
+ for tag in all_tags:
82
+ vellum_image_name = f"{auth.repository}/{image_name}:{tag}"
83
+
84
+ docker_client.api.tag(image, vellum_image_name)
85
+
86
+ push_result = docker_client.images.push(repository=vellum_image_name, stream=True)
87
+
88
+ # Here were trying to mime the output you would get from a normal docker push, which
89
+ # the python sdk makes as hard as possible.
90
+ for raw_line in push_result:
91
+ try:
92
+ for sub_line in raw_line.decode("utf-8").split("\r\n"):
93
+ line = json.loads(sub_line)
94
+ error_message = line.get("errorDetail", {}).get("message")
95
+ status = line.get("status")
96
+ id = line.get("id", "")
97
+
98
+ if error_message:
99
+ logger.error(error_message)
100
+ exit(1)
101
+ elif status == "Waiting":
102
+ continue
103
+ elif status:
104
+ logger.info(f"{id}{': ' if id else ''}{status}")
105
+ else:
106
+ logger.info(line)
107
+ except Exception:
108
+ continue
109
+
110
+ inspect_result = subprocess.run(
77
111
  ["docker", "inspect", "--format='{{index .RepoDigests 0}}'", image],
78
112
  stdout=subprocess.PIPE,
79
113
  stderr=subprocess.PIPE,
80
114
  )
81
115
 
82
116
  sha = ""
83
- if result.returncode == 0:
84
- match = re.search(r"sha256[^']*", result.stdout.decode("utf-8"))
117
+ if inspect_result.returncode == 0:
118
+ match = re.search(r"sha256[^']*", inspect_result.stdout.decode("utf-8"))
85
119
  if match and match.group(0):
86
120
  sha = match.group(0)
87
121
 
@@ -0,0 +1,56 @@
1
+ import subprocess
2
+ from unittest.mock import MagicMock, patch
3
+
4
+ from click.testing import CliRunner
5
+
6
+ from vellum_cli import main as cli_main
7
+
8
+
9
+ @patch("subprocess.run")
10
+ @patch("docker.from_env")
11
+ def test_image_push__self_hosted_happy_path(mock_docker_from_env, mock_run, vellum_client, monkeypatch):
12
+ # GIVEN a self hosted vellum api URL env var
13
+ monkeypatch.setenv("VELLUM_API_URL", "mycompany.api.com")
14
+
15
+ # Mock Docker client
16
+ mock_docker_client = MagicMock()
17
+ mock_docker_from_env.return_value = mock_docker_client
18
+
19
+ mock_run.side_effect = [
20
+ subprocess.CompletedProcess(
21
+ args="", returncode=0, stdout=b'{"manifests": [{"platform": {"architecture": "amd64"}}]}'
22
+ ),
23
+ subprocess.CompletedProcess(args="", returncode=0, stdout=b"manifest"),
24
+ subprocess.CompletedProcess(args="", returncode=0, stdout=b"sha256:hellosha"),
25
+ ]
26
+
27
+ # WHEN the user runs the image push command
28
+ runner = CliRunner()
29
+ result = runner.invoke(cli_main, ["image", "push", "myrepo.net/myimage:latest"])
30
+
31
+ # THEN the command exits successfully
32
+ assert result.exit_code == 0, result.output
33
+
34
+ # AND gives the success message
35
+ assert "Image successfully pushed" in result.output
36
+
37
+
38
+ @patch("subprocess.run")
39
+ @patch("docker.from_env")
40
+ def test_image_push__self_hosted_blocks_repo(mock_docker_from_env, mock_run, vellum_client, monkeypatch):
41
+ # GIVEN a self hosted vellum api URL env var
42
+ monkeypatch.setenv("VELLUM_API_URL", "mycompany.api.com")
43
+
44
+ # Mock Docker client
45
+ mock_docker_client = MagicMock()
46
+ mock_docker_from_env.return_value = mock_docker_client
47
+
48
+ # WHEN the user runs the image push command
49
+ runner = CliRunner()
50
+ result = runner.invoke(cli_main, ["image", "push", "myimage"])
51
+
52
+ # THEN the command exits unsuccessfully
53
+ assert result.exit_code == 1, result.output
54
+
55
+ # AND gives the error message for self hosted installs not including the repo
56
+ assert "For adding images to your self hosted install you must include" in result.output