'use client'; import type React from 'react'; import { Fragment, useMemo, useState } from 'react'; import { Listbox, Transition } from '@headlessui/react'; import { PlayIcon, StopIcon } from '@heroicons/react/24/outline'; import { EVENT } from '../../utils/event'; import { Checkbox, InputNumber, message, Radio, Spin, Tooltip } from 'antd'; import type { TrainingConfig } from '@/service/train'; import { QuestionCircleOutlined } from '@ant-design/icons'; import OpenAiModelIcon from '../svgs/OpenAiModelIcon'; import CustomModelIcon from '../svgs/CustomModelIcon'; import ColumnArrowIcon from '../svgs/ColumnArrowIcon'; import DoneIcon from '../svgs/DoneIcon'; import ThinkingModelModal from '../ThinkingModelModal'; import { useModelConfigStore } from '@/store/useModelConfigStore'; import classNames from 'classnames'; interface BaseModelOption { value: string; label: string; } interface ModelConfig { provider_type?: string; [key: string]: any; } interface TrainingConfigurationProps { baseModelOptions: BaseModelOption[]; modelConfig: ModelConfig | null; isTraining: boolean; updateTrainingParams: (params: TrainingConfig) => void; status: string; trainSuspended: boolean; handleResetProgress: () => void; handleTrainingAction: () => Promise; trainActionLoading: boolean; setSelectedInfo: React.Dispatch>; trainingParams: TrainingConfig; cudaAvailable: boolean; } const synthesisModeOptions = [ { value: 'low', label: 'Low' }, { value: 'medium', label: 'Medium' }, { value: 'high', label: 'High' } ]; const TrainingConfiguration: React.FC = ({ baseModelOptions, modelConfig, isTraining, updateTrainingParams, trainingParams, status, handleResetProgress, trainSuspended, trainActionLoading, handleTrainingAction, setSelectedInfo, cudaAvailable }) => { const [openThinkingModel, setOpenThinkingModel] = useState(false); const [showThinkingWarning, setShowThinkingWarning] = useState(false); const thinkingModelConfig = useModelConfigStore((state) => state.thinkingModelConfig); const disabledChangeParams = useMemo(() => { return isTraining || trainSuspended; }, [isTraining, trainSuspended]); const thinkingConfigComplete = useMemo(() => { return ( !!thinkingModelConfig.thinking_model_name && !!thinkingModelConfig.thinking_api_key && !!thinkingModelConfig.thinking_endpoint ); }, [thinkingModelConfig]); const trainButtonText = useMemo(() => { return isTraining ? 'Stop Training' : status === 'trained' ? 'Retrain' : trainSuspended ? 'Resume Training' : 'Start Training'; }, [isTraining, status, trainSuspended]); const trainButtonIcon = useMemo(() => { return isTraining ? ( trainActionLoading ? ( ) : ( ) ) : ( ); }, [isTraining, trainActionLoading]); return (

Training Configuration

{`Configure how your Second Me will be trained using your memory data and identity. Then click 'Start Training'.`}

Step 1: Choose Support Model for Data Synthesis

{!modelConfig?.provider_type ? (
Model used for processing and synthesizing your memory data
) : (
Model Used :   {modelConfig.provider_type === 'openai' ? ( ) : ( )} {modelConfig.provider_type === 'openai' ? 'OpenAI' : 'Custom Model'}
Model used for processing and synthesizing your memory data
)}
Data Synthesis Mode
updateTrainingParams({ ...trainingParams, data_synthesis_mode: e.target.value }) } optionType="button" options={synthesisModeOptions} value={trainingParams.data_synthesis_mode} /> Low: Fast data synthesis. Medium: Balanced synthesis and speed. High: Rich synthesis, slower speed.

Step 2: Choose Base Model for Training Second Me

Base model for training your Second Me. Choose based on your available system resources.
updateTrainingParams({ model_name: value })} value={trainingParams.model_name} >
{baseModelOptions.find((option) => option.value === trainingParams.model_name) ?.label || 'Select a model...'} {baseModelOptions.map((option) => ( `relative cursor-pointer select-none py-2 pl-10 pr-4 ${active ? 'bg-blue-100 text-blue-900' : 'text-gray-900'}` } value={option.value} > {({ selected }) => ( <> {option.label} {selected ? ( ) : null} )} ))}

Step 3: Configure Advanced Training Parameters

Adjust these parameters to control training quality and performance. Recommended settings will ensure stable training.
Learning Rate
{ if (value == null) { return; } updateTrainingParams({ ...trainingParams, learning_rate: value }); }} status={ trainingParams.learning_rate == 0.005 || trainingParams.learning_rate == 0.00003 ? 'warning' : undefined } step={0.0001} value={trainingParams.learning_rate} />
Enter a value between 0.00003 and 0.005 (recommended: 0.0001)
Number of Epochs
{ if (value == null) { return; } updateTrainingParams({ ...trainingParams, number_of_epochs: value }); }} status={ trainingParams.number_of_epochs == 10 || trainingParams.number_of_epochs == 1 ? 'warning' : undefined } step={1} value={trainingParams.number_of_epochs} />
Enter an integer between 1 and 10 (recommended: 2)
Concurrency Threads
{ if (value == null) { return; } updateTrainingParams({ ...trainingParams, concurrency_threads: value }); }} status={ trainingParams.concurrency_threads == 10 || trainingParams.concurrency_threads == 1 ? 'warning' : undefined } step={1} value={trainingParams.concurrency_threads} />
Enter an integer between 1 and 10 (recommended: 2)
Enable CUDA GPU Acceleration
Step 4: Configure Advanced Behavior
{ e.stopPropagation(); if (!thinkingConfigComplete) { setShowThinkingWarning(true); if (!showThinkingWarning) { setTimeout(() => setShowThinkingWarning(false), 2000); } return; } updateTrainingParams({ ...trainingParams, is_cot: e.target.checked }); }} />
{ if (disabledChangeParams) return; setOpenThinkingModel(true); }} > Thinking Model
{isTraining && (
Full stop only when the current step is complete
)} {trainButtonText === 'Resume Training' && ( )}
setOpenThinkingModel(false)} open={openThinkingModel} />
); }; export default TrainingConfiguration;