feat(usage): expanded daily stats with detailed token breakdown (#385)
* feat(usage): expanded daily stats with detailed token breakdown * feat(usage): separate cache read and cache write in daily trend table
This commit is contained in:
@@ -783,8 +783,10 @@ export async function getUsageStatsFromDb(
|
||||
const byDay = db.prepare(`
|
||||
SELECT
|
||||
date(started_at, 'unixepoch') AS date,
|
||||
COALESCE(SUM(COALESCE(input_tokens, 0) + COALESCE(output_tokens, 0)), 0) AS tokens,
|
||||
COALESCE(SUM(cache_read_tokens), 0) AS cache,
|
||||
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
||||
COALESCE(SUM(output_tokens), 0) AS output_tokens,
|
||||
COALESCE(SUM(cache_read_tokens), 0) AS cache_read_tokens,
|
||||
COALESCE(SUM(cache_write_tokens), 0) AS cache_write_tokens,
|
||||
COUNT(*) AS sessions,
|
||||
COALESCE(SUM(COALESCE(actual_cost_usd, estimated_cost_usd, 0)), 0) AS cost
|
||||
FROM sessions
|
||||
@@ -793,9 +795,12 @@ export async function getUsageStatsFromDb(
|
||||
ORDER BY date ASC
|
||||
`).all(since).map(row => ({
|
||||
date: String(row.date || ''),
|
||||
tokens: normalizeNumber(row.tokens),
|
||||
cache: normalizeNumber(row.cache),
|
||||
input_tokens: normalizeNumber(row.input_tokens),
|
||||
output_tokens: normalizeNumber(row.output_tokens),
|
||||
cache_read_tokens: normalizeNumber(row.cache_read_tokens),
|
||||
cache_write_tokens: normalizeNumber(row.cache_write_tokens),
|
||||
sessions: normalizeNumber(row.sessions),
|
||||
errors: 0,
|
||||
cost: normalizeNumber(row.cost),
|
||||
}))
|
||||
|
||||
|
||||
@@ -137,9 +137,12 @@ export interface UsageStatsModelRow {
|
||||
|
||||
export interface UsageStatsDailyRow {
|
||||
date: string
|
||||
tokens: number
|
||||
cache: number
|
||||
input_tokens: number
|
||||
output_tokens: number
|
||||
cache_read_tokens: number
|
||||
cache_write_tokens: number
|
||||
sessions: number
|
||||
errors: number
|
||||
cost: number
|
||||
}
|
||||
|
||||
@@ -200,14 +203,16 @@ export function getLocalUsageStats(profile?: string, days = 30): LocalUsageStats
|
||||
|
||||
const byDay = db.prepare(`
|
||||
SELECT DATE(created_at / 1000, 'unixepoch') as date,
|
||||
COALESCE(SUM(input_tokens + output_tokens),0) as tokens,
|
||||
COALESCE(SUM(cache_read_tokens),0) as cache,
|
||||
COALESCE(SUM(input_tokens),0) as input_tokens,
|
||||
COALESCE(SUM(output_tokens),0) as output_tokens,
|
||||
COALESCE(SUM(cache_read_tokens),0) as cache_read_tokens,
|
||||
COALESCE(SUM(cache_write_tokens),0) as cache_write_tokens,
|
||||
COUNT(DISTINCT session_id) as sessions
|
||||
FROM ${TABLE}
|
||||
${whereClause}
|
||||
GROUP BY date
|
||||
ORDER BY date
|
||||
`).all(...params) as Array<{ date: string; tokens: number; cache: number; sessions: number }>
|
||||
`).all(...params) as Array<{ date: string; input_tokens: number; output_tokens: number; cache_read_tokens: number; cache_write_tokens: number; sessions: number }>
|
||||
|
||||
return {
|
||||
input_tokens: totals.input_tokens,
|
||||
@@ -217,6 +222,6 @@ export function getLocalUsageStats(profile?: string, days = 30): LocalUsageStats
|
||||
reasoning_tokens: totals.reasoning_tokens,
|
||||
sessions: totals.sessions,
|
||||
by_model: byModel,
|
||||
by_day: byDay.map(d => ({ ...d, cost: 0 })),
|
||||
by_day: byDay.map(d => ({ ...d, errors: 0, cost: 0 })),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user