fix(stats): rank model pages by week

This commit is contained in:
Adam
2026-06-14 21:00:35 -05:00
parent a774c62eac
commit 1338d7b47a
2 changed files with 25 additions and 14 deletions
@@ -262,8 +262,10 @@ function ModelHero(props: { data: StatsModelData | null; catalog: ModelCatalogEn
> >
{(data) => ( {(data) => (
<p> <p>
Ranked #{data().rank} across recent OpenCode token usage with {formatPercent(data().tokenShare)} of {data().rank === null
observed volume. ? "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> </p>
)} )}
</Show> </Show>
@@ -278,9 +280,9 @@ function ModelHero(props: { data: StatsModelData | null; catalog: ModelCatalogEn
<Show when={props.data} fallback={<ModelCatalogCallout catalog={props.catalog} />}> <Show when={props.data} fallback={<ModelCatalogCallout catalog={props.catalog} />}>
{(data) => ( {(data) => (
<div data-component="model-rank-panel"> <div data-component="model-rank-panel">
<span>Current Rank</span> <span>7D Rank</span>
<strong>#{data().rank}</strong> <strong>{data().rank === null ? "—" : `#${data().rank}`}</strong>
<p>{formatRankMoveLabel(data().previousRank, data().rank)}</p> <p>{formatModelRankMoveLabel(data())}</p>
</div> </div>
)} )}
</Show> </Show>
@@ -810,8 +812,10 @@ function formatRankMove(previousRank: number, rank: number) {
return "Even" return "Even"
} }
function formatRankMoveLabel(previousRank: number | null, rank: number) { function formatModelRankMoveLabel(data: StatsModelData) {
return previousRank === null ? "New in window" : `${formatRankMove(previousRank, rank)} vs previous window` 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) { function formatTokens(value: number) {
+14 -7
View File
@@ -47,7 +47,7 @@ export type StatsModelData = {
slug: string slug: string
provider: string provider: string
author: string author: string
rank: number rank: number | null
previousRank: number | null previousRank: number | null
totalModels: number totalModels: number
tokenShare: number tokenShare: number
@@ -229,20 +229,27 @@ function buildStatsModelData(
const latest = Math.max(...normalized.map((row) => row.periodStart)) const latest = Math.max(...normalized.map((row) => row.periodStart))
const latestUpdate = Math.max(...modelScopedRows.map((row) => row.updatedAt)) const latestUpdate = Math.max(...modelScopedRows.map((row) => row.updatedAt))
const window = getWindow("2M", earliest, latest) const window = getWindow("2M", earliest, latest)
const rankWindow = getWindow("1W", earliest, latest)
const currentRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.start, window.end) const currentRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.start, window.end)
const previousRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.previousStart, window.previousEnd) const previousRows = rowsForProduct(modelScopedRows, SITE_PRODUCT, window.previousStart, window.previousEnd)
const current = combineRowsForModel(model, currentRows) const current = combineRowsForModel(model, currentRows)
const previous = combineRowsForModel(model, previousRows) 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) .filter((item) => item.totalTokens > 0)
.toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model)) .toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model))
const previousPeers = aggregateByModelName( const previousRankPeers = aggregateByModelName(
rowsForProduct(normalized, SITE_PRODUCT, window.previousStart, window.previousEnd), rowsForProduct(normalized, SITE_PRODUCT, rankWindow.previousStart, rankWindow.previousEnd),
) )
.filter((item) => item.totalTokens > 0) .filter((item) => item.totalTokens > 0)
.toSorted((a, b) => b.totalTokens - a.totalTokens || a.model.localeCompare(b.model)) .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 peers = aggregateByModelName(rowsForProduct(normalized, SITE_PRODUCT, window.start, window.end))
const previousRankIndex = previousPeers.findIndex((item) => item.model === model) .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) const totalTokens = peers.reduce((sum, item) => sum + item.totalTokens, 0)
return { return {
@@ -273,7 +280,7 @@ function buildStatsModelData(
tokenMix: buildModelTokenMix(current), tokenMix: buildModelTokenMix(current),
productMix: buildModelProductMix(modelScopedRows, window, current), productMix: buildModelProductMix(modelScopedRows, window, current),
country: createRangeRecord((range) => buildCountryStats(geo, getWindow(range, earliest, latest))), country: createRangeRecord((range) => buildCountryStats(geo, getWindow(range, earliest, latest))),
peers: buildModelPeers(peers, rank, totalTokens), peers: buildModelPeers(peers, peerRank, totalTokens),
} }
} }