mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-12 20:15:26 +00:00
fix(admin): keyset export paging, rollup-free spend, consistent totals
Review pass over the preceding commits. - The activity export paged by OFFSET. The journals are append-only and the feed is newest-first, so rows written mid-export shift the window down and repeat rows already emitted. Pages by keyset on (created_at, feed, id) now. - top_token_users and the per-user breakdown counted run-level rollup rows. A scheduled run already has a row per LLM call, so its spend was billed twice -- invisible while the column was tokens, obvious once it was dollars. Both now exclude them, matching every other spend query. - total_cost was summed from the per-model split, which drops rows with no model_id and so undercounted the figure printed above the series. Summed from the series instead. - The CSV export encoded its detail cell without the fallback the NDJSON branch had, so a non-JSON-native value would have failed the stream. - The activity view reset pagination in an effect, which fetched the stale page against the new filters before fetching again. Reset in the setters. - The audit taxonomy is no longer re-exported from the helper module; the one caller that wanted it imports from where it lives.
This commit is contained in:
1 parent
f6f8af8cef
commit
c2d1893992
9 files changed
+113
-47
No files matched your search
@@ -14,6 +14,9 @@ Two properties matter and are enforced here rather than at every call site:
|
||||
2. **Request context is optional.** Celery tasks (ingestion finishing, a
|
||||
scheduled run) have no Flask request; the row simply records without an IP
|
||||
or user agent instead of raising.
|
||||
|
||||
The event → category taxonomy the admin activity feed filters on lives in
|
||||
``docsgpt/audit_events.py``, which the storage layer needs too.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -23,14 +26,10 @@ from typing import Any, Optional
|
||||
|
||||
from flask import has_request_context, request
|
||||
|
||||
from docsgpt.audit_events import ACTIVITY_CATEGORIES, category_for
|
||||
from docsgpt.storage.db.repositories.auth_events import AuthEventsRepository
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Re-exported so route modules have one import for recording and classifying.
|
||||
__all__ = ["ACTIVITY_CATEGORIES", "category_for", "record_event"]
|
||||
|
||||
|
||||
def record_event(
|
||||
conn,
|
||||
|
||||
Reference in new issue
Block a user