fix: Support both Logic-Node condition serialization formats
All checks were successful
Deploy Development / deploy (push) Successful in 54s
Build Test / pytest-backend (push) Successful in 5s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 16s

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 <noreply@anthropic.com>
This commit is contained in:
Lars 2026-04-13 08:26:43 +02:00
parent 60f6cf3c6d
commit e915d3fb13

View File

@ -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