fix(stats): rank model pages by week
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user