dify/web/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
Coding On Star 1703df5c00
test: add unit tests for workflow components including tools and inspect vars (#34843)
Co-authored-by: CodingOnStar <hanxujiang@dify.com>
2026-04-10 13:11:36 +00:00

150 lines
5.1 KiB
TypeScript

import type { ValueSelector } from '../../types'
import type { KnowledgeRetrievalNodeType } from './types'
import { produce } from 'immer'
import {
useEffect,
useMemo,
} from 'react'
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
import {
useIsChatMode,
useNodesReadOnly,
useWorkflow,
} from '../../hooks'
import { BlockEnum } from '../../types'
import useKnowledgeDatasetSelection from './hooks/use-knowledge-dataset-selection'
import useKnowledgeInputManager from './hooks/use-knowledge-input-manager'
import useKnowledgeMetadataConfig from './hooks/use-knowledge-metadata-config'
import useKnowledgeModelConfig from './hooks/use-knowledge-model-config'
const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
const { nodesReadOnly: readOnly } = useNodesReadOnly()
const isChatMode = useIsChatMode()
const { getBeforeNodesInSameBranch } = useWorkflow()
const startNode = getBeforeNodesInSameBranch(id).find(node => node.data.type === BlockEnum.Start)
const startNodeId = startNode?.id
const { inputs, setInputs: doSetInputs } = useNodeCrud<KnowledgeRetrievalNodeType>(id, payload)
const updateDatasetsDetail = useDatasetsDetailStore(s => s.updateDatasetsDetail)
const {
inputRef,
setInputs,
handleQueryVarChange,
handleQueryAttachmentChange,
} = useKnowledgeInputManager({
inputs,
doSetInputs,
})
const {
currentProvider,
currentModel,
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
const {
modelList: rerankModelList,
defaultModel: rerankDefaultModel,
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
const {
currentModel: currentRerankModel,
currentProvider: currentRerankProvider,
} = useCurrentProviderAndModel(
rerankModelList,
rerankDefaultModel
? {
...rerankDefaultModel,
provider: rerankDefaultModel.provider.provider,
}
: undefined,
)
const fallbackRerankModel = useMemo(() => ({
provider: currentRerankProvider?.provider,
model: currentRerankModel?.model,
}), [currentRerankModel?.model, currentRerankProvider?.provider])
const {
selectedDatasets,
selectedDatasetsLoaded,
rerankModelOpen,
setRerankModelOpen,
handleOnDatasetsChange,
showImageQueryVarSelector,
} = useKnowledgeDatasetSelection({
inputs,
inputRef,
setInputs,
payloadRetrievalMode: payload.retrieval_mode,
updateDatasetsDetail,
fallbackRerankModel,
})
const {
handleModelChanged,
handleCompletionParamsChange,
handleRetrievalModeChange,
handleMultipleRetrievalConfigChange,
} = useKnowledgeModelConfig({
inputs,
inputRef,
setInputs,
selectedDatasets,
currentProvider,
currentModel,
fallbackRerankModel,
hasRerankDefaultModel: Boolean(currentRerankModel && rerankDefaultModel),
})
useEffect(() => {
const currentInputs = inputRef.current
let nextQueryVariableSelector: ValueSelector = currentInputs.query_variable_selector
if (isChatMode && currentInputs.query_variable_selector.length === 0 && startNodeId)
nextQueryVariableSelector = [startNodeId, 'sys.query']
setInputs(produce(currentInputs, (draft) => {
draft.query_variable_selector = nextQueryVariableSelector
}))
}, [inputRef, isChatMode, setInputs, startNodeId])
const metadataConfig = useKnowledgeMetadataConfig({
id,
inputRef,
setInputs,
})
return {
readOnly,
inputs,
handleQueryVarChange,
handleQueryAttachmentChange,
filterStringVar: metadataConfig.filterStringVar,
filterFileVar: metadataConfig.filterFileVar,
handleRetrievalModeChange,
handleMultipleRetrievalConfigChange,
handleModelChanged,
handleCompletionParamsChange,
selectedDatasets: selectedDatasets.filter(d => d.name),
selectedDatasetsLoaded,
handleOnDatasetsChange,
rerankModelOpen,
setRerankModelOpen,
handleMetadataFilterModeChange: metadataConfig.handleMetadataFilterModeChange,
handleUpdateCondition: metadataConfig.handleUpdateCondition,
handleAddCondition: metadataConfig.handleAddCondition,
handleRemoveCondition: metadataConfig.handleRemoveCondition,
handleToggleConditionLogicalOperator: metadataConfig.handleToggleConditionLogicalOperator,
handleMetadataModelChange: metadataConfig.handleMetadataModelChange,
handleMetadataCompletionParamsChange: metadataConfig.handleMetadataCompletionParamsChange,
availableStringVars: metadataConfig.availableStringVars,
availableStringNodesWithParent: metadataConfig.availableStringNodesWithParent,
availableNumberVars: metadataConfig.availableNumberVars,
availableNumberNodesWithParent: metadataConfig.availableNumberNodesWithParent,
showImageQueryVarSelector,
}
}
export default useConfig