Просмотр исходного кода

fix(stats): align homepage model ranks

Adam 2 месяцев назад
Родитель
Сommit
9fdfa23f01
1 измененных файлов с 28 добавлено и 16 удалено
  1. 28 16
      packages/stats/core/src/domain/home.ts

+ 28 - 16
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,
     }))
 }