""" Configuration globale pour RPA Vision V2 Contient tous les paramètres pour les modèles, seuils, performance et sécurité """ import os from pathlib import Path # Répertoire racine du projet PROJECT_ROOT = Path(__file__).parent.parent CONFIG = { # Configuration des modèles IA "models": { # Modèle de vision pour détection d'éléments UI # Options: "owl-v2", "dino", "yolo" "vision": "owl-v2", # Modèle LLM pour raisonnement visuel "llm": "gemma3:12b", # Changé de qwen3-vl:8b à gemma3:12b (pas de thinking mode) # Modèle OpenCLIP pour embeddings visuels "clip": "ViT-B-32", # Chemins des modèles "paths": { "openclip": str(PROJECT_ROOT / "models" / "openclip"), "owl_v2": str(PROJECT_ROOT / "models" / "owl_v2"), "qwen_vl": str(PROJECT_ROOT / "models" / "qwen2.5_vl"), } }, # Seuils pour transitions de mode et confiance "thresholds": { # Nombre minimum d'observations avant passage en Autopilot "autopilot_observations": 20, # Taux de concordance minimum pour passage en Autopilot (95%) "autopilot_concordance": 0.95, # Score de confiance minimum pour maintenir le mode Autopilot (90%) "confidence_min": 0.90, # Seuil de confiance pour rollback vers mode Assisté (85%) "rollback_confidence": 0.85, # Seuil de concordance pour rollback vers mode Assisté (85%) "rollback_concordance": 0.85, # Seuil de similarité d'embedding pour détection de changement UI (70%) "ui_change_threshold": 0.70, # Delta maximum en pixels avant déclenchement de ré-entraînement "max_pixel_delta": 10, }, # Pondérations pour calcul du score de confiance "confidence_weights": { "vision": 0.6, # 60% - Confiance du modèle de vision "llm": 0.3, # 30% - Score du raisonnement LLM "history": 0.1, # 10% - Performance historique de la tâche }, # Paramètres de performance "performance": { # Latence maximale observation-vers-suggestion (ms) "max_latency_ms": 400, # Taux de correction maximum acceptable (3%) "max_correction_rate": 0.03, # Nombre d'exécutions récentes pour calcul de concordance "concordance_window": 10, # Nombre d'exécutions pour calcul du taux de correction "correction_window": 20, # Timeout pour opérations de rollback (secondes) "rollback_timeout_s": 5, }, # Configuration de sécurité "security": { # Algorithme de chiffrement pour les logs "encryption_algorithm": "AES-256-CBC", # Durée de rétention des logs (jours) "log_retention_days": 90, # Fréquence de rotation des clés de chiffrement (jours) "key_rotation_days": 90, # Liste blanche par défaut (vide - doit être configurée par l'utilisateur) "default_whitelist": [], # Activer la vérification de liste blanche # True: Seules les fenêtres autorisées sont observées (sécurisé) # False: Toutes les fenêtres sont observées (mode permissif) "enforce_whitelist": False, # Changé à False pour plus de flexibilité # Demander confirmation avant d'observer une nouvelle fenêtre (si enforce_whitelist=False) "ask_before_new_window": True, }, # Configuration Ollama "ollama": { "host": "localhost:11434", "timeout": 30, # secondes }, # Configuration FAISS "faiss": { # Dimension des embeddings OpenCLIP "embedding_dim": 512, # Type d'index FAISS ("Flat" pour petit dataset, "IVF" pour grand) "index_type": "Flat", # Nombre de clusters pour index IVF (si utilisé) "n_clusters": 100, # Nombre de voisins à retourner lors de la recherche "k_neighbors": 5, }, # Chemins des données "data_paths": { "user_profiles": str(PROJECT_ROOT / "data" / "user_profiles"), "logs": str(PROJECT_ROOT / "data" / "logs"), "faiss_index": str(PROJECT_ROOT / "data" / "faiss_index"), "encryption_keys": str(PROJECT_ROOT / "data" / ".keys"), }, # Configuration GUI "gui": { # Icônes pour les modes "mode_icons": { "shadow": "👀", "assist": "🤝", "auto": "🤖", }, # Durée d'affichage des notifications (secondes) "notification_timeout": 5, # Raccourcis clavier "shortcuts": { "accept": "Return", # Entrée "reject": "Escape", # Échap "correct": "Alt+C", # Alt+C "emergency_stop": "Ctrl+Pause", # Ctrl+Pause }, }, # Configuration du logger "logging": { "level": "INFO", "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", "max_file_size_mb": 100, "backup_count": 5, }, # Configuration UI Element Detection (Phase 1-3) "ui_detection": { # Mode de détection: "light", "enriched", "complete" # - light: Structures de données seulement (pas de détection) # - enriched: Détection d'éléments UI activée # - complete: Détection + embeddings multi-modaux + matching amélioré "mode": "light", # Démarrer en mode light par défaut # Activer la détection automatique d'éléments "enabled": True, # Détecter les éléments à chaque capture d'écran "detect_on_capture": False, # False = détection manuelle uniquement # Utiliser le VLM pour la détection (coûteux) "vlm_enabled": False, # Configuration du détecteur "detector": { "use_text_detection": True, "use_rectangle_detection": True, "use_vlm_detection": False, "vlm_on_new_screens": False, }, }, # Configuration Multi-Modal Embedding (Phase 3) "multimodal_embedding": { # Activer les embeddings multi-modaux "enabled": False, # Activé automatiquement en mode "complete" # Dimension des embeddings "embedding_dim": 512, # Méthode de fusion "fusion_method": "weighted_average", # Poids de fusion des modalités "weights": { "image": 0.5, # Screenshot complet "text": 0.3, # Texte détecté "title": 0.1, # Titre de fenêtre "ui": 0.1, # Éléments UI "context": 0.0, # Contexte workflow (à implémenter) }, }, # Configuration Enhanced Workflow Matcher (Phase 3) "enhanced_matcher": { # Activer le matcher amélioré "enabled": True, # Poids pour le scoring composite "screen_weight": 0.6, # Poids de la similarité d'écran "elements_weight": 0.4, # Poids de la similarité d'éléments # Seuils de matching "min_similarity_threshold": 0.3, "min_confidence_threshold": 0.5, # Nombre maximum de candidats à évaluer "max_candidates": 10, }, } def get_config(): """Retourne la configuration globale""" return CONFIG def get_model_config(): """Retourne la configuration des modèles""" return CONFIG["models"] def get_thresholds(): """Retourne les seuils de confiance et transitions""" return CONFIG["thresholds"] def get_performance_config(): """Retourne la configuration de performance""" return CONFIG["performance"] def get_security_config(): """Retourne la configuration de sécurité""" return CONFIG["security"] def get_data_paths(): """Retourne les chemins des données""" return CONFIG["data_paths"] def ensure_directories(): """Crée tous les répertoires nécessaires s'ils n'existent pas""" paths = get_data_paths() for path in paths.values(): os.makedirs(path, exist_ok=True) # Créer aussi les répertoires de modèles model_paths = CONFIG["models"]["paths"] for path in model_paths.values(): os.makedirs(path, exist_ok=True) if __name__ == "__main__": # Test de la configuration print("Configuration RPA Vision V2") print("=" * 50) print(f"Répertoire racine: {PROJECT_ROOT}") print(f"\nModèles:") for key, value in CONFIG["models"].items(): if key != "paths": print(f" {key}: {value}") print(f"\nSeuils:") for key, value in CONFIG["thresholds"].items(): print(f" {key}: {value}") print(f"\nPerformance:") for key, value in CONFIG["performance"].items(): print(f" {key}: {value}") print(f"\nSécurité:") for key, value in CONFIG["security"].items(): if key != "default_whitelist": print(f" {key}: {value}")