"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslations } from "next-intl"; import { Button, Card, Input, Select, Toggle } from "@/shared/components"; type RuleScope = "global" | "apiKey" | "combo" | "model" | "connection"; type TargetKind = "keep" | "model" | "combo"; type EffortMode = "inherit" | "default" | "force"; type BudgetAction = "preserve" | "remove" | "set"; type Rule = { id: string; name: string; description: string; scope: RuleScope; apiKeyId: string | null; comboId: string | null; connectionId: string | null; modelPattern: string | null; sourceEffort: string; requestTags: string[]; tagMatchMode: "any" | "all"; effortMode: EffortMode; targetEffort: string | null; targetKind: TargetKind; targetModel: string | null; targetComboId: string | null; budgetAction: BudgetAction; budgetTokens: number | null; priority: number; enabled: boolean; }; type Reference = { id: string; name: string; provider?: string; displayName?: string }; type FormState = { name: string; description: string; scope: RuleScope; apiKeyId: string; comboId: string; connectionId: string; modelPattern: string; sourceEffort: string; requestTags: string; tagMatchMode: "any" | "all"; effortMode: EffortMode; targetEffort: string; targetKind: TargetKind; targetModel: string; targetComboId: string; budgetAction: BudgetAction; budgetTokens: string; priority: string; enabled: boolean; }; const STANDARD_EFFORTS = ["none", "low", "medium", "high", "xhigh"]; const EXTENDED_EFFORTS = ["max", "ultra"]; function emptyRule(apiKeyId?: string): FormState { return { name: "", description: "", scope: apiKeyId ? "apiKey" : "global", apiKeyId: apiKeyId || "", comboId: "", connectionId: "", modelPattern: "", sourceEffort: "any", requestTags: "", tagMatchMode: "any", effortMode: "inherit", targetEffort: "medium", targetKind: "keep", targetModel: "", targetComboId: "", budgetAction: "preserve", budgetTokens: "", priority: "0", enabled: true, }; } function supportsExtendedCodexEffort(model: string, effort: "max" | "ultra"): boolean { const normalized = model .trim() .toLowerCase() .replace(/^(?:codex|cx)\//, ""); return effort === "ultra" ? /^gpt-5\.6-(?:sol|terra)(?:-|$)/.test(normalized) : /^gpt-5\.6-(?:sol|terra|luna)(?:-|$)/.test(normalized); } export default function ReasoningRoutingRules({ apiKeyId }: { apiKeyId?: string }) { const t = useTranslations("reasoningRouting"); const [rules, setRules] = useState([]); const [combos, setCombos] = useState([]); const [keys, setKeys] = useState([]); const [connections, setConnections] = useState([]); const [form, setForm] = useState(() => emptyRule(apiKeyId)); const [editingId, setEditingId] = useState(null); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(""); const [scopeFilter, setScopeFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all"); const [search, setSearch] = useState(""); const [simulator, setSimulator] = useState({ model: "", effort: "missing", requestTags: "", transport: "http", }); const [simulation, setSimulation] = useState | null>(null); const load = useCallback(async () => { const responses = await Promise.all([ fetch("/api/settings/reasoning-routing-rules"), fetch("/api/combos"), fetch("/api/keys"), fetch("/api/providers"), ]); if (responses.some((response) => !response.ok)) throw new Error(t("loadError")); const [ruleData, comboData, keyData, providerData] = await Promise.all( responses.map((response) => response.json()) ); setRules(Array.isArray(ruleData.rules) ? ruleData.rules : []); setCombos(Array.isArray(comboData.combos) ? comboData.combos : []); setKeys(Array.isArray(keyData.keys) ? keyData.keys : []); setConnections(Array.isArray(providerData.connections) ? providerData.connections : []); }, [t]); useEffect(() => { load().catch(() => setMessage(t("loadError"))); }, [load, t]); const visibleRules = useMemo(() => { const query = search.trim().toLowerCase(); return rules.filter((rule) => { if (apiKeyId && (rule.scope !== "apiKey" || rule.apiKeyId !== apiKeyId)) return false; if (!apiKeyId && scopeFilter !== "all" && rule.scope !== scopeFilter) return false; if (statusFilter === "enabled" && !rule.enabled) return false; if (statusFilter === "disabled" && rule.enabled) return false; if (!query) return true; return [rule.name, rule.description, rule.modelPattern, ...rule.requestTags] .filter(Boolean) .some((value) => String(value).toLowerCase().includes(query)); }); }, [apiKeyId, rules, scopeFilter, search, statusFilter]); const targetModelForCapability = form.targetKind === "model" ? form.targetModel : form.modelPattern; const effortOptions = useMemo(() => { const values = [...STANDARD_EFFORTS]; for (const effort of EXTENDED_EFFORTS) { if ( supportsExtendedCodexEffort(targetModelForCapability, effort as "max" | "ultra") || form.targetEffort === effort ) { values.push(effort); } } return values.map((value) => ({ value, label: value })); }, [form.targetEffort, targetModelForCapability]); const capabilityWarning = useMemo(() => { if (form.effortMode === "inherit") return ""; if (!EXTENDED_EFFORTS.includes(form.targetEffort)) return ""; if (form.targetKind === "combo") return t("extendedComboWarning"); if (!targetModelForCapability.trim()) return t("extendedUnknownWarning"); return supportsExtendedCodexEffort( targetModelForCapability, form.targetEffort as "max" | "ultra" ) ? "" : t("extendedUnsupportedWarning"); }, [form.effortMode, form.targetEffort, form.targetKind, t, targetModelForCapability]); const reset = () => { setEditingId(null); setForm(emptyRule(apiKeyId)); }; const edit = (rule: Rule) => { setEditingId(rule.id); setForm({ ...emptyRule(apiKeyId), ...rule, apiKeyId: rule.apiKeyId || "", comboId: rule.comboId || "", connectionId: rule.connectionId || "", modelPattern: rule.modelPattern || "", targetEffort: rule.targetEffort || "medium", targetModel: rule.targetModel || "", targetComboId: rule.targetComboId || "", requestTags: rule.requestTags.join(", "), budgetTokens: rule.budgetTokens ? String(rule.budgetTokens) : "", priority: String(rule.priority), }); }; const payload = () => { const targetKind: TargetKind = form.scope === "connection" ? "keep" : form.targetKind; return { ...form, apiKeyId: form.scope === "apiKey" ? form.apiKeyId || null : null, comboId: form.scope === "combo" ? form.comboId || null : null, connectionId: form.scope === "connection" ? form.connectionId || null : null, modelPattern: form.scope === "model" || form.scope === "apiKey" ? form.modelPattern || null : null, requestTags: form.requestTags .split(",") .map((tag) => tag.trim()) .filter(Boolean), targetEffort: form.effortMode === "inherit" ? null : form.targetEffort, targetKind, targetModel: targetKind === "model" ? form.targetModel || null : null, targetComboId: targetKind === "combo" ? form.targetComboId || null : null, budgetTokens: form.budgetAction === "set" ? Number(form.budgetTokens) : null, priority: Number(form.priority), }; }; const save = async () => { setSaving(true); setMessage(""); try { const response = await fetch( editingId ? `/api/settings/reasoning-routing-rules/${encodeURIComponent(editingId)}` : "/api/settings/reasoning-routing-rules", { method: editingId ? "PATCH" : "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload()), } ); if (!response.ok) { const result = await response.json().catch(() => null); throw new Error(result?.error?.message || result?.error || t("saveError")); } await load(); reset(); setMessage(t("saved")); } catch (error) { setMessage(error instanceof Error ? error.message : t("saveError")); } finally { setSaving(false); } }; const remove = async (id: string) => { if (!window.confirm(t("deleteConfirm"))) return; const response = await fetch( `/api/settings/reasoning-routing-rules/${encodeURIComponent(id)}`, { method: "DELETE" } ); if (response.ok) await load(); else setMessage(t("deleteError")); }; const toggle = async (rule: Rule) => { const response = await fetch( `/api/settings/reasoning-routing-rules/${encodeURIComponent(rule.id)}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ enabled: !rule.enabled }), } ); if (response.ok) await load(); else setMessage(t("saveError")); }; const simulate = async () => { setSimulation(null); const response = await fetch("/api/settings/reasoning-routing-rules/simulate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...simulator, apiKeyId: apiKeyId || form.apiKeyId || null, requestTags: simulator.requestTags .split(",") .map((tag) => tag.trim()) .filter(Boolean), }), }); setSimulation(await response.json()); }; const scopeOptions = ["global", "apiKey", "combo", "model", "connection"].map((scope) => ({ value: scope, label: t(`scope.${scope}`), })); return (
setSearch(e.target.value)} /> {!apiKeyId && ( setStatusFilter(e.target.value)} options={[ { value: "all", label: t("all") }, { value: "enabled", label: t("enabled") }, { value: "disabled", label: t("disabled") }, ]} />
{visibleRules.length === 0 &&

{t("empty")}

} {visibleRules.map((rule) => (
toggle(rule)} size="sm" ariaLabel={t("toggleAria", { name: rule.name })} />

{rule.name}

{t(`scope.${rule.scope}`)} · {rule.modelPattern || t("allModels")} ·{" "} {rule.sourceEffort} →{" "} {rule.targetKind === "keep" ? t("keepModel") : rule.targetModel || rule.targetComboId}{" "} · {t(`mode.${rule.effortMode}`)} {rule.targetEffort ? ` ${rule.targetEffort}` : ""} ·{" "} {t("priorityShort", { value: rule.priority })}

))}
setForm({ ...form, name: e.target.value })} required /> setForm({ ...form, description: e.target.value })} /> {!apiKeyId && ( setForm({ ...form, apiKeyId: e.target.value })} options={keys.map((key) => ({ value: key.id, label: key.name }))} /> )} {form.scope === "combo" && ( setForm({ ...form, connectionId: e.target.value })} options={connections.map((connection) => ({ value: connection.id, label: connection.displayName || connection.name || `${connection.provider} · ${connection.id.slice(0, 8)}`, }))} /> )} {(form.scope === "model" || form.scope === "apiKey") && ( setForm({ ...form, modelPattern: e.target.value })} placeholder={ form.scope === "apiKey" ? t("sourceModelOptional") : t("sourceModelExample") } /> )} setForm({ ...form, requestTags: e.target.value })} placeholder={t("requestTagsExample")} /> setForm({ ...form, effortMode: e.target.value as EffortMode })} options={["inherit", "default", "force"].map((mode) => ({ value: mode, label: t(`mode.${mode}`), }))} /> {form.effortMode !== "inherit" && ( setForm({ ...form, targetKind: e.target.value as TargetKind })} options={[ { value: "keep", label: t("keepModel") }, { value: "model", label: t("otherModel") }, { value: "combo", label: t("combo") }, ]} /> {form.targetKind === "model" && form.scope !== "connection" && ( setForm({ ...form, targetModel: e.target.value })} /> )} {form.targetKind === "combo" && form.scope !== "connection" && ( setForm({ ...form, budgetAction: e.target.value as BudgetAction })} options={["preserve", "remove", "set"].map((action) => ({ value: action, label: t(`budget.${action}`), }))} /> {form.budgetAction === "set" && ( setForm({ ...form, budgetTokens: e.target.value })} /> )} setForm({ ...form, priority: e.target.value })} />
{capabilityWarning && (

{capabilityWarning}

)}
{editingId && ( )}
{message &&

{message}

}

{t("simulateTitle")}

setSimulator({ ...simulator, model: e.target.value })} /> setSimulator({ ...simulator, requestTags: e.target.value })} />