diff --git a/web/app/components/workflow/nodes/_base/components/variable/utils.ts b/web/app/components/workflow/nodes/_base/components/variable/utils.ts index d8c22f09ec..7e592b9406 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/utils.ts +++ b/web/app/components/workflow/nodes/_base/components/variable/utils.ts @@ -15,6 +15,7 @@ import type { ParameterExtractorNodeType } from '../../../parameter-extractor/ty import type { IterationNodeType } from '../../../iteration/types' import type { ListFilterNodeType } from '../../../list-filter/types' import { OUTPUT_FILE_SUB_VARIABLES } from '../../../if-else/default' +import type { DocExtractorNodeType } from '../../../document-extractor/types' import { BlockEnum, InputVarType, VarType } from '@/app/components/workflow/types' import type { StartNodeType } from '@/app/components/workflow/nodes/start/types' import type { ConversationVariable, EnvironmentVariable, Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types' @@ -252,7 +253,7 @@ const formatItem = ( res.vars = [ { variable: 'text', - type: VarType.string, + type: (data as DocExtractorNodeType).is_array_file ? VarType.arrayString : VarType.string, }, ] break diff --git a/web/app/components/workflow/nodes/document-extractor/default.ts b/web/app/components/workflow/nodes/document-extractor/default.ts index 21d01abaf7..54045cc52e 100644 --- a/web/app/components/workflow/nodes/document-extractor/default.ts +++ b/web/app/components/workflow/nodes/document-extractor/default.ts @@ -7,6 +7,7 @@ const i18nPrefix = 'workflow.errorMsg' const nodeDefault: NodeDefault = { defaultValue: { variable_selector: [], + is_array_file: false, }, getAvailablePrevNodes(isChatMode: boolean) { const nodes = isChatMode diff --git a/web/app/components/workflow/nodes/document-extractor/types.ts b/web/app/components/workflow/nodes/document-extractor/types.ts index 96f29b407e..8ab7592109 100644 --- a/web/app/components/workflow/nodes/document-extractor/types.ts +++ b/web/app/components/workflow/nodes/document-extractor/types.ts @@ -2,4 +2,5 @@ import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/ty export type DocExtractorNodeType = CommonNodeType & { variable_selector: ValueSelector + is_array_file: boolean } diff --git a/web/app/components/workflow/nodes/document-extractor/use-config.ts b/web/app/components/workflow/nodes/document-extractor/use-config.ts index e72217e9ad..9406c125f0 100644 --- a/web/app/components/workflow/nodes/document-extractor/use-config.ts +++ b/web/app/components/workflow/nodes/document-extractor/use-config.ts @@ -1,28 +1,59 @@ -import { useCallback } from 'react' +import { useCallback, useMemo } from 'react' import produce from 'immer' +import { useStoreApi } from 'reactflow' + import type { ValueSelector, Var } from '../../types' import { VarType } from '../../types' import { type DocExtractorNodeType } from './types' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import { + useIsChatMode, useNodesReadOnly, + useWorkflow, + useWorkflowVariables, } from '@/app/components/workflow/hooks' const useConfig = (id: string, payload: DocExtractorNodeType) => { const { nodesReadOnly: readOnly } = useNodesReadOnly() - const { inputs, setInputs } = useNodeCrud(id, payload) + const filterVar = useCallback((varPayload: Var) => { + return varPayload.type === VarType.file || varPayload.type === VarType.arrayFile + }, []) + + const isChatMode = useIsChatMode() + + const store = useStoreApi() + const { getBeforeNodesInSameBranch } = useWorkflow() + const { + getNodes, + } = store.getState() + const currentNode = getNodes().find(n => n.id === id) + const isInIteration = payload.isInIteration + const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null + const availableNodes = useMemo(() => { + return getBeforeNodesInSameBranch(id) + }, [getBeforeNodesInSameBranch, id]) + + const { getCurrentVariableType } = useWorkflowVariables() + const getType = useCallback((variable?: ValueSelector) => { + const varType = getCurrentVariableType({ + parentNode: iterationNode, + valueSelector: variable || [], + availableNodes, + isChatMode, + isConstant: false, + }) + return varType + }, [getCurrentVariableType, availableNodes, isChatMode, iterationNode]) + const handleVarChanges = useCallback((variable: ValueSelector | string) => { const newInputs = produce(inputs, (draft) => { draft.variable_selector = variable as ValueSelector + draft.is_array_file = getType(draft.variable_selector) === VarType.arrayFile }) setInputs(newInputs) - }, [inputs, setInputs]) - - const filterVar = useCallback((varPayload: Var) => { - return varPayload.type === VarType.file - }, []) + }, [getType, inputs, setInputs]) return { readOnly,