File size: 2,674 Bytes
0c10cf2
ad5cef3
 
 
 
 
 
fb852fe
 
ad5cef3
 
96812c9
 
673d22a
 
59a1fe9
 
 
 
6ebf2fd
 
e7ba29d
 
4d810fa
 
 
 
63dbafb
 
fb852fe
 
96812c9
fb852fe
 
96812c9
ad5cef3
673d22a
ad5cef3
 
 
4a70176
ad5cef3
 
e7ba29d
4d810fa
 
63dbafb
4d810fa
fb852fe
 
96812c9
673d22a
fb852fe
 
 
96812c9
 
 
 
 
 
59a1fe9
 
 
 
 
6ebf2fd
 
e7ba29d
4d810fa
 
 
 
63dbafb
 
 
96812c9
fb852fe
 
 
96812c9
fb852fe
 
 
96812c9
fb852fe
96812c9
fb852fe
96812c9
fb852fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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<ModelContextType | undefined>(undefined)

export function ModelProvider({ children }: { children: React.ReactNode }) {
  const [progress, setProgress] = useState<number>(0)
  const [status, setStatus] = useState<WorkerStatus>('initiate')
  const [modelInfo, setModelInfo] = useState<ModelInfo | null>(null)
  const [models, setModels] = useState<ModelInfoResponse[]>(
    [] as ModelInfoResponse[]
  )
  const [pipeline, setPipeline] = useState<string>('feature-extraction') //text-generation
  const [selectedQuantization, setSelectedQuantization] =
    useState<QuantizationType>('int8')
  const [activeWorker, setActiveWorker] = useState<Worker | null>(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 (
    <ModelContext.Provider
      value={{
        progress,
        setProgress,
        status,
        setStatus,
        modelInfo,
        setModelInfo,
        models,
        setModels,
        pipeline,
        setPipeline,
        selectedQuantization,
        setSelectedQuantization,
        activeWorker,
        setActiveWorker,
        isFetching,
        setIsFetching,
        hasBeenLoaded,
        setHasBeenLoaded,
        errorText,
        setErrorText
      }}
    >
      {children}
    </ModelContext.Provider>
  )
}

export function useModel() {
  const context = useContext(ModelContext)
  if (context === undefined) {
    throw new Error('useModel must be used within a ModelProvider')
  }
  return context
}