vellum-ai 0.10.0__py3-none-any.whl → 0.10.2__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 (36) hide show
  1. vellum/__init__.py +8 -0
  2. vellum/client/README.md +1 -1
  3. vellum/client/__init__.py +4 -0
  4. vellum/client/core/client_wrapper.py +1 -1
  5. vellum/client/resources/__init__.py +2 -0
  6. vellum/client/resources/deployments/client.py +117 -0
  7. vellum/client/resources/ml_models/__init__.py +2 -0
  8. vellum/client/resources/ml_models/client.py +125 -0
  9. vellum/client/resources/workflow_deployments/client.py +117 -0
  10. vellum/client/types/__init__.py +6 -0
  11. vellum/client/types/deployment_history_item.py +44 -0
  12. vellum/client/types/ml_model_read.py +27 -0
  13. vellum/client/types/workflow_deployment_history_item.py +45 -0
  14. vellum/resources/ml_models/__init__.py +3 -0
  15. vellum/resources/ml_models/client.py +3 -0
  16. vellum/types/deployment_history_item.py +3 -0
  17. vellum/types/ml_model_read.py +3 -0
  18. vellum/types/workflow_deployment_history_item.py +3 -0
  19. vellum/workflows/nodes/__init__.py +4 -3
  20. vellum/workflows/nodes/core/__init__.py +2 -0
  21. vellum/workflows/nodes/displayable/bases/search_node.py +10 -3
  22. vellum/workflows/nodes/displayable/search_node/node.py +12 -5
  23. vellum/workflows/references/execution_count.py +4 -0
  24. {vellum_ai-0.10.0.dist-info → vellum_ai-0.10.2.dist-info}/METADATA +3 -3
  25. {vellum_ai-0.10.0.dist-info → vellum_ai-0.10.2.dist-info}/RECORD +36 -25
  26. vellum_cli/__init__.py +3 -2
  27. vellum_cli/pull.py +17 -4
  28. vellum_cli/tests/test_pull.py +18 -0
  29. vellum_ee/py.typed +0 -0
  30. vellum_ee/workflows/display/nodes/vellum/conditional_node.py +20 -2
  31. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py +148 -42
  32. vellum_ee/workflows/display/utils/vellum.py +16 -11
  33. vellum_ee/workflows/display/vellum.py +10 -1
  34. {vellum_ai-0.10.0.dist-info → vellum_ai-0.10.2.dist-info}/LICENSE +0 -0
  35. {vellum_ai-0.10.0.dist-info → vellum_ai-0.10.2.dist-info}/WHEEL +0 -0
  36. {vellum_ai-0.10.0.dist-info → vellum_ai-0.10.2.dist-info}/entry_points.txt +0 -0
@@ -4,10 +4,16 @@ from unittest import mock
4
4
  from deepdiff import DeepDiff
5
5
 
6
6
  from tests.workflows.basic_conditional_node.workflow import CategoryWorkflow
7
- from tests.workflows.basic_conditional_node.workflow_with_only_one_conditional_node import create_simple_workflow
8
- from vellum_ee.workflows.display.nodes.base_node_vellum_display import BaseNodeVellumDisplay
7
+ from tests.workflows.basic_conditional_node.workflow_with_only_one_conditional_node import (
8
+ create_simple_workflow,
9
+ )
10
+ from vellum_ee.workflows.display.nodes.base_node_vellum_display import (
11
+ BaseNodeVellumDisplay,
12
+ )
9
13
  from vellum_ee.workflows.display.workflows import VellumWorkflowDisplay
10
- from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
14
+ from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import (
15
+ get_workflow_display,
16
+ )
11
17
  from vellum.workflows.expressions.begins_with import BeginsWithExpression
12
18
  from vellum.workflows.expressions.between import BetweenExpression
13
19
  from vellum.workflows.expressions.contains import ContainsExpression
@@ -18,12 +24,16 @@ from vellum.workflows.expressions.does_not_equal import DoesNotEqualExpression
18
24
  from vellum.workflows.expressions.ends_with import EndsWithExpression
19
25
  from vellum.workflows.expressions.equals import EqualsExpression
20
26
  from vellum.workflows.expressions.greater_than import GreaterThanExpression
