From 0efcf6ed95524a9e606c55f48c3d4de5c196697d Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 17 Oct 2025 11:41:05 -0700 Subject: [PATCH] feat: support passing around multiple tool returns (#5535) --- letta/agents/letta_agent_v3.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/letta/agents/letta_agent_v3.py b/letta/agents/letta_agent_v3.py index 3b1ebe29..90b75f7c 100644 --- a/letta/agents/letta_agent_v3.py +++ b/letta/agents/letta_agent_v3.py @@ -456,7 +456,7 @@ class LettaAgentV3(LettaAgentV2): step_metrics=step_metrics, is_approval_response=approval_response is not None, tool_call_denials=tool_call_denials, - tool_return=tool_returns[0] if tool_returns else None, + tool_returns=tool_returns, ) aggregated_persisted.extend(persisted_messages) # NOTE: there is an edge case where persisted_messages is empty (the LLM did a "no-op") @@ -600,7 +600,7 @@ class LettaAgentV3(LettaAgentV2): is_approval_response: bool | None = None, tool_calls: list[ToolCall] = [], tool_call_denials: list[ToolCallDenial] = [], - tool_return: ToolReturn | None = None, + tool_returns: list[ToolReturn] = [], ) -> tuple[list[Message], bool, LettaStopReason | None]: """ Handle the final AI response once streaming completes, execute / validate tool calls, @@ -608,9 +608,9 @@ class LettaAgentV3(LettaAgentV2): Unified approach: treats single and multi-tool calls uniformly to reduce code duplication. """ - first_tool_call = tool_calls[0] if tool_calls else None - - if tool_return is not None: + if tool_returns: + assert len(tool_returns) == 1, "Only one tool return is supported" + tool_return = tool_returns[0] continue_stepping = True stop_reason = None tool_call_messages = [