a1723db387
feat: Workflow Engine Part 3 - Inline Prompts (v0.9q)
...
Deploy Development / deploy (push) Successful in 56s
Build Test / pytest-backend (push) Failing after 4s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 17s
Ermöglicht Analysis Nodes zwischen zwei Prompt-Modi zu wählen:
- Reference Mode: Basis-Prompt aus DB referenzieren (bestehend)
- Inline Mode: Template direkt im Node editieren (NEU)
Frontend:
- InlineTemplateEditor Component (~80 Zeilen)
- Radio Buttons in WorkflowEditorPage für Mode-Auswahl
- Placeholder Picker für beide Modi (End Node + Inline Template)
- Cursor-Position Tracking mit textareaRef
- Conditional Rendering basierend auf promptSource
- Validation: Entweder prompt_slug ODER inline_template
Backend:
- load_prompt_template() akzeptiert ganzen WorkflowNode (statt nur slug)
- Unterstützt inline_template (Mode 1) und prompt_slug (Mode 2)
- WorkflowNode.inline_template Feld hinzugefügt
- Validation: HTTPException wenn weder slug noch template
Serialization:
- inline_template in graph_data speichern/laden
- Backward-compatible mit bestehenden Workflows
Version: 0.9q
Module: workflow 0.7.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:45:00 +02:00
856a82ec1d
fix: Frontend-Backend field name mismatch for workflow questions
...
Deploy Development / deploy (push) Successful in 57s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 16s
Root Cause:
- Frontend serialized as "questions"
- Backend expected "question_augmentations"
- Analysis Nodes WITH questions configured sent empty array to backend
- Questions were never added to LLM prompt
Frontend workflowSerializer.js:
- Serialization: questions → question_augmentations (Backend field name)
- Deserialization: question_augmentations → questions (Frontend data object)
- Backward compatible: Falls back to "questions" for old workflows
Backend workflow_executor.py:
- Removed incorrect load_prompt_questions() function (was a misunderstanding)
- Back to original logic: Only use node.question_augmentations
- Simplified normalization logging
Impact:
- Analysis Node questions are now correctly sent to backend
- Questions augment the base prompt as intended
- LLM receives structured questions
- Decision signals are generated and accessible as placeholders
Example:
- Node configures question with id="q21"
- Signal becomes accessible as {{ node_2.signal_q21 }}
- Can be used in Logic Nodes and End Node templates
Issue: Workflow questions not sent to LLM (field name mismatch)
Version: 0.9p (workflow module)
Part 3: End Node Template Engine - Critical Fix
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 18:28:54 +02:00
228010a6d3
feat: Part 3 - End Node Template Editor
...
Deploy Development / deploy (push) Successful in 52s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s
**Neue Features:**
- End Node Output Mode: AUTO vs. TEMPLATE
- Jinja2 Template Editor mit Syntax-Beispiel
- Placeholder Picker Modal (dynamische Node-Liste)
- Template Serialisierung/Deserialisierung
**Komponenten (NEU):**
1. EndNodeConfig.jsx (~150 Zeilen)
- Output Mode Toggle (AUTO/TEMPLATE)
- Template Textarea (monospace, 12 Zeilen)
- Placeholder-Button (öffnet Picker)
- Help-Text mit Beispiel-Syntax
- Auto-Insert Default Template beim Wechsel zu TEMPLATE
2. PlaceholderPicker.jsx (~260 Zeilen)
- Modal mit Suchfunktion
- Dynamische Placeholder-Liste aus Workflow-Nodes
- Kategorien: Global, Node Outputs, Signals
- Click-to-Insert (schließt Modal automatisch)
- Icons pro Node-Typ (🚀 🤖 ⚡ 🔀 🏁 )
**Integration:**
- WorkflowEditorPage.jsx
- EndNodeConfig im Config Panel (wenn type='end')
- PlaceholderPicker State + Modal
- handlePlaceholderSelect (fügt in Template ein)
**Serialisierung:**
- workflowSerializer.js
- Serialize: output_mode + template für End Nodes
- Deserialize: output_mode + template laden
- Fallback: auto Mode wenn nicht gesetzt
**Backend Status:**
- ✅ Backend bereits fertig (execute_end_node() in workflow_executor.py)
- ✅ Beide Modi (AUTO/TEMPLATE) funktionieren
- ✅ Jinja2 Template Rendering implementiert
**Part 3 Status:** Frontend Complete
- ✅ End Node Config UI
- ✅ Template Editor
- ✅ Placeholder Picker
- ⏸️ Testing ausstehend
**Nächster Schritt:**
Browser-Test auf dev.mitai.jinkendo.de
Version: v0.9p
Date: 2026-04-09
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 15:52:19 +02:00
2994df54ad
fix: Complete prompt_id → prompt_slug migration
...
Deploy Development / deploy (push) Successful in 47s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s
**Remaining Issues Found:**
1. Validierung prüfte noch prompt_id → Speichern blockiert
2. AnalysisNode zeigte noch prompt_id → "Kein Prompt" obwohl gesetzt
3. Deserializer hatte keinen Fallback für alte Workflows
**Fixes:**
- workflowValidation.js: Line 91
- if (!node.data.prompt_slug) statt prompt_id
- AnalysisNode.jsx: Line 15
- Verwendet jetzt data.prompt_slug
- Fallback: "Prompt: ${slug}" statt "Prompt #${id}"
- Kommentar aktualisiert (data.prompt_slug statt prompt_id)
- workflowSerializer.js: Line 81
- Fallback: node.prompt_slug || node.prompt_id || null
- Backwards-compatible für alte Workflows
**Testing:**
1. Neuen Workflow erstellen
2. Analysis Node hinzufügen
3. Prompt auswählen
4. Node sollte Prompt-Namen zeigen
5. Beim Öffnen: Dropdown sollte Wert anzeigen
6. Speichern sollte funktionieren (keine Validierungsfehler)
7. Execute sollte funktionieren (kein "Prompt not found")
Part 2 Complete Bugfix - Workflow Execution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 15:39:11 +02:00
af7c5ca55a
fix: Workflow execute - prompt_id → prompt_slug
...
Deploy Development / deploy (push) Successful in 55s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 22s
**Problem:**
Execute-Button funktionierte, aber Ausführung scheiterte mit
"Prompt not found: none" im Analysis Node.
**Root Cause:**
Mismatch zwischen Frontend (speicherte prompt_id/UUID) und
Backend (erwartete prompt_slug/String).
Backend WorkflowNode Model (workflow_models.py:193):
prompt_slug: Optional[str] = Field(...)
**Änderungen:**
- WorkflowEditorPage.jsx: Dropdown auf slug umgestellt
- value: prompt_slug statt prompt_id
- onChange: selectedPrompt.slug statt .id
- handleNodeUpdate: prompt_slug speichern
- workflowSerializer.js: Serialization/Deserialization
- Serialize: prompt_slug statt prompt_id
- Deserialize: node.prompt_slug lesen
**Testing:**
- Workflow mit Analysis Node neu erstellen
- Execute-Button sollte jetzt funktionieren
Part 2 Bugfix - Workflow Execution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 13:59:54 +02:00
cab5758b0d
fix: Save prompt_name in graph_data for readable node display
...
Deploy Development / deploy (push) Successful in 53s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 14s
Bug:
- Analysis nodes showed "Prompt #7edc6d6b-6cd5..." in canvas
- After re-selecting prompt, showed readable name "Pipeline: Ernährungs-Analyse"
- After loading workflow, showed UUID again
Root Cause:
- Serializer saved only prompt_id, not prompt_name
- Deserializer expected prompt_name but got null
- AnalysisNode fallback logic: data.prompt_name || `Prompt #{prompt_id}`
- Result: Showed UUID as fallback
Fix:
- workflowSerializer.js line 25: Added prompt_name to serialization
- Now saves both prompt_id AND prompt_name in graph_data
- On load: prompt_name is restored → AnalysisNode shows readable name
Testing:
- Create workflow with analysis node + prompt selection
- Save → Canvas should show "Pipeline: Körper-Analyse" (not UUID)
- Reload → Canvas should still show readable name (not UUID)
2026-04-04 22:50:40 +02:00
dc59596f01
feat: Phase 5 - Visual Workflow Editor (Option B)
...
Deploy Development / deploy (push) Failing after 1s
Build Test / lint-backend (push) Successful in 1s
Build Test / build-frontend (push) Successful in 14s
Backend (Mini-Backend 1-2h):
- Migration 016: ai_prompts.graph_data JSONB column
- workflow_executor: graph_data parameter support (backward-compatible)
- prompt_executor: execute_workflow_prompt uses graph_data
Frontend (Main effort 25-35h):
- WorkflowCanvas: React Flow wrapper component
- 5 Custom Nodes: Start, End, Analysis, Logic, Join
- 4 Config Panels: QuestionAugmentation, LogicExpression, Fallback, Join
- workflowValidation: Structural + logical validation
- workflowSerializer: Canvas ↔ JSONB conversion
- WorkflowEditorPage: Main orchestration (420 LOC)
- Route: /workflow-editor/:id
- CSS: workflowEditor.css (300 LOC)
Architecture:
- Option B: ai_prompts.type='workflow' (not separate table)
- panels/ subdirectory for clean separation
- WorkflowCanvas reusable component
- User GUI identical (Workflows = Prompts)
- Backward-compatible (type='pipeline' unchanged)
Version: v0.9m → v0.9n (Phase 5 complete)
Module: workflow 0.5.0 → 0.6.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 17:56:00 +02:00