Fix knowledge base crash
This commit is contained in:
@@ -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>
|
||||
);
|
||||
|
||||
@@ -527,6 +527,11 @@ export const fetchKnowledgeBases = async (): Promise<KnowledgeBase[]> => {
|
||||
return list.map((item) => mapKnowledgeBase(item));
|
||||
};
|
||||
|
||||
export const fetchKnowledgeBaseById = async (kbId: string): Promise<KnowledgeBase> => {
|
||||
const response = await apiRequest<AnyRecord>(`/knowledge/bases/${kbId}`);
|
||||
return mapKnowledgeBase(response);
|
||||
};
|
||||
|
||||
export const createKnowledgeBase = async (data: {
|
||||
name: string;
|
||||
description?: string;
|
||||
|
||||
Reference in New Issue
Block a user