'use client' import type { FC } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import produce from 'immer' import { useFormattingChangedDispatcher } from '../debug/hooks' import FeaturePanel from '../base/feature-panel' import OperationBtn from '../base/operation-btn' import CardItem from './card-item/item' import ParamsConfig from './params-config' import ContextVar from './context-var' import ConfigContext from '@/context/debug-configuration' import { AppType } from '@/types/app' import type { DataSet } from '@/models/datasets' import { getMultipleRetrievalConfig, getSelectedDatasetsMode, } from '@/app/components/workflow/nodes/knowledge-retrieval/utils' import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' const Icon = ( ) const DatasetConfig: FC = () => { const { t } = useTranslation() const { mode, dataSets: dataSet, setDataSets: setDataSet, modelConfig, setModelConfig, showSelectDataSet, isAgent, datasetConfigs, setDatasetConfigs, setRerankSettingModalOpen, } = useContext(ConfigContext) const formattingChangedDispatcher = useFormattingChangedDispatcher() const hasData = dataSet.length > 0 const { currentModel: currentRerankModel, currentProvider: currentRerankProvider, } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank) const onRemove = (id: string) => { const filteredDataSets = dataSet.filter(item => item.id !== id) setDataSet(filteredDataSets) const retrievalConfig = getMultipleRetrievalConfig(datasetConfigs as any, filteredDataSets, dataSet, { provider: currentRerankProvider?.provider, model: currentRerankModel?.model, }) setDatasetConfigs({ ...(datasetConfigs as any), ...retrievalConfig, }) const { allExternal, allInternal, mixtureInternalAndExternal, mixtureHighQualityAndEconomic, inconsistentEmbeddingModel, } = getSelectedDatasetsMode(filteredDataSets) if ( (allInternal && (mixtureHighQualityAndEconomic || inconsistentEmbeddingModel)) || mixtureInternalAndExternal || allExternal ) setRerankSettingModalOpen(true) formattingChangedDispatcher() } const handleSave = (newDataset: DataSet) => { const index = dataSet.findIndex(item => item.id === newDataset.id) const newDatasets = [...dataSet.slice(0, index), newDataset, ...dataSet.slice(index + 1)] setDataSet(newDatasets) formattingChangedDispatcher() } const promptVariables = modelConfig.configs.prompt_variables const promptVariablesToSelect = promptVariables.map(item => ({ name: item.name, type: item.type, value: item.key, })) const selectedContextVar = promptVariables?.find(item => item.is_context_var) const handleSelectContextVar = (selectedValue: string) => { const newModelConfig = produce(modelConfig, (draft) => { draft.configs.prompt_variables = modelConfig.configs.prompt_variables.map((item) => { return ({ ...item, is_context_var: item.key === selectedValue, }) }) }) setModelConfig(newModelConfig) } return ( {!isAgent && } } hasHeaderBottomBorder={!hasData} noBodySpacing > {hasData ? ( {dataSet.map(item => ( ))} ) : ( {t('appDebug.feature.dataSet.noData')} )} {mode === AppType.completion && dataSet.length > 0 && ( )} ) } export default React.memo(DatasetConfig)