import { useMutation, useQuery } from "@tanstack/react-query" import React from "react" import { getOllamaURL, systemPromptForNonRag, promptForRag, setOllamaURL as saveOllamaURL, setPromptForRag, setSystemPromptForNonRag, getAllModels, defaultEmbeddingChunkOverlap, defaultEmbeddingChunkSize, defaultEmbeddingModelForRag, saveForRag } from "~/services/ollama" import { Skeleton, Radio, Select, Form, InputNumber, Collapse, Switch } from "antd" import { useDarkMode } from "~/hooks/useDarkmode" import { SaveButton } from "~/components/Common/SaveButton" import { SUPPORTED_LANGUAGES } from "~/utils/supporetd-languages" import { useMessage } from "~/hooks/useMessage" import { MoonIcon, SunIcon } from "lucide-react" import { Trans, useTranslation } from "react-i18next" import { useI18n } from "@/hooks/useI18n" import { TTSModeSettings } from "@/components/Option/Settings/tts-mode" import { AdvanceOllamaSettings } from "@/components/Common/Settings/AdvanceOllamaSettings" import { useStorage } from "@plasmohq/storage/hook" import { getTotalFilePerKB } from "@/services/app" import { SidepanelRag } from "@/components/Option/Settings/sidepanel-rag" export const SettingsBody = () => { const { t } = useTranslation("settings") const [ollamaURL, setOllamaURL] = React.useState("") const [systemPrompt, setSystemPrompt] = React.useState("") const [ragPrompt, setRagPrompt] = React.useState("") const [ragQuestionPrompt, setRagQuestionPrompt] = React.useState("") const [selectedValue, setSelectedValue] = React.useState<"normal" | "rag">( "normal" ) const [copilotResumeLastChat, setCopilotResumeLastChat] = useStorage( "copilotResumeLastChat", false ) const [hideCurrentChatModelSettings, setHideCurrentChatModelSettings] = useStorage("hideCurrentChatModelSettings", false) const [ speechToTextLanguage, setSpeechToTextLanguage ] = useStorage( "speechToTextLanguage", "en-US" ) const { mode, toggleDarkMode } = useDarkMode() const { changeLocale, locale, supportLanguage } = useI18n() const { data, status } = useQuery({ queryKey: ["sidebarSettings"], queryFn: async () => { const [ ollamaURL, systemPrompt, ragPrompt, allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB ] = await Promise.all([ getOllamaURL(), systemPromptForNonRag(), promptForRag(), getAllModels({ returnEmpty: true }), defaultEmbeddingChunkOverlap(), defaultEmbeddingChunkSize(), defaultEmbeddingModelForRag(), getTotalFilePerKB() ]) return { url: ollamaURL, normalSystemPrompt: systemPrompt, ragSystemPrompt: ragPrompt.ragPrompt, ragQuestionPrompt: ragPrompt.ragQuestionPrompt, models: allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB } } }) const { mutate: saveRAG, isPending: isSaveRAGPending } = useMutation({ mutationFn: async (f: { model: string chunkSize: number overlap: number }) => { await saveForRag(f.model, f.chunkSize, f.overlap, data.totalFilePerKB) } }) React.useEffect(() => { if (data) { setOllamaURL(data.url) setSystemPrompt(data.normalSystemPrompt) setRagPrompt(data.ragSystemPrompt) setRagQuestionPrompt(data.ragQuestionPrompt) } }, [data]) if (status === "pending") { return (
) } if (status === "error") { return
Error
} return (

{t("managePrompts.title")}

setSelectedValue(e.target.value)}> {t("managePrompts.option1")} {t("managePrompts.option2")}
{selectedValue === "normal" && (
{t("managePrompts.systemPrompt")}