import MyModal from '@fastgpt/web/components/common/MyModal'; import { useTranslation } from 'next-i18next'; import { strIsLink } from '@fastgpt/global/common/string/tools'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useForm } from 'react-hook-form'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { getDocPath } from '@/web/common/system/doc'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useMyStep } from '@fastgpt/web/hooks/useStep'; import MyDivider from '@fastgpt/web/components/common/MyDivider'; import React, { useRef } from 'react'; import { Box, Link, Input, Button, ModalBody, ModalFooter, Textarea, Stack } from '@chakra-ui/react'; import { DataChunkSplitModeEnum, DatasetCollectionDataProcessModeEnum } from '@fastgpt/global/core/dataset/constants'; import { ChunkSettingModeEnum } from '@fastgpt/global/core/dataset/constants'; import { Prompt_AgentQA } from '@fastgpt/global/core/ai/prompt/agent'; import { useContextSelector } from 'use-context-selector'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import CollectionChunkForm, { collectionChunkForm2StoreChunkData, type CollectionChunkFormType } from '../Form/CollectionChunkForm'; import { getLLMDefaultChunkSize } from '@fastgpt/global/core/dataset/training/utils'; import { ChunkSettingsType } from '@fastgpt/global/core/dataset/type'; export type WebsiteConfigFormType = { websiteConfig: { url: string; selector: string; }; chunkSettings: ChunkSettingsType; }; const WebsiteConfigModal = ({ onClose, onSuccess }: { onClose: () => void; onSuccess: (data: WebsiteConfigFormType) => void; }) => { const { t } = useTranslation(); const { feConfigs } = useSystemStore(); const { toast } = useToast(); const steps = [ { title: t('dataset:website_info') }, { title: t('dataset:params_config') } ]; const datasetDetail = useContextSelector(DatasetPageContext, (v) => v.datasetDetail); const websiteConfig = datasetDetail.websiteConfig; const chunkSettings = datasetDetail.chunkSettings; const { register: websiteInfoForm, handleSubmit: websiteInfoHandleSubmit, getValues: websiteInfoGetValues } = useForm({ defaultValues: { url: websiteConfig?.url || '', selector: websiteConfig?.selector || '' } }); const isEdit = !!websiteConfig?.url; const { ConfirmModal, openConfirm } = useConfirm({ type: 'common' }); const { activeStep, goToPrevious, goToNext, MyStep } = useMyStep({ defaultStep: 0, steps }); const form = useForm({ defaultValues: { trainingType: chunkSettings?.trainingType || DatasetCollectionDataProcessModeEnum.chunk, imageIndex: chunkSettings?.imageIndex || false, autoIndexes: chunkSettings?.autoIndexes || false, chunkSettingMode: chunkSettings?.chunkSettingMode || ChunkSettingModeEnum.auto, chunkSplitMode: chunkSettings?.chunkSplitMode || DataChunkSplitModeEnum.size, embeddingChunkSize: chunkSettings?.chunkSize || 2000, qaChunkSize: chunkSettings?.chunkSize || getLLMDefaultChunkSize(datasetDetail.agentModel), indexSize: chunkSettings?.indexSize || datasetDetail.vectorModel?.defaultToken || 512, chunkSplitter: chunkSettings?.chunkSplitter || '', qaPrompt: chunkSettings?.qaPrompt || Prompt_AgentQA.description } }); return ( {activeStep == 0 && ( <> {t('common:core.dataset.website.Config Description')} {feConfigs?.docUrl && ( {t('common:common.course.Read Course')} )} {t('common:core.dataset.website.Base Url')} {t('common:core.dataset.website.Selector')}({t('common:common.choosable')}) )} {activeStep == 1 && } {activeStep == 0 && ( <> )} {activeStep == 1 && ( <> )} ); }; export default WebsiteConfigModal; const PromptTextarea = ({ defaultValue, onChange, onClose }: { defaultValue: string; onChange: (e: string) => void; onClose: () => void; }) => { const ref = useRef(null); const { t } = useTranslation(); return (