import React, { createContext, useContext, useEffect, useState } from 'react' import { ModelInfo, ModelInfoResponse, QuantizationType, WorkerStatus } from '../types' interface ModelContextType { status: WorkerStatus setStatus: (status: WorkerStatus) => void progress: number setProgress: (progress: number) => void modelInfo: ModelInfo | null setModelInfo: (model: ModelInfo | null) => void pipeline: string setPipeline: (pipeline: string) => void models: ModelInfoResponse[] setModels: (models: ModelInfoResponse[]) => void selectedQuantization: QuantizationType setSelectedQuantization: (quantization: QuantizationType) => void activeWorker: Worker | null setActiveWorker: (worker: Worker | null) => void isFetching: boolean setIsFetching: (isFetching: boolean) => void hasBeenLoaded: boolean setHasBeenLoaded: (hasBeenLoaded: boolean) => void errorText: string setErrorText: (errorText: string) => void } const ModelContext = createContext(undefined) export function ModelProvider({ children }: { children: React.ReactNode }) { const [progress, setProgress] = useState(0) const [status, setStatus] = useState('initiate') const [modelInfo, setModelInfo] = useState(null) const [models, setModels] = useState( [] as ModelInfoResponse[] ) const [pipeline, setPipeline] = useState('feature-extraction') //text-generation const [selectedQuantization, setSelectedQuantization] = useState('int8') const [activeWorker, setActiveWorker] = useState(null) const [isFetching, setIsFetching] = useState(false) const [hasBeenLoaded, setHasBeenLoaded] = useState(false) const [errorText, setErrorText] = useState('') // set progress to 0 when model is changed useEffect(() => { setProgress(0) }, [modelInfo?.name]) return ( {children} ) } export function useModel() { const context = useContext(ModelContext) if (context === undefined) { throw new Error('useModel must be used within a ModelProvider') } return context }