vellum-ai 0.14.60__py3-none-any.whl → 0.14.62__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.
@@ -18,7 +18,7 @@ class BaseClientWrapper:
18
18
  headers: typing.Dict[str, str] = {
19
19
  "X-Fern-Language": "Python",
20
20
  "X-Fern-SDK-Name": "vellum-ai",
21
- "X-Fern-SDK-Version": "0.14.60",
21
+ "X-Fern-SDK-Version": "0.14.62",
22
22
  }
23
23
  headers["X-API-KEY"] = self.api_key
24
24
  return headers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 0.14.60
3
+ Version: 0.14.62
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -45,7 +45,7 @@ vellum_ee/workflows/display/nodes/vellum/inline_subworkflow_node.py,sha256=fQV5o
45
45
  vellum_ee/workflows/display/nodes/vellum/map_node.py,sha256=CiklGf5_tDbqE1XQm2mnbtoL01_2JYjcnB4FDTpMImQ,3824
46
46
  vellum_ee/workflows/display/nodes/vellum/merge_node.py,sha256=yBWeN4T_lOsDVnNOKWRiT7JYKu0IR5Fx2z99iq6QKSA,3273
47
47
  vellum_ee/workflows/display/nodes/vellum/note_node.py,sha256=3E0UqmgVYdtbj4nyq8gKju8EpMsRHMCQ0KLrJhug3XU,1084
48
- vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=dVb3ONkuovK8xE5MdDLVSBCoZoKPrCnhdcWLYcl14mw,3307
48
+ vellum_ee/workflows/display/nodes/vellum/prompt_deployment_node.py,sha256=1NxFddxWCFtMe_je1cutP7qnoASoG94LJqKhRkoQwvw,3535
49
49
  vellum_ee/workflows/display/nodes/vellum/retry_node.py,sha256=X3xnlAU5JisL0jRvaG_V9RvTF7ZlGufTO8tXLLVhGIg,3280
50
50
  vellum_ee/workflows/display/nodes/vellum/search_node.py,sha256=3n1qa-zWIk0p_H94u0hjfDtGkanldC6EXVhg0xgLmE4,9544
51
51
  vellum_ee/workflows/display/nodes/vellum/subworkflow_deployment_node.py,sha256=MWLZBXHsmj5vKgqOgI2HHcHAJzLS0sqybn6idhwug8Y,2669
@@ -55,11 +55,11 @@ vellum_ee/workflows/display/nodes/vellum/tests/test_code_execution_node.py,sha25
55
55
  vellum_ee/workflows/display/nodes/vellum/tests/test_error_node.py,sha256=540FoWMpJ3EN_DPjHsr9ODJWCRVcUa5hZBn-5T2GiHU,1665
56
56
  vellum_ee/workflows/display/nodes/vellum/tests/test_note_node.py,sha256=uiMB0cOxKZzos7YKnj4ef4DFa2bOvZJWIv-hfbUV6Go,1218
57
57
  vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_deployment_node.py,sha256=G-qJyTNJkpqJiEZ3kCJl86CXJINLeFyf2lM0bQHCCOs,3822
58
- vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py,sha256=7GGbGhcaXkWqLoOU9dWWKFnjVVE_dId9vcKFYzpIHKg,9945
58
+ vellum_ee/workflows/display/nodes/vellum/tests/test_prompt_node.py,sha256=TtzUj3Zk3ZhwtXE_WyctCC-CmcLB1RxntyF7u-a3i6I,10077
59
59
  vellum_ee/workflows/display/nodes/vellum/tests/test_retry_node.py,sha256=h93ysolmbo2viisyhRnXKHPxiDK0I_dSAbYoHFYIoO4,1953
60
60
  vellum_ee/workflows/display/nodes/vellum/tests/test_subworkflow_deployment_node.py,sha256=BUzHJgjdWnPeZxjFjHfDBKnbFjYjnbXPjc-1hne1B2Y,3965
61
61
  vellum_ee/workflows/display/nodes/vellum/tests/test_templating_node.py,sha256=LSk2gx9TpGXbAqKe8dggQW8yJZqj-Cf0EGJFeGGlEcw,3321
62
- vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py,sha256=DgpTmXP3GpOfc6QnUzwIASRyqEydOYv7CnXtv2o4EgU,4324
62
+ vellum_ee/workflows/display/nodes/vellum/tests/test_tool_calling_node.py,sha256=NewHcTseNE2ogPzEDJ6KEDD9EYLn9RBZIClMwijIs0I,4581
63
63
  vellum_ee/workflows/display/nodes/vellum/tests/test_try_node.py,sha256=Khjsb53PKpZuyhKoRMgKAL45eGp5hZqXvHmVeQWRw4w,2289
64
64
  vellum_ee/workflows/display/nodes/vellum/tests/test_utils.py,sha256=3LS1O4DGPWit05oj_ubeW8AlHGnoBxdUMferGQuAiZs,4851
65
65
  vellum_ee/workflows/display/nodes/vellum/try_node.py,sha256=z9Omo676RRc7mQjLoL7hjiHhUj0OWVLhrrb97YTN4QA,4086
