feat: refactor input variable handling and configurations in pipeline processing components

wtw/rag-pipeline
twwu 7 months ago
parent 261b7cabc8
commit c6ae9628af

@ -1,58 +1,15 @@
import { useMemo } from 'react'
import { BaseFieldType } from '@/app/components/base/form/form-scenarios/base/types'
import { usePublishedPipelineProcessingParams } from '@/service/use-pipeline'
import { VAR_TYPE_MAP } from '@/models/pipeline'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
export const useConfigurations = (datasourceNodeId: string) => {
export const useInputVariables = (datasourceNodeId: string) => {
const pipelineId = useDatasetDetailContextWithSelector(state => state.dataset?.pipeline_id)
const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({
pipeline_id: pipelineId!,
node_id: datasourceNodeId,
})
const initialData = useMemo(() => {
const variables = paramsConfig?.variables || []
return variables.reduce((acc, item) => {
const type = VAR_TYPE_MAP[item.type]
if ([BaseFieldType.textInput, BaseFieldType.paragraph, BaseFieldType.select].includes(type))
acc[item.variable] = item.default_value ?? ''
if (type === BaseFieldType.numberInput)
acc[item.variable] = item.default_value ?? 0
if (type === BaseFieldType.checkbox)
acc[item.variable] = true
if ([BaseFieldType.file, BaseFieldType.fileList].includes(type))
acc[item.variable] = []
return acc
}, {} as Record<string, any>)
}, [paramsConfig])
const configurations = useMemo(() => {
const variables = paramsConfig?.variables || []
const configs = variables.map(item => ({
type: VAR_TYPE_MAP[item.type],
variable: item.variable,
label: item.label,
required: item.required,
maxLength: item.max_length,
options: item.options?.map(option => ({
label: option,
value: option,
})),
showConditions: [],
placeholder: item.placeholder,
tooltip: item.tooltips,
unit: item.unit,
allowedFileTypes: item.allowed_file_types,
allowedFileExtensions: item.allowed_file_extensions,
allowedFileUploadMethods: item.allowed_file_upload_methods,
}))
return configs
}, [paramsConfig])
return {
paramsConfig,
isFetchingParams,
initialData,
configurations,
}
}

@ -1,8 +1,9 @@
import React from 'react'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks'
import { useInputVariables } from './hooks'
import Form from './form'
import Actions from './actions'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type ProcessDocumentsProps = {
dataSourceNodeId: string
@ -21,7 +22,9 @@ const ProcessDocuments = ({
onBack,
ref,
}: ProcessDocumentsProps) => {
const { isFetchingParams, initialData, configurations } = useConfigurations(dataSourceNodeId)
const { isFetchingParams, paramsConfig } = useInputVariables(dataSourceNodeId)
const initialData = useInitialData(paramsConfig?.variables || [])
const configurations = useConfigurations(paramsConfig?.variables || [])
const schema = generateZodSchema(configurations)
return (

@ -12,7 +12,7 @@ import AppUnavailable from '@/app/components/base/app-unavailable'
import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import type { NotionPage } from '@/models/common'
import { useDocumentDetail, useInvalidDocumentDetailKey } from '@/service/knowledge/use-document'
import { useDocumentDetail, useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document'
type DocumentSettingsProps = {
datasetId: string
@ -26,8 +26,10 @@ const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
const { indexingTechnique, dataset } = useContext(DatasetDetailContext)
const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
const invalidDocumentDetail = useInvalidDocumentDetailKey()
const invalidDocumentList = useInvalidDocumentList(datasetId)
const invalidDocumentDetail = useInvalidDocumentDetail()
const saveHandler = () => {
invalidDocumentList()
invalidDocumentDetail()
router.push(`/datasets/${datasetId}/documents/${documentId}`)
}

@ -13,7 +13,7 @@ import { DatasourceType } from '@/models/pipeline'
import { noop } from 'lodash-es'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { useRouter } from 'next/navigation'
import { useInvalidDocumentList } from '@/service/knowledge/use-document'
import { useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document'
type PipelineSettingsProps = {
datasetId: string
@ -99,6 +99,7 @@ const PipelineSettings = ({
}, [lastRunData, pipelineId, runPublishedPipeline])
const invalidDocumentList = useInvalidDocumentList(datasetId)
const invalidDocumentDetail = useInvalidDocumentDetail()
const handleProcess = useCallback(async (data: Record<string, any>) => {
if (!lastRunData)
return
@ -115,10 +116,11 @@ const PipelineSettings = ({
}, {
onSuccess: () => {
invalidDocumentList()
invalidDocumentDetail()
push(`/datasets/${datasetId}/documents/${documentId}`)
},
})
}, [datasetId, documentId, invalidDocumentList, lastRunData, pipelineId, push, runPublishedPipeline])
}, [datasetId, documentId, invalidDocumentDetail, invalidDocumentList, lastRunData, pipelineId, push, runPublishedPipeline])
const onClickProcess = useCallback(() => {
isPreview.current = false

@ -1,59 +1,15 @@
import { useMemo } from 'react'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { usePublishedPipelineProcessingParams } from '@/service/use-pipeline'
import { VAR_TYPE_MAP } from '@/models/pipeline'
import { BaseFieldType } from '@/app/components/base/form/form-scenarios/base/types'
export const useConfigurations = (lastRunInputData: Record<string, any>, datasourceNodeId: string) => {
export const useInputVariables = (datasourceNodeId: string) => {
const pipelineId = useDatasetDetailContextWithSelector(state => state.dataset?.pipeline_id)
const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({
pipeline_id: pipelineId!,
node_id: datasourceNodeId,
})
const initialData = useMemo(() => {
const variables = paramsConfig?.variables || []
return variables.reduce((acc, item) => {
const type = VAR_TYPE_MAP[item.type]
const variableName = item.variable
if ([BaseFieldType.textInput, BaseFieldType.paragraph, BaseFieldType.select].includes(type))
acc[item.variable] = lastRunInputData[variableName] ?? ''
if (type === BaseFieldType.numberInput)
acc[item.variable] = lastRunInputData[variableName] ?? 0
if (type === BaseFieldType.checkbox)
acc[item.variable] = lastRunInputData[variableName]
if ([BaseFieldType.file, BaseFieldType.fileList].includes(type))
acc[item.variable] = lastRunInputData[variableName]
return acc
}, {} as Record<string, any>)
}, [lastRunInputData, paramsConfig?.variables])
const configurations = useMemo(() => {
const variables = paramsConfig?.variables || []
const configs = variables.map(item => ({
type: VAR_TYPE_MAP[item.type],
variable: item.variable,
label: item.label,
required: item.required,
maxLength: item.max_length,
options: item.options?.map(option => ({
label: option,
value: option,
})),
showConditions: [],
placeholder: item.placeholder,
tooltip: item.tooltips,
unit: item.unit,
allowedFileTypes: item.allowed_file_types,
allowedFileExtensions: item.allowed_file_extensions,
allowedFileUploadMethods: item.allowed_file_upload_methods,
}))
return configs
}, [paramsConfig])
return {
paramsConfig,
isFetchingParams,
initialData,
configurations,
}
}

@ -1,7 +1,8 @@
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks'
import { useInputVariables } from './hooks'
import Actions from './actions'
import Form from '../../../../create-from-pipeline/process-documents/form'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type ProcessDocumentsProps = {
datasourceNodeId: string
@ -20,7 +21,9 @@ const ProcessDocuments = ({
onSubmit,
ref,
}: ProcessDocumentsProps) => {
const { isFetchingParams, initialData, configurations } = useConfigurations(lastRunInputData, datasourceNodeId)
const { isFetchingParams, paramsConfig } = useInputVariables(datasourceNodeId)
const initialData = useInitialData(paramsConfig?.variables || [], lastRunInputData)
const configurations = useConfigurations(paramsConfig?.variables || [])
const schema = generateZodSchema(configurations)
return (

@ -23,7 +23,7 @@ import { DataSourceType, ProcessMode } from '@/models/datasets'
import IndexFailed from '@/app/components/datasets/common/document-status-with-action/index-failed'
import { useProviderContext } from '@/context/provider-context'
import cn from '@/utils/classnames'
import { useDocumentList, useInvalidDocumentDetailKey, useInvalidDocumentList } from '@/service/knowledge/use-document'
import { useDocumentList, useInvalidDocumentDetail, useInvalidDocumentList } from '@/service/knowledge/use-document'
import { useInvalid } from '@/service/use-base'
import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment'
import useEditDocumentMetadata from '../metadata/hooks/use-edit-dataset-metadata'
@ -123,7 +123,7 @@ const Documents: FC<IDocumentsProps> = ({ datasetId }) => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [documentsRes])
const invalidDocumentDetail = useInvalidDocumentDetailKey()
const invalidDocumentDetail = useInvalidDocumentDetail()
const invalidChunkList = useInvalid(useSegmentListKey)
const invalidChildChunkList = useInvalid(useChildSegmentListKey)

@ -52,6 +52,12 @@ export const useHiddenFieldNames = (type: PipelineInputVarType) => {
t('appDebug.variableConfig.tooltips'),
]
break
case PipelineInputVarType.checkbox:
fieldNames = [
t('appDebug.variableConfig.startedChecked'),
t('appDebug.variableConfig.tooltips'),
]
break
default:
fieldNames = [
t('appDebug.variableConfig.tooltips'),
@ -258,6 +264,15 @@ export const useHiddenConfigurations = (props: {
popupProps: {
wrapperClassName: 'z-40',
},
}, {
type: InputFieldType.checkbox,
label: t('appDebug.variableConfig.startChecked'),
variable: 'default',
required: false,
showConditions: [{
variable: 'type',
value: PipelineInputVarType.checkbox,
}],
}, {
type: InputFieldType.textInput,
label: t('appDebug.variableConfig.placeholder'),

@ -1,7 +1,7 @@
import { useAppForm } from '@/app/components/base/form'
import BaseField from '@/app/components/base/form/form-scenarios/base/field'
import type { RAGPipelineVariables } from '@/models/pipeline'
import { useConfigurations, useInitialData } from '../../panel/test-run/data-source/website-crawl/base/options/hooks'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type FormProps = {
variables: RAGPipelineVariables

@ -9,7 +9,7 @@ import { useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import Toast from '@/app/components/base/toast'
import type { RAGPipelineVariables } from '@/models/pipeline'
import { useConfigurations, useInitialData } from './hooks'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
const I18N_PREFIX = 'datasetCreation.stepOne.website'

@ -1,59 +1,15 @@
import { useMemo } from 'react'
import type { BaseConfiguration } from '@/app/components/base/form/form-scenarios/base/types'
import { BaseFieldType } from '@/app/components/base/form/form-scenarios/base/types'
import { useStore } from '@/app/components/workflow/store'
import { useDraftPipelineProcessingParams } from '@/service/use-pipeline'
import { VAR_TYPE_MAP } from '@/models/pipeline'
export const useConfigurations = (datasourceNodeId: string) => {
export const useInputVariables = (datasourceNodeId: string) => {
const pipelineId = useStore(state => state.pipelineId)
const { data: paramsConfig, isFetching: isFetchingParams } = useDraftPipelineProcessingParams({
pipeline_id: pipelineId!,
node_id: datasourceNodeId,
})
const initialData = useMemo(() => {
const variables = paramsConfig?.variables || []
return variables.reduce((acc, item) => {
const type = VAR_TYPE_MAP[item.type]
if ([BaseFieldType.textInput, BaseFieldType.paragraph, BaseFieldType.select].includes(type))
acc[item.variable] = item.default_value ?? ''
if (type === BaseFieldType.numberInput)
acc[item.variable] = item.default_value ?? 0
if (type === BaseFieldType.checkbox)
acc[item.variable] = true
if ([BaseFieldType.file, BaseFieldType.fileList].includes(type))
acc[item.variable] = []
return acc
}, {} as Record<string, any>)
}, [paramsConfig])
const configurations = useMemo(() => {
const variables = paramsConfig?.variables || []
const configs: BaseConfiguration[] = variables.map(item => ({
type: VAR_TYPE_MAP[item.type],
variable: item.variable,
label: item.label,
required: item.required,
maxLength: item.max_length,
options: item.options?.map(option => ({
label: option,
value: option,
})),
showConditions: [],
placeholder: item.placeholder,
tooltip: item.tooltips,
unit: item.unit,
allowedFileTypes: item.allowed_file_types,
allowedFileExtensions: item.allowed_file_extensions,
allowedFileUploadMethods: item.allowed_file_upload_methods,
}))
return configs
}, [paramsConfig])
return {
isFetchingParams,
initialData,
configurations,
paramsConfig,
}
}

@ -1,9 +1,10 @@
import React, { useCallback } from 'react'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks'
import { useInputVariables } from './hooks'
import Options from './options'
import Actions from './actions'
import type { CustomActionsProps } from '@/app/components/base/form/components/form/actions'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type DocumentProcessingProps = {
dataSourceNodeId: string
@ -16,7 +17,9 @@ const DocumentProcessing = ({
onProcess,
onBack,
}: DocumentProcessingProps) => {
const { isFetchingParams, initialData, configurations } = useConfigurations(dataSourceNodeId)
const { isFetchingParams, paramsConfig } = useInputVariables(dataSourceNodeId)
const initialData = useInitialData(paramsConfig?.variables || [])
const configurations = useConfigurations(paramsConfig?.variables || [])
const schema = generateZodSchema(configurations)
const renderCustomActions = useCallback((props: CustomActionsProps) => (

@ -1,23 +1,25 @@
import { useMemo } from 'react'
import type { BaseConfiguration } from '@/app/components/base/form/form-scenarios/base/types'
import { BaseFieldType } from '@/app/components/base/form/form-scenarios/base/types'
import { type RAGPipelineVariables, VAR_TYPE_MAP } from '@/models/pipeline'
import { useMemo } from 'react'
import { BaseFieldType } from '@/app/components/base/form/form-scenarios/base/types'
export const useInitialData = (variables: RAGPipelineVariables) => {
export const useInitialData = (variables: RAGPipelineVariables, lastRunInputData?: Record<string, any>) => {
const initialData = useMemo(() => {
return variables.reduce((acc, item) => {
const type = VAR_TYPE_MAP[item.type]
const variableName = item.variable
const defaultValue = lastRunInputData?.[variableName] || item.default_value
if ([BaseFieldType.textInput, BaseFieldType.paragraph, BaseFieldType.select].includes(type))
acc[item.variable] = item.default_value ?? ''
acc[variableName] = defaultValue ?? ''
if (type === BaseFieldType.numberInput)
acc[item.variable] = item.default_value ?? 0
acc[variableName] = defaultValue ?? 0
if (type === BaseFieldType.checkbox)
acc[item.variable] = true
acc[variableName] = defaultValue ?? false
if ([BaseFieldType.file, BaseFieldType.fileList].includes(type))
acc[item.variable] = []
acc[variableName] = defaultValue ?? []
return acc
}, {} as Record<string, any>)
}, [variables])
}, [lastRunInputData, variables])
return initialData
}

@ -414,6 +414,7 @@ const translation = {
atLeastOneOption: 'At least one option is required',
optionRepeat: 'Has repeat options',
},
'startChecked': 'Start checked',
},
vision: {
name: 'Vision',

@ -408,6 +408,7 @@ const translation = {
atLeastOneOption: '至少需要一个选项',
optionRepeat: '选项不能重复',
},
'startChecked': '默认勾选',
},
vision: {
name: '视觉',

@ -127,6 +127,6 @@ export const useDocumentMetadata = (payload: {
})
}
export const useInvalidDocumentDetailKey = () => {
export const useInvalidDocumentDetail = () => {
return useInvalid(useDocumentDetailKey)
}

Loading…
Cancel
Save