"use client"; import { useState, useEffect, useRef } from "react"; import { Card, Button, Input, Toggle } from "@/shared/components"; import { cn } from "@/shared/utils/cn"; import { ROUTING_STRATEGIES, SETTINGS_FALLBACK_STRATEGY_VALUES, } from "@/shared/constants/routingStrategies"; import { useTranslations } from "next-intl"; const STRATEGY_LABEL_FALLBACKS: Record = { "context-relay": "Context Relay", }; const LEGACY_COMBO_RESILIENCE_KEYS = new Set([ "timeoutMs", "healthCheckEnabled", "healthCheckTimeoutMs", ]); const ACCOUNT_FALLBACK_STRATEGIES = new Set(SETTINGS_FALLBACK_STRATEGY_VALUES); const MS_PER_SECOND = 1000; function msToSeconds(value: unknown): number { const ms = Number(value); if (!Number.isFinite(ms) || ms <= 0) return 0; return Math.round(ms / MS_PER_SECOND); } function msToOptionalSecondsInput(value: unknown): string { const ms = Number(value); if (!Number.isFinite(ms) || ms <= 0) return ""; return String(Math.round(ms / MS_PER_SECOND)); } function secondsInputToMs(value: string, maxSeconds: number): number { const seconds = Number(value); if (!Number.isFinite(seconds) || seconds <= 0) return 0; return Math.min(maxSeconds, Math.round(seconds)) * MS_PER_SECOND; } function secondsInputToOptionalMs(value: string, maxSeconds = 86400): number | undefined { const seconds = Number(value); if (!Number.isFinite(seconds) || seconds <= 0) return undefined; return Math.min(maxSeconds, Math.round(seconds)) * MS_PER_SECOND; } function translateOrFallback( t: ReturnType, key: string, fallback: string ): string { return typeof t.has === "function" && t.has(key) ? t(key) : fallback; } function sanitizeComboRuntimeConfig(config?: Record | null) { if (!config || typeof config !== "object") return {}; return Object.fromEntries( Object.entries(config).filter( ([key, value]) => value !== undefined && value !== null && !LEGACY_COMBO_RESILIENCE_KEYS.has(key) ) ); } function sanitizeProviderOverrides(overrides?: Record | null) { if (!overrides || typeof overrides !== "object") return {}; return Object.fromEntries( Object.entries(overrides).map(([providerId, config]) => [ providerId, sanitizeComboRuntimeConfig(config), ]) ); } function toGlobalRoutingPatch(strategy: string | undefined, stickyRoundRobinLimit?: number) { const patch: Record = {}; if (strategy && ACCOUNT_FALLBACK_STRATEGIES.has(strategy)) { patch.fallbackStrategy = strategy; } if (strategy === "round-robin" && stickyRoundRobinLimit !== undefined) { patch.stickyRoundRobinLimit = stickyRoundRobinLimit; } return patch; } export default function ComboDefaultsTab() { const [comboDefaults, setComboDefaults] = useState({ strategy: "priority", maxRetries: 1, retryDelayMs: 2000, maxComboDepth: 3, trackMetrics: true, reasoningTokenBufferEnabled: true, handoffThreshold: 0.85, handoffModel: "", maxMessagesForSummary: 30, stickyRoundRobinLimit: 3, resetAwareQuotaCacheTtlMs: 0, resetAwareQuotaCacheMaxStaleMs: 0, zeroLatencyOptimizationsEnabled: false, }); const [codexSessionAffinityTtlMs, setCodexSessionAffinityTtlMs] = useState(0); const [providerOverrides, setProviderOverrides] = useState({}); const [availableProviders, setAvailableProviders] = useState<{ id: string; provider: string }[]>( [] ); const [dropdownOpen, setDropdownOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const [highlightedIdx, setHighlightedIdx] = useState(0); const dropdownRef = useRef(null); const [saving, setSaving] = useState(false); const [status, setStatus] = useState<{ type: "success" | "error" | ""; message: string }>({ type: "", message: "", }); const t = useTranslations("settings"); const tc = useTranslations("common"); const strategyOptions = ROUTING_STRATEGIES.map((strategy) => ({ value: strategy.value, label: translateOrFallback( t, strategy.labelKey, STRATEGY_LABEL_FALLBACKS[strategy.value] || strategy.value ), icon: strategy.icon, })); const numericSettings = [ { key: "maxRetries", label: t("maxRetriesLabel"), min: 0, max: 5 }, { key: "retryDelayMs", label: t("retryDelayLabel"), min: 500, max: 10000, step: 500 }, { key: "maxComboDepth", label: t("maxNestingDepth"), min: 1, max: 10 }, ]; useEffect(() => { Promise.all([ fetch("/api/settings/combo-defaults").then((res) => res.json()), fetch("/api/settings").then((res) => res.json()), fetch("/api/providers") .then((res) => res.json()) .then((providers: any[]) => { // Filter: include a provider only if at least one of its connections is active. // Disabled providers (all connections inactive) are excluded. const byProvider = new Map(); for (const p of providers) { if (!p.provider) continue; const list = byProvider.get(p.provider) || []; list.push(p); byProvider.set(p.provider, list); } const activeProviders = Array.from(byProvider.entries()) .filter(([, conns]) => conns.some((c) => c.isActive !== false)) .map(([name]) => name) .sort(); setAvailableProviders(activeProviders.map((p) => ({ id: p, provider: p }))); }) .catch(() => { /* providers fetch is non-critical */ }), ]) .then(([comboData, settingsData]) => { setComboDefaults((prev) => ({ ...prev, ...sanitizeComboRuntimeConfig(comboData.comboDefaults), strategy: comboData.comboDefaults?.strategy ?? settingsData.fallbackStrategy ?? prev.strategy, stickyRoundRobinLimit: settingsData.stickyRoundRobinLimit ?? comboData.comboDefaults?.stickyRoundRobinLimit ?? prev.stickyRoundRobinLimit, })); if (comboData.providerOverrides) { setProviderOverrides(sanitizeProviderOverrides(comboData.providerOverrides)); } setCodexSessionAffinityTtlMs( Number.isFinite(Number(settingsData.codexSessionAffinityTtlMs)) ? Number(settingsData.codexSessionAffinityTtlMs) : 0 ); }) .catch((err) => console.error("Failed to fetch combo defaults:", err)); }, []); // Close dropdown on outside click useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const showStatus = (type: "success" | "error", message: string) => { setStatus({ type, message }); setTimeout(() => setStatus({ type: "", message: "" }), 2500); }; const syncGlobalRoutingSettings = async (patch: Record) => { if (Object.keys(patch).length === 0) return; const res = await fetch("/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(patch), }); if (!res.ok) { throw new Error("Failed to sync global routing settings"); } }; const saveComboDefaults = async () => { setSaving(true); try { const { stickyRoundRobinLimit, ...comboDefaultsPayload } = comboDefaults; const settingsPatch = { ...toGlobalRoutingPatch(comboDefaults.strategy, stickyRoundRobinLimit), codexSessionAffinityTtlMs, }; const comboDefaultsRes = await fetch("/api/settings/combo-defaults", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ comboDefaults: sanitizeComboRuntimeConfig(comboDefaultsPayload), providerOverrides: sanitizeProviderOverrides(providerOverrides), }), }); if (!comboDefaultsRes.ok) { throw new Error("Failed to save combo defaults"); } await syncGlobalRoutingSettings(settingsPatch); showStatus("success", t("savedSuccessfully")); } catch (err) { console.error("Failed to save combo defaults:", err); showStatus("error", t("errorOccurred")); } finally { setSaving(false); } }; const addProviderOverride = (name: string) => { const trimmed = name.trim().toLowerCase(); if (!trimmed || providerOverrides[trimmed]) return; setProviderOverrides((prev) => ({ ...prev, [trimmed]: { maxRetries: 1 } })); setDropdownOpen(false); setSearchQuery(""); setHighlightedIdx(0); }; const removeProviderOverride = (provider: string) => { setProviderOverrides((prev) => { const copy = { ...prev }; delete copy[provider]; return copy; }); }; // Reorder a provider override by rebuilding the object in the new order. // direction: -1 = move up, +1 = move down const moveProviderOverride = (provider: string, direction: -1 | 1) => { setProviderOverrides((prev) => { const keys = Object.keys(prev); const idx = keys.indexOf(provider); if (idx < 0) return prev; const target = idx + direction; if (target < 0 || target >= keys.length) return prev; // Swap positions [keys[idx], keys[target]] = [keys[target], keys[idx]]; // Rebuild object in new order const reordered: Record = {}; for (const k of keys) { reordered[k] = prev[k]; } return reordered; }); }; // Filtered provider list — excludes already-added ones, filtered by search query const filteredProviders = availableProviders.filter( (p) => !providerOverrides[p.provider] && p.provider.toLowerCase().includes(searchQuery.toLowerCase()) ); const handleDropdownKeyDown = (e: React.KeyboardEvent) => { switch (e.key) { case "ArrowDown": e.preventDefault(); setHighlightedIdx((prev) => Math.min(prev + 1, filteredProviders.length - 1)); break; case "ArrowUp": e.preventDefault(); setHighlightedIdx((prev) => Math.max(prev - 1, 0)); break; case "Enter": e.preventDefault(); if (filteredProviders[highlightedIdx]) { addProviderOverride(filteredProviders[highlightedIdx].provider); } break; case "Escape": e.preventDefault(); setDropdownOpen(false); break; } }; return (

{translateOrFallback(t, "comboDefaultsTitle", "Default Routing & Combo Settings")}

{t("globalComboConfig")} {status.message && ( {status.message} )}

{translateOrFallback(t, "routingAdvancedGuideTitle", "Advanced routing guidance")}

{translateOrFallback( t, "routingAdvancedGuideHint1", "This strategy is synced to both new combo defaults and global account fallback routing." )}

{translateOrFallback( t, "routingAdvancedGuideHint2", "Use Fill First for predictable account priority, Round Robin plus Sticky Limit for account batches, and P2C for latency resilience." )}

{t("comboDefaultsGuideTitle")}

{t("comboDefaultsGuideHint1")}

{t("comboDefaultsGuideHint2")}

{/* Default Strategy */}

{t("defaultStrategy")}

{t("defaultStrategyDesc")}

{strategyOptions.map((s) => ( ))}
{comboDefaults.strategy === "round-robin" && (

{t("stickyLimit")}

{t("stickyLimitDesc")}

{ const nextLimit = parseInt(e.target.value) || 3; setComboDefaults((prev) => ({ ...prev, stickyRoundRobinLimit: nextLimit, })); try { await syncGlobalRoutingSettings({ stickyRoundRobinLimit: nextLimit }); } catch (error) { console.error("Failed to sync sticky round robin limit:", error); showStatus("error", t("errorOccurred")); } }} className="w-20 text-center" />
)} {/* Numeric settings */}
{numericSettings.map(({ key, label, min, max, step }) => ( setComboDefaults((prev) => ({ ...prev, [key]: parseInt(e.target.value) || 0 })) } className="text-sm" /> ))} setComboDefaults((prev) => ({ ...prev, targetTimeoutMs: secondsInputToOptionalMs(e.target.value), })) } className="text-sm" />

{translateOrFallback( t, "targetTimeoutHint", "Combo targets inherit the current request timeout by default. Set a lower value here only when you want faster fallback." )}

{translateOrFallback(t, "codexSessionAffinityTitle", "Codex session affinity")}

{translateOrFallback( t, "codexSessionAffinityDesc", "Keeps one Codex conversation on the same account for this many seconds. 0 disables it." )}

setCodexSessionAffinityTtlMs(secondsInputToMs(e.target.value, 86400))} className="text-sm" />

{translateOrFallback(t, "resetAwareQuotaCacheTitle", "Reset-aware quota cache")}

{translateOrFallback( t, "resetAwareQuotaCacheDesc", "Caches quota telemetry for reset-aware ordering only. Quota preflight still protects requests. 0/0 keeps live fetching." )}

setComboDefaults((prev) => ({ ...prev, resetAwareQuotaCacheTtlMs: secondsInputToMs(e.target.value, 300), })) } className="text-sm" /> setComboDefaults((prev) => ({ ...prev, resetAwareQuotaCacheMaxStaleMs: secondsInputToMs(e.target.value, 3600), })) } className="text-sm" />
{/* Round-Robin specific */} {comboDefaults.strategy === "round-robin" && (
setComboDefaults((prev) => ({ ...prev, concurrencyPerModel: parseInt(e.target.value) || 0, })) } className="text-sm" /> setComboDefaults((prev) => ({ ...prev, queueTimeoutMs: parseInt(e.target.value) || 0, })) } className="text-sm" /> setComboDefaults((prev) => ({ ...prev, queueDepth: parseInt(e.target.value) || 0, })) } className="text-sm" />
)} {comboDefaults.strategy === "context-relay" && (
setComboDefaults((prev) => ({ ...prev, handoffThreshold: e.target.value ? Number(e.target.value) : undefined, })) } className="text-sm" /> setComboDefaults((prev) => ({ ...prev, maxMessagesForSummary: e.target.value ? Number(e.target.value) : undefined, })) } className="text-sm" /> setComboDefaults((prev) => ({ ...prev, handoffModel: e.target.value, })) } className="text-sm" />

