import React, { useState, useCallback } from 'react'; import { Box, Flex, Button, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody } from '@chakra-ui/react'; import { useToast } from '@/hooks/useToast'; import { useSelectFile } from '@/hooks/useSelectFile'; import { useConfirm } from '@/hooks/useConfirm'; import { readCsvContent } from '@/utils/file'; import { useMutation } from '@tanstack/react-query'; import { postModelDataCsvData } from '@/api/model'; import Markdown from '@/components/Markdown'; import { useMarkdown } from '@/hooks/useMarkdown'; import { fileDownload } from '@/utils/file'; const csvTemplate = `question,answer\n"什么是 laf","laf 是一个云函数开发平台……"\n"什么是 sealos","Sealos 是以 kubernetes 为内核的云操作系统发行版,可以……"`; const SelectJsonModal = ({ onClose, onSuccess, modelId }: { onClose: () => void; onSuccess: () => void; modelId: string; }) => { const [selecting, setSelecting] = useState(false); const { toast } = useToast(); const { File, onOpen } = useSelectFile({ fileType: '.csv', multiple: false }); const [fileData, setFileData] = useState([]); const { openConfirm, ConfirmChild } = useConfirm({ content: '确认导入该数据集?' }); const onSelectFile = useCallback( async (e: File[]) => { const file = e[0]; setSelecting(true); try { const { header, data } = await readCsvContent(file); if (header[0] !== 'question' || header[1] !== 'answer') { throw new Error('csv 文件格式有误'); } setFileData(data); } catch (error: any) { console.log(error); toast({ title: error?.message || 'csv 文件格式有误', status: 'error' }); } setSelecting(false); }, [setSelecting, toast] ); const { mutate, isLoading } = useMutation({ mutationFn: async () => { if (!fileData) return; const res = await postModelDataCsvData(modelId, fileData); toast({ title: `导入数据成功,最终导入: ${res || 0} 条数据。需要一段时间训练`, status: 'success', duration: 4000 }); onClose(); onSuccess(); }, onError() { toast({ title: '导入文件失败', status: 'error' }); } }); const { data: intro } = useMarkdown({ url: '/csvSelect.md' }); return ( csv 问答对导入 fileDownload({ text: csvTemplate, type: 'text/csv', filename: 'template.csv' }) } > 点击下载csv模板 一共 {fileData.length} 组数据 {fileData.map((item, index) => ( Q{index + 1}. {item[0]} A{index + 1}. {item[1]} ))} ); }; export default SelectJsonModal;