21
- from vellum.workflows.expressions.greater_than_or_equal_to import GreaterThanOrEqualToExpression
27
+ from vellum.workflows.expressions.greater_than_or_equal_to import (
28
+ GreaterThanOrEqualToExpression,
29
+ )
22
30
  from vellum.workflows.expressions.in_ import InExpression
23
31
  from vellum.workflows.expressions.is_not_null import IsNotNullExpression
24
32
  from vellum.workflows.expressions.is_null import IsNullExpression
25
33
  from vellum.workflows.expressions.less_than import LessThanExpression
26
- from vellum.workflows.expressions.less_than_or_equal_to import LessThanOrEqualToExpression
34
+ from vellum.workflows.expressions.less_than_or_equal_to import (
35
+ LessThanOrEqualToExpression,
36
+ )
27
37
  from vellum.workflows.expressions.not_between import NotBetweenExpression
28
38
  from vellum.workflows.expressions.not_in import NotInExpression
29
39
 
@@ -31,7 +41,9 @@ from vellum.workflows.expressions.not_in import NotInExpression
31
41
  def test_serialize_workflow():
32
42
  # GIVEN a Workflow that uses a ConditionalNode
33
43
  # WHEN we serialize it
34
- workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=CategoryWorkflow)
44
+ workflow_display = get_workflow_display(
45
+ base_display_class=VellumWorkflowDisplay, workflow_class=CategoryWorkflow
46
+ )
35
47
 
36
48
  # TODO: Support serialization of BaseNode
37
49
  # https://app.shortcut.com/vellum/story/4871/support-serialization-of-base-node
@@ -69,11 +81,31 @@ def test_serialize_workflow():
69
81
  assert len(output_variables) == 5
70
82
  assert not DeepDiff(
71
83
  [
72
- {"id": "c05f7d96-59a0-4d58-93d7-d451afd3f630", "key": "question", "type": "STRING"},
73
- {"id": "93f2cb75-6fa2-4e46-9488-c0bcd29153c0", "key": "compliment", "type": "STRING"},
74
- {"id": "f936ae31-ba15-4864-8961-86231022a4d7", "key": "complaint", "type": "STRING"},
75
- {"id": "cdbe2adf-9951-409a-b9a8-b8b349037f4f", "key": "statement", "type": "STRING"},
76
- {"id": "62ad462f-f819-4940-99ab-b3f145507f57", "key": "fallthrough", "type": "STRING"},
84
+ {
85
+ "id": "c05f7d96-59a0-4d58-93d7-d451afd3f630",
86
+ "key": "question",
87
+ "type": "STRING",
88
+ },
89
+ {
90
+ "id": "93f2cb75-6fa2-4e46-9488-c0bcd29153c0",
91
+ "key": "compliment",
92
+ "type": "STRING",
93
+ },
94
+ {
95
+ "id": "f936ae31-ba15-4864-8961-86231022a4d7",
96
+ "key": "complaint",
97
+ "type": "STRING",
98
+ },
99
+ {
100
+ "id": "cdbe2adf-9951-409a-b9a8-b8b349037f4f",
101
+ "key": "statement",
102
+ "type": "STRING",
103
+ },
104
+ {
105
+ "id": "62ad462f-f819-4940-99ab-b3f145507f57",
106
+ "key": "fallthrough",
107
+ "type": "STRING",
108
+ },
77
109
  ],
78
110
  output_variables,
79
111
  ignore_order=True,
@@ -124,7 +156,9 @@ def test_serialize_workflow():
124
156
  "rules": [
125
157
  {
126
158
  "type": "INPUT_VARIABLE",
127
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
159
+ "data": {
160
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
161
+ },
128
162
  }
129
163
  ],
130
164
  "combinator": "OR",
@@ -134,7 +168,12 @@ def test_serialize_workflow():
134
168
  "id": "1fb4cf46-f8b3-418f-be30-f7ec57f92285",
135
169
  "key": "708bb538-4c77-4ae9-8e87-0706346e2947.value",
136
170
  "value": {
137
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "question"}}],
171
+ "rules": [
172
+ {
173
+ "type": "CONSTANT_VALUE",
174
+ "data": {"type": "STRING", "value": "question"},
175
+ }
176
+ ],
138
177
  "combinator": "OR",
