Quellcode durchsuchen

fix(stats): scope data charts to go

Adam vor 2 Monaten
Ursprung
Commit
a9a4b2f00f

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

@@ -810,10 +810,8 @@ function stackedTopModelsSegments(point: UsagePoint, order: Map<string, number>)
 }
 
 function getTopModelsSegmentOrder(data: UsagePoint[]) {
-  return getRankOrder(
-    data.flatMap((point) =>
-      point.segments.map((segment, index) => ({ key: segment.model, value: segment.value, index })),
-    ),
+  return new Map(
+    data.find((point) => point.segments.length > 0)?.segments.map((segment, index) => [segment.model, index]) ?? [],
   )
 }
 

+ 9 - 1
packages/stats/core/src/domain/geo.ts

@@ -86,7 +86,15 @@ export class GeoStatRepo extends Context.Service<GeoStatRepo, GeoStatRepo.Servic
                 totalTokens: geoStat.total_tokens,
               })
               .from(geoStat)
-              .where(and(eq(geoStat.grain, "day"), eq(geoStat.client, "all"), eq(geoStat.source, "all"), scope))
+              .where(
+                and(
+                  eq(geoStat.grain, "day"),
+                  eq(geoStat.client, "all"),
+                  eq(geoStat.source, "all"),
+                  inArray(geoStat.tier, ["Go", "go"]),
+                  scope,
+                ),
+              )
               .orderBy(asc(geoStat.period_key)),
           catch: (cause) => DatabaseError.make({ cause }),
         })

+ 13 - 10
packages/stats/core/src/domain/home.ts

@@ -96,6 +96,8 @@ 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 TOP_MODEL_SEGMENT_LIMIT = 9
+const SITE_PRODUCT = "Go"
 const LEADERBOARD_CHANGE_MIN_MULTIPLE = 10
 const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"] as const
 
@@ -227,15 +229,15 @@ 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 currentRows = rowsForProduct(modelScopedRows, "All Users", window.start, window.end)
-  const previousRows = rowsForProduct(modelScopedRows, "All Users", window.previousStart, window.previousEnd)
+  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, "All Users", window.start, window.end))
+  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 previousPeers = aggregateByModelName(
-    rowsForProduct(normalized, "All Users", window.previousStart, window.previousEnd),
+    rowsForProduct(normalized, SITE_PRODUCT, window.previousStart, window.previousEnd),
   )
     .filter((item) => item.totalTokens > 0)
     .toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
@@ -289,11 +291,11 @@ function buildStatsLabData(providerParam: string, modelRows: ModelStatMetric[]):
   const latest = Math.max(...normalized.map((row) => row.periodStart))
   const latestUpdate = Math.max(...providerRows.map((row) => row.updatedAt))
   const window = getWindow("2M", earliest, latest)
-  const currentRows = rowsForProduct(providerRows, "All Users", window.start, window.end)
-  const previousRows = rowsForProduct(providerRows, "All Users", window.previousStart, window.previousEnd)
+  const currentRows = rowsForProduct(providerRows, SITE_PRODUCT, window.start, window.end)
+  const previousRows = rowsForProduct(providerRows, SITE_PRODUCT, window.previousStart, window.previousEnd)
   const current = combineRowsForModel("", currentRows)
   const previous = combineRowsForModel("", previousRows)
-  const allCurrent = aggregateByModel(rowsForProduct(normalized, "All Users", window.start, window.end))
+  const allCurrent = aggregateByModel(rowsForProduct(normalized, SITE_PRODUCT, window.start, window.end))
   const totalTokens = allCurrent.reduce((sum, item) => sum + item.totalTokens, 0)
   const models = aggregateByModel(currentRows)
     .filter((item) => item.totalTokens > 0)
@@ -337,9 +339,10 @@ function emptyStatsHomeData(): StatsHomeData {
 
 function buildUsagePoints(rows: StatMetricRow[], product: UsageProduct, range: UsageRange, window: DateWindow) {
   const windowRows = rowsForProduct(rows, product, window.start, window.end)
-  const modelOrder = aggregateByModel(windowRows)
+  const rankStart = Math.max(window.start, window.end - 7 * DAY_MS)
+  const modelOrder = aggregateByModel(rowsForProduct(rows, product, rankStart, window.end))
     .toSorted((a, b) => b.totalTokens - a.totalTokens)
-    .slice(0, 6)
+    .slice(0, TOP_MODEL_SEGMENT_LIMIT)
     .map((item) => ({ key: modelKey(item.provider, item.model), model: item.model }))
 
   return createBuckets(window, range).map((bucket) => {
@@ -408,7 +411,7 @@ function buildMarketShare(rows: ProviderMetricRow[], product: UsageProduct, rang
 }
 
 function buildCountryStats(rows: GeoMetricRow[], window: DateWindow) {
-  const countries = aggregateByCountry(rowsForProduct(rows, "All Users", window.start, window.end))
+  const countries = aggregateByCountry(rowsForProduct(rows, SITE_PRODUCT, window.start, window.end))
     .filter((item) => item.tokens > 0 && item.country !== "AQ")
     .toSorted((a, b) => b.tokens - a.tokens)
   const totalTokens = countries.reduce((sum, item) => sum + item.tokens, 0)

+ 8 - 1
packages/stats/core/src/domain/model.ts

@@ -74,7 +74,14 @@ export class ModelStatRepo extends Context.Service<ModelStatRepo, ModelStatRepo.
                 totalCostMicrocents: modelStat.total_cost_microcents,
               })
               .from(modelStat)
-              .where(and(eq(modelStat.grain, "day"), eq(modelStat.client, "all"), eq(modelStat.source, "all")))
+              .where(
+                and(
+                  eq(modelStat.grain, "day"),
+                  eq(modelStat.client, "all"),
+                  eq(modelStat.source, "all"),
+                  inArray(modelStat.tier, ["Go", "go"]),
+                ),
+              )
               .orderBy(asc(modelStat.period_key)),
           catch: (cause) => DatabaseError.make({ cause }),
         })

+ 8 - 1
packages/stats/core/src/domain/provider.ts

@@ -62,7 +62,14 @@ export class ProviderStatRepo extends Context.Service<ProviderStatRepo, Provider
                 totalTokens: providerStat.total_tokens,
               })
               .from(providerStat)
-              .where(and(eq(providerStat.grain, "day"), eq(providerStat.client, "all"), eq(providerStat.source, "all")))
+              .where(
+                and(
+                  eq(providerStat.grain, "day"),
+                  eq(providerStat.client, "all"),
+                  eq(providerStat.source, "all"),
+                  inArray(providerStat.tier, ["Go", "go"]),
+                ),
+              )
               .orderBy(asc(providerStat.period_key)),
           catch: (cause) => DatabaseError.make({ cause }),
         })