diff --git a/packages/stats/core/src/domain/home.ts b/packages/stats/core/src/domain/home.ts index a819bdb063..e577a362a0 100644 --- a/packages/stats/core/src/domain/home.ts +++ b/packages/stats/core/src/domain/home.ts @@ -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, })) }