'use client' import { useEffect, useState } from 'react' import type { Dispatch } from 'react' import { useContext } from 'use-context-selector' import { BookOpenIcon } from '@heroicons/react/24/outline' import { useTranslation } from 'react-i18next' import cn from 'classnames' import { useSWRConfig } from 'swr' import { unstable_serialize } from 'swr/infinite' import PermissionsRadio from '../permissions-radio' import IndexMethodRadio from '../index-method-radio' import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config' import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config' import { ToastContext } from '@/app/components/base/toast' import Button from '@/app/components/base/button' import { updateDatasetSetting } from '@/service/datasets' import type { DataSet, DataSetListResponse } from '@/models/datasets' import DatasetDetailContext from '@/context/dataset-detail' import { type RetrievalConfig } from '@/types/app' import { useModalContext } from '@/context/modal-context' import { ensureRerankModelSelected, isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model' import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' import { useModelList, useModelListAndDefaultModelAndCurrentProviderAndModel, } from '@/app/components/header/account-setting/model-provider-page/hooks' const rowClass = ` flex justify-between py-4 flex-wrap gap-y-2 ` const labelClass = ` flex items-center w-[168px] h-9 ` const inputClass = ` w-full max-w-[480px] px-3 bg-gray-100 text-sm text-gray-800 rounded-lg outline-none appearance-none ` const useInitialValue: (depend: T, dispatch: Dispatch) => void = (depend, dispatch) => { useEffect(() => { dispatch(depend) }, [depend]) } const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => { if (!pageIndex || previousPageData.has_more) return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } } return null } const Form = () => { const { t } = useTranslation() const { notify } = useContext(ToastContext) const { mutate } = useSWRConfig() const { dataset: currentDataset, mutateDatasetRes: mutateDatasets } = useContext(DatasetDetailContext) const { setShowAccountSettingModal } = useModalContext() const [loading, setLoading] = useState(false) const [name, setName] = useState(currentDataset?.name ?? '') const [description, setDescription] = useState(currentDataset?.description ?? '') const [permission, setPermission] = useState(currentDataset?.permission) const [indexMethod, setIndexMethod] = useState(currentDataset?.indexing_technique) const [retrievalConfig, setRetrievalConfig] = useState(currentDataset?.retrieval_model_dict as RetrievalConfig) const { modelList: rerankModelList, defaultModel: rerankDefaultModel, currentModel: isRerankDefaultModelVaild, } = useModelListAndDefaultModelAndCurrentProviderAndModel(3) const { data: embeddingModelList } = useModelList(2) const handleSave = async () => { if (loading) return if (!name?.trim()) { notify({ type: 'error', message: t('datasetSettings.form.nameError') }) return } if ( !isReRankModelSelected({ rerankDefaultModel, isRerankDefaultModelVaild: !!isRerankDefaultModelVaild, rerankModelList, retrievalConfig, indexMethod, }) ) { notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') }) return } const postRetrievalConfig = ensureRerankModelSelected({ rerankDefaultModel: rerankDefaultModel!, retrievalConfig, indexMethod, }) try { setLoading(true) await updateDatasetSetting({ datasetId: currentDataset!.id, body: { name, description, permission, indexing_technique: indexMethod, retrieval_model: postRetrievalConfig, }, }) notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) if (mutateDatasets) { await mutateDatasets() mutate(unstable_serialize(getKey)) } } catch (e) { notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) } finally { setLoading(false) } } useInitialValue(currentDataset?.name ?? '', setName) useInitialValue(currentDataset?.description ?? '', setDescription) useInitialValue(currentDataset?.permission, setPermission) useInitialValue(currentDataset?.indexing_technique, setIndexMethod) return (
{t('datasetSettings.form.name')}
setName(e.target.value)} />
{t('datasetSettings.form.desc')}