import { APP_NAME } from '$lib/constants'; import { type Writable, writable } from 'svelte/store'; import type { GlobalModelConfig, ModelConfig } from '$lib/apis'; import type { Banner } from '$lib/types'; import type { Socket } from 'socket.io-client'; // Backend export const WEBUI_NAME = writable(APP_NAME); export const config: Writable = writable(undefined); export const user: Writable = writable(undefined); // Frontend export const MODEL_DOWNLOAD_POOL = writable({}); export const mobile = writable(false); export const socket: Writable = writable(null); export const activeUserCount: Writable = writable(null); export const USAGE_POOL: Writable = writable(null); export const theme = writable('system'); export const chatId = writable(''); export const chats = writable([]); export const pinnedChats = writable([]); export const tags = writable([]); export const models: Writable = writable([]); export const prompts: Writable = writable([]); export const documents: Writable = writable([]); export const tools = writable([]); export const functions = writable([]); export const banners: Writable = writable([]); export const settings: Writable = writable({}); export const showSidebar = writable(false); export const showSettings = writable(false); export const showArchivedChats = writable(false); export const showChangelog = writable(false); export const showControls = writable(false); export const showOverview = writable(false); export const showCallOverlay = writable(false); export const temporaryChatEnabled = writable(false); export const scrollPaginationEnabled = writable(false); export const currentChatPage = writable(1); export type Model = OpenAIModel | OllamaModel; type BaseModel = { id: string; name: string; info?: ModelConfig; owned_by: 'ollama' | 'openai'; }; export interface OpenAIModel extends BaseModel { owned_by: 'openai'; external: boolean; source?: string; } export interface OllamaModel extends BaseModel { owned_by: 'ollama'; details: OllamaModelDetails; size: number; description: string; model: string; modified_at: string; digest: string; ollama?: { name?: string; model?: string; modified_at: string; size?: number; digest?: string; details?: { parent_model?: string; format?: string; family?: string; families?: string[]; parameter_size?: string; quantization_level?: string; }; urls?: number[]; }; } type OllamaModelDetails = { parent_model: string; format: string; family: string; families: string[] | null; parameter_size: string; quantization_level: string; }; type Settings = { models?: string[]; conversationMode?: boolean; speechAutoSend?: boolean; responseAutoPlayback?: boolean; audio?: AudioSettings; showUsername?: boolean; notificationEnabled?: boolean; title?: TitleSettings; splitLargeDeltas?: boolean; chatDirection: 'LTR' | 'RTL'; system?: string; requestFormat?: string; keepAlive?: string; seed?: number; temperature?: string; repeat_penalty?: string; top_k?: string; top_p?: string; num_ctx?: string; num_batch?: string; num_keep?: string; options?: ModelOptions; }; type ModelOptions = { stop?: boolean; }; type AudioSettings = { STTEngine?: string; TTSEngine?: string; speaker?: string; model?: string; nonLocalVoices?: boolean; }; type TitleSettings = { auto?: boolean; model?: string; modelExternal?: string; prompt?: string; }; type Prompt = { command: string; user_id: string; title: string; content: string; timestamp: number; }; type Document = { collection_name: string; filename: string; name: string; title: string; }; type Config = { status: boolean; name: string; version: string; default_locale: string; default_models: string; default_prompt_suggestions: PromptSuggestion[]; features: { auth: boolean; auth_trusted_header: boolean; enable_signup: boolean; enable_login_form: boolean; enable_web_search?: boolean; enable_image_generation: boolean; enable_admin_export: boolean; enable_admin_chat_access: boolean; enable_community_sharing: boolean; }; oauth: { providers: { [key: string]: string; }; }; }; type PromptSuggestion = { content: string; title: [string, string]; }; type SessionUser = { id: string; email: string; name: string; role: string; profile_image_url: string; };