import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { Form, Input, InputNumber, Select, Skeleton } from "antd" import { SaveButton } from "~/components/Common/SaveButton" import { defaultEmbeddingChunkOverlap, defaultEmbeddingChunkSize, defaultEmbeddingModelForRag, defaultSplittingStrategy, defaultSsplttingSeparator, getEmbeddingModels, saveForRag } from "~/services/ollama" import { SettingPrompt } from "./prompt" import { useTranslation } from "react-i18next" import { getNoOfRetrievedDocs, getTotalFilePerKB } from "@/services/app" import { SidepanelRag } from "./sidepanel-rag" import { ProviderIcons } from "@/components/Common/ProviderIcon" export const RagSettings = () => { const { t } = useTranslation("settings") const [form] = Form.useForm() const splittingStrategy = Form.useWatch("splittingStrategy", form) const queryClient = useQueryClient() const { data: ollamaInfo, status } = useQuery({ queryKey: ["fetchRAGSettings"], queryFn: async () => { const [ allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB, noOfRetrievedDocs, splittingStrategy, splittingSeparator ] = await Promise.all([ getEmbeddingModels({ returnEmpty: true }), defaultEmbeddingChunkOverlap(), defaultEmbeddingChunkSize(), defaultEmbeddingModelForRag(), getTotalFilePerKB(), getNoOfRetrievedDocs(), defaultSplittingStrategy(), defaultSsplttingSeparator() ]) return { models: allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB, noOfRetrievedDocs, splittingStrategy, splittingSeparator } } }) const { mutate: saveRAG, isPending: isSaveRAGPending } = useMutation({ mutationFn: async (data: { model: string chunkSize: number overlap: number totalFilePerKB: number noOfRetrievedDocs: number strategy: string separator: string }) => { await saveForRag( data.model, data.chunkSize, data.overlap, data.totalFilePerKB, data.noOfRetrievedDocs, data.strategy, data.separator ) return true }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["fetchRAGSettings"] }) } }) return (
{status === "pending" && } {status === "success" && (

{t("rag.ragSettings.label")}

{ saveRAG({ model: data.defaultEM, chunkSize: data.chunkSize, overlap: data.chunkOverlap, totalFilePerKB: data.totalFilePerKB, noOfRetrievedDocs: data.noOfRetrievedDocs, separator: data.splittingSeparator, strategy: data.splittingStrategy }) }} initialValues={{ chunkSize: ollamaInfo?.chunkSize, chunkOverlap: ollamaInfo?.chunkOverlap, defaultEM: ollamaInfo?.defaultEM, totalFilePerKB: ollamaInfo?.totalFilePerKB, noOfRetrievedDocs: ollamaInfo?.noOfRetrievedDocs, splittingStrategy: ollamaInfo?.splittingStrategy, splittingSeparator: ollamaInfo?.splittingSeparator }}> ({ label: e, value: e }))} /> {splittingStrategy !== "RecursiveCharacterTextSplitter" && ( )}

{t("rag.prompt.label")}

)}
) }