| checkValid(payload: LoopNodeType, t: any) { | checkValid(payload: LoopNodeType, t: any) { | ||||
| let errorMessages = '' | let errorMessages = '' | ||||
| if (!errorMessages && (!payload.break_conditions || payload.break_conditions.length === 0)) | |||||
| errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.loop.breakCondition') }) | |||||
| payload.break_conditions!.forEach((condition) => { | payload.break_conditions!.forEach((condition) => { | ||||
| if (!errorMessages && (!condition.variable_selector || condition.variable_selector.length === 0)) | if (!errorMessages && (!condition.variable_selector || condition.variable_selector.length === 0)) | ||||
| errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) }) | errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) }) |
| <div> | <div> | ||||
| <Field | <Field | ||||
| title={<div className='pl-3'>{t(`${i18nPrefix}.breakCondition`)}</div>} | title={<div className='pl-3'>{t(`${i18nPrefix}.breakCondition`)}</div>} | ||||
| tooltip={t(`${i18nPrefix}.breakConditionTip`)} | |||||
| > | > | ||||
| <ConditionWrap | <ConditionWrap | ||||
| nodeId={id} | nodeId={id} |
| import { LogicalOperator } from './types' | import { LogicalOperator } from './types' | ||||
| import type { HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, LoopNodeType } from './types' | import type { HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, LoopNodeType } from './types' | ||||
| import useIsVarFileAttribute from './use-is-var-file-attribute' | import useIsVarFileAttribute from './use-is-var-file-attribute' | ||||
| import { useStore } from '@/app/components/workflow/store' | |||||
| const DELIMITER = '@@@@@' | const DELIMITER = '@@@@@' | ||||
| const useConfig = (id: string, payload: LoopNodeType) => { | const useConfig = (id: string, payload: LoopNodeType) => { | ||||
| const { nodesReadOnly: readOnly } = useNodesReadOnly() | const { nodesReadOnly: readOnly } = useNodesReadOnly() | ||||
| const { isNodeInLoop } = useIsNodeInLoop(id) | const { isNodeInLoop } = useIsNodeInLoop(id) | ||||
| const isChatMode = useIsChatMode() | const isChatMode = useIsChatMode() | ||||
| const conversationVariables = useStore(s => s.conversationVariables) | |||||
| const { inputs, setInputs } = useNodeCrud<LoopNodeType>(id, payload) | const { inputs, setInputs } = useNodeCrud<LoopNodeType>(id, payload) | ||||
| const beforeNodes = getBeforeNodesInSameBranch(id) | const beforeNodes = getBeforeNodesInSameBranch(id) | ||||
| const loopChildrenNodes = getLoopNodeChildren(id) | const loopChildrenNodes = getLoopNodeChildren(id) | ||||
| const canChooseVarNodes = [...beforeNodes, ...loopChildrenNodes] | const canChooseVarNodes = [...beforeNodes, ...loopChildrenNodes] | ||||
| const childrenNodeVars = toNodeOutputVars(loopChildrenNodes, isChatMode) | |||||
| const childrenNodeVars = toNodeOutputVars(loopChildrenNodes, isChatMode, undefined, [], conversationVariables) | |||||
| // single run | // single run | ||||
| const loopInputKey = `${id}.input_selector` | const loopInputKey = `${id}.input_selector` |
| loop_other: '{{count}} Loops', | loop_other: '{{count}} Loops', | ||||
| currentLoop: 'Current Loop', | currentLoop: 'Current Loop', | ||||
| breakCondition: 'Loop Termination Condition', | breakCondition: 'Loop Termination Condition', | ||||
| breakConditionTip: 'Only variables within loops with termination conditions and conversation variables can be referenced.', | |||||
| loopMaxCount: 'Maximum Loop Count', | loopMaxCount: 'Maximum Loop Count', | ||||
| loopMaxCountError: 'Please enter a valid maximum loop count, ranging from 1 to {{maxCount}}', | loopMaxCountError: 'Please enter a valid maximum loop count, ranging from 1 to {{maxCount}}', | ||||
| errorResponseMethod: 'Error Response Method', | errorResponseMethod: 'Error Response Method', |
| loop_other: '{{count}} 个循环', | loop_other: '{{count}} 个循环', | ||||
| currentLoop: '当前循环', | currentLoop: '当前循环', | ||||
| breakCondition: '循环终止条件', | breakCondition: '循环终止条件', | ||||
| breakConditionTip: '支持引用终止条件循环内的变量和会话变量。', | |||||
| loopMaxCount: '最大循环次数', | loopMaxCount: '最大循环次数', | ||||
| loopMaxCountError: '请输入正确的 最大循环次数,范围为 1 到 {{maxCount}}', | loopMaxCountError: '请输入正确的 最大循环次数,范围为 1 到 {{maxCount}}', | ||||
| errorResponseMethod: '错误响应方法', | errorResponseMethod: '错误响应方法', |