diff --git a/app/components/LlmSettings.tsx b/app/components/LlmSettings.tsx index e52a467..621759f 100644 --- a/app/components/LlmSettings.tsx +++ b/app/components/LlmSettings.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; interface LlmSettingsProps { settings: Record; @@ -6,6 +6,10 @@ interface LlmSettingsProps { saveError: string | null; } +const DEFAULT_MODEL = "openai/gpt-oss-120b:free"; +const DEFAULT_TEMPERATURE = 0.7; +const DEFAULT_MAX_DEBATE_ROUNDS = 3; + const AVAILABLE_MODELS = [ "openai/gpt-oss-120b:free", "openrouter/free", @@ -14,14 +18,18 @@ const AVAILABLE_MODELS = [ ]; export default function LlmSettings({ settings, onSave, saveError }: LlmSettingsProps) { - const [model, setModel] = useState(settings["llm.model"] ?? "openai/gpt-oss-120b:free"); - const [temperature, setTemperature] = useState(settings["llm.temperature"] ?? 0.7); - const [maxDebateRounds, setMaxDebateRounds] = useState(settings["llm.maxDebateRounds"] ?? 3); + const [model, setModel] = useState(settings["llm.model"] ?? DEFAULT_MODEL); + const [temperature, setTemperature] = useState(settings["llm.temperature"] ?? DEFAULT_TEMPERATURE); + const [maxDebateRounds, setMaxDebateRounds] = useState(settings["llm.maxDebateRounds"] ?? DEFAULT_MAX_DEBATE_ROUNDS); + const tempTimerRef = useRef | null>(null); useEffect(() => { - setModel(settings["llm.model"] ?? "openai/gpt-oss-120b:free"); - setTemperature(settings["llm.temperature"] ?? 0.7); - setMaxDebateRounds(settings["llm.maxDebateRounds"] ?? 3); + setModel(settings["llm.model"] ?? DEFAULT_MODEL); + setTemperature(settings["llm.temperature"] ?? DEFAULT_TEMPERATURE); + setMaxDebateRounds(settings["llm.maxDebateRounds"] ?? DEFAULT_MAX_DEBATE_ROUNDS); + return () => { + if (tempTimerRef.current) clearTimeout(tempTimerRef.current); + }; }, [settings]); const saveModel = async (value: string) => { @@ -31,7 +39,10 @@ export default function LlmSettings({ settings, onSave, saveError }: LlmSettings const saveTemperature = async (value: number) => { setTemperature(value); - await onSave("llm.temperature", value); + if (tempTimerRef.current) clearTimeout(tempTimerRef.current); + tempTimerRef.current = setTimeout(() => { + onSave("llm.temperature", value); + }, 300); }; const saveMaxDebateRounds = async (value: number) => { @@ -53,8 +64,9 @@ export default function LlmSettings({ settings, onSave, saveError }: LlmSettings
- +
- + saveMaxDebateRounds(parseInt(e.target.value) || 1)} + onChange={(e) => saveMaxDebateRounds(Math.max(1, parseInt(e.target.value) || 1))} className="w-32 border border-gray-300 rounded-lg px-4 py-2.5 text-gray-900 focus:ring-2 focus:ring-blue-500" />