- 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>
193 lines
6.2 KiB
Python
193 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Démonstration du système d'apprentissage persistant - Fiche #18
|
|
|
|
Ce script démontre le fonctionnement du système d'apprentissage persistant
|
|
"mix" (JSONL + SQLite) pour la résolution de cibles UI.
|
|
|
|
Auteur: Dom, Alice Kiro - 22 décembre 2025
|
|
"""
|
|
|
|
import sys
|
|
import logging
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
from unittest.mock import Mock
|
|
|
|
# Ajouter le répertoire racine au path
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from core.learning.target_memory_store import TargetMemoryStore, TargetFingerprint
|
|
from core.execution.target_resolver import TargetResolver
|
|
from core.execution.screen_signature import screen_signature
|
|
|
|
# Configuration du logging
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def create_mock_screen_state(window_title: str = "Test App") -> Mock:
|
|
"""Créer un mock ScreenState pour les tests"""
|
|
screen_state = Mock()
|
|
screen_state.screen_state_id = f"state_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
screen_state.timestamp = datetime.now()
|
|
|
|
# Mock window
|
|
screen_state.window = Mock()
|
|
screen_state.window.window_title = window_title
|
|
screen_state.window.screen_resolution = [1920, 1080]
|
|
|
|
# Mock perception
|
|
screen_state.perception = Mock()
|
|
screen_state.perception.detected_text = ["Login", "Password", "Submit", "Cancel"]
|
|
|
|
return screen_state
|
|
|
|
|
|
def create_mock_ui_elements() -> list:
|
|
"""Créer des éléments UI mock pour les tests"""
|
|
elements = []
|
|
|
|
# Label "Email"
|
|
email_label = Mock()
|
|
email_label.element_id = "lbl_email"
|
|
email_label.bbox = (50, 100, 80, 25)
|
|
email_label.role = "label"
|
|
email_label.label = "Email"
|
|
elements.append(email_label)
|
|
|
|
# Input email
|
|
email_input = Mock()
|
|
email_input.element_id = "input_email"
|
|
email_input.bbox = (150, 100, 200, 25)
|
|
email_input.role = "input"
|
|
email_input.type = "text_input"
|
|
email_input.label = ""
|
|
elements.append(email_input)
|
|
|
|
# Bouton Submit
|
|
submit_btn = Mock()
|
|
submit_btn.element_id = "btn_submit"
|
|
submit_btn.bbox = (150, 200, 100, 35)
|
|
submit_btn.role = "button"
|
|
submit_btn.type = "submit"
|
|
submit_btn.label = "Submit"
|
|
elements.append(submit_btn)
|
|
|
|
return elements
|
|
|
|
|
|
def create_mock_target_spec(by_role: str = None, by_text: str = None, context_hints: dict = None) -> Mock:
|
|
"""Créer un mock TargetSpec"""
|
|
spec = Mock()
|
|
spec.by_role = by_role
|
|
spec.by_text = by_text
|
|
spec.by_position = None
|
|
spec.context_hints = context_hints or {}
|
|
return spec
|
|
|
|
|
|
def demo_basic_learning():
|
|
"""Démonstration de base de l'apprentissage persistant"""
|
|
print("\n" + "="*60)
|
|
print("DÉMONSTRATION - Apprentissage persistant de base")
|
|
print("="*60)
|
|
|
|
# Initialiser le store
|
|
store = TargetMemoryStore("data/learning_demo")
|
|
|
|
# Créer des données de test
|
|
screen_state = create_mock_screen_state("Login Form")
|
|
ui_elements = create_mock_ui_elements()
|
|
|
|
# Générer signature d'écran
|
|
screen_sig = screen_signature(screen_state, ui_elements, mode="layout")
|
|
print(f"📋 Signature d'écran générée: {screen_sig[:16]}...")
|
|
|
|
# Créer un TargetSpec pour le bouton Submit
|
|
target_spec = create_mock_target_spec(
|
|
by_role="button",
|
|
by_text="Submit"
|
|
)
|
|
|
|
print(f"🎯 TargetSpec: role={target_spec.by_role}, text={target_spec.by_text}")
|
|
|
|
# Simuler plusieurs résolutions réussies
|
|
submit_element = next(e for e in ui_elements if e.element_id == "btn_submit")
|
|
fingerprint = TargetFingerprint(
|
|
element_id=submit_element.element_id,
|
|
bbox=tuple(submit_element.bbox),
|
|
role=submit_element.role,
|
|
etype=submit_element.type,
|
|
label=submit_element.label,
|
|
confidence=0.95
|
|
)
|
|
|
|
print("\n📚 Apprentissage - Enregistrement de 3 résolutions réussies...")
|
|
for i in range(3):
|
|
store.record_success(
|
|
screen_signature=screen_sig,
|
|
target_spec=target_spec,
|
|
fingerprint=fingerprint,
|
|
strategy_used="by_role",
|
|
confidence=0.90 + i * 0.03 # Confiances variables
|
|
)
|
|
print(f" ✅ Succès {i+1}/3 enregistré (confiance: {0.90 + i * 0.03:.2f})")
|
|
|
|
# Test de lookup
|
|
print("\n🔍 Test de lookup...")
|
|
result = store.lookup(screen_sig, target_spec, min_success_count=2)
|
|
|
|
if result:
|
|
print(f" ✅ Élément trouvé en mémoire!")
|
|
print(f" - Element ID: {result.element_id}")
|
|
print(f" - Role: {result.role}")
|
|
print(f" - Label: {result.label}")
|
|
print(f" - BBox: {result.bbox}")
|
|
print(f" - Confiance: {result.confidence:.3f}")
|
|
else:
|
|
print(" ❌ Aucun élément trouvé en mémoire")
|
|
|
|
# Statistiques
|
|
stats = store.get_stats()
|
|
print(f"\n📊 Statistiques:")
|
|
print(f" - Entrées totales: {stats['total_entries']}")
|
|
print(f" - Succès totaux: {stats['total_successes']}")
|
|
print(f" - Échecs totaux: {stats['total_failures']}")
|
|
print(f" - Confiance moyenne: {stats['overall_confidence']:.3f}")
|
|
print(f" - Fichiers JSONL: {stats['jsonl_files_count']}")
|
|
|
|
|
|
def main():
|
|
"""Fonction principale de démonstration"""
|
|
print("🚀 DÉMONSTRATION - Système d'apprentissage persistant RPA Vision V3")
|
|
print("Fiche #18 - Architecture 'mix' (JSONL + SQLite)")
|
|
print("Auteur: Dom, Alice Kiro - 22 décembre 2025")
|
|
|
|
try:
|
|
# Créer le répertoire de démonstration
|
|
demo_dir = Path("data/learning_demo")
|
|
demo_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Exécuter les démonstrations
|
|
demo_basic_learning()
|
|
|
|
print("\n" + "="*60)
|
|
print("✅ DÉMONSTRATION TERMINÉE AVEC SUCCÈS")
|
|
print("="*60)
|
|
print(f"📁 Données de démonstration sauvegardées dans: {demo_dir.absolute()}")
|
|
print("🔍 Vous pouvez examiner les fichiers JSONL et la base SQLite générés")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Erreur durant la démonstration: {e}", exc_info=True)
|
|
print(f"\n❌ ERREUR: {e}")
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |