- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.2 KiB
Tâche 17 Terminée : Nodes de Logique (Condition et Loop)
✅ Résumé
Les nodes de logique (Condition et Loop) sont maintenant implémentés avec support complet de la conversion vers WorkflowGraph.
📦 Fichiers Modifiés/Créés
Backend - Services
backend/services/converter.py- Extension avec support Condition/Loop
Tests
backend/test_logic_nodes.py- Tests unitaires des nodes de logique (5 tests)
🎯 Fonctionnalités Implémentées
1. Node Condition (Exigences 8.1, 8.2, 8.3, 8.5)
Configuration:
VisualNode(
type="condition",
parameters={
'expression': '${status} == "success"',
'type': 'expression'
},
output_ports=[
Port('out_true', 'True', 'output'),
Port('out_false', 'False', 'output')
]
)
Conversion:
- Détection automatique des branches true/false
- Configuration dans
workflow.conditionals - Support des expressions avec variables
- Validation de syntaxe des expressions
Exemple de configuration générée:
conditionals['condition_1'] = {
'expression': '${status} == "success"',
'true_branch': 'success_action',
'false_branch': 'failure_action',
'metadata': {...}
}
✅ Testé: Conversion avec branches true/false
2. Node Loop - Type Repeat (Exigences 9.1, 9.2, 9.3, 9.5)
Configuration:
VisualNode(
type="loop",
parameters={
'type': 'repeat',
'count': 5
},
output_ports=[
Port('out_body', 'Body', 'output'),
Port('out_exit', 'Exit', 'output')
]
)
Conversion:
- Détection du corps de la boucle
- Détection de la sortie de boucle
- Configuration dans
workflow.loops
✅ Testé: Boucle repeat avec 5 itérations
3. Node Loop - Type While (Exigences 9.1, 9.2, 9.3, 9.5)
Configuration:
VisualNode(
type="loop",
parameters={
'type': 'while',
'condition': '${counter} < 10',
'max_iterations': 100
}
)
Conversion:
- Support des conditions de boucle
- Limite de sécurité (max_iterations)
- Substitution de variables dans la condition
✅ Testé: Boucle while avec condition
4. Node Loop - Type For-Each (Exigences 9.1, 9.2, 9.3, 9.5)
Configuration:
VisualNode(
type="loop",
parameters={
'type': 'for-each',
'collection': '${items}',
'item_variable': 'current_item'
}
)
Conversion:
- Itération sur collections
- Variable d'item configurable
- Support des références de variables
✅ Testé: Boucle for-each sur collection
5. Validation des Expressions (Exigence 8.5)
Validations effectuées:
- Expression non vide
- Présence d'opérateurs de comparaison
- Parenthèses équilibrées
- Génération d'avertissements pour expressions invalides
Opérateurs supportés:
- Comparaison:
==,!=,<,>,<=,>= - Logique:
and,or,not - Appartenance:
in
Exemple:
# Expression invalide
'(${value} == "test"' # Parenthèse manquante
# Avertissement généré:
"Expression de condition potentiellement invalide:
(${value} == "test" - Parenthèses non équilibrées"
✅ Testé: Validation avec détection d'erreurs
6. Détection des Structures de Logique
Méthode _detect_logic_structures():
- Parcourt tous les nodes du workflow
- Identifie les nodes de type
conditionetloop - Configure les structures dans le WorkflowGraph
- Détecte les branches et corps de boucles
Pour les conditions:
- Trouve la branche true (via port
out_true) - Trouve la branche false (via port
out_false) - Stocke l'expression de condition
Pour les boucles:
- Trouve le corps de la boucle (via port
out_body) - Trouve la sortie de boucle (via port
out_exit) - Configure les paramètres selon le type
✅ Implémenté: Détection automatique complète
7. Gestion des Edges Conditionnels
Méthode _create_edge_constraints():
- Détecte si le node source est une condition
- Ajoute les contraintes appropriées aux edges
- Marque les branches true/false dans les pre-conditions
Exemple:
# Edge depuis un node condition
constraints.pre_conditions['condition_result'] = True # Branche true
constraints.pre_conditions['condition_result'] = False # Branche false
✅ Implémenté: Contraintes conditionnelles
📊 Résultats des Tests
Tests Unitaires (test_logic_nodes.py)
✅ Test 1: Conversion node Condition avec branches true/false
✅ Test 2: Conversion boucle repeat (5 itérations)
✅ Test 3: Conversion boucle while (avec condition)
✅ Test 4: Conversion boucle for-each (sur collection)
✅ Test 5: Validation des expressions de condition
TOUS LES TESTS RÉUSSIS! (5/5)
Couverture des Exigences
| Exigence | Description | Status |
|---|---|---|
| 8.1 | Configuration node Condition | ✅ |
| 8.2 | Edges séparés true/false | ✅ |
| 8.3 | Suivi de la branche appropriée | ✅ |
| 8.5 | Validation syntaxe expression | ✅ |
| 9.1 | Configuration node Loop (types) | ✅ |
| 9.2 | Edges pour corps et sortie | ✅ |
| 9.3 | Répétition selon paramètres | ✅ |
| 9.5 | Continuation après boucle | ✅ |
🚀 Utilisation
Créer un Workflow avec Condition
from models.visual_workflow import VisualNode, VisualEdge, Port
# Node condition
condition = VisualNode(
id="check_status",
type="condition",
parameters={'expression': '${status} == "ready"'},
output_ports=[
Port('out_true', 'True', 'output'),
Port('out_false', 'False', 'output')
]
)
# Branches
edge_true = VisualEdge(
source="check_status",
target="proceed",
source_port="out_true"
)
edge_false = VisualEdge(
source="check_status",
target="retry",
source_port="out_false"
)
Créer un Workflow avec Boucle
# Boucle repeat
loop = VisualNode(
id="repeat_action",
type="loop",
parameters={'type': 'repeat', 'count': 3},
output_ports=[
Port('out_body', 'Body', 'output'),
Port('out_exit', 'Exit', 'output')
]
)
# Corps de la boucle
edge_body = VisualEdge(
source="repeat_action",
target="action_to_repeat",
source_port="out_body"
)
# Sortie de la boucle
edge_exit = VisualEdge(
source="repeat_action",
target="after_loop",
source_port="out_exit"
)
📝 Notes Techniques
Mapping des Types
| Type Visuel | Type Action | Paramètres Spécifiques |
|---|---|---|
| condition | evaluate_condition | expression, condition_type |
| loop (repeat) | execute_loop | loop_type, count |
| loop (while) | execute_loop | loop_type, condition, max_iterations |
| loop (for-each) | execute_loop | loop_type, collection, item_variable |
Structure des Conditionals
workflow.conditionals = {
'condition_id': {
'expression': '${var} == value',
'true_branch': 'node_id_true',
'false_branch': 'node_id_false',
'metadata': {...}
}
}
Structure des Loops
workflow.loops = {
'loop_id': {
'loop_type': 'repeat|while|for-each',
'body_nodes': ['node_1', 'node_2'],
'exit_node': 'node_after_loop',
# Paramètres spécifiques au type
'count': 5, # pour repeat
'condition': '${x} < 10', # pour while
'collection': '${items}', # pour for-each
'metadata': {...}
}
}
Détection des Branches
La détection des branches se fait via :
- Nom du port source :
out_true,out_false,out_body,out_exit - Métadonnées de l'edge :
source_portcontient le nom du port - Pre-conditions :
condition_result= True/False
🎯 Prochaines Étapes
La tâche 17 est terminée. La prochaine tâche est :
- Tâche 18: Intégrer avec ExecutionLoop pour l'exécution réelle
✨ Conclusion
Les nodes de logique sont maintenant complets et robustes :
- ✅ Node Condition avec branches true/false
- ✅ Node Loop avec 3 types (repeat, while, for-each)
- ✅ Validation des expressions
- ✅ Détection automatique des structures
- ✅ Configuration dans WorkflowGraph
- ✅ Tests complets (5/5)
Le système est prêt pour l'intégration avec ExecutionLoop pour permettre l'exécution réelle des workflows avec logique conditionnelle et boucles !