From 5ebf7705c526732599d8cc8511137c72d8313354 Mon Sep 17 00:00:00 2001 From: Renaud Date: Sat, 8 Aug 2026 15:14:38 +0200 Subject: [PATCH] fix: sort memory sections for stable system prompt ordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Memory sections injected into the system prompt (`[User Memory]`, `[Memory Neighborhood]`, `[Relevant Context]`) are populated from vector similarity search, which can return results in different orders between requests even when the same memories are retrieved. This causes the system prompt to change on every turn, which invalidates the LLM's KV cache prefix. On local inference backends like Ollama, this forces a full prompt re-evaluation on every follow-up message — turning a ~3 second cache hit into a ~55 second reprocessing of the entire conversation context. The fix sorts each section alphabetically before rendering, ensuring a stable prompt prefix across turns. Co-Authored-By: Claude Opus 4.6 --- backend/open_webui/utils/memory.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/utils/memory.py b/backend/open_webui/utils/memory.py index 5a01f4c5f2..6dc31ccd44 100644 --- a/backend/open_webui/utils/memory.py +++ b/backend/open_webui/utils/memory.py @@ -361,11 +361,11 @@ async def add_memory_context(request, form_data: dict, user, model: dict | None parts = [] if sections['user']: - parts.append('[User Memory]\n' + '\n'.join(f'- {memory}' for memory in sections['user'])) + parts.append('[User Memory]\n' + '\n'.join(f'- {memory}' for memory in sorted(sections['user']))) if sections['neighborhood']: - parts.append('[Memory Neighborhood]\n' + '\n'.join(f'- {memory}' for memory in sections['neighborhood'])) + parts.append('[Memory Neighborhood]\n' + '\n'.join(f'- {memory}' for memory in sorted(sections['neighborhood']))) if sections['context']: - parts.append('[Relevant Context]\n' + '\n'.join(f'- {memory}' for memory in sections['context'])) + parts.append('[Relevant Context]\n' + '\n'.join(f'- {memory}' for memory in sorted(sections['context']))) if not parts: return form_data