139
178
  },
140
179
  },
@@ -145,7 +184,9 @@ def test_serialize_workflow():
145
184
  "rules": [
146
185
  {
147
186
  "type": "INPUT_VARIABLE",
148
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
187
+ "data": {
188
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
189
+ },
149
190
  }
150
191
  ],
151
192
  "combinator": "OR",
@@ -155,7 +196,12 @@ def test_serialize_workflow():
155
196
  "id": "40957176-de6e-4131-bfa7-55c633312af0",
156
197
  "key": "ddee5d1d-46e9-4ae8-b0a8-311747ebadd4.value",
157
198
  "value": {
158
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "complaint"}}],
199
+ "rules": [
200
+ {
201
+ "type": "CONSTANT_VALUE",
202
+ "data": {"type": "STRING", "value": "complaint"},
203
+ }
204
+ ],
159
205
  "combinator": "OR",
160
206
  },
161
207
  },
@@ -166,7 +212,9 @@ def test_serialize_workflow():
166
212
  "rules": [
167
213
  {
168
214
  "type": "INPUT_VARIABLE",
169
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
215
+ "data": {
216
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
217
+ },
170
218
  }
171
219
  ],
172
220
  "combinator": "OR",
@@ -176,7 +224,12 @@ def test_serialize_workflow():
176
224
  "id": "93f06582-aff7-4ce5-8c60-f923090ffebc",
177
225
  "key": "73157578-205a-4816-8985-cf726063647c.value",
178
226
  "value": {
179
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "compliment"}}],
227
+ "rules": [
228
+ {
229
+ "type": "CONSTANT_VALUE",
230
+ "data": {"type": "STRING", "value": "compliment"},
231
+ }
232
+ ],
180
233
  "combinator": "OR",
181
234
  },
182
235
  },
@@ -187,7 +240,9 @@ def test_serialize_workflow():
187
240
  "rules": [
188
241
  {
189
242
  "type": "INPUT_VARIABLE",
190
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
243
+ "data": {
244
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
245
+ },
191
246
  }
192
247
  ],
193
248
  "combinator": "OR",
@@ -197,7 +252,12 @@ def test_serialize_workflow():
197
252
  "id": "e759091b-3609-4581-9014-5f46f438a4c9",
198
253
  "key": "e805add5-7f7f-443d-b9bc-11ad15eeb49c.value",
199
254
  "value": {
200
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "statement"}}],
255
+ "rules": [
256
+ {
257
+ "type": "CONSTANT_VALUE",
258
+ "data": {"type": "STRING", "value": "statement"},
259
+ }
260
+ ],
201
261
  "combinator": "OR",
202
262
  },
203
263
  },
@@ -208,7 +268,9 @@ def test_serialize_workflow():
208
268
  "rules": [
209
269
  {
210
270
  "type": "INPUT_VARIABLE",
211
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
271
+ "data": {
272
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
273
+ },
212
274
  }
213
275
  ],
214
276
  "combinator": "OR",
@@ -218,7 +280,12 @@ def test_serialize_workflow():
218
280
  "id": "e915cd85-ae55-48be-b31c-f2285db9db10",
219
281
  "key": "f47d72ff-665f-4143-ada3-6fa66f5bda42.value",
220
282
  "value": {
221
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "statement"}}],
283
+ "rules": [
284
+ {
285
+ "type": "CONSTANT_VALUE",
286
+ "data": {"type": "STRING", "value": "statement"},
287
+ }
288
+ ],
222
289
  "combinator": "OR",
223
290
  },
224
291
  },
@@ -229,7 +296,9 @@ def test_serialize_workflow():
229
296
  "rules": [
230
297
  {
231
298
  "type": "INPUT_VARIABLE",
232
- "data": {"input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"},
299
+ "data": {
300
+ "input_variable_id": "eece050a-432e-4a2c-8c87-9480397e4cbf"
301
+ },
233
302
  }
234
303
  ],
235
304
  "combinator": "OR",
@@ -239,7 +308,12 @@ def test_serialize_workflow():
239
308
  "id": "e5d75ae4-cd46-437e-9695-9df2d79578b4",