@@ -70,7 +70,7 @@ vellum_ee/workflows/display/tests/workflow_serialization/__init__.py,sha256=47DE
70
70
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/conftest.py,sha256=XOQDDRiG46etxTC7-_RUEutoNumXc02fo7oho4GYM0c,1900
72
72
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_adornments_serialization.py,sha256=tsjGM-jOurPSkDIbrDFdjNLmkI1fPNPAw3J9-l9knCw,12848
73
- vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=rV7_NOUIsyHUrdSJ0pJFt7ha-uIC1nSLqdYpRhE9Zfg,21430
73
+ vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_attributes_serialization.py,sha256=MdjWgD8yZhv0MnpI-Ak5EqMzh2joVz3z5WFqr42PgZc,21508
74
74
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_outputs_serialization.py,sha256=s6_mnk0pkztU59wYpSfOFpMhAJaRjmyfxM6WJGtnD4Y,6456
75
75
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_ports_serialization.py,sha256=PkSgghJDz0fpDB72HHPjLjo8LkZk-HpUkCQzRLX-iVw,40611
76
76
  vellum_ee/workflows/display/tests/workflow_serialization/generic_nodes/test_trigger_serialization.py,sha256=dsJr8I9AdPwMOGszirfNDzZP2Ychd94aAKuPXAzknMk,4632
@@ -81,29 +81,29 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_default_stat
81
81
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_error_node_serialization.py,sha256=MNnQ51ZWOQGVfBdpIqvr4OZF0tWdfrh2bsHP3xkTwQw,5841
82
82
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_generic_node_serialization.py,sha256=kLOnUNn-r1w1JXNQcVKe-Vp-fKhSfuDBuDqrjGkFZ3U,5544
83
83
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_guardrail_node_serialization.py,sha256=v07cILUzS5iFYDrSOAXK93yz50-FtxLaMYMwoaPOv20,7374
84
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py,sha256=P6BZ8SanasxKCmDxwznh_EYmDoihi7BSGxA2SaXQYQw,11478
84
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_prompt_node_serialization.py,sha256=THUDmsZJAOigJWs7pCiVik-STA5zvQtUZxgW7XkUBl8,11556
85
85
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_inline_subworkflow_serialization.py,sha256=u2nquKoO3o2xIkU_uFPOb_s5YoLmULiq09vb6Ee0Cqw,21415
86
86
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_map_node_serialization.py,sha256=3gZuNM8sT6ovVaeoAvd2JoyKwuxokvowlhH8kwDUoZ8,16559
87
87
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_merge_node_serialization.py,sha256=IIJt7YZBzkhNtbmaMwCX4ENs58QtSIIoBHlMR6OwGU8,8342
88
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=mLr_1Ow5NZYSLzzEZPup14LckuT8ivOvq9Lz85pGj0c,8602
88
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_prompt_deployment_serialization.py,sha256=QXiRjwtiTPeMUl40Pvh_geeU99C3mv1aVS85oeIUwY4,21052
89
89
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_serialization.py,sha256=K0mECBUyTNX4I468goeaRf93N7Qfizoc1ctCH5_nNys,12936
90
90
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=KkYZc_bZuq1lmDcvUz3QxIqJLpQPCZioD1FHUNsMJY8,11211
91
91
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=aZaqRDrkO3ytcmdM2eKJqHSt60MF070NMj6M2vgzOKc,7711
92
92
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=r748dpS13HtwY7t_KQFExFssxRy0xI2d-wxmhiUHRe0,3850
93
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=ai1f6fKJ7F9iY6PGyBa9b1dCFWEM8gO1WAkVzIhHMlw,8000
93
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=RPv0bJGwgzBDK_f16VrplPjSZbTisANSH08BGzaHwmk,8341
94
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=EL5kfakuoEcwD85dGjhMta-J-PpCHRSDoc80SdbBrQk,2769
95
95
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=RmFUDx8dYdfsOE2CGLvdXqNNRtLLpVzXDN8dqZyMcZ8,5822
96
96
  vellum_ee/workflows/display/types.py,sha256=i4T7ElU5b5h-nA1i3scmEhO1BqmNDc4eJDHavATD88w,2821
97
97
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  vellum_ee/workflows/display/utils/exceptions.py,sha256=LSwwxCYNxFkf5XMUcFkaZKpQ13OSrI7y_bpEUwbKVk0,169
99
- vellum_ee/workflows/display/utils/expressions.py,sha256=8rwEsT99kSiCemIR7oFjlmphHoNqE5-7Fft5NdkWJ98,12419
99
+ vellum_ee/workflows/display/utils/expressions.py,sha256=u-sIH_hDxJdSjq_0BTP3QmbIDvA-OI1GxyPtmNvxxKc,12595
100
100
  vellum_ee/workflows/display/utils/registry.py,sha256=fWIm5Jj-10gNFjgn34iBu4RWv3Vd15ijtSN0V97bpW8,1513
101
101
  vellum_ee/workflows/display/utils/vellum.py,sha256=mtoXmSYwR7rvrq-d6CzCW_auaJXTct0Mi1F0xpRCiNQ,5627
102
102
  vellum_ee/workflows/display/vellum.py,sha256=o7mq_vk2Yapu9DDKRz5l76h8EmCAypWGQYe6pryrbB8,3576
