"use client"; import * as React from "react"; import { RefreshCw, ChevronDown, CheckCircle2, XCircle, Users, Boxes, Link2, AlertTriangle } from "lucide-react"; import { PageHeader, Card, CardHeader, CardBody, Stat, EmptyState, Skeleton } from "@/components/ui/misc"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tooltip } from "@/components/ui/tooltip"; import { toast } from "@/components/ui/toast"; import { ProviderIcon } from "@/components/brand/provider-icon"; import { api, useApi } from "@/lib/client/api"; import { PROVIDERS, PROVIDER_ORDER, providerName } from "@/lib/client/providers"; import { formatMs, formatNumber, formatRelative, cn } from "@/lib/utils"; import { errorMessage, formatDateTime } from "@/lib/client/humanize"; import type { ProviderId } from "@/lib/client/types"; interface AdminResponse { users: number; connections: { provider: ProviderId; status: string; n: number }[]; counts: { provider: ProviderId; total: number; hidden: number }[]; syncRuns: { id: string; provider: ProviderId; triggeredBy: string; startedAt: string; finishedAt: string | null; ok: boolean | null; modelsFound: number | null; modelsAdded: number | null; modelsRemoved: number | null; latencyMs: number | null; errorCode: string | null; errorMessage: string | null; }[]; errors: { provider: ProviderId; errorCode: string | null; n: number }[]; latency: { provider: ProviderId; avgLatencyMs: number; avgTtftMs: number; requests: number }[]; providers: { provider: ProviderId; envKeyConfigured: boolean; models: { key: string; displayName: string; status: string; hidden: boolean; lastSeenAt: string; source: string }[] }[]; } interface SyncResult { provider: ProviderId; ok: boolean; found: number; added: number; removed: number; latencyMs: number; error?: string; } const CONN_STATUS_VARIANT: Record = { valid: "success", invalid: "danger", unverified: "warning" }; export default function AdminProvidersPage() { const q = useApi("/api/admin/providers"); const [syncing, setSyncing] = React.useState(null); const data = q.data; const sync = async (provider?: ProviderId) => { setSyncing(provider ?? "all"); try { const res = await api<{ results: SyncResult[] }>("/api/admin/providers", { method: "POST", json: provider ? { action: "sync", provider } : { action: "sync" } }); await q.mutate(); const ok = res.results.filter((r) => r.ok); const bad = res.results.filter((r) => !r.ok); if (ok.length) toast.success(`Synced ${ok.map((r) => providerName(r.provider)).join(", ")}`, ok.map((r) => `${providerName(r.provider)}: ${r.found} found, +${r.added} / −${r.removed} in ${formatMs(r.latencyMs)}`).join(" · ")); for (const r of bad) toast.error(`${providerName(r.provider)} failed`, r.error); if (!res.results.length) toast.warning("Nothing synced", "No owner keys configured in the environment."); } catch (e) { toast.error("Sync failed", errorMessage(e)); } finally { setSyncing(null); } }; const connByProvider = React.useMemo(() => { const m = new Map>(); for (const c of data?.connections ?? []) { const cur = m.get(c.provider) ?? {}; cur[c.status] = (cur[c.status] ?? 0) + c.n; m.set(c.provider, cur); } return m; }, [data?.connections]); const totalConnections = (data?.connections ?? []).reduce((a, c) => a + c.n, 0); const totalModels = (data?.counts ?? []).reduce((a, c) => a + c.total, 0); const totalErrors = (data?.errors ?? []).reduce((a, c) => a + c.n, 0); return (
sync()}> Sync all with owner keys } /> {q.error ? ( q.mutate()}>Retry} /> ) : !data ? (
{Array.from({ length: 4 }).map((_, i) => ( ))}
) : ( <>
registered} /> across all users} /> {formatNumber((data.counts ?? []).reduce((a, c) => a + c.hidden, 0))} hidden} />
{/* Per-provider overview */}
{PROVIDER_ORDER.map((p) => { const conns = connByProvider.get(p) ?? {}; const count = data.counts.find((c) => c.provider === p); const lat = data.latency.find((l) => l.provider === p); const env = data.providers.find((x) => x.provider === p)?.envKeyConfigured ?? false; const lastRun = data.syncRuns.find((r) => r.provider === p); return (

{PROVIDERS[p].name}

{env ? "owner key" : "no owner key"}
Connections
{Object.keys(conns).length ? ( Object.entries(conns).map(([s, n]) => ( {n} {s} )) ) : ( none )}
Registry
{count?.total ?? 0} ({count?.hidden ?? 0} hidden)
Latency (7 d)
{lat && lat.requests ? `${formatMs(lat.avgLatencyMs)} · ttft ${formatMs(lat.avgTtftMs)} · ${formatNumber(lat.requests)} req` : "—"}
Last sync
{lastRun ? ( <> {lastRun.ok ? : lastRun.ok === false ? : null} {formatRelative(lastRun.startedAt)} ) : ( never )}
); })}
{/* Errors + latency */}
{data.errors.length === 0 ? (

No failed requests in the last 7 days.

) : ( {data.errors.map((e, i) => ( ))}
Provider Code Count
{providerName(e.provider)} {e.errorCode ?? "unknown"} {formatNumber(e.n)}
)}
{data.latency.length === 0 ? (

No requests in the last 7 days.

) : ( (() => { const max = Math.max(...data.latency.map((l) => l.avgLatencyMs), 1); return [...data.latency] .sort((a, b) => a.avgLatencyMs - b.avgLatencyMs) .map((l) => (
{providerName(l.provider)} · {formatNumber(l.requests)} req {formatMs(l.avgLatencyMs)} / ttft {formatMs(l.avgTtftMs)}
)); })() )}
{/* Sync runs */} {data.syncRuns.length === 0 ? (

No sync runs recorded yet.

) : (
{data.syncRuns.map((r) => ( ))}
Provider Trigger Started Result Found Added Removed Latency Error
{providerName(r.provider)} {r.triggeredBy} {formatRelative(r.startedAt)} {r.ok === true ? ( ok ) : r.ok === false ? ( failed ) : ( running )} {r.modelsFound ?? "—"} {r.modelsAdded ? `+${r.modelsAdded}` : "0"} {r.modelsRemoved ? `−${r.modelsRemoved}` : "0"} {formatMs(r.latencyMs)} {r.errorCode ? {r.errorCode} : null} {r.errorMessage ?? ""}
)}
{/* Per-provider model lists */}

Registry contents

{data.providers.map((p) => ( ))}
)}
); } function ProviderModelList({ provider, models }: { provider: ProviderId; models: AdminResponse["providers"][number]["models"] }) { const [open, setOpen] = React.useState(false); const [now] = React.useState(() => Date.now()); const hidden = models.filter((m) => m.hidden).length; const stale = models.filter((m) => now - new Date(m.lastSeenAt).getTime() > 7 * 86_400_000 && !m.hidden).length; return ( {open ? (
{models.length === 0 ? (

No models recorded for this provider.

) : ( {models.map((m) => ( ))}
Key Name Status Source Hidden Last seen
{m.key} {m.displayName} {m.status} {m.source} {m.hidden ? "yes" : "no"} {formatRelative(m.lastSeenAt)}
)}
) : null}
); }