diff --git a/web/app/components/base/form/components/field/variable-or-constant-input.tsx b/web/app/components/base/form/components/field/variable-or-constant-input.tsx new file mode 100644 index 0000000000..0f620f7154 --- /dev/null +++ b/web/app/components/base/form/components/field/variable-or-constant-input.tsx @@ -0,0 +1,58 @@ +import { useState } from 'react' +import { RiEditLine } from '@remixicon/react' +import cn from '@/utils/classnames' +import SegmentedControl from '@/app/components/base/segmented-control' +import { VariableX } from '@/app/components/base/icons/src/vender/workflow' +import type { LabelProps } from '../label' +import Label from '../label' + +type VariableOrConstantInputFieldProps = { + label: string + labelOptions?: Omit + className?: string +} + +const VariableOrConstantInputField = ({ + className, + label, + labelOptions, +}: VariableOrConstantInputFieldProps) => { + const [variableType, setVariableType] = useState('variable') + + const options = [ + { + Icon: VariableX, + text: '', + value: 'variable', + }, + { + Icon: RiEditLine, + text: '', + value: 'constant', + }, + ] + + const handleVariableOrConstantChange = (value: string) => { + setVariableType(value) + } + + return ( +
+
+ ) +} + +export default VariableOrConstantInputField diff --git a/web/app/components/base/form/form-scenarios/node-panel/field.tsx b/web/app/components/base/form/form-scenarios/node-panel/field.tsx new file mode 100644 index 0000000000..00cc401960 --- /dev/null +++ b/web/app/components/base/form/form-scenarios/node-panel/field.tsx @@ -0,0 +1,239 @@ +import React from 'react' +import { type InputFieldConfiguration, InputFieldType } from './types' +import { withForm } from '../..' +import { useStore } from '@tanstack/react-form' + +type InputFieldProps = { + initialData?: T + config: InputFieldConfiguration +} + +const NodePanelField = ({ + initialData, + config, +}: InputFieldProps) => withForm({ + defaultValues: initialData, + render: function Render({ + form, + }) { + const { + type, + label, + placeholder, + variable, + tooltip, + showConditions, + max, + min, + required, + showOptional, + supportFile, + description, + options, + listeners, + popupProps, + } = config + + const isAllConditionsMet = useStore(form.store, (state) => { + const fieldValues = state.values + return showConditions.every((condition) => { + const { variable, value } = condition + const fieldValue = fieldValues[variable as keyof typeof fieldValues] + return fieldValue === value + }) + }) + + if (!isAllConditionsMet) + return <> + + if (type === InputFieldType.textInput) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.numberInput) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.numberSlider) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.checkbox) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.select) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.inputTypeSelect) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.uploadMethod) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.fileTypes) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.options) { + return ( + ( + + )} + /> + ) + } + + if (type === InputFieldType.variableOrConstant) { + return ( + ( + + )} + /> + ) + } + + return <> + }, +}) + +export default NodePanelField diff --git a/web/app/components/base/form/form-scenarios/node-panel/types.ts b/web/app/components/base/form/form-scenarios/node-panel/types.ts new file mode 100644 index 0000000000..9ff663a57a --- /dev/null +++ b/web/app/components/base/form/form-scenarios/node-panel/types.ts @@ -0,0 +1,40 @@ +import type { DeepKeys, FieldListeners } from '@tanstack/react-form' +import type { NumberConfiguration, SelectConfiguration, ShowCondition } from '../base/types' + +export enum InputFieldType { + textInput = 'textInput', + numberInput = 'numberInput', + numberSlider = 'numberSlider', + checkbox = 'checkbox', + options = 'options', + select = 'select', + inputTypeSelect = 'inputTypeSelect', + uploadMethod = 'uploadMethod', + fileTypes = 'fileTypes', + variableOrConstant = 'variableOrConstant', +} + +export type InputTypeSelectConfiguration = { + supportFile: boolean +} + +export type NumberSliderConfiguration = { + description: string + max?: number + min?: number +} + +export type InputFieldConfiguration = { + label: string + variable: DeepKeys // Variable name + maxLength?: number // Max length for text input + placeholder?: string + required: boolean + showOptional?: boolean // show optional label + showConditions: ShowCondition[] // Show this field only when all conditions are met + type: InputFieldType + tooltip?: string // Tooltip for this field + listeners?: FieldListeners> // Listener for this field +} & NumberConfiguration & Partial +& Partial +& Partial diff --git a/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts b/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts index 9b7a689a29..82d8a1809f 100644 --- a/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts +++ b/web/app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts @@ -2,6 +2,7 @@ import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useGetLanguage } from '@/context/i18n' import knowledgeBaseDefault from '@/app/components/workflow/nodes/knowledge-base/default' +import dataSourceDefault from '@/app/components/workflow/nodes/data-source/default' import { WORKFLOW_COMMON_NODES } from '@/app/components/workflow/constants/node' import type { AvailableNodesMetaData } from '@/app/components/workflow/hooks-store/store' @@ -12,6 +13,7 @@ export const useAvailableNodesMetaData = () => { const mergedNodesMetaData = useMemo(() => [ ...WORKFLOW_COMMON_NODES, knowledgeBaseDefault, + dataSourceDefault, ], []) const prefixLink = useMemo(() => { @@ -22,21 +24,27 @@ export const useAvailableNodesMetaData = () => { }, [language]) const availableNodesMetaData = useMemo(() => mergedNodesMetaData.map((node) => { + const { metaData } = node + const title = t(`workflow.blocks.${metaData.type}`) + const description = t(`workflow.blocksAbout.${metaData.type}`) return { ...node, + metaData: { + ...metaData, + title, + description, + helpLinkUri: `${prefixLink}${metaData.helpLinkUri}`, + }, defaultValue: { ...node.defaultValue, - type: node.type, + type: metaData.type, + title, }, - title: t(`workflow.blocks.${node.type}`), - description: t(`workflow.blocksAbout.${node.type}`), - helpLinkUri: `${prefixLink}${node.helpLinkUri}`, - } }), [mergedNodesMetaData, t, prefixLink]) const availableNodesMetaDataMap = useMemo(() => availableNodesMetaData.reduce((acc, node) => { - acc![node.type] = node + acc![node.metaData.type] = node return acc }, {} as AvailableNodesMetaData['nodesMap']), [availableNodesMetaData]) diff --git a/web/app/components/rag-pipeline/index.tsx b/web/app/components/rag-pipeline/index.tsx index a06f7dcad4..1359f10c89 100644 --- a/web/app/components/rag-pipeline/index.tsx +++ b/web/app/components/rag-pipeline/index.tsx @@ -3,21 +3,38 @@ import { WorkflowContextProvider, } from '@/app/components/workflow/context' import type { InjectWorkflowStoreSliceFn } from '@/app/components/workflow/store' +import { generateNewNode } from '@/app/components/workflow/utils' +import dataSourceNodeDefault from '@/app/components/workflow/nodes/data-source/default' +import { + NODE_WIDTH_X_OFFSET, + START_INITIAL_POSITION, +} from '@/app/components/workflow/constants' import { createRagPipelineSliceSlice } from './store' import RagPipelineMain from './components/rag-pipeline-main' const RagPipeline = () => { + const { newNode: DataSourceNode } = generateNewNode({ + data: { + type: dataSourceNodeDefault.metaData.type, + title: 'data-source', + ...dataSourceNodeDefault.defaultValue, + }, + position: { + x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET, + y: START_INITIAL_POSITION.y, + }, + } as any) return ( diff --git a/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts b/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts index 5562b251a0..f590c1a8ce 100644 --- a/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts +++ b/web/app/components/workflow-app/hooks/use-available-nodes-meta-data.ts @@ -31,21 +31,27 @@ export const useAvailableNodesMetaData = () => { }, [language]) const availableNodesMetaData = useMemo(() => mergedNodesMetaData.map((node) => { + const { metaData } = node + const title = t(`workflow.blocks.${metaData.type}`) + const description = t(`workflow.blocksAbout.${metaData.type}`) return { ...node, + metaData: { + ...metaData, + title, + description, + helpLinkUri: `${prefixLink}${metaData.helpLinkUri}`, + }, defaultValue: { ...node.defaultValue, - type: node.type, + type: metaData.type, + title, }, - title: t(`workflow.blocks.${node.type}`), - description: t(`workflow.blocksAbout.${node.type}`), - helpLinkUri: `${prefixLink}${node.helpLinkUri}`, - } }), [mergedNodesMetaData, t, prefixLink]) const availableNodesMetaDataMap = useMemo(() => availableNodesMetaData.reduce((acc, node) => { - acc![node.type] = node + acc![node.metaData.type] = node return acc }, {} as AvailableNodesMetaData['nodesMap']), [availableNodesMetaData]) diff --git a/web/app/components/workflow-app/hooks/use-workflow-template.ts b/web/app/components/workflow-app/hooks/use-workflow-template.ts index c720a27093..3c58462e4c 100644 --- a/web/app/components/workflow-app/hooks/use-workflow-template.ts +++ b/web/app/components/workflow-app/hooks/use-workflow-template.ts @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next' import { generateNewNode } from '@/app/components/workflow/utils' import { NODE_WIDTH_X_OFFSET, @@ -11,9 +12,14 @@ import answerDefault from '@/app/components/workflow/nodes/answer/default' export const useWorkflowTemplate = () => { const isChatMode = useIsChatMode() + const { t } = useTranslation() const { newNode: startNode } = generateNewNode({ - data: startDefault.defaultValue as StartNodeType, + data: { + ...startDefault.defaultValue as StartNodeType, + type: startDefault.metaData.type, + title: t(`workflow.blocks.${startDefault.metaData.type}`), + }, position: START_INITIAL_POSITION, }) @@ -27,6 +33,8 @@ export const useWorkflowTemplate = () => { query_prompt_template: '{{#sys.query#}}', }, selected: true, + type: llmDefault.metaData.type, + title: t(`workflow.blocks.${llmDefault.metaData.type}`), }, position: { x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET, @@ -39,6 +47,8 @@ export const useWorkflowTemplate = () => { data: { ...answerDefault.defaultValue, answer: `{{#${llmNode.id}.text#}}`, + type: answerDefault.metaData.type, + title: t(`workflow.blocks.${answerDefault.metaData.type}`), }, position: { x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET * 2, diff --git a/web/app/components/workflow/hooks/use-available-blocks.ts b/web/app/components/workflow/hooks/use-available-blocks.ts index aa15eb3b7e..419a49eee8 100644 --- a/web/app/components/workflow/hooks/use-available-blocks.ts +++ b/web/app/components/workflow/hooks/use-available-blocks.ts @@ -19,7 +19,7 @@ export const useAvailableBlocks = (nodeType?: BlockEnum, inContainer?: boolean) const { nodes: availableNodes, } = useNodesMetaData() - const availableNodesType = useMemo(() => availableNodes.map(node => node.type), [availableNodes]) + const availableNodesType = useMemo(() => availableNodes.map(node => node.metaData.type), [availableNodes]) const availablePrevBlocks = useMemo(() => { if (!nodeType || nodeType === BlockEnum.Start) return [] diff --git a/web/app/components/workflow/hooks/use-nodes-interactions.ts b/web/app/components/workflow/hooks/use-nodes-interactions.ts index b220d47a08..b1787c56a4 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions.ts @@ -685,7 +685,6 @@ export const useNodesInteractions = () => { const nodesWithSameType = nodes.filter(node => node.data.type === nodeType) const { defaultValue, - title, } = nodesMetaDataMap![nodeType] const { newNode, @@ -695,7 +694,7 @@ export const useNodesInteractions = () => { type: getNodeCustomTypeByNodeDataType(nodeType), data: { ...(defaultValue as any), - title: nodesWithSameType.length > 0 ? `${title} ${nodesWithSameType.length + 1}` : title, + title: nodesWithSameType.length > 0 ? `${defaultValue.title} ${nodesWithSameType.length + 1}` : defaultValue.title, ...(toolDefaultValue || {}), selected: true, _showAddVariablePopup: (nodeType === BlockEnum.VariableAssigner || nodeType === BlockEnum.VariableAggregator) && !!prevNodeId, @@ -1121,7 +1120,6 @@ export const useNodesInteractions = () => { const nodesWithSameType = nodes.filter(node => node.data.type === nodeType) const { defaultValue, - title, } = nodesMetaDataMap![nodeType] const { newNode: newCurrentNode, @@ -1131,7 +1129,7 @@ export const useNodesInteractions = () => { type: getNodeCustomTypeByNodeDataType(nodeType), data: { ...(defaultValue as any), - title: nodesWithSameType.length > 0 ? `${title} ${nodesWithSameType.length + 1}` : title, + title: nodesWithSameType.length > 0 ? `${defaultValue.title} ${nodesWithSameType.length + 1}` : defaultValue.title, ...(toolDefaultValue || {}), _connectedSourceHandleIds: [], _connectedTargetHandleIds: [], diff --git a/web/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx b/web/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx index ad0f6c636f..374517c4aa 100644 --- a/web/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx +++ b/web/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx @@ -55,7 +55,7 @@ const PanelOperatorPopup = ({ const edge = edges.find(edge => edge.target === id) const author = useMemo(() => { if (data.type !== BlockEnum.Tool) - return nodesExtraData![data.type].author + return nodesExtraData![data.type].metaData.author if (data.provider_type === CollectionType.builtIn) return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.author @@ -68,7 +68,7 @@ const PanelOperatorPopup = ({ const about = useMemo(() => { if (data.type !== BlockEnum.Tool) - return nodesExtraData![data.type].description + return nodesExtraData![data.type].metaData.description if (data.provider_type === CollectionType.builtIn) return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.description[language] diff --git a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts index 804d031a8e..e40f6271ef 100644 --- a/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts +++ b/web/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts @@ -6,7 +6,7 @@ export const useNodeHelpLink = (nodeType: BlockEnum) => { const availableNodesMetaData = useNodesMetaData() const link = useMemo(() => { - const result = availableNodesMetaData?.nodesMap?.[nodeType]?.helpLinkUri || '' + const result = availableNodesMetaData?.nodesMap?.[nodeType]?.metaData.helpLinkUri || '' return result }, [availableNodesMetaData, nodeType]) diff --git a/web/app/components/workflow/nodes/agent/default.ts b/web/app/components/workflow/nodes/agent/default.ts index aed97fb7c3..6aab47ed69 100644 --- a/web/app/components/workflow/nodes/agent/default.ts +++ b/web/app/components/workflow/nodes/agent/default.ts @@ -6,13 +6,13 @@ import { renderI18nObject } from '@/i18n' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: 3, + type: BlockEnum.Agent, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 3, - type: BlockEnum.Agent, - }), - defaultValue: { - }, + metaData, + defaultValue: {}, checkValid(payload, t, moreDataForCheckValid: { strategyProvider?: StrategyPluginDetail, strategy?: StrategyDetail diff --git a/web/app/components/workflow/nodes/answer/default.ts b/web/app/components/workflow/nodes/answer/default.ts index a1f0b47c5a..d3cb2c6741 100644 --- a/web/app/components/workflow/nodes/answer/default.ts +++ b/web/app/components/workflow/nodes/answer/default.ts @@ -3,11 +3,12 @@ import type { AnswerNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: 2.1, + type: BlockEnum.Answer, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 2.1, - type: BlockEnum.Answer, - }), + metaData, defaultValue: { variables: [], answer: '', diff --git a/web/app/components/workflow/nodes/assigner/default.ts b/web/app/components/workflow/nodes/assigner/default.ts index 1a43d15c49..fe26f4c2c2 100644 --- a/web/app/components/workflow/nodes/assigner/default.ts +++ b/web/app/components/workflow/nodes/assigner/default.ts @@ -5,13 +5,14 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 5, + type: BlockEnum.Assigner, + helpLinkUri: 'variable-assigner', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 5, - type: BlockEnum.Assigner, - helpLinkUri: 'variable-assigner', - }), + metaData, defaultValue: { version: '2', items: [], diff --git a/web/app/components/workflow/nodes/code/default.ts b/web/app/components/workflow/nodes/code/default.ts index c66215fa99..7cf40db63f 100644 --- a/web/app/components/workflow/nodes/code/default.ts +++ b/web/app/components/workflow/nodes/code/default.ts @@ -6,12 +6,13 @@ import { BlockClassificationEnum } from '@/app/components/workflow/block-selecto const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 1, + type: BlockEnum.Code, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 1, - type: BlockEnum.Code, - }), + metaData, defaultValue: { code: '', code_language: CodeLanguage.python3, diff --git a/web/app/components/workflow/nodes/data-source/default.ts b/web/app/components/workflow/nodes/data-source/default.ts index 6fe02cd0e0..6236ed927a 100644 --- a/web/app/components/workflow/nodes/data-source/default.ts +++ b/web/app/components/workflow/nodes/data-source/default.ts @@ -3,13 +3,13 @@ import type { DataSourceNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: -1, + type: BlockEnum.DataSource, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: -1, - type: BlockEnum.DataSource, - }), - defaultValue: { - }, + metaData, + defaultValue: {}, checkValid() { return { isValid: true, diff --git a/web/app/components/workflow/nodes/data-source/panel.tsx b/web/app/components/workflow/nodes/data-source/panel.tsx index feefaa8612..0d6d95586f 100644 --- a/web/app/components/workflow/nodes/data-source/panel.tsx +++ b/web/app/components/workflow/nodes/data-source/panel.tsx @@ -2,11 +2,15 @@ import type { FC } from 'react' import { memo } from 'react' import type { DataSourceNodeType } from './types' import type { NodePanelProps } from '@/app/components/workflow/types' +import VariableOrConstantInputField from '@/app/components/base/form/components/field/variable-or-constant-input' const Panel: FC> = () => { return (
datasource +
) } diff --git a/web/app/components/workflow/nodes/document-extractor/default.ts b/web/app/components/workflow/nodes/document-extractor/default.ts index caeb37656a..77a847b5fd 100644 --- a/web/app/components/workflow/nodes/document-extractor/default.ts +++ b/web/app/components/workflow/nodes/document-extractor/default.ts @@ -5,13 +5,14 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 4, + type: BlockEnum.DocExtractor, + helpLinkUri: 'doc-extractor', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 4, - type: BlockEnum.DocExtractor, - helpLinkUri: 'doc-extractor', - }), + metaData, defaultValue: { variable_selector: [], is_array_file: false, diff --git a/web/app/components/workflow/nodes/end/default.ts b/web/app/components/workflow/nodes/end/default.ts index e61d84d648..32e4f1051d 100644 --- a/web/app/components/workflow/nodes/end/default.ts +++ b/web/app/components/workflow/nodes/end/default.ts @@ -3,11 +3,12 @@ import type { EndNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: 2.1, + type: BlockEnum.End, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 2.1, - type: BlockEnum.End, - }), + metaData, defaultValue: { outputs: [], }, diff --git a/web/app/components/workflow/nodes/http/default.ts b/web/app/components/workflow/nodes/http/default.ts index b5dca4549e..0ba0671590 100644 --- a/web/app/components/workflow/nodes/http/default.ts +++ b/web/app/components/workflow/nodes/http/default.ts @@ -5,12 +5,13 @@ import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Utilities, + sort: 1, + type: BlockEnum.HttpRequest, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Utilities, - sort: 1, - type: BlockEnum.HttpRequest, - }), + metaData, defaultValue: { variables: [], method: Method.get, diff --git a/web/app/components/workflow/nodes/if-else/default.ts b/web/app/components/workflow/nodes/if-else/default.ts index 1f82c0fe29..4ef3bef4a2 100644 --- a/web/app/components/workflow/nodes/if-else/default.ts +++ b/web/app/components/workflow/nodes/if-else/default.ts @@ -6,13 +6,14 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Logic, + sort: 1, + type: BlockEnum.IfElse, + helpLinkUri: 'ifelse', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Logic, - sort: 1, - type: BlockEnum.IfElse, - helpLinkUri: 'ifelse', - }), + metaData, defaultValue: { _targetBranches: [ { diff --git a/web/app/components/workflow/nodes/iteration-start/default.ts b/web/app/components/workflow/nodes/iteration-start/default.ts index 3bd42894f1..5229229648 100644 --- a/web/app/components/workflow/nodes/iteration-start/default.ts +++ b/web/app/components/workflow/nodes/iteration-start/default.ts @@ -3,11 +3,12 @@ import type { IterationStartNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: -1, + type: BlockEnum.IterationStart, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: -1, - type: BlockEnum.IterationStart, - }), + metaData, defaultValue: {}, checkValid() { return { diff --git a/web/app/components/workflow/nodes/iteration/default.ts b/web/app/components/workflow/nodes/iteration/default.ts index 3cc51dd340..212c4a2f2c 100644 --- a/web/app/components/workflow/nodes/iteration/default.ts +++ b/web/app/components/workflow/nodes/iteration/default.ts @@ -6,12 +6,13 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Logic, + sort: 2, + type: BlockEnum.Iteration, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Logic, - sort: 2, - type: BlockEnum.Iteration, - }), + metaData, defaultValue: { start_node_id: '', iterator_selector: [], diff --git a/web/app/components/workflow/nodes/iteration/use-interactions.ts b/web/app/components/workflow/nodes/iteration/use-interactions.ts index b4e0540b2c..ec3422ba82 100644 --- a/web/app/components/workflow/nodes/iteration/use-interactions.ts +++ b/web/app/components/workflow/nodes/iteration/use-interactions.ts @@ -129,6 +129,7 @@ export const useNodeIterationInteractions = () => { _connectedTargetHandleIds: [], title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${childNodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${childNodeType}`), iteration_id: newNodeId, + type: childNodeType, }, position: child.position, positionAbsolute: child.positionAbsolute, diff --git a/web/app/components/workflow/nodes/knowledge-base/default.ts b/web/app/components/workflow/nodes/knowledge-base/default.ts index ff5448a37d..f121972e20 100644 --- a/web/app/components/workflow/nodes/knowledge-base/default.ts +++ b/web/app/components/workflow/nodes/knowledge-base/default.ts @@ -3,13 +3,13 @@ import type { KnowledgeBaseNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: 3.1, + type: BlockEnum.KnowledgeBase, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 3.1, - type: BlockEnum.KnowledgeBase, - }), - defaultValue: { - }, + metaData, + defaultValue: {}, checkValid() { return { isValid: true, diff --git a/web/app/components/workflow/nodes/knowledge-retrieval/default.ts b/web/app/components/workflow/nodes/knowledge-retrieval/default.ts index bbb2ed6387..5b2cd737ed 100644 --- a/web/app/components/workflow/nodes/knowledge-retrieval/default.ts +++ b/web/app/components/workflow/nodes/knowledge-retrieval/default.ts @@ -7,11 +7,12 @@ import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' const i18nPrefix = 'workflow' +const metaData = genNodeMetaData({ + sort: 2, + type: BlockEnum.KnowledgeRetrieval, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 2, - type: BlockEnum.KnowledgeRetrieval, - }), + metaData, defaultValue: { query_variable_selector: [], dataset_ids: [], diff --git a/web/app/components/workflow/nodes/list-operator/default.ts b/web/app/components/workflow/nodes/list-operator/default.ts index a9898ac2a8..4cf69f930e 100644 --- a/web/app/components/workflow/nodes/list-operator/default.ts +++ b/web/app/components/workflow/nodes/list-operator/default.ts @@ -7,12 +7,13 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Utilities, + sort: 2, + type: BlockEnum.ListFilter, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Utilities, - sort: 2, - type: BlockEnum.ListFilter, - }), + metaData, defaultValue: { variable: [], filter_by: { diff --git a/web/app/components/workflow/nodes/llm/default.ts b/web/app/components/workflow/nodes/llm/default.ts index 34b6085c9d..df892d1c53 100644 --- a/web/app/components/workflow/nodes/llm/default.ts +++ b/web/app/components/workflow/nodes/llm/default.ts @@ -6,11 +6,12 @@ import { BlockEnum } from '@/app/components/workflow/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + sort: 1, + type: BlockEnum.LLM, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 1, - type: BlockEnum.LLM, - }), + metaData, defaultValue: { model: { provider: '', diff --git a/web/app/components/workflow/nodes/loop-end/default.ts b/web/app/components/workflow/nodes/loop-end/default.ts index 7e314ab277..c02d007cde 100644 --- a/web/app/components/workflow/nodes/loop-end/default.ts +++ b/web/app/components/workflow/nodes/loop-end/default.ts @@ -6,12 +6,13 @@ import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Logic, + sort: 2, + type: BlockEnum.LoopEnd, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Logic, - sort: 2, - type: BlockEnum.LoopEnd, - }), + metaData, defaultValue: {}, checkValid() { return { diff --git a/web/app/components/workflow/nodes/loop-start/default.ts b/web/app/components/workflow/nodes/loop-start/default.ts index 17f1669111..86dc5b44bf 100644 --- a/web/app/components/workflow/nodes/loop-start/default.ts +++ b/web/app/components/workflow/nodes/loop-start/default.ts @@ -3,11 +3,12 @@ import type { LoopStartNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: -1, + type: BlockEnum.LoopStart, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: -1, - type: BlockEnum.LoopStart, - }), + metaData, defaultValue: {}, checkValid() { return { diff --git a/web/app/components/workflow/nodes/loop/default.ts b/web/app/components/workflow/nodes/loop/default.ts index 1e54b31122..d7424d3f94 100644 --- a/web/app/components/workflow/nodes/loop/default.ts +++ b/web/app/components/workflow/nodes/loop/default.ts @@ -8,13 +8,14 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Logic, + sort: 3, + type: BlockEnum.Loop, + author: 'AICT-Team', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Logic, - sort: 3, - type: BlockEnum.Loop, - // author: 'AICT-Team', - }), + metaData, defaultValue: { start_node_id: '', break_conditions: [], diff --git a/web/app/components/workflow/nodes/loop/use-interactions.ts b/web/app/components/workflow/nodes/loop/use-interactions.ts index 6687acb0c4..532de56e54 100644 --- a/web/app/components/workflow/nodes/loop/use-interactions.ts +++ b/web/app/components/workflow/nodes/loop/use-interactions.ts @@ -116,7 +116,6 @@ export const useNodeLoopInteractions = () => { const childNodeType = child.data.type as BlockEnum const { defaultValue, - title, } = nodesMetaDataMap![childNodeType] const nodesWithSameType = nodes.filter(node => node.data.type === childNodeType) const { newNode } = generateNewNode({ @@ -128,7 +127,7 @@ export const useNodeLoopInteractions = () => { _isBundled: false, _connectedSourceHandleIds: [], _connectedTargetHandleIds: [], - title: nodesWithSameType.length > 0 ? `${title} ${nodesWithSameType.length + 1}` : title, + title: nodesWithSameType.length > 0 ? `${defaultValue.title} ${nodesWithSameType.length + 1}` : defaultValue.title, loop_id: newNodeId, }, diff --git a/web/app/components/workflow/nodes/parameter-extractor/default.ts b/web/app/components/workflow/nodes/parameter-extractor/default.ts index c2c0140940..a65306249d 100644 --- a/web/app/components/workflow/nodes/parameter-extractor/default.ts +++ b/web/app/components/workflow/nodes/parameter-extractor/default.ts @@ -5,12 +5,13 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 6, + type: BlockEnum.ParameterExtractor, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 6, - type: BlockEnum.ParameterExtractor, - }), + metaData, defaultValue: { query: [], model: { diff --git a/web/app/components/workflow/nodes/question-classifier/default.ts b/web/app/components/workflow/nodes/question-classifier/default.ts index c404a6698b..d34c854916 100644 --- a/web/app/components/workflow/nodes/question-classifier/default.ts +++ b/web/app/components/workflow/nodes/question-classifier/default.ts @@ -6,12 +6,13 @@ import { BlockClassificationEnum } from '@/app/components/workflow/block-selecto const i18nPrefix = 'workflow' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.QuestionUnderstand, + sort: 1, + type: BlockEnum.QuestionClassifier, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.QuestionUnderstand, - sort: 1, - type: BlockEnum.QuestionClassifier, - }), + metaData, defaultValue: { query_variable_selector: [], model: { diff --git a/web/app/components/workflow/nodes/start/default.ts b/web/app/components/workflow/nodes/start/default.ts index 53ad1761a1..8337c2275f 100644 --- a/web/app/components/workflow/nodes/start/default.ts +++ b/web/app/components/workflow/nodes/start/default.ts @@ -3,11 +3,12 @@ import type { StartNodeType } from './types' import { genNodeMetaData } from '@/app/components/workflow/utils' import { BlockEnum } from '@/app/components/workflow/types' +const metaData = genNodeMetaData({ + sort: 0.1, + type: BlockEnum.Start, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: 0.1, - type: BlockEnum.Start, - }), + metaData, defaultValue: { variables: [], }, diff --git a/web/app/components/workflow/nodes/template-transform/default.ts b/web/app/components/workflow/nodes/template-transform/default.ts index f68d81663a..1a3c092c0b 100644 --- a/web/app/components/workflow/nodes/template-transform/default.ts +++ b/web/app/components/workflow/nodes/template-transform/default.ts @@ -5,13 +5,14 @@ import { BlockEnum } from '@/app/components/workflow/types' import { BlockClassificationEnum } from '@/app/components/workflow/block-selector/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 2, + type: BlockEnum.TemplateTransform, + helpLinkUri: 'template', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 2, - type: BlockEnum.TemplateTransform, - helpLinkUri: 'template', - }), + metaData, defaultValue: { template: '', variables: [], diff --git a/web/app/components/workflow/nodes/tool/default.ts b/web/app/components/workflow/nodes/tool/default.ts index 891857d6ec..371c78260c 100644 --- a/web/app/components/workflow/nodes/tool/default.ts +++ b/web/app/components/workflow/nodes/tool/default.ts @@ -6,12 +6,13 @@ import { BlockEnum } from '@/app/components/workflow/types' const i18nPrefix = 'workflow.errorMsg' +const metaData = genNodeMetaData({ + sort: -1, + type: BlockEnum.Tool, + helpLinkUri: 'tools', +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - sort: -1, - type: BlockEnum.Tool, - helpLinkUri: 'tools', - }), + metaData, defaultValue: { tool_parameters: {}, tool_configurations: {}, diff --git a/web/app/components/workflow/nodes/variable-assigner/default.ts b/web/app/components/workflow/nodes/variable-assigner/default.ts index f7813c9258..825bad5b9c 100644 --- a/web/app/components/workflow/nodes/variable-assigner/default.ts +++ b/web/app/components/workflow/nodes/variable-assigner/default.ts @@ -6,12 +6,13 @@ import { BlockClassificationEnum } from '@/app/components/workflow/block-selecto const i18nPrefix = 'workflow' +const metaData = genNodeMetaData({ + classification: BlockClassificationEnum.Transform, + sort: 3, + type: BlockEnum.VariableAggregator, +}) const nodeDefault: NodeDefault = { - ...genNodeMetaData({ - classification: BlockClassificationEnum.Transform, - sort: 3, - type: BlockEnum.VariableAggregator, - }), + metaData, defaultValue: { output_type: VarType.any, variables: [], diff --git a/web/app/components/workflow/operator/add-block.tsx b/web/app/components/workflow/operator/add-block.tsx index 7e6a6598e4..30007fcda5 100644 --- a/web/app/components/workflow/operator/add-block.tsx +++ b/web/app/components/workflow/operator/add-block.tsx @@ -59,13 +59,12 @@ const AddBlock = ({ const nodesWithSameType = nodes.filter(node => node.data.type === type) const { defaultValue, - title, } = nodesMetaDataMap![type] const { newNode } = generateNewNode({ type: getNodeCustomTypeByNodeDataType(type), data: { ...(defaultValue as any), - title: nodesWithSameType.length > 0 ? `${title} ${nodesWithSameType.length + 1}` : title, + title: nodesWithSameType.length > 0 ? `${defaultValue.title} ${nodesWithSameType.length + 1}` : defaultValue.title, ...(toolDefaultValue || {}), _isCandidate: true, }, diff --git a/web/app/components/workflow/types.ts b/web/app/components/workflow/types.ts index 578c933ba4..e6d019e8ca 100644 --- a/web/app/components/workflow/types.ts +++ b/web/app/components/workflow/types.ts @@ -292,13 +292,15 @@ export type NodeOutPutVar = { } export type NodeDefault = { - classification: BlockClassificationEnum - sort: number - type: BlockEnum - title: string - author: string - description?: string - helpLinkUri?: string + metaData: { + classification: BlockClassificationEnum + sort: number + type: BlockEnum + title: string + author: string + description?: string + helpLinkUri?: string + } defaultValue: Partial checkValid: (payload: T, t: any, moreDataForCheckValid?: any) => { isValid: boolean; errorMessage?: string } }