import { useState } from "react"; import { api, getErrorMessage } from "../api"; import type { CorpusStats } from "../types"; import StatusMessage from "./StatusMessage"; import Select from "./Select"; interface Props { onStatsUpdate: (stats: CorpusStats) => void; } const MODELS = [ { value: "all-MiniLM-L6-v2", label: "all-MiniLM-L6-v2 (fast, 384-dim)" }, { value: "all-mpnet-base-v2", label: "all-mpnet-base-v2 (best quality, 768-dim)" }, { value: "BAAI/bge-large-en-v1.5", label: "BAAI/bge-large-en-v1.5 (high accuracy, 1024-dim)" }, ]; export default function EngineSetup({ onStatsUpdate }: Props) { const [model, setModel] = useState("all-MiniLM-L6-v2"); const [chunkSize, setChunkSize] = useState(512); const [chunkOverlap, setChunkOverlap] = useState(128); const [batchSize, setBatchSize] = useState(64); const [docId, setDocId] = useState(""); const [docText, setDocText] = useState(""); const [showAdvanced, setShowAdvanced] = useState(false); const [status, setStatus] = useState<{ type: "ok" | "err" | "loading"; msg: string } | null>(null); const [initialized, setInitialized] = useState(false); const [docsAdded, setDocsAdded] = useState([]); async function handleInit() { setStatus({ type: "loading", msg: "Loading model..." }); try { const res = await api.init({ model_name: model, chunk_size: chunkSize, chunk_overlap: chunkOverlap, batch_size: batchSize, }); setInitialized(true); setDocsAdded([]); setStatus({ type: "ok", msg: `Model "${res.model}" loaded in ${res.load_time_seconds}s` }); } catch (e: unknown) { setStatus({ type: "err", msg: getErrorMessage(e) }); } } async function handleAddDoc() { if (!docId.trim() || !docText.trim()) return; setStatus({ type: "loading", msg: `Adding document "${docId}"...` }); try { const res = await api.addDocument({ doc_id: docId, text: docText }); setDocsAdded((prev) => [...prev, res.doc_id]); setStatus({ type: "ok", msg: `Added "${res.doc_id}": ${res.num_chunks} chunks` }); setDocId(""); setDocText(""); } catch (e: unknown) { setStatus({ type: "err", msg: getErrorMessage(e) }); } } async function handleBuildIndex() { setStatus({ type: "loading", msg: "Building FAISS index..." }); try { const res = await api.buildIndex(); setStatus({ type: "ok", msg: `Index built: ${res.total_chunks} vectors (dim=${res.embedding_dim}) in ${res.build_time_seconds}s`, }); const stats = await api.getStats(); onStatsUpdate(stats); } catch (e: unknown) { setStatus({ type: "err", msg: getErrorMessage(e) }); } } return (
{/* Step 1: Initialize engine */}

1. Initialize Engine

setChunkSize(+e.target.value)} />
setChunkOverlap(+e.target.value)} />
setBatchSize(+e.target.value)} />
)}
{/* Step 2: Add documents */}

2. Add Documents

{docsAdded.length > 0 && (
{docsAdded.map((id) => ( {id} ))}
)}
setDocId(e.target.value)} placeholder="e.g. chapter_1" disabled={!initialized} />