"use client" import { startTransition, useCallback, useEffect, useMemo, useState } from "react" import { useParams, useRouter, useSearchParams } from "next/navigation" import { Button } from "@/components/ui/button" import { ArrowLeft } from "lucide-react" import { Navigation } from "@/components/navigation" import { BenchmarkDetail } from "@/components/benchmark-detail" import type { BenchmarkCard, ModelEvaluationSummary } from "@/lib/eval-processing" import { fetchBenchmarkMetadata, fetchComparisonIndex, fetchEvalHierarchy, fetchModelSummary, fetchModelCards, } from "@/lib/dashboard-data-client" import type { BenchmarkEvaluationCardData } from "@/components/benchmark-evaluation-card" import type { ComparisonIndex, EvalHierarchy } from "@/lib/backend-artifacts" export default function ModelDetailPage() { const params = useParams() const router = useRouter() const searchParams = useSearchParams() const [summary, setSummary] = useState(null) const [benchmarkCards, setBenchmarkCards] = useState>({}) const [modelCards, setModelCards] = useState([]) const [evalHierarchy, setEvalHierarchy] = useState(null) const [comparisonIndex, setComparisonIndex] = useState(null) const [selectedVariantId, setSelectedVariantId] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const routeId = params.id as string const getVariantFromQuery = useCallback( (modelSummary: ModelEvaluationSummary) => { const requestedVersion = searchParams.get("version") if (!requestedVersion || modelSummary.variants.length === 0) { return modelSummary.variants[0] ?? null } return ( modelSummary.variants.find( (variant) => variant.variant_key === requestedVersion || variant.variant_id === requestedVersion ) ?? modelSummary.variants[0] ?? null ) }, [searchParams] ) const handleBack = useCallback(() => { if (typeof window !== "undefined") { const referrer = document.referrer if (referrer) { try { const referrerUrl = new URL(referrer) if (referrerUrl.origin === window.location.origin) { router.back() return } } catch { // Fall through to a deterministic in-app destination. } } } router.push("/models") }, [router]) const handleVariantChange = useCallback( (nextVariantId: string) => { setSelectedVariantId(nextVariantId) if (!summary || summary.variants.length <= 1 || !routeId) { return } const nextVariant = summary.variants.find((variant) => variant.variant_id === nextVariantId) if (!nextVariant) { return } const nextParams = new URLSearchParams(searchParams.toString()) const currentVersion = nextParams.get("version") const nextVersion = nextVariant.variant_key if (currentVersion === nextVersion) { return } nextParams.set("version", nextVersion) const nextQuery = nextParams.toString() router.replace( nextQuery ? `/models/${routeId}?${nextQuery}` : `/models/${routeId}`, { scroll: false } ) }, [routeId, router, searchParams, summary] ) useEffect(() => { let isCancelled = false const loadCoreData = async () => { try { const [modelSummary, cards, hierarchy] = await Promise.all([ fetchModelSummary(routeId), fetchBenchmarkMetadata(), fetchEvalHierarchy().catch((err) => { console.warn("Failed to load eval-hierarchy:", err) return null as EvalHierarchy | null }), ]) if (isCancelled) { return } setSummary(modelSummary) setBenchmarkCards(cards) setEvalHierarchy(hierarchy) setSelectedVariantId((current) => current ?? modelSummary.variants[0]?.variant_id ?? null) } catch (err) { if (isCancelled) { return } console.error("Failed to load model:", err) setError("Failed to load model data") } finally { if (!isCancelled) { setLoading(false) } } } loadCoreData() return () => { isCancelled = true } }, [routeId]) useEffect(() => { let isCancelled = false const loadAuxiliaryData = async () => { const [allModelCards, compIndex] = await Promise.all([ fetchModelCards().catch((err) => { console.warn("Failed to load model cards:", err) return [] as BenchmarkEvaluationCardData[] }), fetchComparisonIndex().catch((err) => { console.warn("Failed to load comparison-index:", err) return null as ComparisonIndex | null }), ]) if (isCancelled) { return } startTransition(() => { setModelCards(allModelCards) setComparisonIndex(compIndex) }) } loadAuxiliaryData() return () => { isCancelled = true } }, [routeId]) useEffect(() => { if (!summary?.variants.length) { return } const requestedVariant = getVariantFromQuery(summary) if (requestedVariant && requestedVariant.variant_id !== selectedVariantId) { setSelectedVariantId(requestedVariant.variant_id) } }, [getVariantFromQuery, searchParams, summary]) useEffect(() => { if (!summary?.variants.length || !routeId) { return } const requestedVersion = searchParams.get("version") if (!requestedVersion) { return } const matchesKnownVariant = summary.variants.some( (variant) => variant.variant_key === requestedVersion || variant.variant_id === requestedVersion ) if (matchesKnownVariant) { return } const nextParams = new URLSearchParams(searchParams.toString()) nextParams.delete("version") const nextQuery = nextParams.toString() router.replace( nextQuery ? `/models/${routeId}?${nextQuery}` : `/models/${routeId}`, { scroll: false } ) }, [routeId, router, searchParams, summary]) const selectedVariant = useMemo(() => { if (!summary) { return null } if (!summary.variants.length) { return summary } return ( summary.variants.find((variant) => variant.variant_id === selectedVariantId) ?? summary.variants[0] ) }, [selectedVariantId, summary]) useEffect(() => { if (!summary) { return } const titleParts = [summary.model_family_name] if (selectedVariant && "variant_key" in selectedVariant && selectedVariant.variant_key !== "base") { titleParts.push(selectedVariant.variant_label) } document.title = `${titleParts.join(" · ")} - AI Evaluation Dashboard` }, [selectedVariant, summary]) if (loading) { return (
Loading model record…
) } if (error || !summary) { return (
{error || "Model not found"}
) } const detailSummary = selectedVariant ?? summary const hasVariantTabs = summary.variants.length > 1 return (
{hasVariantTabs ? (
Versions
{summary.variants.map((variant) => ( ))}
) : null}
) }