fix: Placeholder field name mismatch + debug logging
All checks were successful
Deploy Development / deploy (push) Successful in 54s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s

Root Cause:
- PlaceholderPicker used q.id for signal placeholders
- Backend template context used question_type
- Placeholders never matched → empty values

Frontend PlaceholderPicker.jsx:
- Changed signal_${q.id} → signal_${q.type} (matches backend)
- Added question_${q.type} placeholders (question texts)
- New category: "Workflow - Questions"

Backend workflow_executor.py:
- Added extensive debug logging for template context
- Logs all signal_* and question_* keys + values
- Helps diagnose template rendering issues

Example:
- Question configured with type="kalorienbilanz"
- Frontend now shows: {{ node_4.signal_kalorienbilanz }}
- Frontend now shows: {{ node_4.question_kalorienbilanz }}
- Backend creates: template_context['node_4']['signal_kalorienbilanz']
- Should match and render correctly

Issue: Signal placeholders show empty values
Version: 0.9p (workflow module)
Part 3: End Node Template Engine - Field Name Fix

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Lars 2026-04-09 20:49:45 +02:00
parent 76b4b36617
commit 3e93dbbc89
2 changed files with 24 additions and 3 deletions

View File

@ -624,6 +624,17 @@ def execute_end_node(
logger.debug(f"End node {node.id}: Built template context for {len(template_context)} nodes")
# DEBUG: Log template context keys for each node
for node_id, node_ctx in template_context.items():
logger.info(f"End node template context[{node_id}]: {list(node_ctx.keys())}")
# Log signal keys specifically
signal_keys = [k for k in node_ctx.keys() if k.startswith('signal_')]
question_keys = [k for k in node_ctx.keys() if k.startswith('question_')]
if signal_keys:
logger.info(f" Signals: {signal_keys} → values: {[(k, node_ctx[k]) for k in signal_keys]}")
if question_keys:
logger.info(f" Questions: {question_keys} → values: {[(k, node_ctx[k]) for k in question_keys]}")
# Render template
try:
jinja_template = Template(node.template)

View File

@ -372,17 +372,27 @@ function extractWorkflowPlaceholders(nodes) {
})
}
// Signals für Analysis Nodes mit Fragen
// Signals und Fragen für Analysis Nodes
if (node.type === 'analysis' && node.data.questions && node.data.questions.length > 0) {
node.data.questions.forEach((q, qIdx) => {
const questionId = q.id || `q${qIdx + 1}`
const questionType = q.type || `q${qIdx + 1}`
const questionText = q.question || `Frage ${qIdx + 1}`
// Signal-Platzhalter (Antwort)
placeholders.push({
placeholder: `{{ ${nodeId}.signal_${questionId} }}`,
placeholder: `{{ ${nodeId}.signal_${questionType} }}`,
description: `${nodeLabel} - Signal: ${questionText.substring(0, 50)}${questionText.length > 50 ? '...' : ''}`,
icon: '📊',
category: 'Workflow - Signals'
})
// Frage-Text-Platzhalter
placeholders.push({
placeholder: `{{ ${nodeId}.question_${questionType} }}`,
description: `${nodeLabel} - Frage-Text: ${questionText.substring(0, 50)}${questionText.length > 50 ? '...' : ''}`,
icon: '❓',
category: 'Workflow - Questions'
})
})
}
})