- 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>
157 lines
5.7 KiB
Python
157 lines
5.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test de Construction de Workflow depuis une Session Réelle
|
|
|
|
Ce script teste la construction complète d'un workflow depuis une RawSession.
|
|
Utiliser avec l'interface GUI pour capturer une vraie session.
|
|
|
|
Usage:
|
|
1. Lancer l'interface GUI: http://127.0.0.1:5000
|
|
2. Capturer une session (plusieurs actions répétées)
|
|
3. Exécuter ce script avec le chemin de la session
|
|
"""
|
|
|
|
import sys
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
# Ajouter le répertoire parent au path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from core.graph.graph_builder import GraphBuilder
|
|
from core.models.raw_session import RawSession
|
|
from core.embedding.faiss_manager import FAISSManager
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def test_workflow_construction(session_path: str):
|
|
"""
|
|
Tester la construction d'un workflow depuis une session.
|
|
|
|
Args:
|
|
session_path: Chemin vers le fichier JSON de la session
|
|
"""
|
|
logger.info("=" * 70)
|
|
logger.info("TEST CONSTRUCTION DE WORKFLOW")
|
|
logger.info("=" * 70)
|
|
|
|
# Étape 1: Charger la session
|
|
logger.info(f"\n[1/5] Chargement de la session: {session_path}")
|
|
try:
|
|
session = RawSession.load(session_path)
|
|
logger.info(f"✓ Session chargée: {session.session_id}")
|
|
logger.info(f" - Screenshots: {len(session.screenshots)}")
|
|
logger.info(f" - Événements: {len(session.events) if hasattr(session, 'events') else 0}")
|
|
except Exception as e:
|
|
logger.error(f"✗ Erreur chargement session: {e}")
|
|
return False
|
|
|
|
# Étape 2: Créer le GraphBuilder
|
|
logger.info("\n[2/5] Initialisation du GraphBuilder")
|
|
try:
|
|
# Créer FAISS manager optionnel
|
|
faiss_manager = FAISSManager(dimensions=512)
|
|
|
|
builder = GraphBuilder(
|
|
faiss_manager=faiss_manager,
|
|
min_pattern_repetitions=2, # Bas pour les tests
|
|
clustering_eps=0.15
|
|
)
|
|
logger.info("✓ GraphBuilder initialisé")
|
|
except Exception as e:
|
|
logger.error(f"✗ Erreur initialisation: {e}")
|
|
return False
|
|
|
|
# Étape 3: Construire le workflow
|
|
logger.info("\n[3/5] Construction du workflow")
|
|
try:
|
|
workflow = builder.build_from_session(
|
|
session,
|
|
workflow_name="Test Workflow"
|
|
)
|
|
logger.info(f"✓ Workflow construit: {workflow.workflow_id}")
|
|
logger.info(f" - Nodes: {len(workflow.nodes)}")
|
|
logger.info(f" - Edges: {len(workflow.edges)}")
|
|
except Exception as e:
|
|
logger.error(f"✗ Erreur construction: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
# Étape 4: Analyser les nodes
|
|
logger.info("\n[4/5] Analyse des nodes")
|
|
for node in workflow.nodes:
|
|
logger.info(f" Node {node.node_id}:")
|
|
logger.info(f" - Name: {node.name}")
|
|
logger.info(f" - Observations: {node.observation_count}")
|
|
logger.info(f" - Similarity threshold: {node.template.embedding.min_cosine_similarity}")
|
|
|
|
# Étape 5: Analyser les edges
|
|
logger.info("\n[5/5] Analyse des edges")
|
|
for edge in workflow.edges:
|
|
logger.info(f" Edge {edge.edge_id}:")
|
|
logger.info(f" - From: {edge.from_node_id} → To: {edge.to_node_id}")
|
|
logger.info(f" - Action: {edge.action.type}")
|
|
logger.info(f" - Target: {edge.action.target.role}")
|
|
logger.info(f" - Observations: {edge.observation_count}")
|
|
|
|
# Résumé
|
|
logger.info("\n" + "=" * 70)
|
|
logger.info("✓ TEST RÉUSSI")
|
|
logger.info("=" * 70)
|
|
logger.info(f"Workflow: {len(workflow.nodes)} nodes, {len(workflow.edges)} edges")
|
|
logger.info(f"FAISS index: {faiss_manager.index.ntotal} vectors")
|
|
|
|
return True
|
|
|
|
|
|
def main():
|
|
"""Point d'entrée principal."""
|
|
# Chemin par défaut vers le dossier de sessions
|
|
default_session_dir = Path(__file__).parent.parent / "data" / "sessions"
|
|
|
|
# Chercher la session la plus récente
|
|
if len(sys.argv) < 2:
|
|
# Utiliser la session la plus récente dans data/sessions/
|
|
if default_session_dir.exists():
|
|
session_files = sorted(default_session_dir.glob("*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
|
|
if session_files:
|
|
session_path = str(session_files[0])
|
|
logger.info(f"Utilisation de la session la plus récente: {session_path}")
|
|
else:
|
|
logger.error(f"Aucune session trouvée dans {default_session_dir}")
|
|
print("\nPour capturer une session:")
|
|
print(" 1. Lancer l'interface GUI: http://127.0.0.1:5000")
|
|
print(" 2. Effectuer plusieurs actions répétées")
|
|
print(" 3. Sauvegarder la session dans data/sessions/")
|
|
print(" 4. Relancer ce script")
|
|
sys.exit(1)
|
|
else:
|
|
logger.error(f"Dossier non trouvé: {default_session_dir}")
|
|
default_session_dir.mkdir(parents=True, exist_ok=True)
|
|
logger.info(f"Dossier créé: {default_session_dir}")
|
|
print("\nPour capturer une session:")
|
|
print(" 1. Lancer l'interface GUI: http://127.0.0.1:5000")
|
|
print(" 2. Effectuer plusieurs actions répétées")
|
|
print(" 3. Sauvegarder la session dans data/sessions/")
|
|
print(" 4. Relancer ce script")
|
|
sys.exit(1)
|
|
else:
|
|
session_path = sys.argv[1]
|
|
|
|
if not Path(session_path).exists():
|
|
logger.error(f"Fichier non trouvé: {session_path}")
|
|
sys.exit(1)
|
|
|
|
success = test_workflow_construction(session_path)
|
|
sys.exit(0 if success else 1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|