"use client"; import { useEffect, useMemo, useState } from "react"; import { Card, Toggle, Select } from "@/shared/components"; import { useTranslations } from "next-intl"; import { CODEX_FAST_TIER_DEFAULT_SUPPORTED_MODELS, resolveCodexGlobalFastServiceTier, } from "@/lib/providers/codexFastTier"; type TierValue = "default" | "priority" | "flex"; // Fast-eligible Codex models per OpenAI ~/.codex/models_cache.json (service_tiers: priority). // Other future Fast-eligible slugs can be added here without code changes once the user // opts them in via the checkbox UI. const CODEX_FAST_TIER_CATALOG: readonly string[] = ["gpt-5.5", "gpt-5.4"]; export default function CodexFastTierTab() { const [enabled, setEnabled] = useState(false); const [tier, setTier] = useState("priority"); const [supportedModels, setSupportedModels] = useState([ ...CODEX_FAST_TIER_DEFAULT_SUPPORTED_MODELS, ]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [status, setStatus] = useState<"" | "saved" | "error">(""); const [modelsOpen, setModelsOpen] = useState(false); const t = useTranslations("settings"); useEffect(() => { let cancelled = false; fetch("/api/settings") .then((res) => res.json()) .then((data) => { if (cancelled) return; const resolved = resolveCodexGlobalFastServiceTier(data); setEnabled(resolved.enabled); setTier(resolved.tier); setSupportedModels([...resolved.supportedModels]); setLoading(false); }) .catch(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); const allCatalogModels = useMemo(() => { // Union of the catalog and any custom models the user has stored, so we don't // silently drop a slug the user added on a future Codex release. const set = new Set([...CODEX_FAST_TIER_CATALOG, ...supportedModels]); return Array.from(set); }, [supportedModels]); const save = async (next: { enabled?: boolean; tier?: TierValue; supportedModels?: string[]; }) => { if (saving || loading) return; setSaving(true); setStatus(""); const previous = { enabled, tier, supportedModels }; const merged = { enabled: next.enabled ?? enabled, tier: next.tier ?? tier, supportedModels: next.supportedModels ?? supportedModels, }; setEnabled(merged.enabled); setTier(merged.tier); setSupportedModels(merged.supportedModels); try { const res = await fetch("/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ codexServiceTier: { enabled: merged.enabled, tier: merged.tier, supportedModels: merged.supportedModels, }, }), }); if (res.ok) { setStatus("saved"); setTimeout(() => setStatus(""), 2000); } else { setEnabled(previous.enabled); setTier(previous.tier); setSupportedModels(previous.supportedModels); setStatus("error"); } } catch { setEnabled(previous.enabled); setTier(previous.tier); setSupportedModels(previous.supportedModels); setStatus("error"); } finally { setSaving(false); } }; const toggleModel = (slug: string, checked: boolean) => { const next = checked ? Array.from(new Set([...supportedModels, slug])) : supportedModels.filter((m) => m !== slug); save({ supportedModels: next }); }; return (

{t("codexFastTierTitle")}

{t("codexFastTierDesc")}

{status === "saved" && ( check_circle{" "} {t("saved")} )} {status === "error" && ( error{" "} {t("codexFastTierSaveError")} )} save({ enabled: value })} disabled={loading || saving} ariaLabel={t("codexFastTierTitle")} />
{enabled && (
toggleModel(slug, e.target.checked)} aria-label={t("codexFastTierModelCheckbox", { model: slug })} /> {slug} ); })}
)} )}

info {t("codexFastTierHint")}

); }