import { Stack, Text, Group, TextInput, Button, Slider } from '@mantine/core'; import { File, Search } from 'lucide-react'; import { InfoTooltip } from '@/components/InfoTooltip'; import { BackendSelector } from '@/components/screens/Launch/GeneralTab/BackendSelector'; import { getInputValidationState } from '@/utils'; import styles from '@/styles/layout.module.css'; interface GeneralTabProps { modelPath: string; gpuLayers: number; autoGpuLayers: boolean; contextSize: number; backend: string; gpuDevice?: number; noavx2: boolean; failsafe: boolean; onModelPathChange: (path: string) => void; onSelectModelFile: () => void; onGpuLayersChange: (layers: number) => void; onAutoGpuLayersChange: (auto: boolean) => void; onContextSizeChange: (size: number) => void; onBackendChange: (backend: string) => void; onGpuDeviceChange?: (device: number) => void; onWarningsChange?: ( warnings: Array<{ type: 'warning' | 'info'; message: string }> ) => void; onBackendsReady?: () => void; } export const GeneralTab = ({ modelPath, gpuLayers, autoGpuLayers, contextSize, backend, gpuDevice, noavx2, failsafe, onModelPathChange, onSelectModelFile, onGpuLayersChange, onAutoGpuLayersChange, onContextSizeChange, onBackendChange, onGpuDeviceChange, onWarningsChange, onBackendsReady, }: GeneralTabProps) => { const validationState = getInputValidationState(modelPath); const getInputColor = () => { switch (validationState) { case 'valid': return 'green'; case 'invalid': return 'red'; default: return undefined; } }; const getHelperText = () => { if (!modelPath.trim()) return undefined; if (validationState === 'invalid') { return 'Enter a valid URL or file path to the .gguf'; } return undefined; }; return (
Text Model File
onModelPathChange(event.currentTarget.value)} color={getInputColor()} error={ validationState === 'invalid' ? getHelperText() : undefined } />
Context Size onContextSizeChange(Number(event.target.value) || 256) } type="number" min={256} max={131072} step={256} size="sm" w={100} />
); };