From 41e1f0165942876e04cf238a5cf1c7aeeb43b77f Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Thu, 18 Sep 2025 15:05:49 -0700 Subject: [PATCH] feat: Factor our approval parsing logic (#4782) Factor our approval parsing logic --- letta/agents/helpers.py | 8 ++++++++ letta/agents/letta_agent_v2.py | 10 ++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/letta/agents/helpers.py b/letta/agents/helpers.py index 0a865539..18130964 100644 --- a/letta/agents/helpers.py +++ b/letta/agents/helpers.py @@ -282,3 +282,11 @@ def _load_last_function_response(in_context_messages: list[Message]): except (json.JSONDecodeError, KeyError): raise ValueError(f"Invalid JSON format in message: {text_content}") return None + + +def _maybe_get_approval_messages(messages: list[Message]) -> Tuple[Message | None, Message | None]: + if len(messages) >= 2: + maybe_approval_request, maybe_approval_response = messages[-2], messages[-1] + if maybe_approval_request.role == "approval" and maybe_approval_response.role == "approval": + return maybe_approval_request, maybe_approval_response + return None, None diff --git a/letta/agents/letta_agent_v2.py b/letta/agents/letta_agent_v2.py index abe369c6..e2db5324 100644 --- a/letta/agents/letta_agent_v2.py +++ b/letta/agents/letta_agent_v2.py @@ -13,6 +13,7 @@ from letta.agents.ephemeral_summary_agent import EphemeralSummaryAgent from letta.agents.helpers import ( _build_rule_violation_result, _load_last_function_response, + _maybe_get_approval_messages, _pop_heartbeat, _prepare_in_context_messages_no_persist_async, _safe_load_tool_call_str, @@ -379,7 +380,7 @@ class LettaAgentV2(BaseAgentV2): try: self.last_function_response = _load_last_function_response(messages) valid_tools = await self._get_valid_tools() - approval_request, approval_response = await self._maybe_get_approval_messages(messages) + approval_request, approval_response = _maybe_get_approval_messages(messages) if approval_request and approval_response: tool_call = approval_request.tool_calls[0] reasoning_content = approval_request.content @@ -601,13 +602,6 @@ class LettaAgentV2(BaseAgentV2): self.last_function_response = None self.response_messages = [] - async def _maybe_get_approval_messages(self, messages: list[Message]) -> Tuple[Message | None, Message | None]: - if len(messages) >= 2: - maybe_approval_request, maybe_approval_response = messages[-2], messages[-1] - if maybe_approval_request.role == "approval" and maybe_approval_response.role == "approval": - return maybe_approval_request, maybe_approval_response - return None, None - @trace_method async def _check_run_cancellation(self, run_id) -> bool: try: