import { useState, useEffect } from "react"; import { api, getErrorMessage } from "../api"; import type { W2VInitResponse } from "../types"; import StatusMessage from "./StatusMessage"; import LogViewer from "./LogViewer"; import MetricCard from "./MetricCard"; interface Props { onReady: (ready: boolean, info?: { vocab_size: number; sentences: number; vector_size: number }) => void; } export default function Word2VecPanel({ onReady }: Props) { const [statusChecked, setStatusChecked] = useState(false); const [trainResult, setTrainResult] = useState(null); const [vectorSize, setVectorSize] = useState(100); const [windowSize, setWindowSize] = useState(5); const [w2vEpochs, setW2vEpochs] = useState(50); const [showAdvanced, setShowAdvanced] = useState(false); const [initLoading, setInitLoading] = useState(false); const [error, setError] = useState(""); useEffect(() => { api.w2vStatus().then(res => { if (res.ready) { onReady(true, { vocab_size: res.vocab_size!, sentences: res.sentences!, vector_size: res.vector_size! }); } setStatusChecked(true); }).catch(() => setStatusChecked(true)); }, []); async function handleTrainFromEngine() { setInitLoading(true); setError(""); setTrainResult(null); try { const res = await api.w2vInitFromEngine({ vector_size: vectorSize, window: windowSize, epochs: w2vEpochs, }); setTrainResult(res); } catch (err) { setError(getErrorMessage(err)); } finally { setInitLoading(false); } } if (!statusChecked) { return

Checking Word2Vec status...

; } // Training complete — show results + continue button if (trainResult) { return (

Training Complete

); } // Training form return (

Word2Vec Baseline (gensim)

Static embeddings — one vector per word, no context awareness. Train on all documents loaded in the engine to use as a baseline comparison.

{showAdvanced && (
setVectorSize(+e.target.value)} min={50} max={300} />
setWindowSize(+e.target.value)} min={2} max={15} />
setW2vEpochs(+e.target.value)} min={5} max={200} />
)}
{error && }
); }