import React from 'react'; import { AppSettings, ModelConfig, ModelType } from '../types'; import { useLanguage } from '../contexts/LanguageContext'; import { useConfirm } from '../contexts/ConfirmContext'; import { Settings, Database, Sliders, Layers, Cpu, ChevronRight } from 'lucide-react'; import VisionModelSelector from './VisionModelSelector'; interface ConfigPanelProps { settings: AppSettings; models: ModelConfig[]; onSettingsChange: (newSettings: AppSettings) => void; onOpenSettings: () => void; mode?: 'chat' | 'kb' | 'all'; isAdmin?: boolean; } const ConfigPanel: React.FC = ({ settings, models, onSettingsChange, onOpenSettings, mode = 'all', isAdmin = false }) => { const { t } = useLanguage(); const { confirm } = useConfirm(); const handleChange = (key: keyof AppSettings, value: any) => { onSettingsChange({ ...settings, [key]: value, }); }; const llmModels = models.filter(m => m.type === ModelType.LLM && m.isEnabled !== false && !m.supportsVision); const embeddingModels = models.filter(m => m.type === ModelType.EMBEDDING && m.isEnabled !== false); const rerankModels = models.filter(m => m.type === ModelType.RERANK && m.isEnabled !== false); const showChatSettings = mode === 'chat' || mode === 'all'; const showKbSettings = mode === 'kb' || mode === 'all'; return (
{!isAdmin && (

{t('onlyAdminCanModify') || "Only administrators can modify system settings."}

)} {/* Model Selection (LLM) - Chat Mode Only */} {showChatSettings && (
{t('headerModelSelection')}
)} {/* Embedding Model Selection - KB Mode Only */} {showKbSettings && (
{t('lblEmbedding')}

{t('defaultForUploads')}

{t('embeddingModelWarning') || "Changing this setting may require clearing and re-importing your knowledge base."}

)} {/* Hyperparameters - Chat Mode Only */} {showChatSettings && (
{t('headerHyperparams')}
{settings.temperature}
handleChange('temperature', parseFloat(e.target.value))} disabled={!isAdmin} className={`w-full h-2 rounded-lg appearance-none cursor-pointer accent-blue-600 ${!isAdmin ? 'bg-slate-100' : 'bg-slate-200'}`} />
handleChange('maxTokens', parseInt(e.target.value))} disabled={!isAdmin} className="w-full text-sm bg-slate-50 border border-slate-200 rounded-lg px-3 py-2 text-slate-700 focus:outline-none focus:border-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" />
)} {/* Vision Model Settings - Chat Mode Only? Or both? Assuming Chat */} {/* Vision Model Settings - KB Only */} {showKbSettings && } {/* Retrieval Settings - KB Mode Only */} {showKbSettings && (
{t('headerRetrieval')}
{settings.topK}
handleChange('topK', parseInt(e.target.value))} disabled={!isAdmin} className={`w-full h-2 rounded-lg appearance-none cursor-pointer accent-blue-600 ${!isAdmin ? 'bg-slate-100' : 'bg-slate-200'}`} />
{settings.similarityThreshold}
handleChange('similarityThreshold', parseFloat(e.target.value))} disabled={!isAdmin} className={`w-full h-2 rounded-lg appearance-none cursor-pointer accent-blue-600 ${!isAdmin ? 'bg-slate-100' : 'bg-slate-200'}`} />

{t('filterLowResults')}

{settings.enableRerank && (
{settings.rerankSimilarityThreshold}
handleChange('rerankSimilarityThreshold', parseFloat(e.target.value))} className="w-full h-2 bg-slate-200 rounded-lg appearance-none cursor-pointer accent-pink-600" />
)}
{settings.enableFullTextSearch && (
{settings.hybridVectorWeight}
handleChange('hybridVectorWeight', parseFloat(e.target.value))} disabled={!isAdmin} className={`w-full h-2 rounded-lg appearance-none cursor-pointer accent-blue-600 ${!isAdmin ? 'bg-slate-100' : 'bg-slate-200'}`} />

{t('hybridVectorWeightDesc')}

)}
)}
); }; export default ConfigPanel;