import React from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, Button, IconButton, Input, Textarea, HStack } from '@chakra-ui/react'; import { DeleteIcon } from '@chakra-ui/icons'; import { delDatasetById } from '@/web/core/dataset/api'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useForm } from 'react-hook-form'; import { compressImgFileAndUpload } from '@/web/common/file/controller'; import type { DatasetItemType } from '@fastgpt/global/core/dataset/type.d'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import AIModelSelector from '@/components/Select/AIModelSelector'; import { postRebuildEmbedding } from '@/web/core/dataset/api'; import { useI18n } from '@/web/context/I18n'; import type { VectorModelItemType } from '@fastgpt/global/core/ai/model.d'; import { useContextSelector } from 'use-context-selector'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import MyDivider from '@fastgpt/web/components/common/MyDivider/index'; import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import DefaultPermissionList from '@/components/support/permission/DefaultPerList'; import { DatasetDefaultPermissionVal, DatasetPermissionList } from '@fastgpt/global/support/permission/dataset/constant'; import MemberManager from '../../component/MemberManager'; import { getCollaboratorList, postUpdateDatasetCollaborators, deleteDatasetCollaborators } from '@/web/core/dataset/api/collaborator'; const Info = ({ datasetId }: { datasetId: string }) => { const { t } = useTranslation(); const { datasetT, commonT } = useI18n(); const { datasetDetail, loadDatasetDetail, updateDataset, rebuildingCount, trainingCount } = useContextSelector(DatasetPageContext, (v) => v); const refetchDatasetTraining = useContextSelector( DatasetPageContext, (v) => v.refetchDatasetTraining ); const { setValue, register, handleSubmit, watch } = useForm({ defaultValues: datasetDetail }); const avatar = watch('avatar'); const vectorModel = watch('vectorModel'); const agentModel = watch('agentModel'); const defaultPermission = watch('defaultPermission'); const { datasetModelList, vectorModelList } = useSystemStore(); const router = useRouter(); const { openConfirm: onOpenConfirmDel, ConfirmModal: ConfirmDelModal } = useConfirm({ content: t('common:core.dataset.Delete Confirm'), type: 'delete' }); const { openConfirm: onOpenConfirmRebuild, ConfirmModal: ConfirmRebuildModal } = useConfirm({ title: t('common:common.confirm.Common Tip'), content: datasetT('confirm_to_rebuild_embedding_tip'), type: 'delete' }); const { File, onOpen: onOpenSelectFile } = useSelectFile({ fileType: '.jpg,.png', multiple: false }); /* 点击删除 */ const { mutate: onclickDelete, isLoading: isDeleting } = useRequest({ mutationFn: () => { return delDatasetById(datasetId); }, onSuccess() { router.replace(`/dataset/list`); }, successToast: t('common:common.Delete Success'), errorToast: t('common:common.Delete Failed') }); const { mutate: onclickSave, isLoading: isSaving } = useRequest({ mutationFn: (data: DatasetItemType) => { return updateDataset({ id: datasetId, ...data }); }, successToast: t('common:common.Update Success'), errorToast: t('common:common.Update Failed') }); const { mutate: onSelectFile, isLoading: isSelecting } = useRequest({ mutationFn: (e: File[]) => { const file = e[0]; if (!file) return Promise.resolve(null); return compressImgFileAndUpload({ type: MongoImageTypeEnum.datasetAvatar, file, maxW: 300, maxH: 300 }); }, onSuccess(src: string | null) { if (src) { setValue('avatar', src); } }, errorToast: t('common:common.avatar.Select Failed') }); const { mutate: onRebuilding, isLoading: isRebuilding } = useRequest({ mutationFn: (vectorModel: VectorModelItemType) => { return postRebuildEmbedding({ datasetId, vectorModel: vectorModel.model }); }, onSuccess() { refetchDatasetTraining(); loadDatasetDetail(datasetId); }, successToast: datasetT('rebuild_embedding_start_tip'), errorToast: t('common:common.Update Failed') }); const btnLoading = isSelecting || isDeleting || isSaving || isRebuilding; return ( {t('common:core.dataset.Dataset ID')} {datasetDetail._id} {t('common:core.ai.model.Vector Model')} 0 || trainingCount > 0 ? datasetT('the_knowledge_base_has_indexes_that_are_being_trained_or_being_rebuilt') : undefined } list={vectorModelList.map((item) => ({ label: item.name, value: item.model }))} onchange={(e) => { const vectorModel = vectorModelList.find((item) => item.model === e); if (!vectorModel) return; onOpenConfirmRebuild(() => { setValue('vectorModel', vectorModel); onRebuilding(vectorModel); })(); }} /> {t('common:core.Max Token')} {vectorModel.maxToken} {t('common:core.ai.model.Dataset Agent Model')} ({ label: item.name, value: item.model }))} onchange={(e) => { const agentModel = datasetModelList.find((item) => item.model === e); if (!agentModel) return; setValue('agentModel', agentModel); }} /> {datasetDetail.type === DatasetTypeEnum.externalFile && ( <> {datasetT('external_read_url')} )} {t('common:core.dataset.Avatar')} {t('common:core.dataset.Name')} {t('common:common.Intro')}