| import { create } from 'zustand';
|
|
|
| export type ModelStatus = 'idle' | 'loading' | 'ready' | 'error';
|
|
|
| export interface ModelState {
|
|
|
| modelId: string;
|
| status: ModelStatus;
|
| error: string | null;
|
|
|
|
|
| loadingProgress: number;
|
| loadingPhase: string;
|
|
|
|
|
| supportsWebGPU: boolean;
|
| maxTokens: number;
|
| temperature: number;
|
|
|
|
|
| setModelId: (modelId: string) => void;
|
| setStatus: (status: ModelStatus) => void;
|
| setError: (error: string | null) => void;
|
| setLoadingProgress: (progress: number, phase: string) => void;
|
| setSupportsWebGPU: (supports: boolean) => void;
|
| setTemperature: (temperature: number) => void;
|
| setMaxTokens: (maxTokens: number) => void;
|
| reset: () => void;
|
| }
|
|
|
| const DEFAULT_MODEL = 'Llama-3.2-1B-Instruct-q4f16_1-MLC';
|
|
|
| export const useModelStore = create<ModelState>((set) => ({
|
|
|
| modelId: DEFAULT_MODEL,
|
| status: 'idle',
|
| error: null,
|
| loadingProgress: 0,
|
| loadingPhase: '',
|
| supportsWebGPU: false,
|
| maxTokens: 2048,
|
| temperature: 0.7,
|
|
|
|
|
| setModelId: (modelId) => {
|
| set({ modelId, status: 'idle', error: null });
|
| },
|
|
|
| setStatus: (status) => {
|
| set({ status });
|
| },
|
|
|
| setError: (error) => {
|
| set({ error, status: 'error' });
|
| },
|
|
|
| setLoadingProgress: (progress, phase) => {
|
| set({ loadingProgress: progress, loadingPhase: phase });
|
| },
|
|
|
| setSupportsWebGPU: (supports) => {
|
| set({ supportsWebGPU: supports });
|
| },
|
|
|
| setTemperature: (temperature) => {
|
| set({ temperature: Math.max(0, Math.min(2, temperature)) });
|
| },
|
|
|
| setMaxTokens: (maxTokens) => {
|
| set({ maxTokens: Math.max(1, Math.min(4096, maxTokens)) });
|
| },
|
|
|
| reset: () => {
|
| set({
|
| modelId: DEFAULT_MODEL,
|
| status: 'idle',
|
| error: null,
|
| loadingProgress: 0,
|
| loadingPhase: '',
|
| });
|
| },
|
| }));
|
|
|
|
|
|
|