fix(stats): align homepage model ranks

This commit is contained in:
Adam 2026-06-14 21:22:01 -05:00
parent dfb616f067
commit 9fdfa23f01
No known key found for this signature in database
GPG key ID: 9CB48779AF150E75

View file

@ -192,10 +192,18 @@ function buildStatsHomeData(
return {
updatedAt: new Date(latestUpdate).toISOString(),
usage: createUsageProductRecord((product) =>
createRangeRecord((range) => buildUsagePoints(normalized, product, range, getWindow(range, earliest, latest))),
createRangeRecord((range) =>
buildUsagePoints(
normalized,
product,
range,
getWindow(range, earliest, latest),
getWindow("1W", earliest, latest),
),
),
),
leaderboard: createUsageProductRecord((product) =>
createRangeRecord((range) => buildLeaderboard(normalized, product, getWindow(range, earliest, latest))),
createRangeRecord((range) => buildLeaderboard(normalized, product, getWindow("1W", earliest, latest))),
),
market: createRangeRecord((range) => buildMarketShare(providers, "Go", range, getWindow(range, earliest, latest))),
tokenCost: createTokenProductRecord((product) =>
@ -344,18 +352,22 @@ function emptyStatsHomeData(): StatsHomeData {
}
}
function buildUsagePoints(rows: StatMetricRow[], product: UsageProduct, range: UsageRange, window: DateWindow) {
const windowRows = rowsForProduct(rows, product, window.start, window.end)
const rankStart = Math.max(window.start, window.end - 7 * DAY_MS)
const modelOrder = aggregateByModel(rowsForProduct(rows, product, rankStart, window.end))
function buildUsagePoints(
rows: StatMetricRow[],
product: UsageProduct,
range: UsageRange,
window: DateWindow,
rankWindow: DateWindow,
) {
const modelOrder = aggregateByModelName(rowsForProduct(rows, product, rankWindow.start, rankWindow.end))
.toSorted((a, b) => b.totalTokens - a.totalTokens)
.slice(0, TOP_MODEL_SEGMENT_LIMIT)
.map((item) => ({ key: modelKey(item.provider, item.model), model: item.model }))
.map((item) => item.model)
return createBuckets(window, range).map((bucket) => {
const bucketRows = aggregateByModel(rowsForProduct(rows, product, bucket.start, bucket.end))
const byModel = new Map(bucketRows.map((item) => [modelKey(item.provider, item.model), item.totalTokens]))
const segmentTokens = modelOrder.map((model) => ({ model: model.model, tokens: byModel.get(model.key) ?? 0 }))
const bucketRows = aggregateByModelName(rowsForProduct(rows, product, bucket.start, bucket.end))
const byModel = new Map(bucketRows.map((item) => [item.model, item.totalTokens]))
const segmentTokens = modelOrder.map((model) => ({ model, tokens: byModel.get(model) ?? 0 }))
const knownTokens = segmentTokens.reduce((sum, item) => sum + item.tokens, 0)
const totalTokens = bucketRows.reduce((sum, item) => sum + item.totalTokens, 0)
return {
@ -368,23 +380,23 @@ function buildUsagePoints(rows: StatMetricRow[], product: UsageProduct, range: U
})
}
function buildLeaderboard(rows: StatMetricRow[], product: UsageProduct, window: DateWindow) {
function buildLeaderboard(rows: StatMetricRow[], product: UsageProduct, rankWindow: DateWindow) {
const previous = new Map(
aggregateByModel(rowsForProduct(rows, product, window.previousStart, window.previousEnd)).map((item) => [
modelKey(item.provider, item.model),
aggregateByModelName(rowsForProduct(rows, product, rankWindow.previousStart, rankWindow.previousEnd)).map((item) => [
item.model,
item.totalTokens,
]),
)
return aggregateByModel(rowsForProduct(rows, product, window.start, window.end))
.toSorted((a, b) => b.totalTokens - a.totalTokens)
return aggregateByModelName(rowsForProduct(rows, product, rankWindow.start, rankWindow.end))
.toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
.slice(0, 18)
.map((item, index) => ({
model: item.model,
provider: item.provider,
author: formatProvider(item.provider),
tokens: Math.round(item.totalTokens / 1_000_000_000),
change: leaderboardChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0),
change: leaderboardChange(item.totalTokens, previous.get(item.model) ?? 0),
rank: index + 1,
}))
}