From 107a380e61a57d72a23ea84c6ba8b68e0e2936cb Mon Sep 17 00:00:00 2001 From: Nikolas de Hor Date: Wed, 18 Feb 2026 21:22:22 -0300 Subject: [PATCH] fix: prevent duplicate memory consolidation tasks per session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a `_consolidating` set to track which sessions have an active consolidation task. Skip creating a new task if one is already in progress for the same session key, and clean up the flag when done. This prevents the excessive API calls reported when messages exceed the memory_window threshold — previously every single message after the threshold triggered a new background consolidation. Closes #751 --- nanobot/agent/loop.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/nanobot/agent/loop.py b/nanobot/agent/loop.py index e5a5183..0e5d3b3 100644 --- a/nanobot/agent/loop.py +++ b/nanobot/agent/loop.py @@ -89,6 +89,7 @@ class AgentLoop: self._mcp_servers = mcp_servers or {} self._mcp_stack: AsyncExitStack | None = None self._mcp_connected = False + self._consolidating: set[str] = set() # Session keys with consolidation in progress self._register_default_tools() def _register_default_tools(self) -> None: @@ -318,8 +319,16 @@ class AgentLoop: return OutboundMessage(channel=msg.channel, chat_id=msg.chat_id, content="🐈 nanobot commands:\n/new — Start a new conversation\n/help — Show available commands") - if len(session.messages) > self.memory_window: - asyncio.create_task(self._consolidate_memory(session)) + if len(session.messages) > self.memory_window and session.key not in self._consolidating: + self._consolidating.add(session.key) + + async def _consolidate_and_unlock(): + try: + await self._consolidate_memory(session) + finally: + self._consolidating.discard(session.key) + + asyncio.create_task(_consolidate_and_unlock()) self._set_tool_context(msg.channel, msg.chat_id) initial_messages = self.context.build_messages(