소스 검색

fix(stats): rank model pages by week

Adam 2 달 전
부모
커밋
1338d7b47a
2개의 변경된 파일25개의 추가작업 그리고 14개의 파일을 삭제
  1. 11 7
      packages/stats/app/src/routes/[lab]/[model].tsx
  2. 14 7
      packages/stats/core/src/domain/home.ts

+ 11 - 7
packages/stats/app/src/routes/[lab]/[model].tsx

@@ -262,8 +262,10 @@ function ModelHero(props: { data: StatsModelData | null; catalog: ModelCatalogEn
           >
             {(data) => (
               <p>
-                Ranked #{data().rank} across recent OpenCode token usage with {formatPercent(data().tokenShare)} of
-                observed volume.
+                {data().rank === null
+                  ? "Unranked across last week's OpenCode Go usage"
+                  : `Ranked #${data().rank} across last week's OpenCode Go usage`}{" "}
+                with {formatPercent(data().tokenShare)} of observed 2M volume.
               </p>
             )}
           </Show>
@@ -278,9 +280,9 @@ function ModelHero(props: { data: StatsModelData | null; catalog: ModelCatalogEn
         <Show when={props.data} fallback={<ModelCatalogCallout catalog={props.catalog} />}>
           {(data) => (
             <div data-component="model-rank-panel">
-              <span>Current Rank</span>
-              <strong>#{data().rank}</strong>
-              <p>{formatRankMoveLabel(data().previousRank, data().rank)}</p>
+              <span>7D Rank</span>
+              <strong>{data().rank === null ? "—" : `#${data().rank}`}</strong>
+              <p>{formatModelRankMoveLabel(data())}</p>
             </div>
           )}
         </Show>
@@ -810,8 +812,10 @@ function formatRankMove(previousRank: number, rank: number) {
   return "Even"
 }
 
-function formatRankMoveLabel(previousRank: number | null, rank: number) {
-  return previousRank === null ? "New in window" : `${formatRankMove(previousRank, rank)} vs previous window`
+function formatModelRankMoveLabel(data: StatsModelData) {
+  if (data.rank === null) return "No usage last week"
+  if (data.previousRank === null) return "New this week"
+  return `${formatRankMove(data.previousRank, data.rank)} vs previous week`
 }
 
 function formatTokens(value: number) {

+ 14 - 7
packages/stats/core/src/domain/home.ts

@@ -47,7 +47,7 @@ export type StatsModelData = {
   slug: string
   provider: string
   author: string
-  rank: number
+  rank: number | null
   previousRank: number | null
   totalModels: number
   tokenShare: number
@@ -229,20 +229,27 @@ function buildStatsModelData(
   const latest = Math.max(...normalized.map((row) => row.periodStart))
   const latestUpdate = Math.max(...modelScopedRows.map((row) => row.updatedAt))
   const window = getWindow("2M", earliest, latest)
+  const rankWindow = getWindow("1W", earliest, latest)
   const currentRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.start, window.end)
   const previousRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.previousStart, window.previousEnd)
   const current = combineRowsForModel(model, currentRows)
   const previous = combineRowsForModel(model, previousRows)
-  const peers = aggregateByModelName(rowsForProduct(normalized, SITE_PRODUCT, window.start, window.end))
+  const rankPeers = aggregateByModelName(rowsForProduct(normalized, SITE_PRODUCT, rankWindow.start, rankWindow.end))
     .filter((item) => item.totalTokens > 0)
     .toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
-  const previousPeers = aggregateByModelName(
-    rowsForProduct(normalized, SITE_PRODUCT, window.previousStart, window.previousEnd),
+  const previousRankPeers = aggregateByModelName(
+    rowsForProduct(normalized, SITE_PRODUCT, rankWindow.previousStart, rankWindow.previousEnd),
   )
     .filter((item) => item.totalTokens > 0)
     .toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
-  const rank = Math.max(1, peers.findIndex((item) => item.model === model) + 1)
-  const previousRankIndex = previousPeers.findIndex((item) => item.model === model)
+  const peers = aggregateByModelName(rowsForProduct(normalized, SITE_PRODUCT, window.start, window.end))
+    .filter((item) => item.totalTokens > 0)
+    .toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
+  const rankIndex = rankPeers.findIndex((item) => item.model === model)
+  const rank = rankIndex >= 0 ? rankIndex + 1 : null
+  const previousRankIndex = previousRankPeers.findIndex((item) => item.model === model)
+  const peerRankIndex = peers.findIndex((item) => item.model === model)
+  const peerRank = peerRankIndex >= 0 ? peerRankIndex + 1 : 1
   const totalTokens = peers.reduce((sum, item) => sum + item.totalTokens, 0)
 
   return {
@@ -273,7 +280,7 @@ function buildStatsModelData(
     tokenMix: buildModelTokenMix(current),
     productMix: buildModelProductMix(modelScopedRows, window, current),
     country: createRangeRecord((range) => buildCountryStats(geo, getWindow(range, earliest, latest))),
-    peers: buildModelPeers(peers, rank, totalTokens),
+    peers: buildModelPeers(peers, peerRank, totalTokens),
   }
 }