Fix knowledge base crash

This commit is contained in:
Xin Wang
2026-02-09 08:14:17 +08:00
parent 0d13d6acdb
commit 479cfb797b
2 changed files with 40 additions and 18 deletions

View File

@@ -2,7 +2,7 @@ import React, { useEffect, useState, useRef } from 'react';
import { Search, Plus, FileText, Upload, ArrowLeft, CloudUpload, File as FileIcon, X, Pencil, Trash2, Settings2, MoreHorizontal } from 'lucide-react';
import { Button, Input, TableHeader, TableRow, TableHead, TableCell, Card, Dialog, Badge } from '../components/UI';
import { KnowledgeBase } from '../types';
import { createKnowledgeBase, deleteKnowledgeBase, deleteKnowledgeDocument, fetchKnowledgeBases, fetchLLMModels, updateKnowledgeBase, uploadKnowledgeDocument } from '../services/backendApi';
import { createKnowledgeBase, deleteKnowledgeBase, deleteKnowledgeDocument, fetchKnowledgeBaseById, fetchKnowledgeBases, fetchLLMModels, updateKnowledgeBase, uploadKnowledgeDocument } from '../services/backendApi';
const EMBEDDING_OPTIONS = [
'text-embedding-3-small',
@@ -19,6 +19,7 @@ export const KnowledgeBasePage: React.FC = () => {
const [isKbModalOpen, setIsKbModalOpen] = useState(false);
const [editingKb, setEditingKb] = useState<KnowledgeBase | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [isDetailLoading, setIsDetailLoading] = useState(false);
const [embeddingOptions, setEmbeddingOptions] = useState<string[]>(EMBEDDING_OPTIONS);
const [hasDbEmbeddingModels, setHasDbEmbeddingModels] = useState(false);
const [openMenuKbId, setOpenMenuKbId] = useState<string | null>(null);
@@ -79,9 +80,19 @@ export const KnowledgeBasePage: React.FC = () => {
return () => document.removeEventListener('click', onDocClick);
}, []);
const handleSelect = (kb: KnowledgeBase) => {
const handleSelect = async (kb: KnowledgeBase) => {
setSelectedKb(kb);
setView('detail');
setIsDetailLoading(true);
try {
const fullKb = await fetchKnowledgeBaseById(kb.id);
setSelectedKb(fullKb);
} catch (error: any) {
console.error(error);
alert(error?.message || '加载知识库详情失败。');
} finally {
setIsDetailLoading(false);
}
};
const openCreateKb = () => {
@@ -169,22 +180,26 @@ export const KnowledgeBasePage: React.FC = () => {
if (view === 'detail' && selectedKb) {
return (
<div className="py-4 pb-10">
<KnowledgeBaseDetail
kb={selectedKb}
onBack={() => setView('list')}
onImport={() => setIsUploadOpen(true)}
onEdit={() => openEditKb(selectedKb)}
onDelete={() => handleDeleteKb(selectedKb)}
onDeleteDocument={async (docId) => {
try {
await deleteKnowledgeDocument(selectedKb.id, docId);
await refreshKnowledgeBases();
} catch (error: any) {
console.error(error);
alert(error?.message || '删除文档失败。');
}
}}
/>
{isDetailLoading ? (
<div className="rounded-lg border border-white/10 bg-card/40 p-8 text-center text-muted-foreground">...</div>
) : (
<KnowledgeBaseDetail
kb={selectedKb}
onBack={() => setView('list')}
onImport={() => setIsUploadOpen(true)}
onEdit={() => openEditKb(selectedKb)}
onDelete={() => handleDeleteKb(selectedKb)}
onDeleteDocument={async (docId) => {
try {
await deleteKnowledgeDocument(selectedKb.id, docId);
await refreshKnowledgeBases();
} catch (error: any) {
console.error(error);
alert(error?.message || '删除文档失败。');
}
}}
/>
)}
<UploadModal
kbId={selectedKb.id}
isOpen={isUploadOpen}
@@ -208,6 +223,8 @@ export const KnowledgeBasePage: React.FC = () => {
setKbChunkSize={setKbChunkSize}
kbChunkOverlap={kbChunkOverlap}
setKbChunkOverlap={setKbChunkOverlap}
embeddingOptions={embeddingOptions}
hasDbEmbeddingModels={hasDbEmbeddingModels}
/>
</div>
);