import { usePubSub } from "create-pubsub/react"; import { settingsPubSub } from "../../../../modules/pubSub"; import { isWebGPUAvailable } from "../../../../modules/webGpu"; import { match, Pattern } from "ts-pattern"; import { NumberInput, Select, Slider, Stack, Switch, Textarea, Text, TextInput, Group, ComboboxData, Skeleton, } from "@mantine/core"; import { useForm } from "@mantine/form"; import { lazy, Suspense, useEffect, useState } from "react"; import { defaultSettings, inferenceTypes } from "../../../../modules/settings"; import { getOpenAiClient } from "../../../../modules/openai"; import { IconInfoCircle } from "@tabler/icons-react"; import { addLogEntry } from "../../../../modules/logEntries"; const WebLlmModelSelect = lazy( () => import("../../../AiResponse/WebLlmModelSelect"), ); const WllamaModelSelect = lazy( () => import("../../../AiResponse/WllamaModelSelect"), ); export default function AISettingsForm() { const [settings, setSettings] = usePubSub(settingsPubSub); const [openAiModels, setOpenAiModels] = useState([]); const form = useForm({ initialValues: settings, onValuesChange: setSettings, }); useEffect(() => { async function fetchOpenAiModels() { try { const openai = getOpenAiClient({ baseURL: settings.openAiApiBaseUrl, apiKey: settings.openAiApiKey, }); const response = await openai.models.list(); const models = response.data.map((model) => ({ label: model.id, value: model.id, })); setOpenAiModels(models); form.setFieldError("openAiApiModel", null); if (!form.values.openAiApiModel) { form.setFieldValue("openAiApiModel", models[0].value); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); addLogEntry(`Error fetching OpenAI models: ${errorMessage}`); setOpenAiModels([]); form.setFieldError("openAiApiModel", errorMessage); } } if (form.values.inferenceType === "openai") { fetchOpenAiModels(); } }, [ form.values.inferenceType, settings.openAiApiBaseUrl, settings.openAiApiKey, ]); const isUsingCustomInstructions = form.values.systemPrompt !== defaultSettings.systemPrompt; const handleRestoreDefaultInstructions = () => { form.setFieldValue("systemPrompt", defaultSettings.systemPrompt); }; return ( {form.values.enableAiResponse && ( <> Search results to consider Determines the number of search results to consider when generating AI responses. A higher value may enhance accuracy, but it will also increase response time. ({ value: index, label: index.toString(), }))} /> )} {form.values.inferenceType === "browser" && ( <> {isWebGPUAvailable && ( )} {match([isWebGPUAvailable, form.values.enableWebGpu]) .with([true, true], () => ( }> form.setFieldValue("webLlmModelId", value) } /> )) .with([false, Pattern.any], [Pattern.any, false], () => ( <> }> form.setFieldValue("wllamaModelId", value) } /> )) .otherwise(() => null)} )}