- 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>
381 lines
13 KiB
Python
381 lines
13 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Démonstration du système de nommage intelligent des workflows
|
|
|
|
Ce script montre comment utiliser les nouvelles fonctionnalités de nommage
|
|
intelligent et de capture enrichie de l'Agent V0.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import time
|
|
import tempfile
|
|
from datetime import datetime
|
|
|
|
# Add agent_v0 to path
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'agent_v0'))
|
|
|
|
from agent_v0.enhanced_raw_session import EnhancedRawSession
|
|
from agent_v0.workflow_namer import WorkflowNamer
|
|
from agent_v0.ui_dialogs import show_workflow_name_dialog
|
|
|
|
|
|
def demo_basic_naming():
|
|
"""Démonstration du nommage de base"""
|
|
print("=== Démonstration du Nommage de Base ===")
|
|
|
|
namer = WorkflowNamer()
|
|
|
|
# Créer une session de test
|
|
session = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
user_label="Utilisateur Démo",
|
|
workflow_name="Session_Demo"
|
|
)
|
|
|
|
# Simuler des interactions avec un CRM
|
|
print("Simulation d'interactions CRM...")
|
|
|
|
# Clic sur un bouton "Nouveau Client"
|
|
session.add_enhanced_mouse_click_event(
|
|
button="left",
|
|
pos=[150, 100],
|
|
window_title="CRM Pro - Gestion Clients",
|
|
app_name="CRM_Pro",
|
|
screenshot_id="shot_001",
|
|
element_type="button",
|
|
element_text="Nouveau Client",
|
|
confidence=0.95
|
|
)
|
|
|
|
# Saisie du nom du client
|
|
session.add_enhanced_key_event(
|
|
keys=["Jean", "space", "Dupont"],
|
|
window_title="CRM Pro - Nouveau Client",
|
|
app_name="CRM_Pro",
|
|
screenshot_id="shot_002",
|
|
text_content="Jean Dupont",
|
|
input_method="typing",
|
|
confidence=0.9
|
|
)
|
|
|
|
# Saisie de l'email
|
|
session.add_enhanced_key_event(
|
|
keys=["jean.dupont@email.com"],
|
|
window_title="CRM Pro - Nouveau Client",
|
|
app_name="CRM_Pro",
|
|
screenshot_id="shot_003",
|
|
text_content="jean.dupont@email.com",
|
|
input_method="typing",
|
|
confidence=0.9
|
|
)
|
|
|
|
# Clic sur "Sauvegarder"
|
|
session.add_enhanced_mouse_click_event(
|
|
button="left",
|
|
pos=[200, 400],
|
|
window_title="CRM Pro - Nouveau Client",
|
|
app_name="CRM_Pro",
|
|
screenshot_id="shot_004",
|
|
element_type="button",
|
|
element_text="Sauvegarder",
|
|
confidence=0.95
|
|
)
|
|
|
|
# Générer un nom intelligent
|
|
print("Génération du nom intelligent...")
|
|
intelligent_name = session.generate_intelligent_name()
|
|
print(f"Nom généré : {intelligent_name}")
|
|
|
|
# Analyser la session
|
|
analysis = session.analyze_session()
|
|
print(f"Type de workflow : {analysis.workflow_type}")
|
|
print(f"Application principale : {analysis.primary_application}")
|
|
print(f"Score de complexité : {analysis.complexity_score:.2f}")
|
|
|
|
# Évaluer la qualité
|
|
quality_score = session.get_workflow_quality_score()
|
|
suggestions = session.get_workflow_suggestions()
|
|
|
|
print(f"Score de qualité : {quality_score:.1%}")
|
|
print("Suggestions d'amélioration :")
|
|
for suggestion in suggestions:
|
|
print(f" • {suggestion}")
|
|
|
|
return session
|
|
|
|
|
|
def demo_different_workflow_types():
|
|
"""Démonstration de différents types de workflows"""
|
|
print("\n=== Démonstration des Types de Workflows ===")
|
|
|
|
workflows = []
|
|
|
|
# 1. Workflow de connexion
|
|
print("\n1. Workflow de Connexion")
|
|
login_session = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="Demo_Login"
|
|
)
|
|
|
|
login_session.add_enhanced_mouse_click_event(
|
|
button="left", pos=[100, 200],
|
|
window_title="Gmail - Sign In", app_name="Chrome",
|
|
screenshot_id="login_001", element_type="input",
|
|
element_text="Email", confidence=0.9
|
|
)
|
|
|
|
login_session.add_enhanced_key_event(
|
|
keys=["user@example.com"], window_title="Gmail - Sign In",
|
|
app_name="Chrome", screenshot_id="login_002",
|
|
text_content="user@example.com", input_method="typing"
|
|
)
|
|
|
|
login_session.add_enhanced_mouse_click_event(
|
|
button="left", pos=[100, 250],
|
|
window_title="Gmail - Sign In", app_name="Chrome",
|
|
screenshot_id="login_003", element_type="input",
|
|
element_text="Password", confidence=0.9
|
|
)
|
|
|
|
login_name = login_session.generate_intelligent_name()
|
|
print(f"Nom généré : {login_name}")
|
|
workflows.append(("Connexion", login_session))
|
|
|
|
# 2. Workflow de navigation
|
|
print("\n2. Workflow de Navigation")
|
|
nav_session = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="Demo_Navigation"
|
|
)
|
|
|
|
# Plusieurs clics de navigation
|
|
for i, section in enumerate(["Dashboard", "Reports", "Settings", "Profile"]):
|
|
nav_session.add_enhanced_mouse_click_event(
|
|
button="left", pos=[50 + i*100, 50],
|
|
window_title=f"App - {section}", app_name="WebApp",
|
|
screenshot_id=f"nav_{i:03d}", element_type="link",
|
|
element_text=section, confidence=0.8
|
|
)
|
|
|
|
nav_name = nav_session.generate_intelligent_name()
|
|
print(f"Nom généré : {nav_name}")
|
|
workflows.append(("Navigation", nav_session))
|
|
|
|
# 3. Workflow de recherche
|
|
print("\n3. Workflow de Recherche")
|
|
search_session = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="Demo_Search"
|
|
)
|
|
|
|
search_session.add_enhanced_mouse_click_event(
|
|
button="left", pos=[300, 50],
|
|
window_title="Google", app_name="Chrome",
|
|
screenshot_id="search_001", element_type="input",
|
|
element_text="Search", confidence=0.9
|
|
)
|
|
|
|
search_session.add_enhanced_key_event(
|
|
keys=["Python", "space", "tutorial"],
|
|
window_title="Google", app_name="Chrome",
|
|
screenshot_id="search_002", text_content="Python tutorial",
|
|
input_method="typing"
|
|
)
|
|
|
|
search_name = search_session.generate_intelligent_name()
|
|
print(f"Nom généré : {search_name}")
|
|
workflows.append(("Recherche", search_session))
|
|
|
|
return workflows
|
|
|
|
|
|
def demo_quality_assessment():
|
|
"""Démonstration de l'évaluation de qualité"""
|
|
print("\n=== Démonstration de l'Évaluation de Qualité ===")
|
|
|
|
# Workflow de haute qualité
|
|
print("\n1. Workflow de Haute Qualité")
|
|
high_quality = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="High_Quality_Demo"
|
|
)
|
|
|
|
# Nombreuses interactions variées
|
|
for i in range(5):
|
|
high_quality.add_enhanced_mouse_click_event(
|
|
button="left", pos=[100 + i*50, 100 + i*30],
|
|
window_title="Complex App - Form", app_name="ComplexApp",
|
|
screenshot_id=f"hq_{i:03d}", element_type="input",
|
|
element_text=f"Field {i+1}", confidence=0.9
|
|
)
|
|
|
|
high_quality.add_enhanced_key_event(
|
|
keys=[f"Value_{i+1}"], window_title="Complex App - Form",
|
|
app_name="ComplexApp", screenshot_id=f"hq_key_{i:03d}",
|
|
text_content=f"Value_{i+1}", input_method="typing"
|
|
)
|
|
|
|
hq_score = high_quality.get_workflow_quality_score()
|
|
hq_suggestions = high_quality.get_workflow_suggestions()
|
|
|
|
print(f"Score de qualité : {hq_score:.1%}")
|
|
print("Suggestions :")
|
|
for suggestion in hq_suggestions:
|
|
print(f" • {suggestion}")
|
|
|
|
# Workflow de basse qualité
|
|
print("\n2. Workflow de Basse Qualité")
|
|
low_quality = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="Low_Quality_Demo"
|
|
)
|
|
|
|
# Une seule interaction simple
|
|
low_quality.add_enhanced_mouse_click_event(
|
|
button="left", pos=[100, 100],
|
|
window_title="Simple App", app_name="SimpleApp",
|
|
screenshot_id="lq_001", element_type="button",
|
|
element_text="Click", confidence=0.5
|
|
)
|
|
|
|
lq_score = low_quality.get_workflow_quality_score()
|
|
lq_suggestions = low_quality.get_workflow_suggestions()
|
|
|
|
print(f"Score de qualité : {lq_score:.1%}")
|
|
print("Suggestions :")
|
|
for suggestion in lq_suggestions:
|
|
print(f" • {suggestion}")
|
|
|
|
|
|
def demo_serialization():
|
|
"""Démonstration de la sérialisation enrichie"""
|
|
print("\n=== Démonstration de la Sérialisation ===")
|
|
|
|
session = EnhancedRawSession.create_enhanced(
|
|
user_id="demo_user",
|
|
workflow_name="Serialization_Demo"
|
|
)
|
|
|
|
# Ajouter quelques événements
|
|
session.add_enhanced_mouse_click_event(
|
|
button="left", pos=[100, 200],
|
|
window_title="Test App", app_name="TestApp",
|
|
screenshot_id="ser_001", element_type="button",
|
|
element_text="Test Button", confidence=0.9
|
|
)
|
|
|
|
# Fermer avec analyse
|
|
session.close_with_analysis()
|
|
|
|
# Sauvegarder dans un dossier temporaire
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
json_path = session.save_enhanced_json(temp_dir)
|
|
print(f"Session sauvegardée : {json_path}")
|
|
|
|
# Lire et afficher le contenu
|
|
import json
|
|
with open(json_path, 'r', encoding='utf-8') as f:
|
|
data = json.load(f)
|
|
|
|
print(f"Clés principales : {list(data.keys())}")
|
|
|
|
if 'workflow_metadata' in data:
|
|
metadata = data['workflow_metadata']
|
|
print(f"Nom du workflow : {metadata.get('workflow_name')}")
|
|
print(f"Type : {metadata.get('workflow_type')}")
|
|
print(f"Application : {metadata.get('primary_application')}")
|
|
print(f"Score de complexité : {metadata.get('complexity_score', 0):.2f}")
|
|
|
|
print(f"Nombre d'événements : {len(data.get('events', []))}")
|
|
print(f"Nombre d'événements enrichis : {len(data.get('enhanced_events', []))}")
|
|
print(f"Score de qualité : {data.get('quality_score', 0):.1%}")
|
|
|
|
|
|
def demo_ui_integration():
|
|
"""Démonstration de l'intégration UI (si Qt disponible)"""
|
|
print("\n=== Démonstration de l'Intégration UI ===")
|
|
|
|
try:
|
|
from PyQt5.QtWidgets import QApplication
|
|
|
|
# Vérifier si Qt est disponible
|
|
app = QApplication.instance()
|
|
if app is None:
|
|
app = QApplication(sys.argv)
|
|
app.setQuitOnLastWindowClosed(False)
|
|
|
|
print("Qt5 disponible - démonstration des dialogues")
|
|
|
|
# Simuler des noms existants
|
|
existing_names = [
|
|
"Saisie_Client_CRM",
|
|
"Navigation_Dashboard_Admin",
|
|
"Recherche_Produits_Catalogue"
|
|
]
|
|
|
|
print("Noms existants :")
|
|
for name in existing_names:
|
|
print(f" • {name}")
|
|
|
|
print("\nPour tester le dialogue interactif, décommentez le code suivant :")
|
|
print("# result = show_workflow_name_dialog('Nouveau_Workflow_Demo', existing_names)")
|
|
print("# print(f'Nom sélectionné : {result}')")
|
|
|
|
# Démonstration non-interactive
|
|
# result = show_workflow_name_dialog("Nouveau_Workflow_Demo", existing_names)
|
|
# print(f"Nom sélectionné : {result}")
|
|
|
|
except ImportError:
|
|
print("Qt5 non disponible - utilisation des fallbacks")
|
|
print("Les dialogues utiliseront des interfaces texte simplifiées")
|
|
|
|
|
|
def main():
|
|
"""Fonction principale de démonstration"""
|
|
print("Démonstration du Système de Nommage Intelligent des Workflows")
|
|
print("=" * 70)
|
|
|
|
try:
|
|
# Démonstrations principales
|
|
session = demo_basic_naming()
|
|
workflows = demo_different_workflow_types()
|
|
demo_quality_assessment()
|
|
demo_serialization()
|
|
demo_ui_integration()
|
|
|
|
# Résumé final
|
|
print("\n" + "=" * 70)
|
|
print("Résumé de la Démonstration")
|
|
print("=" * 70)
|
|
|
|
print(f"✓ Session de base créée : {session.session_id}")
|
|
print(f"✓ {len(workflows)} types de workflows démontrés")
|
|
print("✓ Évaluation de qualité testée")
|
|
print("✓ Sérialisation enrichie validée")
|
|
print("✓ Intégration UI vérifiée")
|
|
|
|
print("\nFonctionnalités démontrées :")
|
|
print(" • Génération automatique de noms intelligents")
|
|
print(" • Détection de types de workflows")
|
|
print(" • Analyse de qualité avec suggestions")
|
|
print(" • Sérialisation enrichie avec métadonnées")
|
|
print(" • Compatibilité avec l'interface utilisateur")
|
|
|
|
print("\nPour utiliser le système :")
|
|
print(" 1. Remplacez TrayApp par EnhancedTrayApp")
|
|
print(" 2. Les dialogues de nommage s'ouvriront automatiquement")
|
|
print(" 3. Les workflows seront organisés avec des noms descriptifs")
|
|
print(" 4. Consultez le guide : agent_v0/WORKFLOW_NAMING_GUIDE.md")
|
|
|
|
return 0
|
|
|
|
except Exception as e:
|
|
print(f"Erreur lors de la démonstration : {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |