Files
rpa_vision_v3/examples/capture_and_test.py
Dom cf495dd82f feat: chat unifié, GestureCatalog, Copilot, Léa UI, extraction données, vérification replay
Refonte majeure du système Agent Chat et ajout de nombreux modules :

- Chat unifié : suppression du dual Workflows/Agent Libre, tout passe par /api/chat
  avec résolution en 3 niveaux (workflow → geste → "montre-moi")
- GestureCatalog : 38 raccourcis clavier universels Windows avec matching sémantique,
  substitution automatique dans les replays, et endpoint /api/gestures
- Mode Copilot : exécution pas-à-pas des workflows avec validation humaine via WebSocket
  (approve/skip/abort) avant chaque action
- Léa UI (agent_v0/lea_ui/) : interface PyQt5 pour Windows avec overlay transparent
  pour feedback visuel pendant le replay
- Data Extraction (core/extraction/) : moteur d'extraction visuelle de données
  (OCR + VLM → SQLite), avec schémas YAML et export CSV/Excel
- ReplayVerifier (agent_v0/server_v1/) : vérification post-action par comparaison
  de screenshots, avec logique de retry (max 3)
- IntentParser durci : meilleur fallback regex, type GREETING, patterns améliorés
- Dashboard : nouvelles pages gestures, streaming, extractions
- Tests : 63 tests GestureCatalog, 47 tests extraction, corrections tests existants
- Dépréciation : /api/agent/plan et /api/agent/execute retournent HTTP 410,
  suppression du code hardcodé _plan_to_replay_actions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:02:09 +01:00

