feat(dashboard): LLM stats answer who/what spends tokens — member scope chips and spend breakdowns
Nightly Build / build (push) Successful in 4m27s
Nightly Build / build (push) Successful in 4m27s
The stats section was designed single-user: four global charts, no attribution. Request metadata rows now carry the session's source and the frame's agent_id/depth (additive ensure_column), denormalized at log time by the LoggingModel from the owner's pool — off the turn's hot path, degrading to NULLs, never to a lost row. The dashboard gains member scope chips filtering every chart, and a breakdown row splitting the range's billed tokens by member, kind (chat / sub-agents / cron / system agents / channels), agent, model and provider — a sub-agent's spend is attributed to the sub-agent itself. Rows predating the columns group under 'older data'.
This commit is contained in:
+20
-1
@@ -419,7 +419,6 @@ export default {
|
||||
'dashboard.stats.requests': 'Requests {per}',
|
||||
'dashboard.stats.tokens': 'Tokens {per}',
|
||||
'dashboard.stats.latency': 'Avg latency (ms)',
|
||||
'dashboard.stats.models': 'Models',
|
||||
'dashboard.stats.per_min': '/ min',
|
||||
'dashboard.stats.per_hour': '/ hour',
|
||||
'dashboard.stats.per_day': '/ day',
|
||||
@@ -435,6 +434,26 @@ export default {
|
||||
'dashboard.stats.chart.non_cached': 'Non-cached',
|
||||
'dashboard.stats.chart.cache_hit': 'Cache hit: {pct}%',
|
||||
|
||||
'dashboard.stats.scope.all': 'Everyone',
|
||||
'dashboard.stats.sub.breakdown': 'How the spend splits in the selected range',
|
||||
'dashboard.stats.by_user': 'By member',
|
||||
'dashboard.stats.by_kind': 'By kind',
|
||||
'dashboard.stats.by_agent': 'By agent',
|
||||
'dashboard.stats.by_model': 'By model',
|
||||
'dashboard.stats.by_provider': 'By provider',
|
||||
'dashboard.stats.user_unknown': 'Unknown',
|
||||
'dashboard.stats.tip.requests': 'requests',
|
||||
|
||||
'dashboard.stats.kind.web': 'Chat',
|
||||
'dashboard.stats.kind.mobile': 'Mobile',
|
||||
'dashboard.stats.kind.telegram': 'Telegram',
|
||||
'dashboard.stats.kind.cron': 'Scheduled tasks',
|
||||
'dashboard.stats.kind.sub_agent': 'Sub-agents',
|
||||
'dashboard.stats.kind.event_triage': 'Event triage',
|
||||
'dashboard.stats.kind.memory_lint': 'Memory lint',
|
||||
'dashboard.stats.kind.conversation_review': 'Conversation review',
|
||||
'dashboard.stats.kind.unknown': 'Older data',
|
||||
|
||||
'dashboard.hero.subtitle': 'Your AI command centre — research, code, plan, and orchestrate. All in one place.',
|
||||
|
||||
'dashboard.banner.no_models.title': 'No LLM models configured.',
|
||||
|
||||
+20
-1
@@ -416,7 +416,6 @@ export default {
|
||||
'dashboard.stats.requests': 'Requêtes {per}',
|
||||
'dashboard.stats.tokens': 'Tokens {per}',
|
||||
'dashboard.stats.latency': 'Latence moyenne (ms)',
|
||||
'dashboard.stats.models': 'Modèles',
|
||||
'dashboard.stats.per_min': '/ min',
|
||||
'dashboard.stats.per_hour': '/ heure',
|
||||
'dashboard.stats.per_day': '/ jour',
|
||||
@@ -432,6 +431,26 @@ export default {
|
||||
'dashboard.stats.chart.non_cached': 'Non en cache',
|
||||
'dashboard.stats.chart.cache_hit': 'Cache hit : {pct}%',
|
||||
|
||||
'dashboard.stats.scope.all': 'Tous',
|
||||
'dashboard.stats.sub.breakdown': 'Répartition des dépenses sur la période sélectionnée',
|
||||
'dashboard.stats.by_user': 'Par membre',
|
||||
'dashboard.stats.by_kind': 'Par type',
|
||||
'dashboard.stats.by_agent': 'Par agent',
|
||||
'dashboard.stats.by_model': 'Par modèle',
|
||||
'dashboard.stats.by_provider': 'Par fournisseur',
|
||||
'dashboard.stats.user_unknown': 'Inconnu',
|
||||
'dashboard.stats.tip.requests': 'requêtes',
|
||||
|
||||
'dashboard.stats.kind.web': 'Chat',
|
||||
'dashboard.stats.kind.mobile': 'Mobile',
|
||||
'dashboard.stats.kind.telegram': 'Telegram',
|
||||
'dashboard.stats.kind.cron': 'Tâches planifiées',
|
||||
'dashboard.stats.kind.sub_agent': 'Sous-agents',
|
||||
'dashboard.stats.kind.event_triage': 'Triage des événements',
|
||||
'dashboard.stats.kind.memory_lint': 'Lint mémoire',
|
||||
'dashboard.stats.kind.conversation_review': 'Revue des conversations',
|
||||
'dashboard.stats.kind.unknown': 'Données anciennes',
|
||||
|
||||
'dashboard.hero.subtitle': 'Votre centre de commande IA — recherche, code, planification et orchestration. Tout en un seul endroit.',
|
||||
|
||||
'dashboard.banner.no_models.title': 'Aucun modèle LLM configuré.',
|
||||
|
||||
+20
-1
@@ -416,7 +416,6 @@ export default {
|
||||
'dashboard.stats.requests': 'Richieste {per}',
|
||||
'dashboard.stats.tokens': 'Token {per}',
|
||||
'dashboard.stats.latency': 'Latenza media (ms)',
|
||||
'dashboard.stats.models': 'Modelli',
|
||||
'dashboard.stats.per_min': '/ min',
|
||||
'dashboard.stats.per_hour': '/ h',
|
||||
'dashboard.stats.per_day': '/ giorno',
|
||||
@@ -432,6 +431,26 @@ export default {
|
||||
'dashboard.stats.chart.non_cached': 'Non in cache',
|
||||
'dashboard.stats.chart.cache_hit': 'Cache hit: {pct}%',
|
||||
|
||||
'dashboard.stats.scope.all': 'Tutti',
|
||||
'dashboard.stats.sub.breakdown': 'Come si distribuisce la spesa nel periodo selezionato',
|
||||
'dashboard.stats.by_user': 'Per membro',
|
||||
'dashboard.stats.by_kind': 'Per tipo',
|
||||
'dashboard.stats.by_agent': 'Per agente',
|
||||
'dashboard.stats.by_model': 'Per modello',
|
||||
'dashboard.stats.by_provider': 'Per provider',
|
||||
'dashboard.stats.user_unknown': 'Sconosciuto',
|
||||
'dashboard.stats.tip.requests': 'richieste',
|
||||
|
||||
'dashboard.stats.kind.web': 'Chat',
|
||||
'dashboard.stats.kind.mobile': 'Mobile',
|
||||
'dashboard.stats.kind.telegram': 'Telegram',
|
||||
'dashboard.stats.kind.cron': 'Attività pianificate',
|
||||
'dashboard.stats.kind.sub_agent': 'Sub-agent',
|
||||
'dashboard.stats.kind.event_triage': 'Triage eventi',
|
||||
'dashboard.stats.kind.memory_lint': 'Lint memoria',
|
||||
'dashboard.stats.kind.conversation_review': 'Revisione conversazioni',
|
||||
'dashboard.stats.kind.unknown': 'Dati precedenti',
|
||||
|
||||
'dashboard.hero.subtitle': 'Il tuo centro di comando AI — ricerca, codice, pianificazione e orchestrazione. Tutto in un unico posto.',
|
||||
|
||||
'dashboard.banner.no_models.title': 'Nessun modello LLM configurato.',
|
||||
|
||||
Reference in New Issue
Block a user