diff --git a/app/components/SettingsPanel.js b/app/components/SettingsPanel.js index f16da28..148cc70 100644 --- a/app/components/SettingsPanel.js +++ b/app/components/SettingsPanel.js @@ -17,6 +17,7 @@ import { getActiveWorkId, setActiveWorkId, getAllWorks, + rebuildAllEmbeddings, } from '../lib/settings'; import SettingsTree from './SettingsTree'; import { useI18n } from '../lib/useI18n'; @@ -486,6 +487,7 @@ function ApiConfigForm({ data, onChange }) { const [testStatus, setTestStatus] = useState(null); const [fetchedModels, setFetchedModels] = useState(null); const [fetchedEmbedModels, setFetchedEmbedModels] = useState(null); + const [rebuildStatus, setRebuildStatus] = useState(null); // null | 'loading' | {done, total, failed} const [savedProfiles, setSavedProfiles] = useState([]); const [profileName, setProfileName] = useState(''); const [showSaveInput, setShowSaveInput] = useState(false); @@ -557,6 +559,20 @@ function ApiConfigForm({ data, onChange }) { } catch { setFetchedEmbedModels(null); setTestStatus({ success: false, error: t('apiConfig.fetchEmbedModelsFailed') }); } }; + const handleRebuildEmbeddings = async () => { + setRebuildStatus({ done: 0, total: 0, failed: 0 }); + try { + const result = await rebuildAllEmbeddings((done, total, failed) => { + setRebuildStatus({ done, total, failed }); + }); + setRebuildStatus({ ...result, finished: true }); + setTimeout(() => setRebuildStatus(null), 5000); + } catch { + setRebuildStatus({ error: true }); + setTimeout(() => setRebuildStatus(null), 3000); + } + }; + const currentProvider = PROVIDERS.find(p => p.key === data.provider) || PROVIDERS[7]; const isCustom = data.provider === 'custom'; @@ -689,6 +705,28 @@ function ApiConfigForm({ data, onChange }) { > )} + + {/* 重建向量按钮 */} +