240
309
  "key": "d3359d60-9bb4-4c6e-8009-b7ea46ab28a7.value",
241
310
  "value": {
242
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "statement"}}],
311
+ "rules": [
312
+ {
313
+ "type": "CONSTANT_VALUE",
314
+ "data": {"type": "STRING", "value": "statement"},
315
+ }
316
+ ],
243
317
  "combinator": "OR",
244
318
  },
245
319
  },
@@ -377,8 +451,11 @@ def test_serialize_workflow():
377
451
  },
378
452
  "display_data": {"position": {"x": 0.0, "y": 0.0}},
379
453
  "definition": {
454
+ "name": "CategoryConditionalNode",
455
+ "module": ["tests", "workflows", "basic_conditional_node", "workflow"],
380
456
  "bases": [
381
457
  {
458
+ "name": "ConditionalNode",
382
459
  "module": [
383
460
  "vellum",
384
461
  "workflows",
@@ -387,16 +464,8 @@ def test_serialize_workflow():
387
464
  "conditional_node",
388
465
  "node",
389
466
  ],
390
- "name": "ConditionalNode",
391
467
  }
392
468
  ],
393
- "module": [
394
- "tests",
395
- "workflows",
396
- "basic_conditional_node",
397
- "workflow",
398
- ],
399
- "name": "CategoryConditionalNode",
400
469
  },
401
470
  },
402
471
  conditional_node,
@@ -860,11 +929,15 @@ def descriptors_with_value_and_start_and_end():
860
929
 
861
930
 
862
931
  @pytest.mark.parametrize("descriptor, operator", descriptors_with_lhs_and_rhs())
863
- def test_conditional_node_serialize_all_operators_with_lhs_and_rhs(descriptor, operator):
932
+ def test_conditional_node_serialize_all_operators_with_lhs_and_rhs(
933
+ descriptor, operator
934
+ ):
864
935
  # GIVEN a simple workflow with one conditional node
865
936
  workflow_cls = create_simple_workflow(descriptor)
866
937
 
867
- workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls)
938
+ workflow_display = get_workflow_display(
939
+ base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls
940
+ )
868
941
 
869
942
  # TODO: Support serialization of BaseNode
870
943
  # https://app.shortcut.com/vellum/story/4871/support-serialization-of-base-node
@@ -894,7 +967,12 @@ def test_conditional_node_serialize_all_operators_with_lhs_and_rhs(descriptor, o
894
967
  "id": "2262b7b4-a2f2-408b-9d4d-362940ca1ed3",
895
968
  "key": "abe7afac-952f-4cfc-ab07-47b47f34105f.field",
896
969
  "value": {
897
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "123"}}],
970
+ "rules": [
971
+ {
972
+ "type": "CONSTANT_VALUE",
973
+ "data": {"type": "STRING", "value": "123"},
974
+ }
975
+ ],
898
976
  "combinator": "OR",
899
977
  },
900
978
  },
@@ -902,7 +980,12 @@ def test_conditional_node_serialize_all_operators_with_lhs_and_rhs(descriptor, o
902
980
  "id": "aadade8a-c253-483a-8620-31fe8171c0fd",
903
981
  "key": "abe7afac-952f-4cfc-ab07-47b47f34105f.value",
904
982
  "value": {
905
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "123"}}],
983
+ "rules": [
984
+ {
985
+ "type": "CONSTANT_VALUE",
986
+ "data": {"type": "STRING", "value": "123"},
987
+ }
988
+ ],
906
989
  "combinator": "OR",
907
990
  },
908
991
  },
@@ -972,7 +1055,9 @@ def test_conditional_node_serialize_all_operators_with_expression(descriptor, op
972
1055
  # GIVEN a simple workflow with one conditional node
973
1056
  workflow_cls = create_simple_workflow(descriptor)
974
1057
 
975
- workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls)
1058
+ workflow_display = get_workflow_display(
1059
+ base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls
1060
+ )
976
1061
 
977
1062
  # TODO: Support serialization of BaseNode
978
1063
  # https://app.shortcut.com/vellum/story/4871/support-serialization-of-base-node
