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 { 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 { Button, Input, TableHeader, TableRow, TableHead, TableCell, Card, Dialog, Badge } from '../components/UI';
|
||||||
import { KnowledgeBase } from '../types';
|
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 = [
|
const EMBEDDING_OPTIONS = [
|
||||||
'text-embedding-3-small',
|
'text-embedding-3-small',
|
||||||
@@ -19,6 +19,7 @@ export const KnowledgeBasePage: React.FC = () => {
|
|||||||
const [isKbModalOpen, setIsKbModalOpen] = useState(false);
|
const [isKbModalOpen, setIsKbModalOpen] = useState(false);
|
||||||
const [editingKb, setEditingKb] = useState<KnowledgeBase | null>(null);
|
const [editingKb, setEditingKb] = useState<KnowledgeBase | null>(null);
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
const [isDetailLoading, setIsDetailLoading] = useState(false);
|
||||||
const [embeddingOptions, setEmbeddingOptions] = useState<string[]>(EMBEDDING_OPTIONS);
|
const [embeddingOptions, setEmbeddingOptions] = useState<string[]>(EMBEDDING_OPTIONS);
|
||||||
const [hasDbEmbeddingModels, setHasDbEmbeddingModels] = useState(false);
|
const [hasDbEmbeddingModels, setHasDbEmbeddingModels] = useState(false);
|
||||||
const [openMenuKbId, setOpenMenuKbId] = useState<string | null>(null);
|
const [openMenuKbId, setOpenMenuKbId] = useState<string | null>(null);
|
||||||
@@ -79,9 +80,19 @@ export const KnowledgeBasePage: React.FC = () => {
|
|||||||
return () => document.removeEventListener('click', onDocClick);
|
return () => document.removeEventListener('click', onDocClick);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleSelect = (kb: KnowledgeBase) => {
|
const handleSelect = async (kb: KnowledgeBase) => {
|
||||||
setSelectedKb(kb);
|
setSelectedKb(kb);
|
||||||
setView('detail');
|
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 = () => {
|
const openCreateKb = () => {
|
||||||
@@ -169,22 +180,26 @@ export const KnowledgeBasePage: React.FC = () => {
|
|||||||
if (view === 'detail' && selectedKb) {
|
if (view === 'detail' && selectedKb) {
|
||||||
return (
|
return (
|
||||||
<div className="py-4 pb-10">
|
<div className="py-4 pb-10">
|
||||||
<KnowledgeBaseDetail
|
{isDetailLoading ? (
|
||||||
kb={selectedKb}
|
<div className="rounded-lg border border-white/10 bg-card/40 p-8 text-center text-muted-foreground">知识库详情加载中...</div>
|
||||||
onBack={() => setView('list')}
|
) : (
|
||||||
onImport={() => setIsUploadOpen(true)}
|
<KnowledgeBaseDetail
|
||||||
onEdit={() => openEditKb(selectedKb)}
|
kb={selectedKb}
|
||||||
onDelete={() => handleDeleteKb(selectedKb)}
|
onBack={() => setView('list')}
|
||||||
onDeleteDocument={async (docId) => {
|
onImport={() => setIsUploadOpen(true)}
|
||||||
try {
|
onEdit={() => openEditKb(selectedKb)}
|
||||||
await deleteKnowledgeDocument(selectedKb.id, docId);
|
onDelete={() => handleDeleteKb(selectedKb)}
|
||||||
await refreshKnowledgeBases();
|
onDeleteDocument={async (docId) => {
|
||||||
} catch (error: any) {
|
try {
|
||||||
console.error(error);
|
await deleteKnowledgeDocument(selectedKb.id, docId);
|
||||||
alert(error?.message || '删除文档失败。');
|
await refreshKnowledgeBases();
|
||||||
}
|
} catch (error: any) {
|
||||||
}}
|
console.error(error);
|
||||||
/>
|
alert(error?.message || '删除文档失败。');
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<UploadModal
|
<UploadModal
|
||||||
kbId={selectedKb.id}
|
kbId={selectedKb.id}
|
||||||
isOpen={isUploadOpen}
|
isOpen={isUploadOpen}
|
||||||
@@ -208,6 +223,8 @@ export const KnowledgeBasePage: React.FC = () => {
|
|||||||
setKbChunkSize={setKbChunkSize}
|
setKbChunkSize={setKbChunkSize}
|
||||||
kbChunkOverlap={kbChunkOverlap}
|
kbChunkOverlap={kbChunkOverlap}
|
||||||
setKbChunkOverlap={setKbChunkOverlap}
|
setKbChunkOverlap={setKbChunkOverlap}
|
||||||
|
embeddingOptions={embeddingOptions}
|
||||||
|
hasDbEmbeddingModels={hasDbEmbeddingModels}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -527,6 +527,11 @@ export const fetchKnowledgeBases = async (): Promise<KnowledgeBase[]> => {
|
|||||||
return list.map((item) => mapKnowledgeBase(item));
|
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: {
|
export const createKnowledgeBase = async (data: {
|
||||||
name: string;
|
name: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user