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 (
);
}