From d1789c889beb534784bfe44a820b80feb0ccbbfa Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 28 Sep 2026 09:50:22 +0200 Subject: [PATCH] fix: server memory grows with every chat until a restart Every chat that got a reply left a small lock behind in the server process, so a long-running server kept one for every chat it had ever answered and only a restart gave the memory back. The lock is now dropped as soon as nothing is using it, so a finished reply leaves nothing behind per chat, while replies, sub-agent results and timers for the same chat still wait for each other as before. Fixes #31521 --- backend/open_webui/utils/subagents.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/subagents.py b/backend/open_webui/utils/subagents.py index 13b9699216..efb8161a0f 100644 --- a/backend/open_webui/utils/subagents.py +++ b/backend/open_webui/utils/subagents.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio import copy import time +import weakref from datetime import timedelta from uuid import uuid4 @@ -41,7 +42,7 @@ MUTATING_MEMORY_TOOLS = { _background_active: set[str] = set() _background_lock = asyncio.Lock() _foreground_semaphore: asyncio.Semaphore | None = None -_parent_locks: dict[str, asyncio.Lock] = {} +_parent_locks: weakref.WeakValueDictionary[str, asyncio.Lock] = weakref.WeakValueDictionary() def _build_request(source: Request, user_id: str, *, internal: bool) -> Request: