vellum-ai 1.0.9__py3-none-any.whl → 1.0.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. vellum/client/core/client_wrapper.py +2 -2
  2. vellum/workflows/descriptors/base.py +31 -1
  3. vellum/workflows/descriptors/utils.py +19 -1
  4. vellum/workflows/emitters/__init__.py +2 -0
  5. vellum/workflows/emitters/base.py +17 -0
  6. vellum/workflows/emitters/vellum_emitter.py +138 -0
  7. vellum/workflows/expressions/accessor.py +23 -15
  8. vellum/workflows/expressions/add.py +41 -0
  9. vellum/workflows/expressions/length.py +35 -0
  10. vellum/workflows/expressions/minus.py +41 -0
  11. vellum/workflows/expressions/tests/test_add.py +72 -0
  12. vellum/workflows/expressions/tests/test_length.py +38 -0
  13. vellum/workflows/expressions/tests/test_minus.py +72 -0
  14. vellum/workflows/integrations/composio_service.py +10 -2
  15. vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py +1 -1
  16. vellum/workflows/nodes/displayable/inline_prompt_node/node.py +2 -2
  17. vellum/workflows/nodes/displayable/tool_calling_node/node.py +24 -20
  18. vellum/workflows/nodes/displayable/tool_calling_node/state.py +2 -0
  19. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py +92 -0
  20. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py +25 -10
  21. vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py +7 -5
  22. vellum/workflows/nodes/displayable/tool_calling_node/utils.py +141 -86
  23. vellum/workflows/types/core.py +3 -5
  24. vellum/workflows/types/definition.py +2 -6
  25. vellum/workflows/types/tests/test_definition.py +5 -2
  26. {vellum_ai-1.0.9.dist-info → vellum_ai-1.0.11.dist-info}/METADATA +1 -1
  27. {vellum_ai-1.0.9.dist-info → vellum_ai-1.0.11.dist-info}/RECORD +34 -27
  28. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py +1 -4
  29. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py +0 -5
  30. vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py +0 -5
  31. vellum_ee/workflows/display/utils/expressions.py +12 -0
  32. {vellum_ai-1.0.9.dist-info → vellum_ai-1.0.11.dist-info}/LICENSE +0 -0
  33. {vellum_ai-1.0.9.dist-info → vellum_ai-1.0.11.dist-info}/WHEEL +0 -0
  34. {vellum_ai-1.0.9.dist-info → vellum_ai-1.0.11.dist-info}/entry_points.txt +0 -0
@@ -5,6 +5,8 @@ from typing import Any, Callable, Dict, Iterator, List, Optional, Type, Union, c
5
5
  from pydash import snake_case
6
6
 
7
7
  from vellum import ChatMessage, PromptBlock
8
+ from vellum.client.types.array_chat_message_content import ArrayChatMessageContent
9
+ from vellum.client.types.array_chat_message_content_item import ArrayChatMessageContentItem
8
10
  from vellum.client.types.function_call_chat_message_content import FunctionCallChatMessageContent
9
11
  from vellum.client.types.function_call_chat_message_content_value import FunctionCallChatMessageContentValue
10
12
  from vellum.client.types.function_definition import FunctionDefinition
@@ -28,7 +30,7 @@ from vellum.workflows.ports.port import Port
28
30
  from vellum.workflows.references.lazy import LazyReference
29
31
  from vellum.workflows.state import BaseState
30
32
  from vellum.workflows.state.encoder import DefaultStateEncoder
31
- from vellum.workflows.types.core import EntityInputsInterface, MergeBehavior, Tool, ToolSource
33
+ from vellum.workflows.types.core import EntityInputsInterface, MergeBehavior, Tool, ToolBase
32
34
  from vellum.workflows.types.definition import ComposioToolDefinition, DeploymentDefinition, MCPServer, MCPToolDefinition
33
35
  from vellum.workflows.types.generics import is_workflow_class
34
36
 
@@ -59,6 +61,9 @@ class FunctionCallNodeMixin:
59
61
  content=StringChatMessageContent(value=json.dumps(result, cls=DefaultStateEncoder)),
60
62
  )
61
63
  )
64
+ with state.__quiet__():
65
+ state.current_function_calls_processed += 1
66
+ state.current_prompt_output_index += 1
62
67
 
63
68
 
64
69
  class ToolRouterNode(InlinePromptNode[ToolCallingState]):
@@ -73,29 +78,37 @@ class ToolRouterNode(InlinePromptNode[ToolCallingState]):
73
78
  raise NodeException(message=max_iterations_message, code=WorkflowErrorCode.NODE_EXECUTION)
74
79
 
75
80
  generator = super().run()
81
+ with self.state.__quiet__():
82
+ self.state.current_prompt_output_index = 0
83
+ self.state.current_function_calls_processed = 0
84
+ self.state.prompt_iterations += 1
76
85
  for output in generator:
