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, setResults, hasBeenLoaded, setHasBeenLoaded } = useModel() useEffect(() => { setHasBeenLoaded(false) }, [selectedQuantization, setHasBeenLoaded]) useEffect(() => { if (!modelInfo) return if (modelInfo.isCompatible) { 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) } setHasBeenLoaded(false) }, [modelInfo, setSelectedQuantization, setHasBeenLoaded]) useEffect(() => { if (!modelInfo) return const newWorker = getWorker(pipeline) if (!newWorker) { return } if (!hasBeenLoaded) { setStatus('initiate') setActiveWorker(newWorker) } const onMessageReceived = (e: MessageEvent) => { const { status, output } = e.data if (status === 'ready') { setStatus('ready') if (e.data.output) console.log(e.data.output) setHasBeenLoaded(true) } else if (status === 'loading' && output && !hasBeenLoaded) { setStatus('loading') if ( output.progress && typeof output.file === 'string' && output.file.startsWith('onnx') ) { setProgress(output.progress) } } else if (status === 'output') { setStatus('output') const result = e.data.output! setResults((prev: any[]) => [...prev, result]) // console.log(result) } else if (status === 'error') { setStatus('error') console.error(e.data.output) } } newWorker.addEventListener('message', onMessageReceived) return () => { newWorker.removeEventListener('message', onMessageReceived) // terminateWorker(pipeline); } }, [ pipeline, modelInfo, selectedQuantization, setActiveWorker, setStatus, setProgress, setResults, hasBeenLoaded, setHasBeenLoaded ]) const loadModel = useCallback(() => { if (!modelInfo || !selectedQuantization) return const message = { type: 'load', model: modelInfo.name, dtype: selectedQuantization ?? 'fp32' } activeWorker?.postMessage(message) }, [modelInfo, selectedQuantization, activeWorker]) if (!modelInfo?.isCompatible) { return null } return (

{modelInfo.supportedQuantizations.length > 1 ? ( <> Quantization:
) : ( No quantization available. Using fp32 )}
{selectedQuantization && (
)}
) } export default ModelLoader