Skip to content

Commit a868073

Browse files
committed
fix: correct token usage accounting
1 parent 617f724 commit a868073

2 files changed

Lines changed: 16 additions & 4 deletions

File tree

backend/open_webui/models/chat_messages.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,18 @@ async def upsert_message(
200200
existing.error = data.get('error')
201201
if 'context_summary' in data or 'contextSummary' in data:
202202
existing.context_summary = data.get('context_summary') or data.get('contextSummary')
203-
# Extract and normalize usage
203+
# Usage is monotonic per message; keep the largest snapshot so
204+
# idempotent re-saves dedupe instead of double-counting.
204205
usage = get_usage(data)
205206
if usage:
206-
existing_usage = normalize_usage(existing.usage or {}) if existing.usage else {}
207-
existing.usage = existing_usage if usage == existing_usage else merge_usage(existing_usage, usage)
207+
208+
def _usage_total(value):
209+
return normalize_usage(value or {}).get('total_tokens', 0)
210+
211+
if existing.usage is None or _usage_total(usage) >= _usage_total(
212+
existing.usage
213+
):
214+
existing.usage = usage
208215
existing.updated_at = now
209216
await db.commit()
210217
await db.refresh(existing)

backend/open_webui/utils/middleware.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4018,7 +4018,12 @@ def set_last_text(out, text):
40184018
else:
40194019
output = []
40204020

4021-
usage = None
4021+
# Continue: seed from prior usage so the total spans both generations.
4022+
usage = (
4023+
normalize_usage(message['usage'])
4024+
if existing_output and message and message.get('usage')
4025+
else None
4026+
)
40224027
prior_output = []
40234028
last_response_id = None
40244029

0 commit comments

Comments
 (0)