import React, { useEffect, useMemo, useState } from 'react'; import { Box, Flex, Switch, Input } from '@chakra-ui/react'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useForm } from 'react-hook-form'; import type { DatasetItemType } from '@fastgpt/global/core/dataset/type.d'; import Avatar from '@fastgpt/web/components/common/Avatar'; import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import AIModelSelector from '@/components/Select/AIModelSelector'; import { postRebuildEmbedding } from '@/web/core/dataset/api'; import type { EmbeddingModelItemType } 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, DatasetTypeMap } 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 MyIcon from '@fastgpt/web/components/common/Icon'; import { DatasetPermissionList } from '@fastgpt/global/support/permission/dataset/constant'; import MemberManager from '../../MemberManager'; import { getCollaboratorList, postUpdateDatasetCollaborators, deleteDatasetCollaborators } from '@/web/core/dataset/api/collaborator'; import DatasetTypeTag from '@/components/core/dataset/DatasetTypeTag'; import dynamic from 'next/dynamic'; import type { EditAPIDatasetInfoFormType } from './components/EditApiServiceModal'; import { EditResourceInfoFormType } from '@/components/common/Modal/EditResourceModal'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); const EditAPIDatasetInfoModal = dynamic(() => import('./components/EditApiServiceModal')); const Info = ({ datasetId }: { datasetId: string }) => { const { t } = useTranslation(); const { datasetDetail, loadDatasetDetail, updateDataset, rebuildingCount, trainingCount } = useContextSelector(DatasetPageContext, (v) => v); const { feConfigs, datasetModelList, embeddingModelList, getVlmModelList } = useSystemStore(); const [editedDataset, setEditedDataset] = useState(); const [editedAPIDataset, setEditedAPIDataset] = useState(); const refetchDatasetTraining = useContextSelector( DatasetPageContext, (v) => v.refetchDatasetTraining ); const { setValue, register, handleSubmit, watch, reset } = useForm({ defaultValues: datasetDetail }); const vectorModel = watch('vectorModel'); const agentModel = watch('agentModel'); const vllmModelList = useMemo(() => getVlmModelList(), [getVlmModelList]); const vlmModel = watch('vlmModel'); const { 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: t('dataset:confirm_to_rebuild_embedding_tip'), type: 'delete' }); const { openConfirm: onOpenConfirmSyncSchedule, ConfirmModal: ConfirmSyncScheduleModal } = useConfirm({ title: t('common:common.confirm.Common Tip') }); const { runAsync: onSave } = useRequest2( (data: DatasetItemType) => { return updateDataset({ id: datasetId, agentModel: data.agentModel?.model, vlmModel: data.vlmModel?.model, externalReadUrl: data.externalReadUrl }); }, { successToast: t('common:common.Update Success'), errorToast: t('common:common.Update Failed') } ); const { runAsync: onRebuilding } = useRequest2( (vectorModel: EmbeddingModelItemType) => { return postRebuildEmbedding({ datasetId, vectorModel: vectorModel.model }); }, { onSuccess() { refetchDatasetTraining(); loadDatasetDetail(datasetId); }, successToast: t('dataset:rebuild_embedding_start_tip'), errorToast: t('common:common.Update Failed') } ); const { runAsync: onEditBaseInfo } = useRequest2(updateDataset, { onSuccess() { setEditedDataset(undefined); }, successToast: t('common:common.Update Success'), errorToast: t('common:common.Update Failed') }); useEffect(() => { reset(datasetDetail); }, [datasetDetail, datasetDetail._id, reset]); const isTraining = rebuildingCount > 0 || trainingCount > 0; return ( {datasetDetail.name} setEditedDataset({ id: datasetDetail._id, name: datasetDetail.name, avatar: datasetDetail.avatar, intro: datasetDetail.intro }) } /> {DatasetTypeMap[datasetDetail.type] && ( )} {datasetDetail.intro || t('common:core.dataset.Intro Placeholder')} {t('common:core.dataset.Dataset ID')} {datasetDetail._id} {t('common:core.ai.model.Vector Model')} {t('dataset:chunk_max_tokens')}: {vectorModel.maxToken} ({ label: item.name, value: item.model }))} onChange={(e) => { const vectorModel = embeddingModelList.find((item) => item.model === e); if (!vectorModel) return; return onOpenConfirmRebuild(async () => { await onRebuilding(vectorModel); setValue('vectorModel', vectorModel); })(); }} /> {t('common:core.ai.model.Dataset Agent Model')} ({ label: item.name, value: item.model }))} fontSize={'mini'} onChange={(e) => { const agentModel = datasetModelList.find((item) => item.model === e); if (!agentModel) return; setValue('agentModel', agentModel); return handleSubmit((data) => onSave({ ...data, agentModel: agentModel }))(); }} /> {t('dataset:vllm_model')} ({ label: item.name, value: item.model }))} fontSize={'mini'} onChange={(e) => { const vlmModel = vllmModelList.find((item) => item.model === e); if (!vlmModel) return; setValue('vlmModel', vlmModel); return handleSubmit((data) => onSave({ ...data, vlmModel }))(); }} /> {feConfigs?.isPlus && ( {t('dataset:sync_schedule')} { e.preventDefault(); const autoSync = e.target.checked; const text = autoSync ? t('dataset:open_auto_sync') : t('dataset:close_auto_sync'); onOpenConfirmSyncSchedule( async () => { return updateDataset({ id: datasetId, autoSync }); }, undefined, text )(); }} /> )} {datasetDetail.type === DatasetTypeEnum.externalFile && ( <> {t('dataset:external_read_url')} onSave(data))} /> )} {datasetDetail.type === DatasetTypeEnum.apiDataset && ( <> {t('dataset:api_url')} setEditedAPIDataset({ id: datasetDetail._id, apiServer: datasetDetail.apiServer }) } /> {datasetDetail.apiServer?.baseUrl} )} {datasetDetail.type === DatasetTypeEnum.yuque && ( <> {t('dataset:yuque_dataset_config')} setEditedAPIDataset({ id: datasetDetail._id, yuqueServer: datasetDetail.yuqueServer }) } /> {datasetDetail.yuqueServer?.userId} )} {datasetDetail.type === DatasetTypeEnum.feishu && ( <> {t('dataset:feishu_dataset_config')} setEditedAPIDataset({ id: datasetDetail._id, feishuServer: datasetDetail.feishuServer }) } /> {datasetDetail.feishuServer?.folderToken} )} {datasetDetail.permission.hasManagePer && ( <> getCollaboratorList(datasetId), permissionList: DatasetPermissionList, onUpdateCollaborators: (body) => postUpdateDatasetCollaborators({ ...body, datasetId }), onDelOneCollaborator: async ({ groupId, tmbId, orgId }) => { if (tmbId) { return deleteDatasetCollaborators({ datasetId, tmbId }); } else if (groupId) { return deleteDatasetCollaborators({ datasetId, groupId }); } else if (orgId) { return deleteDatasetCollaborators({ datasetId, orgId }); } } }} /> )} {editedDataset && ( setEditedDataset(undefined)} onEdit={(data) => onEditBaseInfo({ id: editedDataset.id, name: data.name, intro: data.intro, avatar: data.avatar }) } /> )} {editedAPIDataset && ( setEditedAPIDataset(undefined)} onEdit={(data) => updateDataset({ id: datasetId, apiServer: data.apiServer, yuqueServer: data.yuqueServer, feishuServer: data.feishuServer }) } /> )} ); }; export default React.memo(Info);