'use client' import type { FC } from 'react' import React, { useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { RiCloseLine } from '@remixicon/react' import Toast from '../../base/toast' import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/declarations' import type { RetrievalConfig } from '@/types/app' import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config' import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config' import Button from '@/app/components/base/button' import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model' import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useDocLink } from '@/context/i18n' import { checkShowMultiModalTip } from '../settings/utils' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import type { IndexingType } from '../create/step-two' type Props = { indexMethod: string value: RetrievalConfig isShow: boolean onHide: () => void onSave: (value: RetrievalConfig) => void } const ModifyRetrievalModal: FC = ({ indexMethod, value, isShow, onHide, onSave, }) => { const ref = useRef(null) const { t } = useTranslation() const docLink = useDocLink() const [retrievalConfig, setRetrievalConfig] = useState(value) const embeddingModel = useDatasetDetailContextWithSelector(state => state.dataset?.embedding_model) const embeddingModelProvider = useDatasetDetailContextWithSelector(state => state.dataset?.embedding_model_provider) // useClickAway(() => { // if (ref) // onHide() // }, ref) const { data: embeddingModelList } = useModelList(ModelTypeEnum.textEmbedding) const { data: rerankModelList } = useModelList(ModelTypeEnum.rerank) const handleSave = () => { if ( !isReRankModelSelected({ rerankModelList, retrievalConfig, indexMethod, }) ) { Toast.notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') }) return } onSave(retrievalConfig) } const showMultiModalTip = useMemo(() => { return checkShowMultiModalTip({ embeddingModel: { provider: embeddingModelProvider ?? '', model: embeddingModel ?? '', }, rerankingEnable: retrievalConfig.reranking_enable, rerankModel: { rerankingProviderName: retrievalConfig.reranking_model.reranking_provider_name, rerankingModelName: retrievalConfig.reranking_model.reranking_model_name, }, indexMethod: indexMethod as IndexingType, embeddingModelList, rerankModelList, }) }, [embeddingModelProvider, embeddingModel, retrievalConfig.reranking_enable, retrievalConfig.reranking_model, indexMethod, embeddingModelList, rerankModelList]) if (!isShow) return null return (
{t('datasetSettings.form.retrievalSetting.title')}
{t('datasetSettings.form.retrievalSetting.learnMore')} {t('datasetSettings.form.retrievalSetting.description')}
{t('datasetSettings.form.retrievalSetting.method')}
{indexMethod === 'high_quality' ? ( ) : ( )}
) } export default React.memo(ModifyRetrievalModal)