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

fix(stats): show new for leaderboard deltas

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

+ 7 - 2
packages/stats/app/src/routes/index.tsx

@@ -956,7 +956,11 @@ function LeaderboardCard(props: {
           </div>
           <div>
             <span>{props.entry.author}</span>
-            <span data-slot="delta" data-negative={props.entry.change < 0 ? "true" : undefined}>
+            <span
+              data-slot="delta"
+              data-new={props.entry.change === null ? "true" : undefined}
+              data-negative={props.entry.change !== null && props.entry.change < 0 ? "true" : undefined}
+            >
               {formatChange(props.entry.change)}
             </span>
           </div>
@@ -978,7 +982,8 @@ function formatBillions(value: number) {
   return `${value}B`
 }
 
-function formatChange(value: number) {
+function formatChange(value: number | null) {
+  if (value === null) return "New"
   if (value > 0) return `+${value}%`
   return `${value}%`
 }

+ 9 - 2
packages/stats/core/src/domain/home.ts

@@ -14,7 +14,7 @@ export type LeaderboardEntry = {
   provider: string
   author: string
   tokens: number
-  change: number
+  change: number | null
   rank: number
 }
 export type TokenCostEntry = { model: string; total: number; input: number; output: number; cached: number }
@@ -96,6 +96,7 @@ const DAY_MS = 86_400_000
 const TOKEN_SCALE = 1_000_000
 const DOLLARS_PER_MICROCENT = 1 / 100_000_000
 const METRIC_MODEL_LIMIT = 10
+const LEADERBOARD_CHANGE_MIN_MULTIPLE = 10
 const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] as const
 
 type StatMetricRow = Omit<ModelStatMetric, "updatedAt"> & {
@@ -373,7 +374,7 @@ function buildLeaderboard(rows: StatMetricRow[], product: UsageProduct, window:
       provider: item.provider,
       author: formatProvider(item.provider),
       tokens: Math.round(item.totalTokens / 1_000_000_000),
-      change: percentChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0),
+      change: leaderboardChange(item.totalTokens, previous.get(modelKey(item.provider, item.model)) ?? 0),
       rank: index + 1,
     }))
 }
@@ -864,6 +865,12 @@ function percentChange(current: number, previous: number) {
   return Math.round(((current - previous) / previous) * 100)
 }
 
+function leaderboardChange(current: number, previous: number) {
+  if (current <= 0) return 0
+  if (previous <= 0 || current >= previous * LEADERBOARD_CHANGE_MIN_MULTIPLE) return null
+  return percentChange(current, previous)
+}
+
 function round(value: number, digits: number) {
   return Number(value.toFixed(digits))
 }