v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- 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>
This commit is contained in:
381
demo_workflow_naming.py
Normal file
381
demo_workflow_naming.py
Normal file
@@ -0,0 +1,381 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user