{translateOrFallback( t, "contextRelayProviderNote", "Context Relay currently generates handoffs for Codex accounts and uses these values as global defaults for new or unconfigured combos." )}

)} {/* Toggles */}

{t("trackMetrics")}

{t("trackMetricsDesc")}

setComboDefaults((prev) => ({ ...prev, trackMetrics: !prev.trackMetrics })) } />

{translateOrFallback(t, "reasoningTokenBuffer", "Reasoning token buffer")}

{translateOrFallback( t, "reasoningTokenBufferDesc", "Allow combo routing to add max_tokens headroom only for known reasoning models when the full buffer fits inside a known output cap." )}

setComboDefaults((prev) => ({ ...prev, reasoningTokenBufferEnabled: prev.reasoningTokenBufferEnabled === false, })) } />

{translateOrFallback(t, "zeroLatencyOptimizations", "Zero-latency optimizations")}

{translateOrFallback( t, "zeroLatencyOptimizationsDesc", "Opt in to hedging, predictive TTFT skips, and proactive fallback compression. Leave off to prevent these latency features from racing targets or compressing fallback requests." )}

setComboDefaults((prev) => ({ ...prev, zeroLatencyOptimizationsEnabled: prev.zeroLatencyOptimizationsEnabled !== true, })) } />
{/* Provider Overrides */}

