import { mockKnowledgeBases, sliceOperators, vectorDatabases, } from "@/mock/knowledgeBase"; import { useState } from "react"; import { Button, Card, Input, Select, Checkbox, Switch, Tabs, Divider, Upload, message, Form, } from "antd"; import { BookOpen, Database, Brain, Scissors, Split, Upload as UploadIcon, Folder, CheckCircle, File, ArrowLeft, } from "lucide-react"; import { useNavigate } from "react-router"; import type { Dataset } from "@/pages/DataManagement/dataset.model"; import DevelopmentInProgress from "@/components/DevelopmentInProgress"; const { TextArea } = Input; const { Option } = Select; const KnowledgeBaseCreatePage: React.FC = () => { return ; const navigate = useNavigate(); const [form] = Form.useForm(); const [knowledgeBases, setKnowledgeBases] = useState(mockKnowledgeBases); const [datasetSearchQuery, setDatasetSearchQuery] = useState(""); const [selectedDatasetId, setSelectedDatasetId] = useState( null ); const [uploadedFiles, setUploadedFiles] = useState([]); const [datasets, setDatasets] = useState([]); const [selectedDatasetFiles, setSelectedDatasetFiles] = useState< { datasetId: string; fileId: string; name: string; size: string; type: string; }[] >([]); const [selectedSliceOperators, setSelectedSliceOperators] = useState< string[] >(["semantic-split", "paragraph-split"]); // Form initial values const initialValues = { name: "", description: "", type: "unstructured" as "unstructured" | "structured", embeddingModel: "text-embedding-3-large", llmModel: "gpt-4o", chunkSize: 512, overlap: 50, sliceMethod: "semantic" as | "paragraph" | "length" | "delimiter" | "semantic", delimiter: "", enableQA: true, vectorDatabase: "pinecone", }; // Dataset file selection helpers const handleDatasetFileToggle = ( datasetId: string, file: MockDataset["files"][0] ) => { setSelectedDatasetFiles((prev) => { const isSelected = prev.some( (f) => f.datasetId === datasetId && f.fileId === file.id ); if (isSelected) { return prev.filter( (f) => !(f.datasetId === datasetId && f.fileId === file.id) ); } else { return [...prev, { datasetId, ...file }]; } }); }; const handleSelectAllDatasetFiles = ( dataset: MockDataset, checked: boolean ) => { setSelectedDatasetFiles((prev) => { let newSelectedFiles = [...prev]; if (checked) { dataset.files.forEach((file) => { if ( !newSelectedFiles.some( (f) => f.datasetId === dataset.id && f.fileId === file.id ) ) { newSelectedFiles.push({ datasetId: dataset.id, ...file }); } }); } else { newSelectedFiles = newSelectedFiles.filter( (f) => f.datasetId !== dataset.id ); } return newSelectedFiles; }); }; const isDatasetFileSelected = (datasetId: string, fileId: string) => { return selectedDatasetFiles.some( (f) => f.datasetId === datasetId && f.fileId === fileId ); }; const isAllDatasetFilesSelected = (dataset: MockDataset) => { return dataset.files.every((file) => isDatasetFileSelected(dataset.id, file.id) ); }; const handleSliceOperatorToggle = (operatorId: string) => { setSelectedSliceOperators((prev) => prev.includes(operatorId) ? prev.filter((id) => id !== operatorId) : [...prev, operatorId] ); }; // 文件上传 const handleFileChange = (info: any) => { setUploadedFiles(info.fileList.map((f: any) => f.originFileObj)); }; // 提交表单 const handleFinish = (values: any) => { const newKB: KnowledgeBase = { id: Date.now(), name: values.name, description: values.description, type: values.type, status: "importing", fileCount: uploadedFiles.length + selectedDatasetFiles.length, chunkCount: 0, vectorCount: 0, size: "0 MB", progress: 0, createdAt: new Date().toISOString().split("T")[0], lastUpdated: new Date().toISOString().split("T")[0], vectorDatabase: values.vectorDatabase, config: { embeddingModel: values.embeddingModel, llmModel: values.llmModel, chunkSize: values.chunkSize, overlap: values.overlap, sliceMethod: values.sliceMethod, delimiter: values.delimiter, enableQA: values.enableQA, vectorDimension: values.embeddingModel.includes("3-large") ? 3072 : 1536, sliceOperators: selectedSliceOperators, }, files: [ ...uploadedFiles.map((file) => ({ id: Date.now() + Math.random(), name: file.name, type: file.type.split("/")[1] || "unknown", size: `${(file.size / (1024 * 1024)).toFixed(2)} MB`, status: "processing" as const, chunkCount: 0, progress: 0, uploadedAt: new Date().toISOString().split("T")[0], source: "upload" as const, vectorizationStatus: "pending" as const, })), ...selectedDatasetFiles.map((file) => ({ id: Date.now() + Math.random(), name: file.name, type: file.type, size: file.size, status: "processing" as const, chunkCount: 0, progress: 0, uploadedAt: new Date().toISOString().split("T")[0], source: "dataset" as const, datasetId: file.datasetId, vectorizationStatus: "pending" as const, })), ], vectorizationHistory: [], }; setKnowledgeBases([newKB, ...knowledgeBases]); form.resetFields(); setUploadedFiles([]); setSelectedDatasetFiles([]); setSelectedSliceOperators(["semantic-split", "paragraph-split"]); setSelectedDatasetId(null); message.success("知识库创建成功!"); navigate("/data/knowledge-generation"); }; return (
{/* Header */}

创建知识库

{/* 基本信息 */}

基本信息