fix(stats): align homepage model ranks
This commit is contained in:
@@ -192,10 +192,18 @@ function buildStatsHomeData(
|
|||||||
return {
|
return {
|
||||||
updatedAt: new Date(latestUpdate).toISOString(),
|
updatedAt: new Date(latestUpdate).toISOString(),
|
||||||
usage: createUsageProductRecord((product) =>
|
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) =>
|
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))),
|
market: createRangeRecord((range) => buildMarketShare(providers, "Go", range, getWindow(range, earliest, latest))),
|
||||||
tokenCost: createTokenProductRecord((product) =>
|
tokenCost: createTokenProductRecord((product) =>
|
||||||
@@ -344,18 +352,22 @@ function emptyStatsHomeData(): StatsHomeData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildUsagePoints(rows: StatMetricRow[], product: UsageProduct, range: UsageRange, window: DateWindow) {
|
function buildUsagePoints(
|
||||||
const windowRows = rowsForProduct(rows, product, window.start, window.end)
|
rows: StatMetricRow[],
|
||||||
const rankStart = Math.max(window.start, window.end - 7 * DAY_MS)
|
product: UsageProduct,
|
||||||
const modelOrder = aggregateByModel(rowsForProduct(rows, product, rankStart, window.end))
|
range: UsageRange,
|
||||||
|
window: DateWindow,
|
||||||
|
rankWindow: DateWindow,
|
||||||
|
) {
|
||||||
|
const modelOrder = aggregateByModelName(rowsForProduct(rows, product, rankWindow.start, rankWindow.end))
|
||||||
.toSorted((a, b) => b.totalTokens - a.totalTokens)
|
.toSorted((a, b) => b.totalTokens - a.totalTokens)
|
||||||
.slice(0, TOP_MODEL_SEGMENT_LIMIT)
|
.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) => {
|
return createBuckets(window, range).map((bucket) => {
|
||||||
const bucketRows = aggregateByModel(rowsForProduct(rows, product, bucket.start, bucket.end))
|
const bucketRows = aggregateByModelName(rowsForProduct(rows, product, bucket.start, bucket.end))
|
||||||
const byModel = new Map(bucketRows.map((item) => [modelKey(item.provider, item.model), item.totalTokens]))
|
const byModel = new Map(bucketRows.map((item) => [item.model, item.totalTokens]))
|
||||||
const segmentTokens = modelOrder.map((model) => ({ model: model.model, tokens: byModel.get(model.key) ?? 0 }))
|
const segmentTokens = modelOrder.map((model) => ({ model, tokens: byModel.get(model) ?? 0 }))
|
||||||
const knownTokens = segmentTokens.reduce((sum, item) => sum + item.tokens, 0)
|
const knownTokens = segmentTokens.reduce((sum, item) => sum + item.tokens, 0)
|
||||||
const totalTokens = bucketRows.reduce((sum, item) => sum + item.totalTokens, 0)
|
const totalTokens = bucketRows.reduce((sum, item) => sum + item.totalTokens, 0)
|
||||||
return {
|
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(
|
const previous = new Map(
|
||||||
aggregateByModel(rowsForProduct(rows, product, window.previousStart, window.previousEnd)).map((item) => [
|
aggregateByModelName(rowsForProduct(rows, product, rankWindow.previousStart, rankWindow.previousEnd)).map((item) => [
|
||||||
modelKey(item.provider, item.model),
|
item.model,
|
||||||
item.totalTokens,
|
item.totalTokens,
|
||||||
]),
|
]),
|
||||||
)
|
)
|
||||||
|
|
||||||
return aggregateByModel(rowsForProduct(rows, product, window.start, window.end))
|
return aggregateByModelName(rowsForProduct(rows, product, rankWindow.start, rankWindow.end))
|
||||||
.toSorted((a, b) => b.totalTokens - a.totalTokens)
|
.toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
|
||||||
.slice(0, 18)
|
.slice(0, 18)
|
||||||
.map((item, index) => ({
|
.map((item, index) => ({
|
||||||
model: item.model,
|
model: item.model,
|
||||||
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: leaderboardChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0),
|
change: leaderboardChange(item.totalTokens, previous.get(item.model) ?? 0),
|
||||||
rank: index + 1,
|
rank: index + 1,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user