import React, { useEffect, useState } from "react"; import Sidebar from "@/components/SettingsSidebar"; import { isMobile } from "react-device-detect"; import PreLoader from "@/components/Preloader"; import CTAButton from "@/components/lib/CTAButton"; import Admin from "@/models/admin"; import showToast from "@/utils/toast"; import { numberWithCommas } from "@/utils/numbers"; import { useTranslation } from "react-i18next"; import { useModal } from "@/hooks/useModal"; import ModalWrapper from "@/components/ModalWrapper"; import ChangeWarningModal from "@/components/ChangeWarning"; function isNullOrNaN(value) { if (value === null) return true; return isNaN(value); } export default function EmbeddingTextSplitterPreference() { const [settings, setSettings] = useState({}); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [hasChanges, setHasChanges] = useState(false); const { isOpen, openModal, closeModal } = useModal(); const { t } = useTranslation(); const handleSubmit = async (e) => { e.preventDefault(); const form = new FormData(e.target); if ( Number(form.get("text_splitter_chunk_overlap")) >= Number(form.get("text_splitter_chunk_size")) ) { showToast( "Chunk overlap cannot be larger or equal to chunk size.", "error" ); return; } openModal(); }; const handleSaveSettings = async () => { setSaving(true); try { const form = new FormData( document.getElementById("text-splitter-chunking-form") ); await Admin.updateSystemPreferences({ text_splitter_chunk_size: isNullOrNaN( form.get("text_splitter_chunk_size") ) ? 1000 : Number(form.get("text_splitter_chunk_size")), text_splitter_chunk_overlap: isNullOrNaN( form.get("text_splitter_chunk_overlap") ) ? 1000 : Number(form.get("text_splitter_chunk_overlap")), }); setHasChanges(false); closeModal(); showToast("Text chunking strategy settings saved.", "success"); } catch (error) { showToast("Failed to save text chunking strategy settings.", "error"); } finally { setSaving(false); } }; useEffect(() => { async function fetchSettings() { const _settings = (await Admin.systemPreferences())?.settings; setSettings(_settings ?? {}); setLoading(false); } fetchSettings(); }, []); return (
{loading ? (
) : (
setHasChanges(true)} className="flex w-full" id="text-splitter-chunking-form" >

{t("text.title")}

{t("text.desc-start")}
{t("text.desc-end")}

{hasChanges && ( {saving ? t("common.saving") : t("common.save")} )}

{t("text.size.description")}

e?.currentTarget?.blur()} className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5" placeholder="maximum length of vectorized text" defaultValue={ isNullOrNaN(settings?.text_splitter_chunk_size) ? 1000 : Number(settings?.text_splitter_chunk_size) } required={true} autoComplete="off" />

{t("text.size.recommend")}{" "} {numberWithCommas(settings?.max_embed_chunk_size || 1000)}.

{t("text.overlap.description")}

e?.currentTarget?.blur()} className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5" placeholder="maximum length of vectorized text" defaultValue={ isNullOrNaN(settings?.text_splitter_chunk_overlap) ? 20 : Number(settings?.text_splitter_chunk_overlap) } required={true} autoComplete="off" />
)}
); }