diff --git a/packages/stats/app/src/routes/model-catalog.ts b/packages/stats/app/src/routes/model-catalog.ts index 1eb1cda09..5733f4a77 100644 --- a/packages/stats/app/src/routes/model-catalog.ts +++ b/packages/stats/app/src/routes/model-catalog.ts @@ -63,17 +63,17 @@ export const getModelCatalog = query(async () => { }, "getModelCatalog") export function findModelCatalogEntry(catalog: ModelCatalog, model: string, lab?: string) { - const normalizedId = lab ? `${catalogSlug(lab)}/${catalogSlug(model)}` : model.trim().toLowerCase() + const normalizedId = lab ? `${catalogLabSlug(lab)}/${catalogSlug(model)}` : model.trim().toLowerCase() const leaf = catalogSlug(model) return ( catalog.models.find((entry) => entry.id.toLowerCase() === normalizedId) ?? - catalog.models.find((entry) => (lab ? entry.lab === catalogSlug(lab) : true) && entry.slug === leaf) ?? + catalog.models.find((entry) => (lab ? entry.lab === catalogLabSlug(lab) : true) && entry.slug === leaf) ?? catalog.models.find((entry) => entry.slug === leaf) ) } export function findModelCatalogLab(catalog: ModelCatalog, lab: string) { - const id = catalogSlug(lab) + const id = catalogLabSlug(lab) return catalog.labs.find((entry) => entry.id === id) } @@ -95,6 +95,8 @@ export function formatCatalogLabName(lab: string) { xai: "xAI", xiaomi: "Xiaomi", zai: "Z.ai", + qwen: "Qwen", + zhipu: "Zhipu", zhipuai: "Zhipu", } return known[catalogSlug(lab)] ?? lab.replace(/[-_]/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase()) @@ -273,6 +275,17 @@ function catalogIdKey(value: string) { return value.split("/").map(catalogSlug).join("/") } +function catalogLabSlug(value: string) { + const slug = catalogSlug(value) + const aliases: Record = { + moonshot: "moonshotai", + qwen: "alibaba", + zhipu: "zhipuai", + zai: "zhipuai", + } + return aliases[slug] ?? slug +} + function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value) } diff --git a/packages/stats/core/src/domain/home.ts b/packages/stats/core/src/domain/home.ts index 727ac6986..3023ae323 100644 --- a/packages/stats/core/src/domain/home.ts +++ b/packages/stats/core/src/domain/home.ts @@ -823,15 +823,14 @@ function resolveModelProvider(model: string, rows: StatMetricRow[], providerPara } function providerMatches(provider: string, providerParam: string) { - return modelSlug(provider) === modelSlug(providerParam) + return providerSlug(provider) === providerSlug(providerParam) } function resolveProviderName(providerParam: string, rows: StatMetricRow[]) { const input = providerParam.trim() if (!input) return undefined - const inputSlug = modelSlug(input) return aggregateByModel(rows) - .filter((item) => modelSlug(item.provider) === inputSlug) + .filter((item) => providerMatches(item.provider, input)) .toSorted((a, b) => b.totalTokens - a.totalTokens || a.provider.localeCompare(b.provider))[0]?.provider } @@ -848,6 +847,17 @@ function modelKey(provider: string, model: string) { return `${provider}\u0000${model}` } +function providerSlug(value: string) { + const slug = modelSlug(value) + const aliases: Record = { + alibaba: "qwen", + moonshotai: "moonshot", + qwen: "qwen", + zhipuai: "zhipu", + } + return aliases[slug] ?? slug +} + function costPerMillion(costMicrocents: number, tokens: number) { if (tokens <= 0 || costMicrocents <= 0) return 0 return round((microcentsToDollars(costMicrocents) / tokens) * TOKEN_SCALE, 2)