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

wtw/rag-pipeline
twwu 11 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 { usePublishedPipelineProcessingParams } from '@/service/use-pipeline'
import { VAR_TYPE_MAP } from '@/models/pipeline'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' 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 pipelineId = useDatasetDetailContextWithSelector(state => state.dataset?.pipeline_id)
const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({ const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({
pipeline_id: pipelineId!, pipeline_id: pipelineId!,
node_id: datasourceNodeId, 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 { return {
paramsConfig,
isFetchingParams, isFetchingParams,
initialData,
configurations,
} }
} }

@ -1,8 +1,9 @@
import React from 'react' import React from 'react'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils' import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks' import { useInputVariables } from './hooks'
import Form from './form' import Form from './form'
import Actions from './actions' import Actions from './actions'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type ProcessDocumentsProps = { type ProcessDocumentsProps = {
dataSourceNodeId: string dataSourceNodeId: string
@ -21,7 +22,9 @@ const ProcessDocuments = ({
onBack, onBack,
ref, ref,
}: ProcessDocumentsProps) => { }: 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) const schema = generateZodSchema(configurations)
return ( 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 { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import type { NotionPage } from '@/models/common' 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 = { type DocumentSettingsProps = {
datasetId: string datasetId: string
@ -26,8 +26,10 @@ const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
const { indexingTechnique, dataset } = useContext(DatasetDetailContext) const { indexingTechnique, dataset } = useContext(DatasetDetailContext)
const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding) const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
const invalidDocumentDetail = useInvalidDocumentDetailKey() const invalidDocumentList = useInvalidDocumentList(datasetId)
const invalidDocumentDetail = useInvalidDocumentDetail()
const saveHandler = () => { const saveHandler = () => {
invalidDocumentList()
invalidDocumentDetail() invalidDocumentDetail()
router.push(`/datasets/${datasetId}/documents/${documentId}`) router.push(`/datasets/${datasetId}/documents/${documentId}`)
} }

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

@ -1,59 +1,15 @@
import { useMemo } from 'react'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { usePublishedPipelineProcessingParams } from '@/service/use-pipeline' 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 pipelineId = useDatasetDetailContextWithSelector(state => state.dataset?.pipeline_id)
const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({ const { data: paramsConfig, isFetching: isFetchingParams } = usePublishedPipelineProcessingParams({
pipeline_id: pipelineId!, pipeline_id: pipelineId!,
node_id: datasourceNodeId, 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 { return {
paramsConfig,
isFetchingParams, isFetchingParams,
initialData,
configurations,
} }
} }

@ -1,7 +1,8 @@
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils' import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks' import { useInputVariables } from './hooks'
import Actions from './actions' import Actions from './actions'
import Form from '../../../../create-from-pipeline/process-documents/form' import Form from '../../../../create-from-pipeline/process-documents/form'
import { useConfigurations, useInitialData } from '@/app/components/rag-pipeline/hooks/use-input-fields'
type ProcessDocumentsProps = { type ProcessDocumentsProps = {
datasourceNodeId: string datasourceNodeId: string
@ -20,7 +21,9 @@ const ProcessDocuments = ({
onSubmit, onSubmit,
ref, ref,
}: ProcessDocumentsProps) => { }: 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) const schema = generateZodSchema(configurations)
return ( 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 IndexFailed from '@/app/components/datasets/common/document-status-with-action/index-failed'
import { useProviderContext } from '@/context/provider-context' import { useProviderContext } from '@/context/provider-context'
import cn from '@/utils/classnames' 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 { useInvalid } from '@/service/use-base'
import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment' import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment'
import useEditDocumentMetadata from '../metadata/hooks/use-edit-dataset-metadata' 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 // eslint-disable-next-line react-hooks/exhaustive-deps
}, [documentsRes]) }, [documentsRes])
const invalidDocumentDetail = useInvalidDocumentDetailKey() const invalidDocumentDetail = useInvalidDocumentDetail()
const invalidChunkList = useInvalid(useSegmentListKey) const invalidChunkList = useInvalid(useSegmentListKey)
const invalidChildChunkList = useInvalid(useChildSegmentListKey) const invalidChildChunkList = useInvalid(useChildSegmentListKey)

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

@ -1,7 +1,7 @@
import { useAppForm } from '@/app/components/base/form' import { useAppForm } from '@/app/components/base/form'
import BaseField from '@/app/components/base/form/form-scenarios/base/field' import BaseField from '@/app/components/base/form/form-scenarios/base/field'
import type { RAGPipelineVariables } from '@/models/pipeline' 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 = { type FormProps = {
variables: RAGPipelineVariables variables: RAGPipelineVariables

@ -9,7 +9,7 @@ import { useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import type { RAGPipelineVariables } from '@/models/pipeline' 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' import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
const I18N_PREFIX = 'datasetCreation.stepOne.website' 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 { useStore } from '@/app/components/workflow/store'
import { useDraftPipelineProcessingParams } from '@/service/use-pipeline' 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 pipelineId = useStore(state => state.pipelineId)
const { data: paramsConfig, isFetching: isFetchingParams } = useDraftPipelineProcessingParams({ const { data: paramsConfig, isFetching: isFetchingParams } = useDraftPipelineProcessingParams({
pipeline_id: pipelineId!, pipeline_id: pipelineId!,
node_id: datasourceNodeId, 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 { return {
isFetchingParams, isFetchingParams,
initialData, paramsConfig,
configurations,
} }
} }

@ -1,9 +1,10 @@
import React, { useCallback } from 'react' import React, { useCallback } from 'react'
import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils' import { generateZodSchema } from '@/app/components/base/form/form-scenarios/base/utils'
import { useConfigurations } from './hooks' import { useInputVariables } from './hooks'
import Options from './options' import Options from './options'
import Actions from './actions' import Actions from './actions'
import type { CustomActionsProps } from '@/app/components/base/form/components/form/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 = { type DocumentProcessingProps = {
dataSourceNodeId: string dataSourceNodeId: string
@ -16,7 +17,9 @@ const DocumentProcessing = ({
onProcess, onProcess,
onBack, onBack,
}: DocumentProcessingProps) => { }: 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 schema = generateZodSchema(configurations)
const renderCustomActions = useCallback((props: CustomActionsProps) => ( 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 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 { 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(() => { const initialData = useMemo(() => {
return variables.reduce((acc, item) => { return variables.reduce((acc, item) => {
const type = VAR_TYPE_MAP[item.type] 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)) if ([BaseFieldType.textInput, BaseFieldType.paragraph, BaseFieldType.select].includes(type))
acc[item.variable] = item.default_value ?? '' acc[variableName] = defaultValue ?? ''
if (type === BaseFieldType.numberInput) if (type === BaseFieldType.numberInput)
acc[item.variable] = item.default_value ?? 0 acc[variableName] = defaultValue ?? 0
if (type === BaseFieldType.checkbox) if (type === BaseFieldType.checkbox)
acc[item.variable] = true acc[variableName] = defaultValue ?? false
if ([BaseFieldType.file, BaseFieldType.fileList].includes(type)) if ([BaseFieldType.file, BaseFieldType.fileList].includes(type))
acc[item.variable] = [] acc[variableName] = defaultValue ?? []
return acc return acc
}, {} as Record<string, any>) }, {} as Record<string, any>)
}, [variables]) }, [lastRunInputData, variables])
return initialData return initialData
} }

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

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

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

Loading…
Cancel
Save