274 lines
9.1 KiB
Python
Executable File
274 lines
9.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Test de la suggestion de workflows dans le Mode Assisté
|
|
"""
|
|
|
|
import sys
|
|
import time
|
|
import numpy as np
|
|
from pathlib import Path
|
|
from datetime import datetime, timedelta
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent / "geniusia2"))
|
|
|
|
from core.logger import Logger
|
|
from core.config import get_config
|
|
from core.event_capture import EventCapture
|
|
from core.suggestion_manager import SuggestionManager
|
|
from core.learning_manager import LearningManager
|
|
from core.embeddings_manager import EmbeddingsManager
|
|
|
|
|
|
def create_mock_learning_manager(logger, config):
|
|
"""Crée un mock du LearningManager pour les tests"""
|
|
class MockLearningManager:
|
|
def __init__(self):
|
|
self.embeddings_manager = EmbeddingsManager(logger, config)
|
|
|
|
def load_task(self, task_id):
|
|
return None
|
|
|
|
def confirm_action(self, data):
|
|
pass
|
|
|
|
return MockLearningManager()
|
|
|
|
|
|
def simulate_workflow_actions(event_capture, base_time):
|
|
"""
|
|
Simule une séquence d'actions qui correspond à un workflow
|
|
"""
|
|
actions = [
|
|
{
|
|
"action_type": "click",
|
|
"position": (100, 50),
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=0)).isoformat(),
|
|
"description": "Clic sur lanceur"
|
|
},
|
|
{
|
|
"action_type": "type",
|
|
"text": "office",
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=2)).isoformat(),
|
|
"description": "Tape 'office'"
|
|
},
|
|
{
|
|
"action_type": "click",
|
|
"position": (150, 100),
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=4)).isoformat(),
|
|
"description": "Clic sur OnlyOffice"
|
|
}
|
|
]
|
|
|
|
for action in actions:
|
|
event_capture.capture_event(action)
|
|
|
|
return actions
|
|
|
|
|
|
def main():
|
|
print("\n" + "="*60)
|
|
print(" 🧪 TEST DE SUGGESTION DE WORKFLOWS")
|
|
print("="*60 + "\n")
|
|
|
|
# Initialiser les composants
|
|
config = get_config()
|
|
logger = Logger()
|
|
|
|
# EventCapture avec workflows
|
|
event_capture = EventCapture(
|
|
logger=logger,
|
|
pattern_threshold=3,
|
|
max_history=1000,
|
|
config=config
|
|
)
|
|
|
|
# Mock du LearningManager
|
|
learning_manager = create_mock_learning_manager(logger, config)
|
|
|
|
# SuggestionManager
|
|
suggestion_manager = SuggestionManager(
|
|
learning_manager=learning_manager,
|
|
embeddings_manager=learning_manager.embeddings_manager,
|
|
logger=logger,
|
|
config=config
|
|
)
|
|
|
|
# Callback pour les suggestions
|
|
suggestions_created = []
|
|
|
|
def on_suggestion_created(suggestion):
|
|
suggestions_created.append(suggestion)
|
|
print(f"\n🎉 SUGGESTION CRÉÉE !")
|
|
print(f" Type: {suggestion.get('type', 'unknown')}")
|
|
|
|
if suggestion.get('type') == 'workflow':
|
|
print(f" Workflow: {suggestion['workflow_name']}")
|
|
print(f" Étape: {suggestion['current_step']}/{suggestion['total_steps']}")
|
|
print(f" Prochaine action: {suggestion['next_action']['description']}")
|
|
print(f" Confiance: {suggestion['confidence']:.2%}")
|
|
print(f" Répétitions: {suggestion['repetitions']}x")
|
|
else:
|
|
print(f" Tâche: {suggestion.get('task_name', 'Unknown')}")
|
|
print(f" Confiance: {suggestion['confidence']:.2%}")
|
|
|
|
suggestion_manager.on_suggestion_created = on_suggestion_created
|
|
|
|
print("📋 Phase 1: Créer des workflows répétés...\n")
|
|
|
|
# Créer 3 sessions similaires pour établir un workflow
|
|
base_times = [
|
|
datetime.now() - timedelta(hours=3),
|
|
datetime.now() - timedelta(hours=2),
|
|
datetime.now() - timedelta(hours=1)
|
|
]
|
|
|
|
for i, base_time in enumerate(base_times, 1):
|
|
print(f"Session {i} - {base_time.strftime('%H:%M')}")
|
|
|
|
# Créer les actions
|
|
actions = [
|
|
{
|
|
"action_type": "click",
|
|
"position": (100, 50),
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=0)).isoformat(),
|
|
"description": "Clic sur lanceur"
|
|
},
|
|
{
|
|
"action_type": "type",
|
|
"text": "office",
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=2)).isoformat(),
|
|
"description": "Tape 'office'"
|
|
},
|
|
{
|
|
"action_type": "click",
|
|
"position": (150, 100),
|
|
"window": "Desktop",
|
|
"timestamp": (base_time + timedelta(seconds=4)).isoformat(),
|
|
"description": "Clic sur OnlyOffice"
|
|
},
|
|
{
|
|
"action_type": "click",
|
|
"position": (200, 150),
|
|
"window": "OnlyOffice",
|
|
"timestamp": (base_time + timedelta(seconds=8)).isoformat(),
|
|
"description": "Nouveau document"
|
|
},
|
|
{
|
|
"action_type": "type",
|
|
"text": "Bonjour",
|
|
"window": "OnlyOffice",
|
|
"timestamp": (base_time + timedelta(seconds=10)).isoformat(),
|
|
"description": "Tape du texte"
|
|
}
|
|
]
|
|
|
|
# Ajouter les actions
|
|
for action in actions:
|
|
event_capture.session_manager.add_action(action)
|
|
|
|
# Finaliser la session
|
|
event_capture.session_manager.force_finalize_session()
|
|
|
|
print(f" ✅ {len(actions)} actions ajoutées")
|
|
|
|
# Analyser pour détecter des workflows
|
|
print(f"\n🔍 Analyse des sessions pour détecter des workflows...")
|
|
recent_sessions = event_capture.session_manager.get_recent_sessions(10)
|
|
event_capture.workflow_detector.analyze_sessions(recent_sessions)
|
|
|
|
# Vérifier les workflows détectés
|
|
workflows = event_capture.get_workflows()
|
|
print(f"\n📊 Workflows détectés: {len(workflows)}")
|
|
|
|
if workflows:
|
|
for workflow in workflows:
|
|
print(f" - {workflow.name} ({workflow.repetitions}x, {workflow.confidence:.2%})")
|
|
print(f" Étapes: {len(workflow.steps)}")
|
|
else:
|
|
print(" ❌ Aucun workflow détecté")
|
|
print("\n⚠️ Le test ne peut pas continuer sans workflows")
|
|
return
|
|
|
|
print(f"\n📋 Phase 2: Simuler le début d'un workflow...\n")
|
|
|
|
# Créer une nouvelle session qui commence comme le workflow
|
|
print("Début d'une nouvelle session...")
|
|
current_time = datetime.now()
|
|
|
|
# Première action du workflow
|
|
action1 = {
|
|
"action_type": "click",
|
|
"position": (100, 50),
|
|
"window": "Desktop",
|
|
"timestamp": current_time.isoformat(),
|
|
"description": "Clic sur lanceur"
|
|
}
|
|
event_capture.session_manager.add_action(action1)
|
|
print(f" ✅ Action 1: {action1['description']}")
|
|
|
|
time.sleep(0.5)
|
|
|
|
# Deuxième action du workflow
|
|
action2 = {
|
|
"action_type": "type",
|
|
"text": "office",
|
|
"window": "Desktop",
|
|
"timestamp": (current_time + timedelta(seconds=2)).isoformat(),
|
|
"description": "Tape 'office'"
|
|
}
|
|
event_capture.session_manager.add_action(action2)
|
|
print(f" ✅ Action 2: {action2['description']}")
|
|
|
|
print(f"\n🔍 Vérification de suggestion de workflow...\n")
|
|
|
|
# Créer un contexte pour la suggestion
|
|
context = {
|
|
"event_capture": event_capture,
|
|
"embedding": np.random.rand(512), # Mock embedding
|
|
"window": "Desktop",
|
|
"timestamp": datetime.now()
|
|
}
|
|
|
|
# Chercher une suggestion
|
|
suggestion = suggestion_manager.find_suggestion(context)
|
|
|
|
if suggestion:
|
|
print(f"✅ Suggestion trouvée !")
|
|
print(f" Type: {suggestion.get('type')}")
|
|
|
|
if suggestion.get('type') == 'workflow':
|
|
print(f" Workflow: {suggestion['workflow_name']}")
|
|
print(f" Étape actuelle: {suggestion['current_step']}/{suggestion['total_steps']}")
|
|
print(f" Prochaine action: {suggestion['next_action']['description']}")
|
|
print(f" Actions restantes: {suggestion['remaining_steps']}")
|
|
print(f" Confiance: {suggestion['confidence']:.2%}")
|
|
|
|
# Créer la suggestion dans le manager
|
|
suggestion_manager.create_suggestion(context)
|
|
|
|
print(f"\n📈 Statistiques:")
|
|
stats = suggestion_manager.get_stats()
|
|
print(f" Suggestion active: {stats['has_active_suggestion']}")
|
|
|
|
else:
|
|
print(f"❌ Aucune suggestion trouvée")
|
|
print(f"\n🔍 Debug:")
|
|
print(f" Workflows: {len(workflows)}")
|
|
print(f" Session courante: {event_capture.session_manager.current_session}")
|
|
if event_capture.session_manager.current_session:
|
|
print(f" Actions dans session: {event_capture.session_manager.current_session.action_count}")
|
|
|
|
print(f"\n" + "="*60)
|
|
print(f" ✅ TEST TERMINÉ")
|
|
print(f" Suggestions créées: {len(suggestions_created)}")
|
|
print(f"="*60)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|