103
103
  vellum_ee/workflows/display/workflows/__init__.py,sha256=kapXsC67VJcgSuiBMa86FdePG5A9kMB5Pi4Uy1O2ob4,207
104
104
  vellum_ee/workflows/display/workflows/base_workflow_display.py,sha256=dVOe3TOV00uvllxsDziM3pFfL2HYTkWRq9iKDlj_xyU,33162
105
105
  vellum_ee/workflows/display/workflows/get_vellum_workflow_display_class.py,sha256=gxz76AeCqgAZ9D2lZeTiZzxY9eMgn3qOSfVgiqYcOh8,2028
106
- vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=rRwXLgsXqiaSn3jzP7lc--pytRW3Jmnj2-zNq5l-FQ4,29472
106
+ vellum_ee/workflows/display/workflows/tests/test_workflow_display.py,sha256=o0bHG9gi6RKlyccuCyow-YbCY8ejcvS1f4VJ6ozjUVA,30234
107
107
  vellum_ee/workflows/display/workflows/vellum_workflow_display.py,sha256=aaKdmWrgEe5YyV4zuDY_4E3y-l59rIHQnNGiPj2OWxQ,359
108
108
  vellum_ee/workflows/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
109
  vellum_ee/workflows/server/virtual_file_loader.py,sha256=7JphJcSO3H85qiC2DpFfBWjC3JjrbRmoynBC6KKHVsA,2710
@@ -134,7 +134,7 @@ vellum/client/README.md,sha256=qmaVIP42MnxAu8jV7u-CsgVFfs3-pHQODrXdZdFxtaw,4749
134
134
  vellum/client/__init__.py,sha256=AYopGv2ZRVn3zsU8_km6KOvEHDbXiTPCVuYVI7bWvdA,120166
135
135
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
136
136
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
137
- vellum/client/core/client_wrapper.py,sha256=xJEAaWXWTXYGi5cngzCHj78LWZhQwcRXmdMQ8nv2f_4,1869
137
+ vellum/client/core/client_wrapper.py,sha256=6Ws3Z7WyEV9P2j-NicrbyppAaPyLzK4wAJ5mxUvUdJ4,1869
138
138
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
139
139
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
140
140
  vellum/client/core/http_client.py,sha256=Z77OIxIbL4OAB2IDqjRq_sYa5yNYAWfmdhdCSSvh6Y4,19552
@@ -1712,8 +1712,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1712
1712
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1713
1713
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=fROqff6AZpCIzaSwOKSdtYy4XR0UZQ6ejxL3RJOSJVs,20447
1714
1714
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1715
- vellum_ai-0.14.60.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1716
- vellum_ai-0.14.60.dist-info/METADATA,sha256=-N3Z5mcyNxlCzemNCbu-norYWyJrS8lFZqALTfoLhh8,5484
1717
- vellum_ai-0.14.60.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1718
- vellum_ai-0.14.60.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1719
- vellum_ai-0.14.60.dist-info/RECORD,,
1715
+ vellum_ai-0.14.62.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1716
+ vellum_ai-0.14.62.dist-info/METADATA,sha256=Bzub_INWkihzZyUxbedAO9QOhQmT-Ci17-6k_8JW5zE,5484
1717
+ vellum_ai-0.14.62.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1718
+ vellum_ai-0.14.62.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1719
+ vellum_ai-0.14.62.dist-info/RECORD,,
@@ -1,8 +1,7 @@
1
1
  from uuid import UUID
2
- from typing import Generic, Optional, TypeVar, cast
2
+ from typing import Generic, Optional, TypeVar
3
3
 
4
4
  from vellum.workflows.nodes.displayable.prompt_deployment_node import PromptDeploymentNode
5
- from vellum.workflows.references import OutputReference
6
5
  from vellum.workflows.types.core import JsonObject
7
6
  from vellum_ee.workflows.display.nodes.base_node_display import BaseNodeDisplay
8
7
  from vellum_ee.workflows.display.nodes.utils import raise_if_descriptor
@@ -40,8 +39,9 @@ class BasePromptDeploymentNodeDisplay(BaseNodeDisplay[_PromptDeploymentNodeType]
40
39
  else []
41
40
  )
42
41
 
43
- _, output_display = display_context.global_node_output_displays[cast(OutputReference, node.Outputs.text)]
44
- _, array_display = display_context.global_node_output_displays[cast(OutputReference, node.Outputs.results)]
42
+ output_display = self.output_display[node.Outputs.text]
43
+ array_display = self.output_display[node.Outputs.results]
44
+ json_display = self.output_display[node.Outputs.json]
45
45
 