@@ -1002,7 +1087,12 @@ def test_conditional_node_serialize_all_operators_with_expression(descriptor, op
1002
1087
  "id": "2262b7b4-a2f2-408b-9d4d-362940ca1ed3",
1003
1088
  "key": "abe7afac-952f-4cfc-ab07-47b47f34105f.field",
1004
1089
  "value": {
1005
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "123"}}],
1090
+ "rules": [
1091
+ {
1092
+ "type": "CONSTANT_VALUE",
1093
+ "data": {"type": "STRING", "value": "123"},
1094
+ }
1095
+ ],
1006
1096
  "combinator": "OR",
1007
1097
  },
1008
1098
  }
@@ -1067,12 +1157,18 @@ def test_conditional_node_serialize_all_operators_with_expression(descriptor, op
1067
1157
  )
1068
1158
 
1069
1159
 
1070
- @pytest.mark.parametrize("descriptor, operator", descriptors_with_value_and_start_and_end())
1071
- def test_conditional_node_serialize_all_operators_with_value_and_start_and_end(descriptor, operator):
1160
+ @pytest.mark.parametrize(
1161
+ "descriptor, operator", descriptors_with_value_and_start_and_end()
1162
+ )
1163
+ def test_conditional_node_serialize_all_operators_with_value_and_start_and_end(
1164
+ descriptor, operator
1165
+ ):
1072
1166
  # GIVEN a simple workflow with one conditional node
1073
1167
  workflow_cls = create_simple_workflow(descriptor)
1074
1168
 
1075
- workflow_display = get_workflow_display(base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls)
1169
+ workflow_display = get_workflow_display(
1170
+ base_display_class=VellumWorkflowDisplay, workflow_class=workflow_cls
1171
+ )
1076
1172
 
1077
1173
  # TODO: Support serialization of BaseNode
1078
1174
  # https://app.shortcut.com/vellum/story/4871/support-serialization-of-base-node
@@ -1102,7 +1198,12 @@ def test_conditional_node_serialize_all_operators_with_value_and_start_and_end(d
1102
1198
  "id": "2262b7b4-a2f2-408b-9d4d-362940ca1ed3",
1103
1199
  "key": "abe7afac-952f-4cfc-ab07-47b47f34105f.field",
1104
1200
  "value": {
1105
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "123"}}],
1201
+ "rules": [
1202
+ {
1203
+ "type": "CONSTANT_VALUE",
1204
+ "data": {"type": "STRING", "value": "123"},
1205
+ }
1206
+ ],
1106
1207
  "combinator": "OR",
1107
1208
  },
1108
1209
  },
@@ -1110,7 +1211,12 @@ def test_conditional_node_serialize_all_operators_with_value_and_start_and_end(d
1110
1211
  "id": "aadade8a-c253-483a-8620-31fe8171c0fd",
1111
1212
  "key": "abe7afac-952f-4cfc-ab07-47b47f34105f.value",
1112
1213
  "value": {
1113
- "rules": [{"type": "CONSTANT_VALUE", "data": {"type": "STRING", "value": "123,123"}}],
1214
+ "rules": [
1215
+ {
1216
+ "type": "CONSTANT_VALUE",
1217
+ "data": {"type": "STRING", "value": "123,123"},
1218
+ }
1219
+ ],
1114
1220
  "combinator": "OR",
1115
1221
  },
1116
1222
  },
@@ -4,11 +4,20 @@ import typing
4
4
  from typing import Any, List, Union, cast
5
5
 
6
6
  from vellum import ChatMessage, SearchResult, SearchResultRequest, VellumVariableType
7
-
7
+ from vellum.workflows.descriptors.base import BaseDescriptor
8
+ from vellum.workflows.references import OutputReference, WorkflowInputReference
9
+ from vellum.workflows.references.execution_count import ExecutionCountReference
10
+ from vellum.workflows.references.node import NodeReference
11
+ from vellum.workflows.references.vellum_secret import VellumSecretReference
12
+ from vellum.workflows.types.core import VellumValuePrimitive
13
+ from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
14
+ from vellum.workflows.vellum_client import create_vellum_client
8
15
  from vellum_ee.workflows.display.types import WorkflowDisplayContext
