From 3d372429930724bc50cdf6131326ed458f50db02 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:03:21 -0300 Subject: [PATCH] fix(dashboard): show custom provider given-name instead of internal id across dashboard pages (#4603) (#4960) Integrated into release/v3.8.36 (fixes #4603) --- CHANGELOG.md | 4 ++ .../dashboard/analytics/ComboHealthTab.tsx | 14 +++- .../analytics/CompressionAnalyticsTab.tsx | 4 +- .../analytics/ProviderUtilizationTab.tsx | 8 ++- .../analytics/RouteExplainabilityTab.tsx | 15 ++-- src/app/(dashboard)/dashboard/cache/page.tsx | 6 +- .../dashboard/costs/CostOverviewTab.tsx | 5 +- .../health/ProviderHealthAutopilotCard.tsx | 4 +- src/app/(dashboard)/dashboard/health/page.tsx | 32 ++++----- .../dashboard/provider-stats/page.tsx | 53 +++++++++------ .../dashboard/runtime/RuntimePageClient.tsx | 12 ++-- src/lib/display/useProviderNodeMap.ts | 68 +++++++++++++++++++ tests/unit/display-and-error-utils.test.ts | 27 ++++++++ 13 files changed, 195 insertions(+), 57 deletions(-) create mode 100644 src/lib/display/useProviderNodeMap.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b248707f8..6e5fc041c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ _In development — bullets added per PR; finalized at release._ - **feat(providers):** update volcengine-ark model list, adding DeepSeek-V4-Flash and DeepSeek-V4-Pro. (thanks @kenlin8827) +### 🔧 Bug Fixes + +- **fix(dashboard):** show custom provider given-name instead of internal id across dashboard pages — cache, combo health, compression analytics, cost overview, health/autopilot, provider stats, route explainability, provider utilization, runtime. Adds shared `resolveProviderName` resolver and `useProviderNodeMap` hook. (#4603) + --- ## [3.8.35] — 2026-06-23 diff --git a/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx b/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx index dda2143082..62684d51fd 100644 --- a/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx +++ b/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx @@ -3,6 +3,7 @@ import Link from "next/link"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslations } from "next-intl"; +import { useProviderNodeMap, resolveProviderName } from "@/lib/display/useProviderNodeMap"; import Card from "@/shared/components/Card"; import Badge from "@/shared/components/Badge"; import { Skeleton, Spinner } from "@/shared/components/Loading"; @@ -156,6 +157,7 @@ function DistributionBar({ label, value, meta }: { label: string; value: number; } function ComboForecastPanel({ forecast }: { forecast: ComboForecastMetrics }) { + const nodeMap = useProviderNodeMap(); const topTargets = useMemo( () => [...forecast.targets] @@ -227,7 +229,8 @@ function ComboForecastPanel({ forecast }: { forecast: ComboForecastMetrics }) { {target.label || target.model}
{point.provider}
++ {resolveProviderName(point.provider, nodeMap)} +
{t("providerUtilizationLatestSnapshot")}
diff --git a/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx b/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx index be2257f368..d5ea1b397b 100644 --- a/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx +++ b/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx @@ -6,6 +6,7 @@ import Badge from "@/shared/components/Badge"; import Card from "@/shared/components/Card"; import { Skeleton } from "@/shared/components/Loading"; import { cn } from "@/shared/utils/cn"; +import { useProviderNodeMap, resolveProviderName } from "@/lib/display/useProviderNodeMap"; type CallLogOption = { id: string; @@ -247,6 +248,7 @@ function FactorCard({ factor }: { factor: ExplanationFactor }) { } function TargetTimeline({ targets }: { targets: ExplainTarget[] }) { + const nodeMap = useProviderNodeMap(); if (targets.length === 0) { returnscore {(provider.score * 100).toFixed(0)}% · active{" "} diff --git a/src/app/(dashboard)/dashboard/health/page.tsx b/src/app/(dashboard)/dashboard/health/page.tsx index 12605e5da9..30e2eeb5e0 100644 --- a/src/app/(dashboard)/dashboard/health/page.tsx +++ b/src/app/(dashboard)/dashboard/health/page.tsx @@ -16,6 +16,7 @@ import { useState, useEffect, useCallback } from "react"; import { Card } from "@/shared/components"; import { AI_PROVIDERS } from "@/shared/constants/providers"; import { getProviderDisplayName } from "@/lib/display/names"; +import { useProviderNodeMap, resolveProviderName } from "@/lib/display/useProviderNodeMap"; import { compareTr } from "@/shared/utils/turkishText"; import { useTranslations } from "next-intl"; import TelemetryCard from "./TelemetryCard"; @@ -59,6 +60,7 @@ export default function HealthPage() { const t = useTranslations("health"); const tc = useTranslations("common"); const tp = useTranslations("providers"); + const nodeMap = useProviderNodeMap(); const [data, setData] = useState(null); const [dbHealth, setDbHealth] = useState(null); const [dbHealthError, setDbHealthError] = useState(null); @@ -763,7 +765,10 @@ export default function HealthPage() { {unhealthy.map(([provider, cb]: [string, any]) => { const style = CB_STYLES[cb.state] || CB_STYLES.OPEN; const providerInfo = AI_PROVIDERS[provider]; - const displayName = getProviderDisplayName(provider, providerInfo); + const displayName = getProviderDisplayName( + provider, + nodeMap.get(provider) ?? providerInfo + ); return (
{key.replace(/([A-Z])/g, " $1").replace(/_/g, " ")}
diff --git a/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx b/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx index beed568a11..300d93e2e3 100644 --- a/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx +++ b/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx @@ -6,6 +6,7 @@ import Link from "next/link"; import Card from "@/shared/components/Card"; import ProviderIcon from "@/shared/components/ProviderIcon"; import ModelCooldownsCard from "./components/ModelCooldownsCard"; +import { useProviderNodeMap, resolveProviderName } from "@/lib/display/useProviderNodeMap"; type KnownBreakerState = "CLOSED" | "OPEN" | "HALF_OPEN" | "DEGRADED"; type BreakerState = KnownBreakerState | (string & {}); @@ -399,6 +400,7 @@ function diffSnapshots( export default function RuntimePageClient() { const t = useTranslations("runtime"); + const nodeMap = useProviderNodeMap(); const [health, setHealth] = useState