From e915d3fb133d0fc8ee8ddc716d517575fae9eb9f Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 13 Apr 2026 08:26:43 +0200 Subject: [PATCH] fix: Support both Logic-Node condition serialization formats Logic-Nodes were timing out because UI saves condition as: {operands: [...], operator: "and"} But Backend expected: {expression: {operands: [...], operator: "and"}} This caused node.condition.expression to be None, triggering: - Logic-Node failures - Join-Node wait_all timeout - 504 Gateway Timeout Fix: Accept both formats by checking for operator/operands attributes directly on condition, falling back to condition.expression. Fixes: 504 Gateway Timeout in Training-Tiefenanalyse workflow Co-Authored-By: Claude Opus 4.6 --- backend/workflow_executor.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/backend/workflow_executor.py b/backend/workflow_executor.py index 693c7ed..f1a6638 100644 --- a/backend/workflow_executor.py +++ b/backend/workflow_executor.py @@ -398,8 +398,26 @@ def execute_logic_node( started_at = datetime.utcnow().isoformat() try: - if not node.condition or not node.condition.expression: - error_msg = f"Logic node {node.id} has no condition/expression defined" + if not node.condition: + error_msg = f"Logic node {node.id} has no condition defined" + logger.error(error_msg) + return NodeExecutionState( + node_id=node.id, + status=NodeStatus.FAILED, + error=error_msg, + started_at=started_at, + completed_at=datetime.utcnow().isoformat() + ) + + # Handle both serialization formats: + # UI format: condition = {operands: [...], operator: "and"} + # Expected format: condition = {expression: {operands: [...], operator: "and"}} + if hasattr(node.condition, 'operator') and hasattr(node.condition, 'operands'): + expression = node.condition # UI format (direct) + elif hasattr(node.condition, 'expression'): + expression = node.condition.expression # Expected format (wrapped) + else: + error_msg = f"Logic node {node.id} has invalid condition structure (missing operator/operands)" logger.error(error_msg) return NodeExecutionState( node_id=node.id, @@ -410,7 +428,7 @@ def execute_logic_node( ) # 1. Evaluiere Bedingung - result, error = evaluate_logic_expression(node.condition.expression, context) + result, error = evaluate_logic_expression(expression, context) if error: # Fehler bei Evaluation → Fallback anwenden