import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { Switch } from "@/components/ui/switch"; import { Label } from "@/components/ui/label"; import { settingsApi, type RectifierConfig, type OptimizerConfig, } from "@/lib/api/settings"; export function RectifierConfigPanel() { const { t } = useTranslation(); const [config, setConfig] = useState({ enabled: true, requestThinkingSignature: true, requestThinkingBudget: true, requestMediaFallback: true, requestMediaHeuristic: true, }); const [optimizerConfig, setOptimizerConfig] = useState({ enabled: false, thinkingOptimizer: true, cacheInjection: true, cacheTtl: "1h", }); const [isLoading, setIsLoading] = useState(true); useEffect(() => { settingsApi .getRectifierConfig() .then(setConfig) .catch((e) => console.error("Failed to load rectifier config:", e)) .finally(() => setIsLoading(false)); settingsApi .getOptimizerConfig() .then(setOptimizerConfig) .catch((e) => console.error("Failed to load optimizer config:", e)); }, []); const handleChange = async (updates: Partial) => { const newConfig = { ...config, ...updates }; setConfig(newConfig); try { await settingsApi.setRectifierConfig(newConfig); } catch (e) { console.error("Failed to save rectifier config:", e); toast.error(String(e)); setConfig(config); } }; const handleOptimizerChange = async (updates: Partial) => { const newConfig = { ...optimizerConfig, ...updates }; setOptimizerConfig(newConfig); try { await settingsApi.setOptimizerConfig(newConfig); } catch (e) { console.error("Failed to save optimizer config:", e); toast.error(String(e)); setOptimizerConfig(optimizerConfig); } }; if (isLoading) return null; return (

{t("settings.advanced.rectifier.enabledDescription")}

handleChange({ enabled: checked })} />

{t("settings.advanced.rectifier.requestGroup")}

{t("settings.advanced.rectifier.thinkingSignatureDescription")}

handleChange({ requestThinkingSignature: checked }) } />

{t("settings.advanced.rectifier.thinkingBudgetDescription")}

handleChange({ requestThinkingBudget: checked }) } />

{t("settings.advanced.rectifier.mediaFallbackDescription")}

handleChange({ requestMediaFallback: checked }) } />

{t("settings.advanced.rectifier.mediaHeuristicDescription")}

handleChange({ requestMediaHeuristic: checked }) } />

{t("settings.advanced.optimizer.title")}

{t("settings.advanced.optimizer.description")}

handleOptimizerChange({ enabled: checked }) } />

{t( "settings.advanced.optimizer.thinkingOptimizerDescription", )}

handleOptimizerChange({ thinkingOptimizer: checked }) } />

{t("settings.advanced.optimizer.cacheInjectionDescription")}

handleOptimizerChange({ cacheInjection: checked }) } />
{optimizerConfig.cacheInjection && (
)}
); }