235 lines
7.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script de Capture et Test Automatique
Ce script:
1. Capture l'écran pendant 1 minute (1 screenshot toutes les 2 secondes)
2. Enregistre les screenshots dans data/sessions/
3. Crée une RawSession JSON
4. Teste le GraphBuilder avec la session capturée
"""
import sys
import time
import logging
from pathlib import Path
from datetime import datetime
import json
sys.path.insert(0, str(Path(__file__).parent.parent))
# Import après ajout au path
try:
import mss
import mss.tools
except ImportError:
print("❌ Erreur: mss n'est pas installé")
print("Installation: pip install mss")
sys.exit(1)
from core.graph.graph_builder import GraphBuilder
from core.models.raw_session import RawSession, Screenshot
from core.embedding.faiss_manager import FAISSManager
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def capture_session(duration_seconds=60, interval_seconds=2):
"""
Capturer l'écran pendant une durée donnée.
Args:
duration_seconds: Durée totale de capture (défaut: 60s)
interval_seconds: Intervalle entre captures (défaut: 2s)
Returns:
Tuple (session_dir, screenshots_list)
"""
# Créer répertoire de session
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
session_id = f"session_{timestamp}"
session_dir = Path(__file__).parent.parent / "data" / "sessions" / session_id
screenshots_dir = session_dir / "screenshots"
screenshots_dir.mkdir(parents=True, exist_ok=True)
logger.info("=" * 70)
logger.info("CAPTURE DE SESSION")
logger.info("=" * 70)
logger.info(f"Session ID: {session_id}")
logger.info(f"Durée: {duration_seconds}s")
logger.info(f"Intervalle: {interval_seconds}s")
logger.info(f"Screenshots attendus: ~{duration_seconds // interval_seconds}")
logger.info(f"Répertoire: {session_dir}")
logger.info("")
logger.info("🎬 Démarrage de la capture dans 3 secondes...")
logger.info(" Effectuez des actions répétées pour créer des patterns!")
time.sleep(3)
screenshots = []
start_time = time.time()
screenshot_count = 0
with mss.mss() as sct:
while (time.time() - start_time) < duration_seconds:
# Capturer l'écran
monitor = sct.monitors[1] # Écran principal
screenshot_data = sct.grab(monitor)
# Sauvegarder
screenshot_id = f"screen_{screenshot_count:04d}"
screenshot_filename = f"{screenshot_id}.png"
screenshot_path = screenshots_dir / screenshot_filename
mss.tools.to_png(screenshot_data.rgb, screenshot_data.size, output=str(screenshot_path))
# Créer objet Screenshot
screenshot = Screenshot(
screenshot_id=screenshot_id,
relative_path=f"screenshots/{screenshot_filename}",
captured_at=datetime.now().isoformat()
)
screenshots.append(screenshot)
screenshot_count += 1
elapsed = time.time() - start_time
remaining = duration_seconds - elapsed
logger.info(f"📸 Screenshot {screenshot_count} capturé - Reste {remaining:.0f}s")
# Attendre avant prochaine capture
time.sleep(interval_seconds)
logger.info("")
logger.info(f"✅ Capture terminée: {screenshot_count} screenshots")
return session_dir, screenshots, session_id
def create_session_json(session_dir, screenshots, session_id):
"""Créer le fichier JSON de la session."""
logger.info("\n📝 Création du fichier session.json...")
session = RawSession(
session_id=session_id,
agent_version="v3.0",
environment={"os": "linux", "capture": "auto"},
user="test_user",
context={"type": "automated_capture"},
started_at=screenshots[0].captured_at if screenshots else datetime.now().isoformat()
)
session.screenshots = screenshots
# Sauvegarder JSON
session_file = session_dir / "session.json"
session.save(str(session_file))
logger.info(f"✅ Session sauvegardée: {session_file}")
return session, session_file
def test_workflow_construction(session, session_file):
"""Tester la construction du workflow."""
logger.info("\n" + "=" * 70)
logger.info("TEST CONSTRUCTION DE WORKFLOW")
logger.info("=" * 70)
# Créer GraphBuilder
logger.info("\n[1/3] Initialisation du GraphBuilder")
faiss_manager = FAISSManager(dimensions=512)
builder = GraphBuilder(
faiss_manager=faiss_manager,
min_pattern_repetitions=2, # Bas pour détecter plus facilement
clustering_eps=0.18 # Légèrement permissif
)
logger.info("✅ GraphBuilder initialisé")
# Construire workflow
logger.info("\n[2/3] Construction du workflow")
try:
workflow = builder.build_from_session(session, "Captured 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
# Analyser résultats
logger.info("\n[3/3] Analyse des résultats")
if workflow.nodes:
logger.info(f"\n📊 {len(workflow.nodes)} patterns détectés:")
for node in workflow.nodes:
obs = node.metadata.get("observation_count", "?") if node.metadata else "?"
logger.info(f"{node.node_id}: {obs} observations")
else:
logger.warning("\n⚠️ Aucun pattern détecté")
logger.info(" Conseils:")
logger.info(" - Répétez les mêmes actions plusieurs fois")
logger.info(" - Attendez 2-3 secondes entre chaque action")
logger.info(" - Utilisez des actions simples (cliquer, taper)")
if workflow.edges:
logger.info(f"\n🔗 {len(workflow.edges)} transitions détectées:")
for edge in workflow.edges:
count = edge.stats.execution_count if edge.stats else 0
logger.info(f"{edge.from_node}{edge.to_node} ({count}x)")
logger.info(f"\n💾 Index FAISS: {faiss_manager.index.ntotal} vecteurs")
logger.info(f"📁 Session: {session_file}")
# Résumé
logger.info("\n" + "=" * 70)
if workflow.nodes:
logger.info("✅ TEST RÉUSSI - Patterns détectés!")
else:
logger.info("⚠️ TEST TERMINÉ - Aucun pattern (normal si actions variées)")
logger.info("=" * 70)
return True
def main():
"""Point d'entrée principal."""
logger.info("🚀 CAPTURE ET TEST AUTOMATIQUE")
logger.info("")
# Étape 1: Capturer
session_dir, screenshots, session_id = capture_session(
duration_seconds=60, # 1 minute
interval_seconds=2 # 1 screenshot toutes les 2 secondes
)
if not screenshots:
logger.error("❌ Aucun screenshot capturé")
return False
# Étape 2: Créer session JSON
session, session_file = create_session_json(session_dir, screenshots, session_id)
# Étape 3: Tester GraphBuilder
success = test_workflow_construction(session, session_file)
return success
if __name__ == "__main__":
try:
success = main()
sys.exit(0 if success else 1)
except KeyboardInterrupt:
logger.info("\n\n⚠️ Capture interrompue par l'utilisateur")
sys.exit(1)
except Exception as e:
logger.error(f"\n❌ Erreur: {e}")
import traceback
traceback.print_exc()
sys.exit(1)