diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index eed8170996..0cfcd28508 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -2326,7 +2326,7 @@ async def get_models_analytics(days: int = 30): SUM(tool_call_count) as tool_calls, MAX(started_at) as last_used_at, AVG(input_tokens + output_tokens) as avg_tokens_per_session - FROM sessions WHERE started_at > ? AND model IS NOT NULL + FROM sessions WHERE started_at > ? AND model IS NOT NULL AND model != '' GROUP BY model, billing_provider ORDER BY SUM(input_tokens) + SUM(output_tokens) DESC """, (cutoff,)) @@ -2379,7 +2379,7 @@ async def get_models_analytics(days: int = 30): COALESCE(SUM(actual_cost_usd), 0) as total_actual_cost, COUNT(*) as total_sessions, SUM(COALESCE(api_call_count, 0)) as total_api_calls - FROM sessions WHERE started_at > ? AND model IS NOT NULL + FROM sessions WHERE started_at > ? AND model IS NOT NULL AND model != '' """, (cutoff,)) totals = dict(totals_cur.fetchone()) diff --git a/scripts/release.py b/scripts/release.py index e67fab80f0..85cb46d1cf 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -78,6 +78,7 @@ AUTHOR_MAP = { "beesr@bee.localdomain": "beesrsj2500", "mtf201013@gmail.com": "ma-pony", "sonoyuncudmr@gmail.com": "Sonoyunchu", + "43525405+yatesjalex@users.noreply.github.com": "yatesjalex", "maks.mir@yahoo.com": "say8hi", "27719690+Mirac1eSky@users.noreply.github.com": "Mirac1eSky", "web3blind@users.noreply.github.com": "web3blind", diff --git a/web/src/pages/ModelsPage.tsx b/web/src/pages/ModelsPage.tsx index 4e1880e545..a4f7864054 100644 --- a/web/src/pages/ModelsPage.tsx +++ b/web/src/pages/ModelsPage.tsx @@ -38,17 +38,17 @@ function formatCost(n: number): string { return "$0"; } -/** Short model name: strip provider prefix like "openrouter/" or "anthropic/". */ +/** Short model name: strip vendor prefix like "openrouter/" or "anthropic/". */ function shortModelName(model: string): string { const slashIdx = model.indexOf("/"); - if (slashIdx > 0 && slashIdx < 20) return model.slice(slashIdx + 1); + if (slashIdx > 0) return model.slice(slashIdx + 1); return model; } -/** Extract provider from model string like "openrouter/gemini-2.5-pro" → "openrouter" */ -function modelProvider(model: string, fallback?: string): string { +/** Extract vendor prefix from a model string like "anthropic/claude-opus-4.7" → "anthropic". */ +function modelVendor(model: string, fallback?: string): string { const slashIdx = model.indexOf("/"); - if (slashIdx > 0 && slashIdx < 20) return model.slice(0, slashIdx); + if (slashIdx > 0) return model.slice(0, slashIdx); return fallback || ""; } @@ -142,7 +142,7 @@ function ModelCard({ rank: number; }) { const { t } = useI18n(); - const provider = entry.provider || modelProvider(entry.model); + const provider = entry.provider || modelVendor(entry.model); const totalTokens = entry.input_tokens + entry.output_tokens; const caps = entry.capabilities;