import React from 'react'; import { useMemo, useState } from "react"; import { Badge, Button } from "../common/index"; const EMBEDDING_MODELS = { nvidia: [ { value: "nvidia/nv-embed-v1", label: "nvidia/nv-embed-v1 (Default)" }, { value: "nvidia/llama-3.2-nemoretriever-300m-embed-v1", label: "nvidia/llama-3.2-nemoretriever-300m-embed-v1", }, ], huggingface: [ { value: "sentence-transformers/all-MiniLM-L6-v2", label: "sentence-transformers/all-MiniLM-L6-v2", }, { value: "BAAI/bge-base-en-v1.5", label: "BAAI/bge-base-en-v1.5" }, { value: "intfloat/e5-base-v2", label: "intfloat/e5-base-v2" }, { value: "thenlper/gte-base", label: "thenlper/gte-base" }, { value: "sentence-transformers/multi-qa-mpnet-base-dot-v1", label: "sentence-transformers/multi-qa-mpnet-base-dot-v1", }, ], }; const CHUNK_STRATEGIES = [ { value: "fixed_size", label: "Fixed Size" }, { value: "recursive", label: "Recursive" }, { value: "semantic", label: "Semantic" }, { value: "chapter_based", label: "Chapter-Based" }, { value: "regex", label: "Regex" }, { value: "sentence_window", label: "Sentence Window" }, ]; const DEFAULT_CHUNK_PARAMS = { fixed_size: { chunk_size: 512, overlap: 50 }, recursive: { chunk_size: 512, overlap: 50, min_chunk_size: 100, separators: ["\n\n", "\n", "(?<=[.!?])\\s+", " "], apply_overlap_recursively: true, }, semantic: { max_chunk_size: 512, min_chunk_size: 100, similarity_threshold: 0.7, hard_split_threshold: 0.4, overlap_sentences: 1, }, chapter_based: { max_chunk_size: 1024, overlap_lines: 1 }, regex: { pattern: "\\n\\n+", min_chunk_size: 100 }, sentence_window: { window_size: 3, max_chunk_size: 150 }, }; export default function ConfigFormModal({ onSave, onCancel, existingNames = [], isDisabled }) { const [name, setName] = useState(""); const [chunkStrategy, setChunkStrategy] = useState("fixed_size"); const [chunkParams, setChunkParams] = useState({ ...DEFAULT_CHUNK_PARAMS.fixed_size }); const [embeddingProvider, setEmbeddingProvider] = useState("nvidia"); const [embeddingModel, setEmbeddingModel] = useState(EMBEDDING_MODELS.nvidia[0].value); const [topK, setTopK] = useState(5); const [threshold, setThreshold] = useState(0.5); const [error, setError] = useState(""); const normalizedName = useMemo(() => name.trim(), [name]); const handleSubmit = () => { const trimmed = normalizedName; if (!trimmed) { setError("Config name is required."); return; } if (existingNames.some((item) => item.toLowerCase() === trimmed.toLowerCase())) { setError("A config with this name already exists."); return; } onSave({ name: trimmed, chunk_strategy: chunkStrategy, chunk_params: chunkParams, embedding_provider: embeddingProvider, embedding_model: embeddingModel, top_k: Number(topK), threshold: Number(threshold), isPreset: false, indexingStatus: "indexing", }); }; return (

Create Config

Configure chunking, embeddings, and retrieval values.

Advanced
{(chunkStrategy === "fixed_size" || chunkStrategy === "recursive") && (
setChunkParams((prev) => ({ ...prev, chunk_size: value }))} min={128} max={2048} /> setChunkParams((prev) => ({ ...prev, overlap: value }))} min={0} max={200} />
)} {chunkStrategy === "recursive" && (
setChunkParams((prev) => ({ ...prev, min_chunk_size: value }))} min={10} max={512} />
)} {chunkStrategy === "semantic" && (
setChunkParams((prev) => ({ ...prev, max_chunk_size: value }))} min={128} max={4096} /> setChunkParams((prev) => ({ ...prev, min_chunk_size: value }))} min={10} max={512} /> setChunkParams((prev) => ({ ...prev, similarity_threshold: value }))} min={0} max={1} step={0.01} /> setChunkParams((prev) => ({ ...prev, hard_split_threshold: value }))} min={0} max={1} step={0.01} /> setChunkParams((prev) => ({ ...prev, overlap_sentences: value }))} min={0} max={5} />
)} {chunkStrategy === "chapter_based" && (
setChunkParams((prev) => ({ ...prev, max_chunk_size: value }))} min={256} max={4096} /> setChunkParams((prev) => ({ ...prev, overlap_lines: value }))} min={0} max={10} />
)} {chunkStrategy === "regex" && (
setChunkParams((prev) => ({ ...prev, min_chunk_size: value }))} min={1} max={1024} />
)} {chunkStrategy === "sentence_window" && (
setChunkParams((prev) => ({ ...prev, window_size: value }))} min={1} max={7} /> setChunkParams((prev) => ({ ...prev, max_chunk_size: value }))} min={50} max={150} />
)} {error &&

{error}

}
); } function NumericParam({ label, value, onChange, min, max }) { return ( ); } function FloatParam({ label, value, onChange, min, max, step }) { return ( ); }