FlowiseAI/Flowise · error · Error

Invalid Condition

Error message

Invalid Condition: ${exception}

What it means

Catch-all thrown by the Condition node's UI-grid evaluator (conditionUI branch). Any inner failure during condition evaluation — JSON.parse of the grid, customGet on a $flow/$vars path, checkCondition's type coercion, or casting messageOutput.content to string — is caught and re-thrown with the prefix 'Invalid Condition: ' plus the original exception. The wrapper preserves the root cause in its suffix, so read the appended text to find the real failure.

Solutions

  1. Read the text appended after 'Invalid Condition: ' — it names the real error (SyntaxError for JSON, TypeError for a bad cast, etc.).
  2. Validate the conditionUI JSON in a linter; confirm it is an array of {variable, operation, value, output} items.
  3. For every item.variable starting with '$', confirm the referenced nodeId still exists and produced a message in state.messages.
  4. If the upstream node emits array/object content, flatten it to a string before it reaches the comparison, or reference a $flow./$vars. scalar instead.

Example fix

// before: casts multi-part content to string, throws on .content being an array
if (checkCondition(messageOutput.content as string, item.operation, item.value)) { return item.output }

// after: normalize content to a string first
const raw = messageOutput.content
const text = typeof raw === 'string' ? raw : Array.isArray(raw) ? raw.map(p => typeof p === 'string' ? p : p?.text ?? '').join('') : String(raw ?? '')
if (checkCondition(text, item.operation, item.value)) { return item.output }
Defensive patterns

Strategy: try-catch

Validate before calling

function validateConditionGrid(conditionUI: unknown): {variable:string;operation:string;value:any;output:string}[] {
  const items = typeof conditionUI === 'string' ? JSON.parse(conditionUI) : conditionUI
  if (!Array.isArray(items)) throw new Error('conditionUI must be an array')
  return items.map((it, i) => {
    if (!it || !it.variable) throw new Error(`Row ${i}: variable is required`)
    return it
  })
}

Type guard

const isConditionItem = (x: any): x is {variable:string;operation:string;value:any;output:string} =>
  !!x && typeof x === 'object' && typeof x.variable === 'string' && typeof x.operation === 'string'

Try / catch

try {
  // evaluate condition grid
} catch (e) {
  // unwrap the 'Invalid Condition: <inner>' prefix to inspect the real cause
  const inner = String(e?.message ?? e).replace(/^Invalid Condition:\s*/, '')
  logger.error({ inner }, 'condition evaluation failed')
  throw e
}

Prevention

When it happens

Trigger: The conditionUI value is a non-empty string that fails JSON.parse; a grid item.variable is undefined (caught by the explicit 'Condition variable is required!' check, then re-wrapped); a $nodeId reference points to a node that emitted no message so messageOutput is undefined and later coerced; checkCondition receives a content value that is an array/object (multi-part LLM content) cast with `as string`; an unsupported operation string reaches the switch in checkCondition.

Common situations: Editing the condition grid in the UI then deploying untested; renaming or deleting an upstream sequential node so a $nodeId reference dangles; an upstream LLM returning multimodal/array content that is no longer a plain string; hand-editing the exported chatflow JSON and corrupting the conditionUI array.

Related errors


AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12). Data as JSON: /api/errors/2080c791283f57e2. Report an issue: GitHub.

Appendix: source

Thrown at packages/components/nodes/sequentialagents/ConditionAgent/ConditionAgent.ts:595

                    }
                } else if (item.variable.startsWith('$')) {
                    const nodeId = item.variable.replace('$', '')

                    const messageOutputs = ((state.messages as unknown as BaseMessage[]) ?? []).filter(
                        (message) => message.additional_kwargs && message.additional_kwargs?.nodeId === nodeId
                    )
                    const messageOutput = messageOutputs[messageOutputs.length - 1]

                    if (messageOutput) {
                        if (checkCondition(messageOutput.content as string, item.operation, item.value)) {
                            return item.output
                        }
                    }
                }
            }
            return 'End'
        } catch (exception) {
            throw new Error('Invalid Condition: ' + exception)
        }
    }
}

module.exports = { nodeClass: ConditionAgent_SeqAgents }

View on GitHub (pinned to abe4a8601a)