import { useEffect, useCallback } from 'react' import { ChevronDown, Loader } from 'lucide-react' import { QuantizationType, WorkerMessage } from '../types' import { useModel } from '../contexts/ModelContext' import { getWorker } from '../lib/workerManager' const ModelLoader = () => { const { modelInfo, selectedQuantization, setSelectedQuantization, status, progress, setStatus, setProgress, activeWorker, setActiveWorker, pipeline } = useModel() useEffect(() => { if (modelInfo.isCompatible && modelInfo.supportedQuantizations.length > 0) { const quantizations = modelInfo.supportedQuantizations let defaultQuant: QuantizationType = 'fp32' if (quantizations.includes('int8')) { defaultQuant = 'int8' } else if (quantizations.includes('q8')) { defaultQuant = 'q8' } else if (quantizations.includes('q4')) { defaultQuant = 'q4' } setSelectedQuantization(defaultQuant) } }, [ modelInfo.supportedQuantizations, modelInfo.isCompatible, setSelectedQuantization ]) useEffect(() => { const newWorker = getWorker(pipeline) if (!newWorker) { return } setStatus('initiate') setActiveWorker(newWorker) const onMessageReceived = (e: MessageEvent) => { const { status, output } = e.data if (status === 'ready') { setStatus('ready') } else if (status === 'loading' && output) { setStatus('loading') if ( output.progress && typeof output.file === 'string' && output.file.startsWith('onnx') ) { setProgress(output.progress) } } } newWorker.addEventListener('message', onMessageReceived) return () => { newWorker.removeEventListener('message', onMessageReceived) // terminateWorker(pipeline); } }, [pipeline, modelInfo.name, selectedQuantization, setActiveWorker, setStatus, setProgress]) const loadModel = useCallback(() => { if (!modelInfo.name || !selectedQuantization) return setStatus('loading') const message = { type: 'load', model: modelInfo.name, quantization: selectedQuantization } activeWorker?.postMessage(message) }, [modelInfo.name, selectedQuantization, setStatus, activeWorker]) const ready: boolean = status === 'ready' const busy: boolean = status === 'loading' if (!modelInfo.isCompatible || modelInfo.supportedQuantizations.length === 0) { return null } return (

Quantization:
{selectedQuantization && (
)}
) } export default ModelLoader