"use client"; import { useMemo, useState } from "react"; import useSWR from "swr"; import AppShell from "@/components/AppShell"; import { PageHeader } from "@/components/ui"; import { api, fetcher } from "@/lib/api"; import { useAuth } from "@/lib/auth"; type CatalogEntry = { id: string; backend: string; model: string; tier: string; label: string; display: string; input_per_m: number; output_per_m: number; }; type RoutingResponse = { config: { local_model_id: string; economy_gemini_id: string; economy_deepseek_id: string; economy_openrouter_id: string; premium_gemini_id: string; premium_deepseek_id: string; premium_openrouter_id: string; cloud_provider_order: string[]; auto_escalate: boolean; max_tier: string; }; catalog: Record>; available_backends: Record; strategy: string; }; type LiveModel = { id: string; label: string; [key: string]: unknown }; type AvailableModelsResponse = { providers: Record< string, { available: boolean; error?: string; models: LiveModel[]; note?: string } >; routing_order: string; }; const TIER_LABEL: Record = { local: "Local (always tried first)", economy: "Economy cloud (capable, low cost)", premium: "Premium cloud (strongest, higher cost)", }; const PROVIDER_ORDER_OPTIONS = [ { value: "gemini,deepseek,openrouter", label: "Gemini → DeepSeek → OpenRouter" }, { value: "gemini,openrouter,deepseek", label: "Gemini → OpenRouter → DeepSeek" }, { value: "deepseek,gemini,openrouter", label: "DeepSeek → Gemini → OpenRouter" }, { value: "deepseek,openrouter,gemini", label: "DeepSeek → OpenRouter → Gemini" }, { value: "openrouter,gemini,deepseek", label: "OpenRouter → Gemini → DeepSeek" }, { value: "openrouter,deepseek,gemini", label: "OpenRouter → DeepSeek → Gemini" }, ]; function priceLabel(m: CatalogEntry) { if (m.input_per_m === 0 && m.output_per_m === 0) return "free tier eligible"; return `$${m.input_per_m}/${m.output_per_m} per 1M`; } export default function ModelsPage() { const { user } = useAuth(); const { data, mutate } = useSWR("/api/llm/routing", fetcher); const { data: liveModels } = useSWR( user?.role === "admin" ? "/api/llm/models/available" : null, fetcher, ); const [form, setForm] = useState(null); const [saving, setSaving] = useState(false); const [msg, setMsg] = useState(null); const [showLive, setShowLive] = useState(false); const cfg = form ?? data?.config; const economyOptions = useMemo(() => { if (!data) return { gemini: [], deepseek: [], openrouter: [] }; return { gemini: data.catalog.economy?.gemini || [], deepseek: data.catalog.economy?.deepseek || [], openrouter: data.catalog.economy?.openrouter || [], }; }, [data]); const premiumOptions = useMemo(() => { if (!data) return { gemini: [], deepseek: [], openrouter: [] }; return { gemini: data.catalog.premium?.gemini || [], deepseek: data.catalog.premium?.deepseek || [], openrouter: data.catalog.premium?.openrouter || [], }; }, [data]); const localOptions = data?.catalog.local?.ollama || []; const save = async (e: React.FormEvent) => { e.preventDefault(); if (!cfg) return; setSaving(true); setMsg(null); try { await api("/api/llm/routing", { method: "PUT", body: JSON.stringify(cfg) }); setMsg("Saved — new tasks will use this routing."); mutate(); } catch (err: any) { setMsg(err.message); } finally { setSaving(false); } }; if (user?.role !== "admin") { return ( ); } return ( {data?.strategy && (
{data.strategy}
)}
{Object.entries(data?.available_backends || {}).map(([k, ok]) => ( {k}: {ok ? "available" : "no API key"} ))}
{!cfg ? (
Loading…
) : (

{TIER_LABEL.local}

Used for triage and first reasoning attempt on every task.

{TIER_LABEL.economy}

Escalation target for medium complexity, partial diagnostic failures, or follow-up runs.

{TIER_LABEL.premium}

Used for critical severity, many diagnostic failures, or when economy/local models request escalation.

{msg &&
{msg}
}
)} {liveModels && (

Live models from each API

{!showLive ? (

Ollama: {liveModels.providers.ollama?.models?.length ?? 0} · Gemini:{" "} {liveModels.providers.gemini?.models?.length ?? 0} · DeepSeek:{" "} {liveModels.providers.deepseek?.models?.length ?? 0} · OpenRouter:{" "} {liveModels.providers.openrouter?.models?.length ?? 0}

) : (
{Object.entries(liveModels.providers).map(([name, info]) => (

{name}{" "} ({info.available ? `${info.models.length} models` : info.error || "unavailable"})

{info.note &&

{info.note}

}
    {info.models.map((m) => (
  • {m.id} {m.label !== m.id ? ` — ${m.label}` : ""}
  • ))}
))}
)}
)}
); }