9
16
  from vellum_ee.workflows.display.vellum import (
10
17
  ChatHistoryVellumValue,
11
18
  ConstantValuePointer,
19
+ ExecutionCounterData,
20
+ ExecutionCounterPointer,
12
21
  InputVariableData,
13
22
  InputVariablePointer,
14
23
  JsonVellumValue,
@@ -22,13 +31,6 @@ from vellum_ee.workflows.display.vellum import (
22
31
  WorkspaceSecretData,
23
32
  WorkspaceSecretPointer,
24
33
  )
25
- from vellum.workflows.descriptors.base import BaseDescriptor
26
- from vellum.workflows.references import OutputReference, WorkflowInputReference
27
- from vellum.workflows.references.node import NodeReference
28
- from vellum.workflows.references.vellum_secret import VellumSecretReference
29
- from vellum.workflows.types.core import VellumValuePrimitive
30
- from vellum.workflows.utils.vellum_variables import primitive_type_to_vellum_variable_type
31
- from vellum.workflows.vellum_client import create_vellum_client
32
34
 
33
35
  _T = typing.TypeVar("_T")
34
36
 
@@ -61,13 +63,12 @@ def create_node_input_value_pointer_rule(
61
63
  upstream_node, output_display = display_context.node_output_displays[value]
62
64
  upstream_node_display = display_context.node_displays[upstream_node]
63
65
  return NodeOutputPointer(
64
- type="NODE_OUTPUT",
65
66
  data=NodeOutputData(node_id=str(upstream_node_display.node_id), output_id=str(output_display.id)),
66
67
  )
67
68
  if isinstance(value, WorkflowInputReference):
68
69
  workflow_input_display = display_context.workflow_input_displays[value]
69
70
  return InputVariablePointer(
70
- type="INPUT_VARIABLE", data=InputVariableData(input_variable_id=str(workflow_input_display.id))
71
+ data=InputVariableData(input_variable_id=str(workflow_input_display.id))
71
72
  )
72
73
  if isinstance(value, VellumSecretReference):
73
74
  # TODO: Pass through the name instead of retrieving the ID
@@ -77,12 +78,16 @@ def create_node_input_value_pointer_rule(
77
78
  id=value.name,
78
79
  )
79
80
  return WorkspaceSecretPointer(
80
- type="WORKSPACE_SECRET",
81
81
  data=WorkspaceSecretData(
82
82
  type="STRING",
83
83
  workspace_secret_id=str(workspace_secret.id),
84
84
  ),
85
85
  )
86
+ if isinstance(value, ExecutionCountReference):
87
+ node_class_display = display_context.node_displays[value.node_class]
88
+ return ExecutionCounterPointer(
89
+ data=ExecutionCounterData(node_id=str(node_class_display.node_id)),
90
+ )
86
91
 
87
92
  if not isinstance(value, BaseDescriptor):
88
93
  vellum_value = primitive_to_vellum_value(value)
@@ -7,7 +7,6 @@ from pydantic import Field
7
7
 
8
8
  from vellum import ChatMessage, PromptParameters, SearchResult, SearchResultRequest, VellumVariable, VellumVariableType
9
9
  from vellum.core import UniversalBaseModel
10
-
11
10
  from vellum_ee.workflows.display.base import (
12
11
  EdgeDisplay,
13
12
  EdgeDisplayOverrides,
@@ -211,11 +210,21 @@ class WorkspaceSecretPointer(UniversalBaseModel):
211
210
  data: WorkspaceSecretData
212
211
 
213
212
 
213
+ class ExecutionCounterData(UniversalBaseModel):
214
+ node_id: str
215
+
216
+
217
+ class ExecutionCounterPointer(UniversalBaseModel):
218
+ type: Literal["EXECUTION_COUNTER"] = "EXECUTION_COUNTER"
219
+ data: ExecutionCounterData
220
+
221
+
214
222
  NodeInputValuePointerRule = Union[
215
223
  NodeOutputPointer,
216
224
  InputVariablePointer,
217
225
  ConstantValuePointer,
218
226
  WorkspaceSecretPointer,
227
+ ExecutionCounterPointer,
219
228
  ]
220
229
 
221
230