diff --git a/backend/open_webui/models/chat_messages.py b/backend/open_webui/models/chat_messages.py index 97490c1602..ac75fcf973 100644 --- a/backend/open_webui/models/chat_messages.py +++ b/backend/open_webui/models/chat_messages.py @@ -169,7 +169,10 @@ class ChatMessageTable: info = data.get('info', {}) usage = info.get('usage') if info else None if usage: - existing.usage = usage + # Deep-merge: preserve existing keys not present in new data + # This prevents background tasks (follow-ups, title, tags) + # from accidentally clearing the primary response's token counts + existing.usage = {**(existing.usage or {}), **usage} existing.updated_at = now db.commit() db.refresh(existing) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 05e18e555f..fc8c2fc909 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -4626,6 +4626,7 @@ async def streaming_chat_response_handler(response, ctx): 'content': serialize_output(output), 'output': output, 'title': title, + **({'usage': usage} if usage else {}), } if not ENABLE_REALTIME_CHAT_SAVE: