|
|
@@ -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,
|
|
|
}))
|
|
|
}
|