# agent_v1/config.py """ Configuration avancée pour Agent V1. """ from __future__ import annotations import os import platform import socket from pathlib import Path # --- DPI awareness (DOIT etre appele avant tout import de pynput/mss/tkinter) --- # Rend le process DPI-aware sur Windows pour que toutes les API (pynput, mss, pyautogui) # travaillent en coordonnees physiques (pixels reels) au lieu de coordonnees logiques # (virtualisees par le DPI scaling). # Sans cet appel, un ecran 2560x1600 a 150% DPI apparait comme 1707x1067 pour les API, # ce qui cause des erreurs de positionnement pendant le replay. # Sur Linux/Mac : no-op silencieux. # PROCESS_PER_MONITOR_DPI_AWARE = 2 : le niveau le plus precis. if platform.system() == "Windows": try: import ctypes ctypes.windll.shcore.SetProcessDpiAwareness(2) # PROCESS_PER_MONITOR_DPI_AWARE except Exception: try: # Fallback pour Windows < 8.1 (API plus ancienne) ctypes.windll.user32.SetProcessDPIAware() except Exception: pass AGENT_VERSION = "1.0.0" # Identifiant unique de la machine (utilisé pour le multi-machine) # Configurable via variable d'environnement, sinon auto-généré depuis hostname + OS MACHINE_ID = os.environ.get( "RPA_MACHINE_ID", f"{socket.gethostname()}_{platform.system().lower()}", ) # Dossier racine de l'agent BASE_DIR = Path(__file__).resolve().parent # Endpoint du serveur Streaming (port 5005) # SERVER_URL contient TOUJOURS /api/v1 à la fin (convention unifiée). SERVER_URL = os.getenv("RPA_SERVER_URL", "http://localhost:5005/api/v1") # Base sans /api/v1 — pour les routes à la racine (/health) SERVER_BASE = SERVER_URL.rsplit("/api/v1", 1)[0] UPLOAD_ENDPOINT = f"{SERVER_URL}/traces/upload" STREAMING_ENDPOINT = f"{SERVER_URL}/traces/stream" # Host Ollama — SÉPARÉ du serveur RPA. # Ollama tourne en local sur la machine serveur, jamais exposé via le reverse proxy. # Défaut : localhost (exécution locale ou accès LAN direct). OLLAMA_HOST = os.getenv("RPA_OLLAMA_HOST", "localhost") # Token d'authentification API (doit correspondre au token du serveur) # Configurable via variable d'environnement RPA_API_TOKEN API_TOKEN = os.environ.get("RPA_API_TOKEN", "") # Paramètres de session MAX_SESSION_DURATION_S = 60 * 60 # 1 heure SESSIONS_ROOT = BASE_DIR / "sessions" # Paramètres Vision (Crops pour la résolution visuelle) # 80x80 : assez petit pour être discriminant (icônes), assez grand pour le contexte TARGETED_CROP_SIZE = (80, 80) SCREENSHOT_QUALITY = 85 # Floutage des données sensibles (conformité AI Act) # Floute les champs de saisie dans les screenshots AVANT stockage/envoi # Désactiver avec RPA_BLUR_SENSITIVE=false pour le développement/tests BLUR_SENSITIVE = os.environ.get("RPA_BLUR_SENSITIVE", "true").lower() in ("true", "1", "yes") # Retention des logs — minimum 6 mois (180 jours) requis par le Reglement IA # (Article 12 — journalisation automatique, Article 26(6) — conservation minimum) # Configurable via variable d'environnement pour permettre l'ajustement LOG_RETENTION_DAYS = int(os.environ.get("RPA_LOG_RETENTION_DAYS", "180")) # Monitoring PERF_MONITOR_INTERVAL_S = 30 LOGS_DIR = BASE_DIR / "logs" LOG_FILE = LOGS_DIR / "agent_v1.log" # --- Métadonnées système (capturées au chargement du module) --- # Utilisées pour la bannière de démarrage et le diagnostic. # Import tardif pour éviter les dépendances circulaires. try: from .vision.system_info import get_dpi_scale, get_os_theme, get_monitor_info _monitor_index, _monitors = get_monitor_info() _primary = _monitors[0] if _monitors else {"width": 1920, "height": 1080} SCREEN_RESOLUTION = (_primary["width"], _primary["height"]) DPI_SCALE = get_dpi_scale() OS_THEME = get_os_theme() except Exception: # Fallback silencieux si les métadonnées ne sont pas disponibles SCREEN_RESOLUTION = (1920, 1080) DPI_SCALE = 100 OS_THEME = "unknown" # Création des dossiers os.makedirs(SESSIONS_ROOT, exist_ok=True) os.makedirs(LOGS_DIR, exist_ok=True)