Files
rpa_vision_v3/agent_v0/agent_v1/config.py
Dom 3ed9798f06
Some checks failed
tests / Lint (ruff + black) (push) Failing after 1m43s
tests / Tests unitaires (sans GPU) (push) Failing after 1m51s
tests / Tests sécurité (critique) (push) Has been skipped
feat(agent_v1): log shipper — remontee auto des logs vers le serveur (gated OFF)
LogShipperHandler + LogShipper : buffer borne, flush par batch <= max, resilience
0-perte (rejeu sur echec), sender injectable. Flag RPA_LOG_SHIP_ENABLED (defaut
off, activable par config.txt sans rebuild). Sanitizer client = identite (rempart
PII = serveur, cf commit precedent). Wiring gated dans main.py. 8 tests TDD.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 13:30:08 +02:00

120 lines
5.0 KiB
Python

# 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 = os.environ.get("RPA_AGENT_VERSION", "1.0.1")
# 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", "")
# --- Orchestrateur Léa-first (agent-chat Linux) ---
# Endpoint racine du service agent-chat qui héberge POST /api/learn/start
# (P1-LEA-SHADOW). Configurable via RPA_AGENT_CHAT_URL.
# Défaut : localhost:5004 (même machine en dev). En POC clinique, doit
# pointer vers le DGX Spark (ex. http://agent-chat.dgx-local:5004).
AGENT_CHAT_URL = os.environ.get("RPA_AGENT_CHAT_URL", "http://localhost:5004")
# 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"))
# Remontée automatique des logs vers le serveur (push-log-DGX).
# Diagnostic des postes clinique SANS AnyDesk : les logs (déjà écrits sur disque)
# sont poussés au serveur, rangés par machine_id, consultables au dashboard.
# Défaut PRUDENT = désactivé : on l'active poste par poste via config.txt /
# variable d'environnement, sans rebuild de l'installateur.
LOG_SHIP_ENABLED = os.environ.get("RPA_LOG_SHIP_ENABLED", "false").lower() in (
"true", "1", "yes",
)
# Intervalle de flush du buffer de logs (secondes).
LOG_SHIP_INTERVAL_S = float(os.environ.get("RPA_LOG_SHIP_INTERVAL_S", "30"))
# 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)