import React from 'react'; import Modal from 'react-modal'; import { GoX } from 'react-icons/go'; import { LLMConfig } from '@/api/llmConfigs/types'; import { useQuery } from '@tanstack/react-query'; import { fetchLLMConfigById, fetchDefaultLLMConfig } from '@/api/llmConfigs/llmConfigApi'; import './LlmConfigModal.scss'; interface LLMConfigModalProps { isOpen: boolean; onRequestClose: () => void; config: LLMConfig | null; onSave: (config: LLMConfig | Omit) => Promise; isEditMode: boolean; } const customStyles = { content: { top: '40%', left: '50%', right: 'auto', bottom: 'auto', transform: 'translate(-50%, -50%)', borderRadius: '15px', maxWidth: '100%', overflow: 'hidden', }, }; const LLMConfigModal: React.FC = ({ isOpen, onRequestClose, config, onSave, isEditMode, }) => { const [formData, setFormData] = React.useState>(() => ({ is_default: false, model: '', temperature: 0.7, top_p: 0.95, min_p: 0.05, frequency_penalty: 0, presence_penalty: 0, seed: 42, n_predict: 1000 })); // Запрос конфига для редактирования const { data: serverConfig, isLoading: isConfigLoading } = useQuery({ queryKey: ['llmConfig', config?.id], queryFn: () => fetchLLMConfigById(config!.id), enabled: isOpen && isEditMode && !!config?.id, }); // Запрос дефолтной конфигурации для создания const { data: defaultConfig, isLoading: isDefaultLoading } = useQuery({ queryKey: ['defaultLLMConfig'], queryFn: fetchDefaultLLMConfig, enabled: isOpen && !isEditMode, // Запрашиваем только при создании }); React.useEffect(() => { if (isOpen) { if (isEditMode && serverConfig) { setFormData(serverConfig); // Данные с сервера для редактирования } else if (!isEditMode && defaultConfig) { setFormData(defaultConfig); // Дефолтная запись с сервера для создания } else if (!isEditMode && !defaultConfig && !isDefaultLoading) { setFormData({ // Если дефолтной записи нет и загрузка завершена is_default: true, model: 'meta-llama/Llama-3.3-70B-Instruct-Turbo', temperature: 0.14, top_p: 0.95, min_p: 0.05, frequency_penalty: -0.001, presence_penalty: 1.3, n_predict: 1000, seed: 42, }); } } }, [isOpen, isEditMode, serverConfig, defaultConfig, isDefaultLoading]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: name === 'is_default' ? e.target.checked : name === 'model' ? value : name === 'seed' ? parseInt(value, 10) || 0 : parseFloat(value) || 0, })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { await onSave(formData); onRequestClose(); } catch (err) { console.error('Save failed:', err); } }; if (isConfigLoading && isEditMode) { return
Loading config...
; } if (isDefaultLoading && !isEditMode) { return
Loading default config...
; } return (

{isEditMode ? 'Редактирование настроек' : 'Новые настройки'}

{isEditMode && 'id' in formData && ( )}
); }; export default LLMConfigModal;