fix(stats): show new for leaderboard deltas

This commit is contained in:
Adam 2026-06-08 08:34:24 -05:00
commit f116a55e4a
No known key found for this signature in database
GPG key ID: 9CB48779AF150E75
2 changed files with 16 additions and 4 deletions

View file

@ -956,7 +956,11 @@ function LeaderboardCard(props: {
</div> </div>
<div> <div>
<span>{props.entry.author}</span> <span>{props.entry.author}</span>
<span data-slot="delta" data-negative={props.entry.change < 0 ? "true" : undefined}> <span
data-slot="delta"
data-new={props.entry.change === null ? "true" : undefined}
data-negative={props.entry.change !== null && props.entry.change < 0 ? "true" : undefined}
>
{formatChange(props.entry.change)} {formatChange(props.entry.change)}
</span> </span>
</div> </div>
@ -978,7 +982,8 @@ function formatBillions(value: number) {
return `${value}B` return `${value}B`
} }
function formatChange(value: number) { function formatChange(value: number | null) {
if (value === null) return "New"
if (value > 0) return `+${value}%` if (value > 0) return `+${value}%`
return `${value}%` return `${value}%`
} }

View file

@ -14,7 +14,7 @@ export type LeaderboardEntry = {
provider: string provider: string
author: string author: string
tokens: number tokens: number
change: number change: number | null
rank: number rank: number
} }
export type TokenCostEntry = { model: string; total: number; input: number; output: number; cached: number } export type TokenCostEntry = { model: string; total: number; input: number; output: number; cached: number }
@ -96,6 +96,7 @@ const DAY_MS = 86_400_000
const TOKEN_SCALE = 1_000_000 const TOKEN_SCALE = 1_000_000
const DOLLARS_PER_MICROCENT = 1 / 100_000_000 const DOLLARS_PER_MICROCENT = 1 / 100_000_000
const METRIC_MODEL_LIMIT = 10 const METRIC_MODEL_LIMIT = 10
const LEADERBOARD_CHANGE_MIN_MULTIPLE = 10
const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] as const const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] as const
type StatMetricRow = Omit<ModelStatMetric, "updatedAt"> & { type StatMetricRow = Omit<ModelStatMetric, "updatedAt"> & {
@ -373,7 +374,7 @@ function buildLeaderboard(rows: StatMetricRow[], product: UsageProduct, window:
provider: item.provider, provider: item.provider,
author: formatProvider(item.provider), author: formatProvider(item.provider),
tokens: Math.round(item.totalTokens / 1_000_000_000), tokens: Math.round(item.totalTokens / 1_000_000_000),
change: percentChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0), change: leaderboardChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0),
rank: index + 1, rank: index + 1,
})) }))
} }
@ -864,6 +865,12 @@ function percentChange(current: number, previous: number) {
return Math.round(((current - previous) / previous) * 100) return Math.round(((current - previous) / previous) * 100)
} }
function leaderboardChange(current: number, previous: number) {
if (current <= 0) return 0
if (previous <= 0 || current >= previous * LEADERBOARD_CHANGE_MIN_MULTIPLE) return null
return percentChange(current, previous)
}
function round(value: number, digits: number) { function round(value: number, digits: number) {
return Number(value.toFixed(digits)) return Number(value.toFixed(digits))
} }