diff --git a/frontend/src/pages/KnowledgeBase/Create/KnowledgeBaseCreate.tsx b/frontend/src/pages/KnowledgeBase/Create/KnowledgeBaseCreate.tsx new file mode 100644 index 0000000..b2b2d35 --- /dev/null +++ b/frontend/src/pages/KnowledgeBase/Create/KnowledgeBaseCreate.tsx @@ -0,0 +1,582 @@ +import { + 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 RadioCard from "@/components/RadioCard"; +import { KBTypeMap } from "../knowledge-base.const"; +import { KBType, KnowledgeBaseItem } from "../knowledge-base.model"; +import { createKnowledgeBaseUsingPost } from "../knowledge-base.api"; + +const { TextArea } = Input; +const { Option } = Select; + +const KnowledgeBaseCreatePage: React.FC = () => { + const navigate = useNavigate(); + const [form] = Form.useForm(); + 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 [newKB, setNewKB] = useState>({ + name: "", + description: "", + type: KBType.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 handleCreateKnowledgeBase = async (values: any) => { + await createKnowledgeBaseUsingPost(values); + message.success("知识库创建成功!"); + navigate("/data/knowledge-base"); + }; + + return ( +
+ {/* Header */} +
+
+ +

创建知识库

+
+
+ +
+
+
setNewKB(allValues)} + > + {/* 基本信息 */} +

基本信息

+ + + + +