278 lines
9.2 KiB
Python
Executable File
278 lines
9.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Script pour générer des tâches de démonstration dans RPA Vision V2.
|
|
Crée des tâches fictives avec embeddings pour tester le système de suggestions.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import numpy as np
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
# Ajouter le chemin vers geniusia2
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'geniusia2'))
|
|
|
|
from core.logger import Logger
|
|
from core.embeddings_manager import EmbeddingsManager
|
|
from core.learning_manager import LearningManager
|
|
from core.config import get_config, ensure_directories
|
|
from PIL import Image
|
|
import cv2
|
|
|
|
|
|
def creer_image_demo(texte: str, couleur=(100, 150, 200)) -> np.ndarray:
|
|
"""
|
|
Crée une image de démonstration avec du texte.
|
|
|
|
Args:
|
|
texte: Texte à afficher
|
|
couleur: Couleur de fond (BGR)
|
|
|
|
Returns:
|
|
Image numpy array
|
|
"""
|
|
# Créer une image 400x300
|
|
img = np.zeros((300, 400, 3), dtype=np.uint8)
|
|
img[:] = couleur
|
|
|
|
# Ajouter du texte
|
|
font = cv2.FONT_HERSHEY_SIMPLEX
|
|
cv2.putText(img, texte, (50, 150), font, 1, (255, 255, 255), 2, cv2.LINE_AA)
|
|
|
|
return img
|
|
|
|
|
|
def generer_taches_demo():
|
|
"""Génère des tâches de démonstration."""
|
|
|
|
print("🎨 Génération de tâches de démonstration...")
|
|
print("=" * 60)
|
|
|
|
# Initialiser les composants
|
|
print("\n1. Initialisation des composants...")
|
|
ensure_directories()
|
|
|
|
config = get_config()
|
|
logger = Logger()
|
|
embeddings_manager = EmbeddingsManager(logger=logger)
|
|
learning_manager = LearningManager(embeddings_manager, logger, config)
|
|
|
|
print(" ✓ Composants initialisés")
|
|
|
|
# Définir les tâches de démonstration
|
|
taches_demo = [
|
|
{
|
|
"nom": "Ouvrir Calculatrice",
|
|
"description": "Ouvre l'application calculatrice",
|
|
"actions": [
|
|
{"type": "key_press", "key": "super", "texte": "Menu"},
|
|
{"type": "key_press", "key": "c", "texte": "Calc"},
|
|
{"type": "key_press", "key": "enter", "texte": "Enter"}
|
|
],
|
|
"couleur": (100, 150, 200)
|
|
},
|
|
{
|
|
"nom": "Calcul Simple",
|
|
"description": "Effectue un calcul simple (2+2)",
|
|
"actions": [
|
|
{"type": "mouse_click", "x": 150, "y": 200, "texte": "Bouton 2"},
|
|
{"type": "mouse_click", "x": 200, "y": 250, "texte": "Bouton +"},
|
|
{"type": "mouse_click", "x": 150, "y": 200, "texte": "Bouton 2"},
|
|
{"type": "mouse_click", "x": 250, "y": 250, "texte": "Bouton ="}
|
|
],
|
|
"couleur": (150, 100, 200)
|
|
},
|
|
{
|
|
"nom": "Ouvrir Navigateur",
|
|
"description": "Ouvre le navigateur web",
|
|
"actions": [
|
|
{"type": "key_press", "key": "super", "texte": "Menu"},
|
|
{"type": "key_press", "key": "f", "texte": "Firefox"},
|
|
{"type": "key_press", "key": "enter", "texte": "Enter"}
|
|
],
|
|
"couleur": (200, 150, 100)
|
|
},
|
|
{
|
|
"nom": "Recherche Google",
|
|
"description": "Effectue une recherche sur Google",
|
|
"actions": [
|
|
{"type": "mouse_click", "x": 400, "y": 100, "texte": "Barre recherche"},
|
|
{"type": "key_press", "key": "r", "texte": "RPA"},
|
|
{"type": "key_press", "key": "p", "texte": ""},
|
|
{"type": "key_press", "key": "a", "texte": ""},
|
|
{"type": "key_press", "key": "enter", "texte": "Rechercher"}
|
|
],
|
|
"couleur": (100, 200, 150)
|
|
},
|
|
{
|
|
"nom": "Fermer Fenêtre",
|
|
"description": "Ferme la fenêtre active",
|
|
"actions": [
|
|
{"type": "key_press", "key": "alt+f4", "texte": "Alt+F4"}
|
|
],
|
|
"couleur": (200, 100, 100)
|
|
}
|
|
]
|
|
|
|
print(f"\n2. Création de {len(taches_demo)} tâches de démonstration...")
|
|
|
|
taches_creees = []
|
|
|
|
for i, tache_def in enumerate(taches_demo, 1):
|
|
print(f"\n 📝 Tâche {i}/{len(taches_demo)}: {tache_def['nom']}")
|
|
|
|
# Créer les signatures pour chaque action
|
|
signatures = []
|
|
|
|
for j, action in enumerate(tache_def['actions']):
|
|
# Créer une image de démonstration
|
|
img = creer_image_demo(action['texte'], tache_def['couleur'])
|
|
|
|
# Générer l'embedding
|
|
embedding = embeddings_manager.encode_image(img)
|
|
|
|
# Créer la signature
|
|
signature = {
|
|
"action_type": action['type'],
|
|
"x": action.get('x', 0),
|
|
"y": action.get('y', 0),
|
|
"key": action.get('key', ''),
|
|
"embedding": embedding,
|
|
"screenshot": img,
|
|
"window": "Demo Window",
|
|
"timestamp": datetime.now().isoformat()
|
|
}
|
|
|
|
signatures.append(signature)
|
|
print(f" ✓ Action {j+1}: {action['type']} - {action['texte']}")
|
|
|
|
# Créer la tâche
|
|
try:
|
|
task = learning_manager.create_task_from_signatures(
|
|
signatures,
|
|
description=tache_def['nom']
|
|
)
|
|
|
|
# Marquer comme observée plusieurs fois pour permettre le rejeu
|
|
for _ in range(25): # Plus que le seuil de 20
|
|
task.observation_count += 1
|
|
|
|
# Sauvegarder (méthode privée mais accessible)
|
|
learning_manager._save_task(task)
|
|
|
|
taches_creees.append(task)
|
|
print(f" ✅ Tâche créée: {task.task_id}")
|
|
print(f" Observations: {task.observation_count}")
|
|
|
|
except Exception as e:
|
|
print(f" ❌ Erreur: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
# Sauvegarder l'index FAISS
|
|
print(f"\n3. Sauvegarde de l'index FAISS...")
|
|
try:
|
|
embeddings_manager.save_index()
|
|
print(" ✓ Index FAISS sauvegardé")
|
|
except Exception as e:
|
|
print(f" ⚠️ Erreur lors de la sauvegarde: {e}")
|
|
|
|
# Résumé
|
|
print("\n" + "=" * 60)
|
|
print("✅ GÉNÉRATION TERMINÉE")
|
|
print("=" * 60)
|
|
print(f"\n📊 Résumé:")
|
|
print(f" - Tâches créées: {len(taches_creees)}")
|
|
print(f" - Embeddings générés: {sum(len(t.signatures) for t in taches_creees)}")
|
|
print(f" - Index FAISS: {embeddings_manager.faiss_index.ntotal} embeddings")
|
|
|
|
print(f"\n💡 Prochaines étapes:")
|
|
print(f" 1. Lancez l'application: cd geniusia2 && ./run.sh")
|
|
print(f" 2. L'application devrait maintenant avoir des tâches à suggérer")
|
|
print(f" 3. Effectuez des actions similaires pour voir les suggestions")
|
|
|
|
print(f"\n📁 Fichiers créés:")
|
|
print(f" - geniusia2/data/embeddings/faiss_index.bin")
|
|
print(f" - geniusia2/data/embeddings/metadata.pkl")
|
|
print(f" - geniusia2/data/tasks/*.json")
|
|
|
|
return taches_creees
|
|
|
|
|
|
def verifier_taches():
|
|
"""Vérifie les tâches créées."""
|
|
print("\n🔍 Vérification des tâches créées...")
|
|
print("=" * 60)
|
|
|
|
try:
|
|
config = get_config()
|
|
logger = Logger()
|
|
embeddings_manager = EmbeddingsManager(logger=logger)
|
|
learning_manager = LearningManager(embeddings_manager, logger, config)
|
|
|
|
# Lister les tâches
|
|
tasks = learning_manager.get_all_tasks()
|
|
|
|
print(f"\n📋 Tâches disponibles: {len(tasks)}")
|
|
|
|
for i, task in enumerate(tasks, 1):
|
|
print(f"\n {i}. {task.task_name}")
|
|
print(f" ID: {task.task_id}")
|
|
print(f" Actions: {len(task.signatures)}")
|
|
print(f" Observations: {task.observation_count}")
|
|
print(f" Prêt pour rejeu: {'✅ Oui' if task.observation_count >= 20 else '❌ Non'}")
|
|
|
|
# Vérifier l'index FAISS
|
|
print(f"\n📊 Index FAISS:")
|
|
print(f" - Embeddings: {embeddings_manager.faiss_index.ntotal}")
|
|
print(f" - Métadonnées: {len(embeddings_manager.metadata_store)}")
|
|
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ Erreur lors de la vérification: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
|
|
def main():
|
|
"""Point d'entrée principal."""
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Génère des tâches de démonstration')
|
|
parser.add_argument(
|
|
'--verifier',
|
|
action='store_true',
|
|
help='Vérifie les tâches existantes au lieu de les créer'
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
if args.verifier:
|
|
verifier_taches()
|
|
else:
|
|
taches = generer_taches_demo()
|
|
|
|
# Vérification automatique
|
|
if taches:
|
|
print("\n")
|
|
verifier_taches()
|
|
|
|
print("\n✅ Script terminé avec succès!")
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n\n⚠️ Interruption par l'utilisateur")
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
print(f"\n❌ Erreur fatale: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|