import React, { useState } from 'react'; import { Save, CheckCircle2, AlertTriangle, RefreshCw } from 'lucide-react'; import type { AppSettings, ModelInfo } from '../types'; interface SettingsProps { settings: AppSettings; updateSettings: (newSettings: Partial) => void; clearHistory: () => void; modelInfo: ModelInfo | null; } export const Settings: React.FC = ({ settings, updateSettings, clearHistory, modelInfo, }) => { const [saveSuccess, setSaveSuccess] = useState(false); const [resetting, setResetting] = useState(false); const [confirmClear, setConfirmClear] = useState(false); const handleSave = () => { setSaveSuccess(true); setTimeout(() => setSaveSuccess(false), 2000); }; const handleClearHistory = () => { if (confirmClear) { setResetting(true); setTimeout(() => { clearHistory(); setConfirmClear(false); setResetting(false); alert('Conversation history cleared.'); }, 800); } else { setConfirmClear(true); } }; return (

Generation Settings

Configure how the AI model generates responses.

SmolLM2-360M-Instruct-Q4_K_M.gguf
Temperature {settings.temperature}
updateSettings({ temperature: parseFloat(e.target.value) })} className="w-full accent-primary h-1 bg-[#090810] rounded-lg appearance-none cursor-pointer" />
Max Tokens {settings.maxTokens}
updateSettings({ maxTokens: parseInt(e.target.value) })} className="w-full accent-primary h-1 bg-[#090810] rounded-lg appearance-none cursor-pointer" />
Top P {settings.topP}
updateSettings({ topP: parseFloat(e.target.value) })} className="w-full accent-primary h-1 bg-[#090810] rounded-lg appearance-none cursor-pointer" />

Stream tokens as they are generated.

updateSettings({ streaming: e.target.checked })} className="w-4.5 h-4.5 accent-primary cursor-pointer" />

Model Information

Model {modelInfo?.model_name || 'SmolLM2-360M-Instruct-Q4_K_M'}
Status {modelInfo?.status || 'loaded'}
Quantization Q4_K_M
Disk Size ~180 MB
{/* Danger zone log clear button */}

Reset Cache

{confirmClear && !resetting && ( )}
); };