import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Skeleton } from "@/components/ui/skeleton"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { ProviderIconType, RenderProviderIcon } from "@/lib/constants/icons"; import { ProviderLabels } from "@/lib/constants/logs"; import { Info } from "lucide-react"; function formatCost(dollars: number) { return `$${dollars.toFixed(4)}`; } export interface ModelCatalogRow { providerName: string; isCustom: boolean; baseProviderType?: string; modelsUsed: string[]; totalTraffic24h: number; totalCost24h: number; } interface ModelCatalogTableProps { rows: ModelCatalogRow[]; providers: string[]; providerFilter: string; onProviderFilterChange: (value: string) => void; totalProviders: number; totalModels: number; totalRequests24h: number; totalCost24h: number; isLoadingModels: boolean; } export default function ModelCatalogTable({ rows, providers, providerFilter, onProviderFilterChange, totalProviders, totalModels, totalRequests24h, totalCost24h, isLoadingModels, }: ModelCatalogTableProps) { const summaryCards = [ { label: "Total Providers", value: totalProviders.toLocaleString() }, { label: "Total Models", value: totalModels.toLocaleString() }, { label: "Total Requests (24h)", value: totalRequests24h.toLocaleString() }, { label: "Total Cost (24h)", value: formatCost(totalCost24h) }, ]; return (
{/* Summary Cards */}
{summaryCards.map((card) => (

{card.label}

{card.value}

))}
{/* Header + Filter */}

Model Catalog

Overview of all configured providers, models, and usage.

{/* Table */}
Provider
Models Models used in the last 30 days
Total Traffic (24h) Total Cost (24h)
{rows.length === 0 ? ( No matching providers found. ) : ( rows.map((row) => (
{row.isCustom ? row.providerName : ProviderLabels[row.providerName as keyof typeof ProviderLabels] || row.providerName} {row.isCustom && ( CUSTOM )}
{isLoadingModels ? (
) : ( )}
{row.totalTraffic24h.toLocaleString()} {formatCost(row.totalCost24h)}
)) )}
); } function ModelsUsedCell({ models: rawModels }: { models: string[] }) { const models = Array.from(new Set(rawModels.filter(Boolean))); if (models.length === 0) { return -; } const MAX_VISIBLE = 3; const visible = models.slice(0, MAX_VISIBLE); const remaining = models.length - MAX_VISIBLE; return (
{visible.map((m) => ( {m} ))} {remaining > 0 && ( +{remaining} more {models.slice(MAX_VISIBLE).join(", ")} )}
); }