46
46
  deployment = display_context.client.deployments.retrieve(
47
47
  id=str(raise_if_descriptor(node.deployment)),
@@ -68,4 +68,9 @@ class BasePromptDeploymentNodeDisplay(BaseNodeDisplay[_PromptDeploymentNodeType]
68
68
  "base": self.get_base().dict(),
69
69
  "definition": self.get_definition().dict(),
70
70
  "ports": self.serialize_ports(display_context),
71
+ "outputs": [
72
+ {"id": str(json_display.id), "name": "json", "type": "JSON", "value": None},
73
+ {"id": str(output_display.id), "name": "text", "type": "STRING", "value": None},
74
+ {"id": str(array_display.id), "name": "results", "type": "ARRAY", "value": None},
75
+ ],
71
76
  }
@@ -196,6 +196,7 @@ def test_serialize_node__prompt_inputs__state_reference():
196
196
  "type": "DICTIONARY_REFERENCE",
197
197
  "entries": [
198
198
  {
199
+ "id": "feadab18-07c6-4790-adf0-28be20a5447a",
199
200
  "key": "foo",
200
201
  "value": {
201
202
  "type": "WORKFLOW_STATE",
@@ -203,6 +204,7 @@ def test_serialize_node__prompt_inputs__state_reference():
203
204
  },
204
205
  },
205
206
  {
207
+ "id": "4f252277-d0a5-48ad-8cc5-be03bf0dbd19",
206
208
  "key": "bar",
207
209
  "value": {
208
210
  "type": "CONSTANT_VALUE",
@@ -68,6 +68,7 @@ def test_serialize_node__prompt_inputs__input_reference():
68
68
  "type": "DICTIONARY_REFERENCE",
69
69
  "entries": [
70
70
  {
71
+ "id": "ab7902ef-de14-4edc-835c-366d3ef6a70e",
71
72
  "key": "foo",
72
73
  "value": {"type": "WORKFLOW_INPUT", "input_variable_id": "e3657390-fd3c-4fea-8cdd-fc5ea79f3278"},
73
74
  }
@@ -108,8 +109,13 @@ def test_serialize_node__prompt_inputs__mixed_values():
108
109
  "value": {
109
110
  "type": "DICTIONARY_REFERENCE",
110
111
  "entries": [
111
- {"key": "foo", "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "bar"}}},
112
112
  {
113
+ "id": "0fc7e25e-075c-4849-b89b-9729d1aeada1",
114
+ "key": "foo",
115
+ "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "bar"}},
116
+ },
117
+ {
118
+ "id": "bba42c89-fa7b-4cb7-bc16-0d21ce060a4b",
113
119
  "key": "baz",
114
120
  "value": {"type": "WORKFLOW_INPUT", "input_variable_id": "8d57cf1d-147c-427b-9a5e-e5f6ab76e2eb"},
115
121
  },
@@ -293,6 +293,7 @@ def test_serialize_node__workflow_input_as_nested_chat_history():
293
293
  "type": "DICTIONARY_REFERENCE",
294
294
  "entries": [
295
295
  {
296
+ "id": "52d98e78-5c2a-488e-be3e-f3b487d94ad3",
296
297
  "key": "hello",
297
298
  "value": {
298
299
  "type": "WORKFLOW_INPUT",
@@ -175,6 +175,7 @@ def test_serialize_workflow():
175
175
  "type": "DICTIONARY_REFERENCE",
176
176
  "entries": [
177
177
  {
178
+ "id": "0bfa70a2-164f-460c-9e9a-4d62221eadf4",
178
179
  "key": "noun",
179
180
  "value": {
180
181
  "type": "WORKFLOW_INPUT",
@@ -7,6 +7,9 @@ from vellum import DeploymentRead
7
7
  from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
8
8
 
9
9
  from tests.workflows.basic_text_prompt_deployment.workflow import BasicTextPromptDeployment
10
+ from tests.workflows.basic_text_prompt_deployment.workflow_with_prompt_deployment_json_reference import (
11
+ WorkflowWithPromptDeploymentJsonReferenceWorkflow,
12
+ )
10
13
 
11
14
 
12
15
  def test_serialize_workflow(vellum_client):
@@ -103,30 +106,26 @@ def test_serialize_workflow(vellum_client):
103
106
  "id": "947d7ead-0fad-4e5f-aa3a-d06029ac94bc",
104
107
  "key": "city",
105
108
  "value": {
106
- "combinator": "OR",
107
109
  "rules": [
108
110
  {
109
111
  "type": "INPUT_VARIABLE",
110
- "data": {
111
- "input_variable_id": "52995b50-84c9-465f-8a4b-a4ee2a92e388",
112
- },
113
- },
112
+ "data": {"input_variable_id": "52995b50-84c9-465f-8a4b-a4ee2a92e388"},
113
+ }
114
114
  ],
115
+ "combinator": "OR",
115
116
  },
116
117
  },
117
118
  {
118
119
  "id": "3deebdd7-2900-4d8c-93f2-e5b90649ac42",
119
120
  "key": "date",
120
121
  "value": {
121
- "combinator": "OR",
122
122
  "rules": [
123
123
  {
124
124
  "type": "INPUT_VARIABLE",
125
- "data": {
126
- "input_variable_id": "aa3ca842-250c-4a3f-853f-23928c28d0f8",
127
- },
128
- },
125
+ "data": {"input_variable_id": "aa3ca842-250c-4a3f-853f-23928c28d0f8"},
126
+ }
129
127
  ],
128
+ "combinator": "OR",
130
129
  },
131
130
  },
132
131
  ],
@@ -142,21 +141,21 @@ def test_serialize_workflow(vellum_client):
142
141
  "release_tag": "LATEST",
143
142
  "ml_model_fallbacks": ["gpt-4o", "gemini-1.5-pro"],
144
143
  },
145
- "display_data": {
146
- "position": {
147
- "x": 0.0,
148
- "y": 0.0,
149
- },
150
- },
144
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
151
145
  "base": {
152
- "module": ["vellum", "workflows", "nodes", "displayable", "prompt_deployment_node", "node"],
153
146
  "name": "PromptDeploymentNode",
147
+ "module": ["vellum", "workflows", "nodes", "displayable", "prompt_deployment_node", "node"],
154
148
  },
155
149
  "definition": {
156
- "module": ["tests", "workflows", "basic_text_prompt_deployment", "workflow"],
157
150
  "name": "ExamplePromptDeploymentNode",
151
+ "module": ["tests", "workflows", "basic_text_prompt_deployment", "workflow"],
158
152
  },
159
153
  "ports": [{"id": "2f26c7e0-283d-4f04-b639-adebb56bc679", "name": "default", "type": "DEFAULT"}],
154
+ "outputs": [
155
+ {"id": "180355a8-e67c-4ce6-9ac3-e5dbb75a6629", "name": "json", "type": "JSON", "value": None},
156
+ {"id": "4d38b850-79e3-4b85-9158-a41d0c535410", "name": "text", "type": "STRING", "value": None},
157
+ {"id": "0cf47d33-6d5f-466f-b826-e814f1d0348b", "name": "results", "type": "ARRAY", "value": None},
158
+ ],
160
159
  }
161
160
 
162
161
  final_output_node = workflow_raw_data["nodes"][2]
@@ -251,3 +250,323 @@ def test_serialize_workflow(vellum_client):
251
250
  "workflow",
252
251
  ],
253
252
  }
253
+
254
+
255
+ def test_serialize_workflow_with_prompt_and_templating(vellum_client):
256
+ # GIVEN a Workflow with stubbed out API calls
257
+ deployment = DeploymentRead(
258
+ id=str(uuid4()),
259
+ created=datetime.now(),
260
+ label="JSON Prompt Deployment",
261
+ name="json_prompt_deployment",
262
+ last_deployed_on=datetime.now(),
263
+ input_variables=[],
264
+ active_model_version_ids=[],
265
+ last_deployed_history_item_id=str(uuid4()),
266
+ )
267
+ vellum_client.deployments.retrieve.return_value = deployment
268
+
269
+ # WHEN we serialize it
270
+ workflow_display = get_workflow_display(workflow_class=WorkflowWithPromptDeploymentJsonReferenceWorkflow)
271
+ serialized_workflow: dict = workflow_display.serialize()
272
+
273
+ # THEN we should get a serialized representation of the Workflow
274
+ assert serialized_workflow.keys() == {
275
+ "workflow_raw_data",
276
+ "input_variables",
277
+ "state_variables",
278
+ "output_variables",
279
+ }
280
+
281
+ # AND its input variables should be what we expect
282
+ input_variables = serialized_workflow["input_variables"]
283
+ assert len(input_variables) == 2
284
+ assert not DeepDiff(
285
+ [
286
+ {
287
+ "id": "ad577aca-0797-4deb-a484-574ef1a1f0c7",
288
+ "key": "city",
289
+ "type": "STRING",
290
+ "default": None,
291
+ "required": True,
292
+ "extensions": {"color": None},
293
+ },
294
+ {
295
+ "id": "066124c4-42bd-4764-aa75-6f230dbbed4a",
296
+ "key": "date",
297
+ "type": "STRING",
298
+ "default": None,
299
+ "required": True,
300
+ "extensions": {"color": None},
301
+ },
302
+ ],
303
+ input_variables,
304
+ ignore_order=True,
305
+ )
306
+
307
+ # AND its output variables should be what we expect
308
+ output_variables = serialized_workflow["output_variables"]
309
+ assert len(output_variables) == 1
310
+ assert output_variables == [{"id": "a7e4b449-5879-4d0c-8f00-d5d4985eb65c", "key": "text", "type": "STRING"}]
311
+
312
+ # AND its raw data should be what we expect
313
+ workflow_raw_data = serialized_workflow["workflow_raw_data"]
314
+ assert len(workflow_raw_data["edges"]) == 3
315
+ assert len(workflow_raw_data["nodes"]) == 4
316
+
317
+ # AND each node should be serialized correctly
318
+ entrypoint_node = workflow_raw_data["nodes"][0]
319
+ assert entrypoint_node == {
320
+ "id": "32c7f398-277c-456b-9279-aa1f867fb637",
321
+ "type": "ENTRYPOINT",
322
+ "inputs": [],
323
+ "data": {"label": "Entrypoint Node", "source_handle_id": "cc0f4028-1039-4063-971d-7dacbb01b379"},
324
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
325
+ "base": None,
326
+ "definition": None,
327
+ }
328
+
329
+ prompt_node = workflow_raw_data["nodes"][1]
330
+ assert prompt_node == {
331
+ "id": "56c74024-19a3-4c0d-a5f5-23e1e9f11b21",
332
+ "type": "PROMPT",
333
+ "inputs": [
334
+ {
335
+ "id": "947d7ead-0fad-4e5f-aa3a-d06029ac94bc",
336
+ "key": "city",
337
+ "value": {
338
+ "rules": [
339
+ {
340
+ "type": "INPUT_VARIABLE",
341
+ "data": {"input_variable_id": "ad577aca-0797-4deb-a484-574ef1a1f0c7"},
342
+ }
343
+ ],
344
+ "combinator": "OR",
345
+ },
346
+ },
347
+ {
348
+ "id": "3deebdd7-2900-4d8c-93f2-e5b90649ac42",
349
+ "key": "date",
350
+ "value": {
351
+ "rules": [
352
+ {
353
+ "type": "INPUT_VARIABLE",
354
+ "data": {"input_variable_id": "066124c4-42bd-4764-aa75-6f230dbbed4a"},
355
+ }
356
+ ],
357
+ "combinator": "OR",
358
+ },
359
+ },
360
+ ],
361
+ "data": {
362
+ "label": "Example Prompt Deployment Node",
363
+ "output_id": "4d38b850-79e3-4b85-9158-a41d0c535410",
364
+ "error_output_id": None,
365
+ "array_output_id": "0cf47d33-6d5f-466f-b826-e814f1d0348b",
366
+ "source_handle_id": "2f26c7e0-283d-4f04-b639-adebb56bc679",
367
+ "target_handle_id": "b7605c48-0937-4ecc-914e-0d1058130e65",
368
+ "variant": "DEPLOYMENT",
369
+ "prompt_deployment_id": deployment.id,
370
+ "release_tag": "LATEST",
371
+ "ml_model_fallbacks": None,
372
+ },
373
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
374
+ "base": {
375
+ "name": "PromptDeploymentNode",
376
+ "module": ["vellum", "workflows", "nodes", "displayable", "prompt_deployment_node", "node"],
377
+ },
378
+ "definition": {
379
+ "name": "ExamplePromptDeploymentNode",
380
+ "module": [
381
+ "tests",
382
+ "workflows",
383
+ "basic_text_prompt_deployment",
384
+ "workflow_with_prompt_deployment_json_reference",
385
+ ],
386
+ },
387
+ "ports": [{"id": "2f26c7e0-283d-4f04-b639-adebb56bc679", "name": "default", "type": "DEFAULT"}],
388
+ "outputs": [
389
+ {"id": "180355a8-e67c-4ce6-9ac3-e5dbb75a6629", "name": "json", "type": "JSON", "value": None},
390
+ {"id": "4d38b850-79e3-4b85-9158-a41d0c535410", "name": "text", "type": "STRING", "value": None},
391
+ {"id": "0cf47d33-6d5f-466f-b826-e814f1d0348b", "name": "results", "type": "ARRAY", "value": None},
392
+ ],
393
+ }
394
+
395
+ templating_node = workflow_raw_data["nodes"][2]
396
+ assert templating_node == {
397
+ "id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
398
+ "type": "TEMPLATING",
399
+ "inputs": [
400
+ {
401
+ "id": "7c775379-d589-4d79-b876-dcd224d72966",
402
+ "key": "template",
403
+ "value": {
404
+ "rules": [
405
+ {
406
+ "type": "CONSTANT_VALUE",
407
+ "data": {
408
+ "type": "STRING",
409
+ "value": "The weather in {{ city }} on {{ date }} is {{ weather }}.",
410
+ },
411
+ }
412
+ ],
413
+ "combinator": "OR",
414
+ },
415
+ },
416
+ {
417
+ "id": "dec1317a-6900-4858-a5fb-c849254b2c91",
418
+ "key": "city",
419
+ "value": {
420
+ "rules": [
421
+ {
422
+ "type": "INPUT_VARIABLE",
423
+ "data": {"input_variable_id": "ad577aca-0797-4deb-a484-574ef1a1f0c7"},
424
+ }
425
+ ],
426
+ "combinator": "OR",
427
+ },
428
+ },
429
+ {
430
+ "id": "4cc5b9f1-075d-45fd-a978-f530c29c5682",
431
+ "key": "date",
432
+ "value": {
433
+ "rules": [
434
+ {
435
+ "type": "INPUT_VARIABLE",
436
+ "data": {"input_variable_id": "066124c4-42bd-4764-aa75-6f230dbbed4a"},
437
+ }
438
+ ],
439
+ "combinator": "OR",
440
+ },
441
+ },
442
+ {
443
+ "id": "77b352e0-1b77-4d48-9f6f-04ce17fe7286",
444
+ "key": "weather",
445
+ "value": {
446
+ "rules": [
447
+ {
448
+ "type": "NODE_OUTPUT",
449
+ "data": {
450
+ "node_id": "56c74024-19a3-4c0d-a5f5-23e1e9f11b21",
451
+ "output_id": "180355a8-e67c-4ce6-9ac3-e5dbb75a6629",
452
+ },
453
+ }
454
+ ],
455
+ "combinator": "OR",
456
+ },
457
+ },
458
+ ],
459
+ "data": {
460
+ "label": "Example Templating Node",
461
+ "output_id": "6834cae4-8173-4fa6-88f7-bc09d335bdd1",
462
+ "error_output_id": None,
463
+ "source_handle_id": "39317827-df43-4f5a-bfbc-20bffc839748",
464
+ "target_handle_id": "58427684-3848-498a-8299-c6b0fc70265d",
465
+ "template_node_input_id": "7c775379-d589-4d79-b876-dcd224d72966",
466
+ "output_type": "STRING",
467
+ },
468
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
469
+ "base": {
470
+ "name": "TemplatingNode",
471
+ "module": ["vellum", "workflows", "nodes", "core", "templating_node", "node"],
472
+ },
473
+ "definition": {
474
+ "name": "ExampleTemplatingNode",
475
+ "module": [
476
+ "tests",
477
+ "workflows",
478
+ "basic_text_prompt_deployment",
479
+ "workflow_with_prompt_deployment_json_reference",
480
+ ],
481
+ },
482
+ "ports": [{"id": "39317827-df43-4f5a-bfbc-20bffc839748", "name": "default", "type": "DEFAULT"}],
483
+ }
484
+
485
+ final_output_node = workflow_raw_data["nodes"][3]
486
+ assert final_output_node == {
487
+ "id": "53de824d-a41d-4294-b511-c969932b05af",
488
+ "type": "TERMINAL",
489
+ "data": {
490
+ "label": "Final Output",
491
+ "name": "text",
492
+ "target_handle_id": "fee3d395-38c3-485f-ab61-1a0fdf71c4ce",
493
+ "output_id": "a7e4b449-5879-4d0c-8f00-d5d4985eb65c",
494
+ "output_type": "STRING",
495
+ "node_input_id": "cf380f81-c5ee-4bc9-8e26-ecf1307733a9",
496
+ },
497
+ "inputs": [
498
+ {
499
+ "id": "cf380f81-c5ee-4bc9-8e26-ecf1307733a9",
500
+ "key": "node_input",
501
+ "value": {
502
+ "rules": [
503
+ {
504
+ "type": "NODE_OUTPUT",
505
+ "data": {
506
+ "node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
507
+ "output_id": "6834cae4-8173-4fa6-88f7-bc09d335bdd1",
508
+ },
509
+ }
510
+ ],
511
+ "combinator": "OR",
512
+ },
513
+ }
514
+ ],
515
+ "display_data": {"position": {"x": 0.0, "y": 0.0}},
516
+ "base": {
517
+ "name": "FinalOutputNode",
518
+ "module": ["vellum", "workflows", "nodes", "displayable", "final_output_node", "node"],
519
+ },
520
+ "definition": None,
521
+ }
522
+
523
+ # AND each edge should be serialized correctly
524
+ serialized_edges = workflow_raw_data["edges"]
525
+ assert serialized_edges == [
526
+ {
527
+ "id": "2c49ffa6-7b9a-49a0-a932-009534556480",
528
+ "source_node_id": "32c7f398-277c-456b-9279-aa1f867fb637",
529
+ "source_handle_id": "cc0f4028-1039-4063-971d-7dacbb01b379",
530
+ "target_node_id": "56c74024-19a3-4c0d-a5f5-23e1e9f11b21",
531
+ "target_handle_id": "b7605c48-0937-4ecc-914e-0d1058130e65",
532
+ "type": "DEFAULT",
533
+ },
534
+ {
535
+ "id": "a46909ec-9572-43c6-a134-0bd7e2c09f99",
536
+ "source_node_id": "56c74024-19a3-4c0d-a5f5-23e1e9f11b21",
537
+ "source_handle_id": "2f26c7e0-283d-4f04-b639-adebb56bc679",
538
+ "target_node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
539
+ "target_handle_id": "58427684-3848-498a-8299-c6b0fc70265d",
540
+ "type": "DEFAULT",
541
+ },
542
+ {
543
+ "id": "1f720900-e5e1-49b7-9910-6ede79f6afd2",
544
+ "source_node_id": "51cbe21d-0232-4362-bc54-5bc283297aa6",
545
+ "source_handle_id": "39317827-df43-4f5a-bfbc-20bffc839748",
546
+ "target_node_id": "53de824d-a41d-4294-b511-c969932b05af",
547
+ "target_handle_id": "fee3d395-38c3-485f-ab61-1a0fdf71c4ce",
548
+ "type": "DEFAULT",
549
+ },
550
+ ]
551
+
552
+ # AND the display data should be what we expect
553
+ display_data = workflow_raw_data["display_data"]
554
+ assert display_data == {
555
+ "viewport": {
556
+ "x": 0.0,
557
+ "y": 0.0,
558
+ "zoom": 1.0,
559
+ }
560
+ }
561
+
562
+ # AND the definition should be what we expect
563
+ definition = workflow_raw_data["definition"]
564
+ assert definition == {
565
+ "name": "WorkflowWithPromptDeploymentJsonReferenceWorkflow",
566
+ "module": [
567
+ "tests",
568
+ "workflows",
569
+ "basic_text_prompt_deployment",
570
+ "workflow_with_prompt_deployment_json_reference",
571
+ ],
572
+ }
@@ -21,7 +21,7 @@ def test_serialize_workflow():
21
21
 
22
22
  # AND its input variables should be what we expect
23
23
  input_variables = serialized_workflow["input_variables"]
24
- assert len(input_variables) == 0
24
+ assert len(input_variables) == 1
25
25
 
26
26
  # AND its output variables should be what we expect
27
27
  output_variables = serialized_workflow["output_variables"]
@@ -154,8 +154,17 @@ def test_serialize_workflow():
154
154
  "id": "0f6dc102-3460-4963-91fa-7ba85d65ef7a",
155
155
  "name": "prompt_inputs",
156
156
  "value": {
157
- "type": "CONSTANT_VALUE",
158
- "value": {"type": "JSON", "value": {"question": "What's the weather like in San Francisco?"}},
157
+ "type": "DICTIONARY_REFERENCE",
158
+ "entries": [
159
+ {
160
+ "id": "b6d4427d-16dd-478a-9780-f88d60d2263d",
161
+ "key": "question",
162
+ "value": {
163
+ "type": "WORKFLOW_INPUT",
164
+ "input_variable_id": "a70e0597-0076-4a17-a8d2-c8d6b4a05bac",
165
+ },
166
+ }
167
+ ],
159
168
  },
160
169
  },
161
170
  {
@@ -38,6 +38,7 @@ from vellum.workflows.references.state_value import StateValueReference
38
38
  from vellum.workflows.references.vellum_secret import VellumSecretReference
39
39
  from vellum.workflows.references.workflow_input import WorkflowInputReference
40
40
  from vellum.workflows.types.core import JsonArray, JsonObject
41
+ from vellum.workflows.utils.uuids import uuid4_from_hash
41
42
  from vellum_ee.workflows.display.utils.exceptions import UnsupportedSerializationException
42
43
 
43
44
  if TYPE_CHECKING:
@@ -264,7 +265,12 @@ def serialize_value(display_context: "WorkflowDisplayContext", value: Any) -> Js
264
265
 
265
266
  if isinstance(value, dict):
266
267
  serialized_entries = [
267
- {"key": key, "value": serialize_value(display_context, val)} for key, val in value.items()
268
+ {
269
+ "id": str(uuid4_from_hash(f"{key}|{val}")),
270
+ "key": key,
271
+ "value": serialize_value(display_context, val),
272
+ }
273
+ for key, val in value.items()
268
274
  ]
269
275
 
270
276
  # Check if all entries have constant values
@@ -700,8 +700,13 @@ def test_serialize_workflow__dict_reference():
700
700
  assert mixed_dict_output["value"] == {
701
701
  "type": "DICTIONARY_REFERENCE",
702
702
  "entries": [
703
- {"key": "key1", "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant1"}}},
704
703
  {
704
+ "id": "b528ce26-68ee-42ba-828d-199441810685",
705
+ "key": "key1",
706
+ "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant1"}},
707
+ },
708
+ {
709
+ "id": "a7acccfe-2f80-42ee-a307-c1eb0b137c2b",
705
710
  "key": "key2",
706
711
  "value": {
707
712
  "type": "NODE_OUTPUT",
@@ -709,8 +714,13 @@ def test_serialize_workflow__dict_reference():
709
714
  "node_output_id": "50a6bc11-afb3-49f2-879c-b28f5e16d974",
710
715
  },
711
716
  },
712
- {"key": "key3", "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant2"}}},
713
717
  {
718
+ "id": "8f41013e-7a9f-4659-ac17-c25c6ec6fe99",
719
+ "key": "key3",
720
+ "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant2"}},
721
+ },
722
+ {
723
+ "id": "609e84e8-573a-44ea-b3aa-82c3f3cc2c36",
714
724
  "key": "key4",
715
725
  "value": {
716
726
  "type": "NODE_OUTPUT",
@@ -730,15 +740,18 @@ def test_serialize_workflow__dict_reference():
730
740
  "type": "DICTIONARY_REFERENCE",
731
741
  "entries": [
732
742
  {
743
+ "id": "02abe9d0-bf93-4eea-b34a-902dae7c2b90",
733
744
  "key": "key1",
734
745
  "value": {
735
746
  "type": "DICTIONARY_REFERENCE",
736
747
  "entries": [
737
748
  {
749
+ "id": "b528ce26-68ee-42ba-828d-199441810685",
738
750
  "key": "key1",
739
751
  "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant1"}},
740
752
  },
741
753
  {
754
+ "id": "a7acccfe-2f80-42ee-a307-c1eb0b137c2b",
742
755
  "key": "key2",
743
756
  "value": {
744
757
  "type": "NODE_OUTPUT",
@@ -750,15 +763,18 @@ def test_serialize_workflow__dict_reference():
750
763
  },
751
764
  },
752
765
  {
766
+ "id": "c8640477-13cc-412e-82cc-35cbe9e78ff2",
753
767
  "key": "key2",
754
768
  "value": {
755
769
  "type": "DICTIONARY_REFERENCE",
756
770
  "entries": [
757
771
  {
772
+ "id": "86709f21-a811-4351-993e-a8e9f1c7774f",
758
773
  "key": "key1",
759
774
  "value": {"type": "CONSTANT_VALUE", "value": {"type": "STRING", "value": "constant2"}},
760
775
  },
761
776
  {
777
+ "id": "a7acccfe-2f80-42ee-a307-c1eb0b137c2b",
762
778
  "key": "key2",
763
779
  "value": {
764
780
  "type": "NODE_OUTPUT",