77
- if output.name == "results" and output.value:
78
- values = cast(List[Any], output.value)
79
- if values and len(values) > 0:
80
- if values[0].type == "STRING":
81
- self.state.chat_history.append(ChatMessage(role="ASSISTANT", text=values[0].value))
82
- elif values[0].type == "FUNCTION_CALL":
83
- self.state.prompt_iterations += 1
84
-
85
- function_call = values[0].value
86
- if function_call is not None:
87
- self.state.chat_history.append(
88
- ChatMessage(
89
- role="ASSISTANT",
90
- content=FunctionCallChatMessageContent(
91
- value=FunctionCallChatMessageContentValue(
92
- name=function_call.name,
93
- arguments=function_call.arguments,
94
- id=function_call.id,
95
- ),
96
- ),
97
- )
86
+ if output.name == InlinePromptNode.Outputs.results.name and output.value:
87
+ prompt_outputs = cast(List[PromptOutput], output.value)
88
+ chat_contents: List[ArrayChatMessageContentItem] = []
89
+ for prompt_output in prompt_outputs:
90
+ if prompt_output.type == "STRING":
91
+ chat_contents.append(StringChatMessageContent(value=prompt_output.value))
92
+ elif prompt_output.type == "FUNCTION_CALL" and prompt_output.value:
93
+ raw_function_call = prompt_output.value.model_dump()
94
+ if "state" in raw_function_call:
95
+ del raw_function_call["state"]
96
+ chat_contents.append(
97
+ FunctionCallChatMessageContent(
98
+ value=FunctionCallChatMessageContentValue.model_validate(raw_function_call)
98
99
  )
100
+ )
101
+
102
+ if len(chat_contents) == 1:
103
+ if chat_contents[0].type == "STRING":
104
+ self.state.chat_history.append(ChatMessage(role="ASSISTANT", text=chat_contents[0].value))
105
+ else:
106
+ self.state.chat_history.append(ChatMessage(role="ASSISTANT", content=chat_contents[0]))
107
+ else:
108
+ self.state.chat_history.append(
109
+ ChatMessage(role="ASSISTANT", content=ArrayChatMessageContent(value=chat_contents))
110
+ )
111
+
99
112
  yield output
100
113
 
101
114
 
@@ -184,7 +197,12 @@ class ComposioNode(BaseNode[ToolCallingState], FunctionCallNodeMixin):
184
197
  try:
185
198
  # Execute using ComposioService
186
199
  composio_service = ComposioService()
187
- result = composio_service.execute_tool(tool_name=self.composio_tool.action, arguments=arguments)
200
+ if self.composio_tool.user_id is not None:
201
+ result = composio_service.execute_tool(
202
+ tool_name=self.composio_tool.action, arguments=arguments, user_id=self.composio_tool.user_id
203
+ )
204
+ else:
205
+ result = composio_service.execute_tool(tool_name=self.composio_tool.action, arguments=arguments)
188
206
  except Exception as e:
189
207
  raise NodeException(
190
208
  message=f"Error executing Composio tool '{self.composio_tool.action}': {str(e)}",
@@ -220,41 +238,51 @@ class MCPNode(BaseNode[ToolCallingState], FunctionCallNodeMixin):
220
238
  yield from []
221
239
 
222
240
 
223
- def _hydrate_composio_tool_definition(tool_def: ComposioToolDefinition) -> ComposioToolDefinition:
241
+ class ElseNode(BaseNode[ToolCallingState]):
242
+ """Node that executes when no function conditions match."""
243
+
244
+ class Ports(BaseNode.Ports):
245
+ # Redefined in the create_else_node function, but defined here to resolve mypy errors
246
+ loop = Port.on_if(
247
+ ToolCallingState.current_prompt_output_index.less_than(1)
248
+ | ToolCallingState.current_function_calls_processed.greater_than(0)
249
+ )
250
+ end = Port.on_else()
251
+
252
+ def run(self) -> BaseNode.Outputs:
253
+ with self.state.__quiet__():
254
+ self.state.current_prompt_output_index += 1
255
+ return self.Outputs()
256
+
257
+
258
+ def _hydrate_composio_tool_definition(tool_def: ComposioToolDefinition) -> FunctionDefinition:
224
259
  """Hydrate a ComposioToolDefinition with detailed information from the Composio API.
225
260
 
226
261
  Args:
227
262
  tool_def: The basic ComposioToolDefinition to enhance
228
263
 
229
264
  Returns:
230
- ComposioToolDefinition with detailed parameters and description
265
+ FunctionDefinition with detailed parameters and description
231
266
  """
232
267
  try:
233
268
  composio_service = ComposioService()
234
269
  tool_details = composio_service.get_tool_by_slug(tool_def.action)
235
270
 
236
- # Extract toolkit information from API response
237
- toolkit_info = tool_details.get("toolkit", {})
238
- toolkit_slug = (
239
- toolkit_info.get("slug", tool_def.toolkit) if isinstance(toolkit_info, dict) else tool_def.toolkit
240
- )
241
-
242
- # Create a version of the tool definition with proper field extraction
243
- return ComposioToolDefinition(
244
- type=tool_def.type,
245
- toolkit=toolkit_slug.upper() if toolkit_slug else tool_def.toolkit,
246
- action=tool_details.get("slug", tool_def.action),
271
+ # Create a FunctionDefinition directly with proper field extraction
272
+ return FunctionDefinition(
273
+ name=tool_def.name,
247
274
  description=tool_details.get("description", tool_def.description),
248
- display_name=tool_details.get("name", tool_def.display_name),
249
- parameters=tool_details.get("input_parameters", tool_def.parameters),
250
- version=tool_details.get("version", tool_def.version),
251
- tags=tool_details.get("tags", tool_def.tags),
275
+ parameters=tool_details.get("input_parameters", {}),
252
276
  )
253
277
 
254
278
  except Exception as e:
255
- # If hydration fails (including no API key), log and return original
279
+ # If hydration fails (including no API key), log and return basic function definition
256
280
  logger.warning(f"Failed to enhance Composio tool '{tool_def.action}': {e}")
257
- return tool_def
281
+ return FunctionDefinition(
282
+ name=tool_def.name,
283
+ description=tool_def.description,
284
+ parameters={},
285
+ )
258
286
 
259
287
 
260
288
  def hydrate_mcp_tool_definitions(server_def: MCPServer) -> List[MCPToolDefinition]:
@@ -281,12 +309,11 @@ def create_tool_router_node(
281
309
  ml_model: str,
282
310
  blocks: List[Union[PromptBlock, Dict[str, Any]]],
283
311
  functions: List[Tool],
284
- tool_sources: List[ToolSource],
285
312
  prompt_inputs: Optional[EntityInputsInterface],
286
313
  parameters: PromptParameters,
287
314
  max_prompt_iterations: Optional[int] = None,
288
315
  ) -> Type[ToolRouterNode]:
289
- if functions and len(functions) > 0 or tool_sources and len(tool_sources) > 0:
316
+ if functions and len(functions) > 0:
290
317
  # Create dynamic ports and convert functions in a single loop
291
318
  Ports = type("Ports", (), {})
292
319
  prompt_functions: List[Union[Tool, FunctionDefinition]] = []
@@ -298,8 +325,13 @@ def create_tool_router_node(
298
325
  return Port.on_if(
299
326
  LazyReference(
300
327
  lambda: (
301
- node.Outputs.results[0]["type"].equals("FUNCTION_CALL")
302
- & node.Outputs.results[0]["value"]["name"].equals(fn_name)
328
+ ToolCallingState.current_prompt_output_index.less_than(node.Outputs.results.length())
329
+ & node.Outputs.results[ToolCallingState.current_prompt_output_index]["type"].equals(
330
+ "FUNCTION_CALL"
331
+ )
332
+ & node.Outputs.results[ToolCallingState.current_prompt_output_index]["value"]["name"].equals(
333
+ fn_name
334
+ )
303
335
  )
304
336
  )
305
337
  )
@@ -308,34 +340,29 @@ def create_tool_router_node(
308
340
  if isinstance(function, ComposioToolDefinition):
309
341
  # Get Composio tool details and hydrate the function definition
310
342
  enhanced_function = _hydrate_composio_tool_definition(function)
311
- prompt_functions.append(
312
- FunctionDefinition(
313
- name=enhanced_function.name,
314
- description=enhanced_function.description,
315
- parameters=enhanced_function.parameters,
343
+ prompt_functions.append(enhanced_function)
344
+ # Create port for this function (using original function for get_function_name)
345
+ function_name = get_function_name(function)
346
+ port = create_port_condition(function_name)
347
+ setattr(Ports, function_name, port)
348
+ elif isinstance(function, MCPServer):
349
+ tool_functions: List[MCPToolDefinition] = hydrate_mcp_tool_definitions(function)
350
+ for tool_function in tool_functions:
351
+ name = get_mcp_tool_name(tool_function)
352
+ prompt_functions.append(
353
+ FunctionDefinition(
354
+ name=name,
355
+ description=tool_function.description,
356
+ parameters=tool_function.parameters,
357
+ )
316
358
  )
317
- )
359
+ port = create_port_condition(name)
360
+ setattr(Ports, name, port)
318
361
  else:
319
362
  prompt_functions.append(function)
320
-
321
- # Create port for this function (using original function for get_function_name)
322
- function_name = get_function_name(function)
323
- port = create_port_condition(function_name)
324
- setattr(Ports, function_name, port)
325
-
326
- for server in tool_sources:
327
- tool_functions = hydrate_mcp_tool_definitions(server)
328
- for tool_function in tool_functions:
329
- name = get_function_name(tool_function)
330
- prompt_functions.append(
331
- FunctionDefinition(
332
- name=name,
333
- description=tool_function.description,
334
- parameters=tool_function.parameters,
335
- )
336
- )
337
- port = create_port_condition(name)
338
- setattr(Ports, name, port)
363
+ function_name = get_function_name(function)
364
+ port = create_port_condition(function_name)
365
+ setattr(Ports, function_name, port)
339
366
 
340
367
  # Add the else port for when no function conditions match
341
368
  setattr(Ports, "default", Port.on_else())
@@ -397,7 +424,7 @@ def create_tool_router_node(
397
424
 
398
425
 
399
426
  def create_function_node(
400
- function: Tool,
427
+ function: ToolBase,
401
428
  tool_router_node: Type[ToolRouterNode],
402
429
  ) -> Type[BaseNode]:
403
430
  """
@@ -438,17 +465,6 @@ def create_function_node(
438
465
  },
439
466
  )
440
467
  return node
441
- elif isinstance(function, MCPToolDefinition):
442
- node = type(
443
- f"MCPNode_{function.name}",
444
- (MCPNode,),
445
- {
446
- "mcp_tool": function,
447
- "function_call_output": tool_router_node.Outputs.results,
448
- "__module__": __name__,
449
- },
450
- )
451
- return node
452
468
  elif is_workflow_class(function):
453
469
  node = type(
454
470
  f"DynamicInlineSubworkflowNode_{function.__name__}",
@@ -474,13 +490,52 @@ def create_function_node(
474
490
  return node
475
491
 
476
492
 
477
- def get_function_name(function: Tool) -> str:
493
+ def create_mcp_tool_node(
494
+ tool_def: MCPToolDefinition,
495
+ tool_router_node: Type[ToolRouterNode],
496
+ ) -> Type[BaseNode]:
497
+ node = type(
498
+ f"MCPNode_{tool_def.name}",
499
+ (MCPNode,),
500
+ {
501
+ "mcp_tool": tool_def,
502
+ "function_call_output": tool_router_node.Outputs.results,
503
+ "__module__": __name__,
504
+ },
505
+ )
506
+ return node
507
+
508
+
509
+ def create_else_node(
510
+ tool_router_node: Type[ToolRouterNode],
511
+ ) -> Type[ElseNode]:
512
+ class Ports(ElseNode.Ports):
513
+ loop = Port.on_if(
514
+ ToolCallingState.current_prompt_output_index.less_than(tool_router_node.Outputs.results.length())
515
+ | ToolCallingState.current_function_calls_processed.greater_than(0)
516
+ )
517
+ end = Port.on_else()
518
+
519
+ node = type(
520
+ f"{tool_router_node.__name__}_ElseNode",
521
+ (ElseNode,),
522
+ {
523
+ "Ports": Ports,
524
+ "__module__": __name__,
525
+ },
526
+ )
527
+ return node
528
+
529
+
530
+ def get_function_name(function: ToolBase) -> str:
478
531
  if isinstance(function, DeploymentDefinition):
479
532
  name = str(function.deployment_id or function.deployment_name)
480
533
  return name.replace("-", "")
481
534
  elif isinstance(function, ComposioToolDefinition):
482
535
  return function.name
483
- elif isinstance(function, MCPToolDefinition):
484
- return f"{function.server.name}__{function.name}"
485
536
  else:
486
537
  return snake_case(function.__name__)
538
+
539
+
540
+ def get_mcp_tool_name(tool_def: MCPToolDefinition) -> str:
541
+ return f"{tool_def.server.name}__{tool_def.name}"
@@ -13,7 +13,7 @@ from typing import ( # type: ignore[attr-defined]
13
13
  )
14
14
 
15
15
  from vellum.client.core.pydantic_utilities import UniversalBaseModel
16
- from vellum.workflows.types.definition import ComposioToolDefinition, DeploymentDefinition, MCPServer, MCPToolDefinition
16
+ from vellum.workflows.types.definition import ComposioToolDefinition, DeploymentDefinition, MCPServer
17
17
 
18
18
  if TYPE_CHECKING:
19
19
  from vellum.workflows.workflows.base import BaseWorkflow
@@ -51,7 +51,5 @@ class ConditionType(Enum):
51
51
 
52
52
 
53
53
  # Type alias for functions that can be called in tool calling nodes
54
- Tool = Union[Callable[..., Any], DeploymentDefinition, Type["BaseWorkflow"], ComposioToolDefinition, MCPToolDefinition]
55
-
56
- # Type alias for sources that provide tools to tool calling nodes
57
- ToolSource = Union[MCPServer]
54
+ ToolBase = Union[Callable[..., Any], DeploymentDefinition, Type["BaseWorkflow"], ComposioToolDefinition]
55
+ Tool = Union[ToolBase, MCPServer]
@@ -2,7 +2,7 @@ import importlib
2
2
  import inspect
3
3
  from types import FrameType
4
4
  from uuid import UUID
5
- from typing import Annotated, Any, Dict, List, Literal, Optional, Union
5
+ from typing import Annotated, Any, Dict, Literal, Optional, Union
6
6
 
7
7
  from pydantic import BeforeValidator
8
8
 
@@ -111,11 +111,7 @@ class ComposioToolDefinition(UniversalBaseModel):
111
111
  toolkit: str # "GITHUB", "SLACK", etc.
112
112
  action: str # Specific action like "GITHUB_CREATE_AN_ISSUE"
113
113
  description: str
114
-
115
- display_name: Optional[str] = None
116
- parameters: Optional[Dict[str, Any]] = None
117
- version: Optional[str] = None
118
- tags: Optional[List[str]] = None
114
+ user_id: Optional[str] = None
119
115
 
120
116
  @property
121
117
  def name(self) -> str:
@@ -39,13 +39,16 @@ def test_deployment_definition(deployment_value, expected_deployment_id, expecte
39
39
  def test_composio_tool_definition_creation():
40
40
  """Test that ComposioToolDefinition can be created with required fields."""
41
41
  composio_tool = ComposioToolDefinition(
42
- toolkit="GITHUB", action="GITHUB_CREATE_AN_ISSUE", description="Create a new issue in a GitHub repository"
42
+ toolkit="GITHUB",
43
+ action="GITHUB_CREATE_AN_ISSUE",
44
+ description="Create a new issue in a GitHub repository",
45
+ user_id=None,
43
46
  )
44
47
 
45
48
  assert composio_tool.toolkit == "GITHUB"
46
49
  assert composio_tool.action == "GITHUB_CREATE_AN_ISSUE"
47
50
  assert composio_tool.description == "Create a new issue in a GitHub repository"
48
- assert composio_tool.display_name is None
51
+ assert composio_tool.user_id is None
49
52
  assert composio_tool.name == "github_create_an_issue"
50
53
 
51
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vellum-ai
3
- Version: 1.0.9
3
+ Version: 1.0.11
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.9,<4.0
@@ -94,9 +94,9 @@ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_search_node_
94
94
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_subworkflow_deployment_serialization.py,sha256=XWrhHg_acLsRHwjstBAii9Pmes9oXFtAUWSAVF1oSBc,11225
95
95
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_templating_node_serialization.py,sha256=V8b6gKghLlO7PJI8xeNdnfn8aII0W_IFQvSQBQM62UQ,7721
96
96
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_terminal_node_serialization.py,sha256=hDWtKXmGI1CKhTwTNqpu_d5RkE5n7SolMLtgd87KqTI,3856
97
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py,sha256=gonapBCyDDt3qc7U02PCuKyPS8f3YiSAZ7QD86CH1Fw,3794
98
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py,sha256=pZJVn7oXyTuKvyLOM6pj00ulSJR2QtVd9h2VwBv4_mg,26522
99
- vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=wKJlecy8kxlOslTlPHRFUb-zFBGpNq6S7eeOrswB9-I,10241
97
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_composio_serialization.py,sha256=AUfULtIangNYkvLH3jd2Ar8X5ulW4tGmezeCfMmXFUU,3697
98
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_inline_workflow_serialization.py,sha256=4t1lkN2nsZF6lFqP6QnskUQWJlhasF8C2_f6atzk8ZY,26298
99
+ vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_serialization.py,sha256=B0rDsCvO24qPp0gkmj8SdTDY5CxZYkvKwknsKBuAPyA,10017
100
100
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_tool_calling_node_workflow_deployment_serialization.py,sha256=mova0sPD3evHiHIN1O0VynxlCp-uOcEIKve5Pd_oCDg,4069
101
101
  vellum_ee/workflows/display/tests/workflow_serialization/test_basic_try_node_serialization.py,sha256=pLCyMScV88DTBXRH7jXaXOEA1GBq8NIipCUFwIAWnwI,2771
102
102
  vellum_ee/workflows/display/tests/workflow_serialization/test_complex_terminal_node_serialization.py,sha256=J4ouI8KxbMfxQP2Zq_9cWMGYgbjCWmKzjCJEtnSJb0I,5829
@@ -105,7 +105,7 @@ vellum_ee/workflows/display/types.py,sha256=i4T7ElU5b5h-nA1i3scmEhO1BqmNDc4eJDHa
105
105
  vellum_ee/workflows/display/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
106
  vellum_ee/workflows/display/utils/auto_layout.py,sha256=f4GiLn_LazweupfqTpubcdtdfE_vrOcmZudSsnYIY9E,3906
107
107
  vellum_ee/workflows/display/utils/exceptions.py,sha256=LSwwxCYNxFkf5XMUcFkaZKpQ13OSrI7y_bpEUwbKVk0,169
108
- vellum_ee/workflows/display/utils/expressions.py,sha256=H5_yWpX4QQNr83iIIocOHddTpktsHbVDp1ylayvjjTE,15840
108
+ vellum_ee/workflows/display/utils/expressions.py,sha256=YZjd6wrOkmmnTe5LstKaVaBqmR8Q8XS81QzSFwkLtN0,16324
109
109
  vellum_ee/workflows/display/utils/registry.py,sha256=fWIm5Jj-10gNFjgn34iBu4RWv3Vd15ijtSN0V97bpW8,1513
110
110
  vellum_ee/workflows/display/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
111
  vellum_ee/workflows/display/utils/tests/test_auto_layout.py,sha256=vfXI769418s9vda5Gb5NFBH747WMOwSgHRXeLCTLVm8,2356
@@ -145,7 +145,7 @@ vellum/client/README.md,sha256=Dle5iytCXxP1pNeNd7uZyhFo0rl7tp7vU7s8gmi10OQ,4863
145
145
  vellum/client/__init__.py,sha256=KmkyOgReuTsjmXF3WC_dPQ9QqJgYrB3Sr8_LcSUIQyI,125258
146
146
  vellum/client/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
147
147
  vellum/client/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
148
- vellum/client/core/client_wrapper.py,sha256=K6kF1J_NBmrtjJs0H4OqVoVsJgY3ivrRe4FzhceFTis,2383
148
+ vellum/client/core/client_wrapper.py,sha256=GLUu-tM9O4VyvaRt1Uz-BgKMqUFNR3H4hdD14V7NGqM,2385
149
149
  vellum/client/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
150
150
  vellum/client/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
151
151
  vellum/client/core/http_client.py,sha256=cKs2w0ybDBk1wHQf-fTALm_MmvaMe3cZKcYJxqmCxkE,19539
@@ -1530,14 +1530,15 @@ vellum/workflows/__init__.py,sha256=CssPsbNvN6rDhoLuqpEv7MMKGa51vE6dvAh6U31Pcio,
1530
1530
  vellum/workflows/constants.py,sha256=2yg4_uo5gpqViy3ZLSwfC8qTybleYCtOnhA4Rj6bacM,1310
1531
1531
  vellum/workflows/context.py,sha256=jvMuyeRluay8BQa7GX1TqUlmoHLCycAVYKkp87sfXSo,1644
1532
1532
  vellum/workflows/descriptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1533
- vellum/workflows/descriptors/base.py,sha256=nZeCuuoJj3eJJjhrqOyfBB4FLUkN6fuO8PDdx6YDkzc,15373
1533
+ vellum/workflows/descriptors/base.py,sha256=fRnRkECyDjfz2QEDCY9Q5mAerlJ6jR0R4nE-MP2VP_k,16558
1534
1534
  vellum/workflows/descriptors/exceptions.py,sha256=gUy4UD9JFUKSeQnQpeuDSLiRqWjWiIsxLahB7p_q3JY,54
1535
1535
  vellum/workflows/descriptors/tests/test_utils.py,sha256=HJ5DoRz0sJvViGxyZ_FtytZjxN2J8xTkGtaVwCy6Q90,6928
1536
- vellum/workflows/descriptors/utils.py,sha256=1siECBf6AI54gwwUwkF6mP9rYsRryUGaOYBbMpQaceM,3848
1536
+ vellum/workflows/descriptors/utils.py,sha256=7QvS_IOZWIoKvhNwpYBOTP3NasLSIBKTnhyASry2HCM,4320
1537
1537
  vellum/workflows/edges/__init__.py,sha256=wSkmAnz9xyi4vZwtDbKxwlplt2skD7n3NsxkvR_pUus,50
1538
1538
  vellum/workflows/edges/edge.py,sha256=N0SnY3gKVuxImPAdCbPMPlHJIXbkQ3fwq_LbJRvVMFc,677
1539
- vellum/workflows/emitters/__init__.py,sha256=YyOgaoLtVW8eFNEWODzCYb0HzL0PoSeNRf4diJ1Y0dk,80
1540
- vellum/workflows/emitters/base.py,sha256=D5SADKIvnbgKwIBgYm77jaqvpo1o0rz4MmuX_muRqQU,359
1539
+ vellum/workflows/emitters/__init__.py,sha256=d9QFOI3eVg6rzpSFLvrjkDYXWikf1tcp3ruTRa2Boyc,143
1540
+ vellum/workflows/emitters/base.py,sha256=Tcp13VMB-GMwEJdl-6XTPckspdOdwpMgBx22-PcQxds,892
1541
+ vellum/workflows/emitters/vellum_emitter.py,sha256=VRJgyEs6RnikwlPBUu1s7BD8flVeuM3QgTeQLUnaDuE,5051
1541
1542
  vellum/workflows/environment/__init__.py,sha256=TJz0m9dwIs6YOwCTeuN0HHsU-ecyjc1OJXx4AFy83EQ,121
1542
1543
  vellum/workflows/environment/environment.py,sha256=Ck3RPKXJvtMGx_toqYQQQF-ZwXm5ijVwJpEPTeIJ4_Q,471
1543
1544
  vellum/workflows/errors/__init__.py,sha256=tWGPu5xyAU8gRb8_bl0fL7OfU3wxQ9UH6qVwy4X4P_Q,113
@@ -1552,7 +1553,8 @@ vellum/workflows/events/types.py,sha256=jc6vEcydzYETfK3u2Cx1BfUDmYh3Jxa86sdsrrQ5
1552
1553
  vellum/workflows/events/workflow.py,sha256=cR2aG6A-JqvLMKFqonDhKjSg496qldEtuks4BXXMTrY,7768
1553
1554
  vellum/workflows/exceptions.py,sha256=NiBiR3ggfmPxBVqD-H1SqmjI-7mIn0EStSN1BqApvCM,1213
1554
1555
  vellum/workflows/expressions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1555
- vellum/workflows/expressions/accessor.py,sha256=4OvF9JQKHSyYLTz7gGprcw3Da5-zA8D0Co0j1eIeer0,4141
1556
+ vellum/workflows/expressions/accessor.py,sha256=3lu1-_-dBfZdJvtX-q66jbmRAZtqIfdsh_3_JNuzg1E,4462
1557
+ vellum/workflows/expressions/add.py,sha256=Rr1O83nksL5Z0kam4eaQOokvDrEwlUg7LqWnXzGUW40,1226
1556
1558
  vellum/workflows/expressions/and_.py,sha256=I7lNqrUM3-m_5hmjjiMhaHhJtKcLj39kEFVWPDOqwfo,916
1557
1559
  vellum/workflows/expressions/begins_with.py,sha256=FnWsQXbENm0ZwkfEP7dR8Qx4_MMrzj6C1yqAV2KaNHw,1123
1558
1560
  vellum/workflows/expressions/between.py,sha256=dVeddT6YA91eOAlE1Utg7C7gnCiYE7WP-dg17yXUeAY,1492
@@ -1577,16 +1579,21 @@ vellum/workflows/expressions/is_not_null.py,sha256=EoHXFgZScKP_BM2a5Z7YFQN6l7RME
1577
1579
  vellum/workflows/expressions/is_not_undefined.py,sha256=9s-RUQBqM17-_nIRvwsHuarLdHVtrxVuwnqBNJEtmh0,735
1578
1580
  vellum/workflows/expressions/is_null.py,sha256=C75ALGlG_sTGcxI46tm9HtgPVfJ7DwTIyKzX8qtEiDU,660
1579
1581
  vellum/workflows/expressions/is_undefined.py,sha256=uUBK3rxYbwoeRq36AGFc7d61hXzTp8UacQAi-1JbaW0,724
1582
+ vellum/workflows/expressions/length.py,sha256=Gq4eBXnLLmuyhKHwERcvBd4qLHLkw_JebpZ778gw08M,1274
1580
1583
  vellum/workflows/expressions/less_than.py,sha256=chY9puJ6jDB2EinjfyGNrSplJ1NJC-BB-GGSSB33bqI,1237
1581
1584
  vellum/workflows/expressions/less_than_or_equal_to.py,sha256=JtTDBa8yFKy3fGaCOA1tb_5s1JkY8FFnH6kpoeXGnT4,1267
1585
+ vellum/workflows/expressions/minus.py,sha256=qTIuOF3knMwwGiA9BNGvMP6vVw3z0g5wr4LziaYMRIE,1232
1582
1586
  vellum/workflows/expressions/not_between.py,sha256=ZtRJeJDSSlOvajL8YoBoh5o_khjIn9xSSeQCnXYbHFE,1506
1583
1587
  vellum/workflows/expressions/not_in.py,sha256=pFvwkFPsn3WJw61ssFgM2U1dqWEeglfz4FVT4xwm5Mc,1144
1584
1588
  vellum/workflows/expressions/or_.py,sha256=s-8YdMSSCDS2yijR38kguwok3iqmDMMgDYKV93b4O4s,914
1585
1589
  vellum/workflows/expressions/parse_json.py,sha256=xsk6j3HF7bU1yF6fwt5P9Ugcyd5D9ZXrdng11FRilUI,1088
1586
1590
  vellum/workflows/expressions/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1587
1591
  vellum/workflows/expressions/tests/test_accessor.py,sha256=g2z0mJjuWwVKeXS0yGoFW-aRmT5n_LrhfuBorSmj9kI,7585
1592
+ vellum/workflows/expressions/tests/test_add.py,sha256=_MjlRvIGAVM5wve2ru5jc_5Ae4x_ywvh4vN0S2yQ-8M,1615
1588
1593
  vellum/workflows/expressions/tests/test_concat.py,sha256=fDHXlmFvCtqPkdZQD9Qs22i6sJq_MJjbUXCnTlSMvA0,1666
1589
1594
  vellum/workflows/expressions/tests/test_expressions.py,sha256=3b6k8xs-CItBBw95NygFLUNoNPKxI4VA1GyWbkMtqyI,11623
1595
+ vellum/workflows/expressions/tests/test_length.py,sha256=pQA1tYSwqxE6euclboY024NXEOs7yaVgwTKkMPYUT08,1035
1596
+ vellum/workflows/expressions/tests/test_minus.py,sha256=pq7dvdRGNhSSn95LGNzRErsYUsFk5SpOKHDcSR5QToc,1632
1590
1597
  vellum/workflows/expressions/tests/test_parse_json.py,sha256=zpB_qE5_EwWQL7ULQUJm0o1PRSfWZdAqZNW6Ah13oJE,1059
1591
1598
  vellum/workflows/graph/__init__.py,sha256=3sHlay5d_-uD7j3QJXiGl0WHFZZ_QScRvgyDhN2GhHY,74
1592
1599
  vellum/workflows/graph/graph.py,sha256=GGR8cGpSuNWPIiTWNWsj6l70upb5nIxAyFcn7VdaJIs,5506
@@ -1597,7 +1604,7 @@ vellum/workflows/inputs/base.py,sha256=w3owT5B3rLBmIj-v-jL2l-HD4yd3hXK9RmHVd557B
1597
1604
  vellum/workflows/inputs/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1598
1605
  vellum/workflows/inputs/tests/test_inputs.py,sha256=lioA8917mFLYq7Ml69UNkqUjcWbbxkxnpIEJ4FBaYBk,2206
1599
1606
  vellum/workflows/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1600
- vellum/workflows/integrations/composio_service.py,sha256=Wo1IKHr_CzrHFQHR_hjVcKap3JLwlV_TEbKsZcuR6Sw,5664
1607
+ vellum/workflows/integrations/composio_service.py,sha256=rSliaZtNiBcDSvDxz9k5i1KkyUIrbxyegu0yU9cDByU,6023
1601
1608
  vellum/workflows/integrations/mcp_service.py,sha256=SaOLg76JBAiBDAMUn04mxVWmf2Btobd1kDjc8B1atng,8712
1602
1609
  vellum/workflows/logging.py,sha256=_a217XogktV4Ncz6xKFz7WfYmZAzkfVRVuC0rWob8ls,437
1603
1610
  vellum/workflows/nodes/__init__.py,sha256=aVdQVv7Y3Ro3JlqXGpxwaU2zrI06plDHD2aumH5WUIs,1157
@@ -1640,7 +1647,7 @@ vellum/workflows/nodes/displayable/bases/api_node/node.py,sha256=iUtdPsbJs1jwo3V
1640
1647
  vellum/workflows/nodes/displayable/bases/api_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1641
1648
  vellum/workflows/nodes/displayable/bases/api_node/tests/test_node.py,sha256=Pf51DIyhtUxx-pCu0zJYDB4Z5_IW5mRwkJIoPT53_9I,3894
1642
1649
  vellum/workflows/nodes/displayable/bases/base_prompt_node/__init__.py,sha256=Org3xTvgp1pA0uUXFfnJr29D3HzCey2lEdYF4zbIUgo,70
1643
- vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=EJsGaz8Umss6-JWGGYbJp93ZHx3IlZQWAySlHAdNYtY,4466
1650
+ vellum/workflows/nodes/displayable/bases/base_prompt_node/node.py,sha256=ea20icDM1HB942wkH-XtXNSNCBDcjeOiN3vowkHL4fs,4477
1644
1651
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/__init__.py,sha256=Hl35IAoepRpE-j4cALaXVJIYTYOF3qszyVbxTj4kS1s,82
1645
1652
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/node.py,sha256=hy_fy4zImhpnHuPczKtOLhv_uOmvxvJsQA9Zl9DTmSw,12851
1646
1653
  vellum/workflows/nodes/displayable/bases/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1671,7 +1678,7 @@ vellum/workflows/nodes/displayable/guardrail_node/test_node.py,sha256=SAGv6hSFcB
1671
1678
  vellum/workflows/nodes/displayable/guardrail_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1672
1679
  vellum/workflows/nodes/displayable/guardrail_node/tests/test_node.py,sha256=X2pd6TI8miYxIa7rgvs1pHTEreyWcf77EyR0_Jsa700,2055
1673
1680
  vellum/workflows/nodes/displayable/inline_prompt_node/__init__.py,sha256=gSUOoEZLlrx35-tQhSAd3An8WDwBqyiQh-sIebLU9wU,74
1674
- vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=wgZ9bt9IFe5cqWSghfMlD1NgmFhRnuDLRzXzMhJomV0,2912
1681
+ vellum/workflows/nodes/displayable/inline_prompt_node/node.py,sha256=3jY-2UJarVJSz2eupt7c9Mp-Mk56U2meXU0d7c0KVNk,2941
1675
1682
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1676
1683
  vellum/workflows/nodes/displayable/inline_prompt_node/tests/test_node.py,sha256=bBHs90mV5SZ3rJPAL0wx4WWyawUA406LgMPOdvpZC_A,10923
1677
1684
  vellum/workflows/nodes/displayable/merge_node/__init__.py,sha256=J8IC08dSH7P76wKlNuxe1sn7toNGtSQdFirUbtPDEs0,60
@@ -1696,13 +1703,13 @@ vellum/workflows/nodes/displayable/tests/test_search_node_error_handling.py,sha2
1696
1703
  vellum/workflows/nodes/displayable/tests/test_search_node_wth_text_output.py,sha256=VepO5z1277c1y5N6LLIC31nnWD1aak2m5oPFplfJHHs,6935
1697
1704
  vellum/workflows/nodes/displayable/tests/test_text_prompt_deployment_node.py,sha256=dc3EEn1sOICpr3GdS8eyeFtExaGwWWcw9eHSdkRhQJU,2584
1698
1705
  vellum/workflows/nodes/displayable/tool_calling_node/__init__.py,sha256=3n0-ysmFKsr40CVxPthc0rfJgqVJeZuUEsCmYudLVRg,117
1699
- vellum/workflows/nodes/displayable/tool_calling_node/node.py,sha256=6uFt-_woayqyvbVGNJeWoiBQs2_VBtgTTdMX-Ztwx1I,7338
1700
- vellum/workflows/nodes/displayable/tool_calling_node/state.py,sha256=oQg_GAtc349nPB5BL_oeDYYD7q1qSDPAqjj8iA8OoAw,215
1706
+ vellum/workflows/nodes/displayable/tool_calling_node/node.py,sha256=RFoMIr4CVy50fjuXAFphwfW1oXeZo7s-JY4Bqvlphn0,7460
1707
+ vellum/workflows/nodes/displayable/tool_calling_node/state.py,sha256=CcBVb_YtwfSSka4ze678k6-qwmzMSfjfVP8_Y95feSo,302
1701
1708
  vellum/workflows/nodes/displayable/tool_calling_node/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1702
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py,sha256=UV0vZpU7-_tHcwnIq36WKwHrJXNurU4bdC3rfaw8eoU,4804
1703
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py,sha256=U14GS6YwJGpIA13nq4Qvo1YBEku5ZRL627ZWnybp4hg,8029
1704
- vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py,sha256=3TQeLD-HlB0OHEtUcADe4jl0XGi9YTv5FL4ZupDaSJA,8361
1705
- vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=shFC4Vm0vyqAILWsUTDOo_Ggn0_7GHKQlgZ0TPHohWQ,19180
1709
+ vellum/workflows/nodes/displayable/tool_calling_node/tests/test_composio_service.py,sha256=in1fbEz5x1tx3uKv9YXdvOncsHucNL8Ro6Go7lBuuOQ,8962
1710
+ vellum/workflows/nodes/displayable/tool_calling_node/tests/test_node.py,sha256=1QwfUOS26pesN6Ckqfm-RVlOSyjuF945vKC20AXedKw,8458
1711
+ vellum/workflows/nodes/displayable/tool_calling_node/tests/test_utils.py,sha256=om4FztVQ33jFZK_lbusi6khOM7zgzNCHlUcEb5-r6pU,8361
1712
+ vellum/workflows/nodes/displayable/tool_calling_node/utils.py,sha256=7B_8FY5xEjra3A3k6kcABnrgobqieCKNCEA6ijKKaW8,21284
1706
1713
  vellum/workflows/nodes/experimental/README.md,sha256=eF6DfIL8t-HbF9-mcofOMymKrraiBHDLKTlnBa51ZiE,284
1707
1714
  vellum/workflows/nodes/experimental/__init__.py,sha256=jCQgvZEknXKfuNhGSOou4XPfrPqZ1_XBj5F0n0fgiWM,106
1708
1715
  vellum/workflows/nodes/experimental/openai_chat_completion_node/__init__.py,sha256=lsyD9laR9p7kx5-BXGH2gUTM242UhKy8SMV0SR6S2iE,90
@@ -1749,12 +1756,12 @@ vellum/workflows/tests/test_sandbox.py,sha256=JKwaluI-lODQo7Ek9sjDstjL_WTdSqUlVi
1749
1756
  vellum/workflows/tests/test_undefined.py,sha256=zMCVliCXVNLrlC6hEGyOWDnQADJ2g83yc5FIM33zuo8,353
1750
1757
  vellum/workflows/types/__init__.py,sha256=KxUTMBGzuRCfiMqzzsykOeVvrrkaZmTTo1a7SLu8gRM,68
1751
1758
  vellum/workflows/types/code_execution_node_wrappers.py,sha256=3MNIoFZKzVzNS5qFLVuDwMV17QJw72zo7NRf52yMq5A,3074
1752
- vellum/workflows/types/core.py,sha256=ybQj70QjlVNSEXsdIO8Mug9EBIDEkyFPxYv4cnn_hM0,1482
1753
- vellum/workflows/types/definition.py,sha256=pK0fAXHw7C0AFpCoM4WGe1_MD-usupF4-m6ldo5AQXY,4568
1759
+ vellum/workflows/types/core.py,sha256=TggDVs2lVya33xvu374EDhMC1b7RRlAAs0zWLaF46BA,1385
1760
+ vellum/workflows/types/definition.py,sha256=ee55MvZs4scFgI7y3ykIcP_5kSTqb4ojNrtGmnvISTw,4437
1754
1761
  vellum/workflows/types/generics.py,sha256=8jptbEx1fnJV0Lhj0MpCJOT6yNiEWeTOYOwrEAb5CRU,1576
1755
1762
  vellum/workflows/types/stack.py,sha256=h7NE0vXR7l9DevFBIzIAk1Zh59K-kECQtDTKOUunwMY,1314
1756
1763
  vellum/workflows/types/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1757
- vellum/workflows/types/tests/test_definition.py,sha256=RsDoicu8A1dqJOGa-Ok866K8lnzn5L0Hez3lQijYD4c,5011
1764
+ vellum/workflows/types/tests/test_definition.py,sha256=AM2uaADSWb6QUAP_CwjeSuNayBjoZ_yQWjYefw0mbGI,5045
1758
1765
  vellum/workflows/types/tests/test_utils.py,sha256=UnZog59tR577mVwqZRqqWn2fScoOU1H6up0EzS8zYhw,2536
1759
1766
  vellum/workflows/types/utils.py,sha256=mTctHITBybpt4855x32oCKALBEcMNLn-9cCmfEKgJHQ,6498
1760
1767
  vellum/workflows/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1775,8 +1782,8 @@ vellum/workflows/workflows/event_filters.py,sha256=GSxIgwrX26a1Smfd-6yss2abGCnad
1775
1782
  vellum/workflows/workflows/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1776
1783
  vellum/workflows/workflows/tests/test_base_workflow.py,sha256=ptMntHzVyy8ZuzNgeTuk7hREgKQ5UBdgq8VJFSGaW4Y,20832
1777
1784
  vellum/workflows/workflows/tests/test_context.py,sha256=VJBUcyWVtMa_lE5KxdhgMu0WYNYnUQUDvTF7qm89hJ0,2333
1778
- vellum_ai-1.0.9.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1779
- vellum_ai-1.0.9.dist-info/METADATA,sha256=b1ciqHMubElgtkn0rm_nW7vFBfZ2KqdOVuogZ9ICOcE,5554
1780
- vellum_ai-1.0.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1781
- vellum_ai-1.0.9.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1782
- vellum_ai-1.0.9.dist-info/RECORD,,
1785
+ vellum_ai-1.0.11.dist-info/LICENSE,sha256=hOypcdt481qGNISA784bnAGWAE6tyIf9gc2E78mYC3E,1574
1786
+ vellum_ai-1.0.11.dist-info/METADATA,sha256=8M0wZ1WdaD1OxRcbUt8a0g6566qeU-QnXRHQ6heBKiU,5555
1787
+ vellum_ai-1.0.11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
1788
+ vellum_ai-1.0.11.dist-info/entry_points.txt,sha256=HCH4yc_V3J_nDv3qJzZ_nYS8llCHZViCDP1ejgCc5Ak,42
1789
+ vellum_ai-1.0.11.dist-info/RECORD,,
@@ -53,10 +53,7 @@ def test_serialize_workflow():
53
53
  "toolkit": "GITHUB",
54
54
  "action": "GITHUB_CREATE_AN_ISSUE",
55
55
  "description": "Create a new issue in a GitHub repository",
56
- "display_name": "Create GitHub Issue",
57
- "parameters": None,
58
- "version": None,
59
- "tags": None,
56
+ "user_id": None,
60
57
  }
61
58
 
62
59
  # AND the rest of the node structure should be correct
@@ -407,11 +407,6 @@ def test_serialize_workflow():
407
407
  ],
408
408
  },
409
409
  },
410
- {
411
- "id": "89084be2-0853-4483-9031-c24bdf872c32",
412
- "name": "tool_sources",
413
- "value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": []}},
414
- },
415
410
  {
416
411
  "id": "229cd1ca-dc2f-4586-b933-c4d4966f7bd1",
417
412
  "name": "parameters",
@@ -175,11 +175,6 @@ def test_serialize_workflow():
175
175
  ],
176
176
  },
177
177
  },
178
- {
179
- "id": "89084be2-0853-4483-9031-c24bdf872c32",
180
- "name": "tool_sources",
181
- "value": {"type": "CONSTANT_VALUE", "value": {"type": "JSON", "value": []}},
182
- },
183
178
  {
184
179
  "id": "229cd1ca-dc2f-4586-b933-c4d4966f7bd1",
185
180
  "name": "parameters",