{t("providerOverrides")}

{t("providerOverridesDesc")}

{Object.entries(providerOverrides).map( ([provider, config]: [string, any], index: number) => (
{/* Reorder arrows (combo-builder pattern) */}
{provider} setProviderOverrides((prev) => ({ ...prev, [provider]: { ...prev[provider], maxRetries: parseInt(e.target.value) || 0 }, })) } className="text-xs w-16" aria-label={t("providerMaxRetriesAria", { provider })} /> {t("retries")}
) )}
{dropdownOpen && (
{ setSearchQuery(e.target.value); setHighlightedIdx(0); }} className="w-full px-2 py-1.5 text-xs rounded-md border border-border/50 bg-transparent outline-none focus:border-amber-500 transition-colors" placeholder={t("searchProviderPlaceholder") || "Search providers..."} aria-label={t("searchProviderAria") || "Search providers"} onKeyDown={handleDropdownKeyDown} autoFocus />
    {filteredProviders.length === 0 ? (
  • {availableProviders.filter((p) => !providerOverrides[p.provider]).length === 0 ? "All providers added" : "No providers found"}
  • ) : ( filteredProviders.map((p, idx) => (
  • addProviderOverride(p.provider)} onMouseEnter={() => setHighlightedIdx(idx)} > {p.provider}
  • )) )}
)}
{/* Save */}
); }