fix: workflow loop node break conditions (#15549)

This commit is contained in:
zxhlyh 2025-03-12 10:10:51 +08:00 committed by GitHub
parent eb9b256ee8
commit b541792465
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 6 additions and 4 deletions

View File

@ -28,9 +28,6 @@ const nodeDefault: NodeDefault<LoopNodeType> = {
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`) })

View File

@ -55,6 +55,7 @@ const Panel: FC<NodePanelProps<LoopNodeType>> = ({
<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}

View File

@ -17,12 +17,14 @@ import { getOperators } from './utils'
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)
@ -35,7 +37,7 @@ const useConfig = (id: string, payload: LoopNodeType) => {
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`

View File

@ -673,6 +673,7 @@ const translation = {
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',

View File

@ -674,6 +674,7 @@ const translation = {
loop_other: '{{count}} 个循环', loop_other: '{{count}} 个循环',
currentLoop: '当前循环', currentLoop: '当前循环',
breakCondition: '循环终止条件', breakCondition: '循环终止条件',
breakConditionTip: '支持引用终止条件循环内的变量和会话变量。',
loopMaxCount: '最大循环次数', loopMaxCount: '最大循环次数',
loopMaxCountError: '请输入正确的 最大循环次数,范围为 1 到 {{maxCount}}', loopMaxCountError: '请输入正确的 最大循环次数,范围为 1 到 {{maxCount}}',
errorResponseMethod: '错误响应方法', errorResponseMethod: '错误响应方法',