- Frontend v4 accessible sur réseau local (192.168.1.40) - Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard) - Ollama GPU fonctionnel - Self-healing interactif - Dashboard confiance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
13 KiB
Agent V0 - Analyse et Validation ✅
Date: 24 novembre 2025
Status: Architecture Validée - Recommandations Fournies
📋 Vue d'Ensemble
L'agent V0 est un enregistreur d'interface cross-plateforme léger qui capture les interactions utilisateur et les envoie au serveur RPA Vision V3 pour apprentissage.
Objectif
Permettre aux formateurs (Windows/macOS/Linux) d'enregistrer leurs workflows sans avoir besoin du système complet RPA Vision V3.
Architecture
Agent V0 (Poste Formateur)
↓ Capture
├─ Clics souris
├─ Combos clavier
├─ Scroll molette
├─ Hover (immobilité)
└─ Screenshots (full/crop)
↓ Package
RawSession JSON + Screenshots ZIP
↓ Upload
Serveur RPA Vision V3 (Linux)
✅ Points Forts
1. Compatibilité Parfaite avec RPA Vision V3
- ✅ Utilise le format
rawsession_v1identique àcore/models/raw_session.py - ✅ Structure Event/Screenshot/WindowContext compatible
- ✅ Timestamps relatifs (
ten secondes depuis début session) - ✅ Métadonnées complètes (environment, user, context)
2. Architecture Modulaire et Propre
agent_v0/
├── main.py # Point d'entrée
├── tray_ui.py # Interface utilisateur (icône tray)
├── raw_session.py # Modèle de données
├── event_captor.py # Capture souris (clics, scroll, hover)
├── key_captor.py # Capture clavier (combos)
├── screen_capturer.py # Screenshots (mss)
├── window_info.py # Info fenêtre active (xdotool)
├── storage.py # Création ZIP
├── uploader.py # Upload serveur
├── user_config.py # Configuration JSON
├── config.py # Constantes
└── logger_conf.py # Logging rotatif
3. Fonctionnalités Avancées
- ✅ Hover detection - Capture l'immobilité souris (infobulles)
- ✅ Screenshot modes - Full screen ou crop autour du curseur
- ✅ Key combos - Détection CTRL+C, ALT+F4, etc.
- ✅ Scroll tracking - Molette souris avec delta
- ✅ Network save - Copie automatique vers chemin réseau
- ✅ ZIP packaging - Session complète en un fichier
- ✅ Logging rotatif - Fichiers logs avec rotation 5MB
4. UX Excellente
- ✅ Icône tray (zone de notification)
- ✅ Menu simple: Start/Stop/Open/Quit
- ✅ Indicateur visuel (vert=actif, gris=inactif)
- ✅ Configuration JSON éditable
- ✅ Ouverture dossiers sessions/logs depuis le menu
⚠️ Points d'Attention
1. Compatibilité Cross-Plateforme Limitée
Problème: window_info.py utilise xdotool (Linux uniquement)
# window_info.py - LINUX ONLY
def get_active_window_info():
title = _run_cmd(["xdotool", "getactivewindow", "getwindowname"])
pid_str = _run_cmd(["xdotool", "getactivewindow", "getwindowpid"])
Impact: Ne fonctionnera pas sur Windows/macOS
Solution: Implémenter des backends spécifiques par OS:
# window_info.py - CROSS-PLATFORM
import sys
import platform
def get_active_window_info() -> Dict[str, str]:
system = platform.system()
if system == "Linux":
return _get_window_info_linux()
elif system == "Windows":
return _get_window_info_windows()
elif system == "Darwin": # macOS
return _get_window_info_macos()
else:
return {"title": "unknown_window", "app_name": "unknown_app"}
def _get_window_info_linux():
# Code actuel avec xdotool
...
def _get_window_info_windows():
# Windows: pywin32 ou ctypes
import win32gui
import win32process
import psutil
hwnd = win32gui.GetForegroundWindow()
title = win32gui.GetWindowText(hwnd)
_, pid = win32process.GetWindowThreadProcessId(hwnd)
app_name = psutil.Process(pid).name()
return {"title": title, "app_name": app_name}
def _get_window_info_macos():
# macOS: pyobjc ou AppleScript
from AppKit import NSWorkspace
active_app = NSWorkspace.sharedWorkspace().activeApplication()
app_name = active_app['NSApplicationName']
# Pour le titre, utiliser AppleScript ou Accessibility API
return {"title": "...", "app_name": app_name}
Dépendances à ajouter:
# requirements.txt
pywin32>=306 ; sys_platform == 'win32'
pyobjc-framework-Cocoa>=10.0 ; sys_platform == 'darwin'
psutil>=5.9.0 # Pour Windows process info
2. Sécurité et Permissions
Problème: Capture d'écran et monitoring clavier nécessitent des permissions
Windows:
- Pas de permissions spéciales nécessaires
- Antivirus peut bloquer (ajouter exception)
macOS:
- ⚠️ Nécessite "Accessibility" permissions
- ⚠️ Nécessite "Screen Recording" permissions
- Demander à l'utilisateur d'activer dans System Preferences
Linux:
- Nécessite X11 (pas Wayland par défaut)
xdotooldoit être installé
Recommandation: Ajouter un check au démarrage:
# permissions_check.py
def check_permissions():
system = platform.system()
if system == "Darwin":
# Vérifier Accessibility
from AppKit import NSWorkspace
# Tester si on peut lire la fenêtre active
try:
NSWorkspace.sharedWorkspace().activeApplication()
except:
show_macos_permissions_dialog()
return False
elif system == "Linux":
# Vérifier xdotool
if not shutil.which("xdotool"):
show_linux_install_dialog()
return False
return True
3. Gestion des Données Sensibles
Problème: Les screenshots peuvent contenir des données sensibles
Recommandations:
- Chiffrement du ZIP avant upload
- Anonymisation optionnelle des screenshots
- Politique de rétention claire (supprimer après X jours)
- RGPD compliance - Consentement utilisateur
# storage.py - Ajout chiffrement
import zipfile
import pyminizip # ou cryptography
def create_session_zip_encrypted(session, password):
zip_path = create_session_zip(session)
encrypted_path = zip_path.replace('.zip', '_encrypted.zip')
# Chiffrer avec AES-256
pyminizip.compress(
zip_path,
None,
encrypted_path,
password,
5 # compression level
)
os.remove(zip_path) # Supprimer non-chiffré
return encrypted_path
4. Performance et Optimisation
Problème: Screenshots en PNG peuvent être volumineux
Recommandations:
- Compression JPEG pour screenshots (qualité 85%)
- Resize automatique si > 1920x1080
- Throttling - Max 1 screenshot/seconde
# screen_capturer.py - Optimisations
from PIL import Image
def capture_optimized(self, focus_pos):
# Capture existante
screenshot_id, relative_path = self.capture(focus_pos)
# Optimiser l'image
img_path = os.path.join(self._get_session_shots_dir(), f"{screenshot_id}.png")
with Image.open(img_path) as img:
# Resize si trop grand
if img.width > 1920 or img.height > 1080:
img.thumbnail((1920, 1080), Image.Resampling.LANCZOS)
# Convertir en JPEG (plus léger)
jpg_path = img_path.replace('.png', '.jpg')
img.convert('RGB').save(jpg_path, 'JPEG', quality=85, optimize=True)
# Supprimer PNG
os.remove(img_path)
# Mettre à jour relative_path
relative_path = relative_path.replace('.png', '.jpg')
return screenshot_id, relative_path
5. Packaging et Distribution
Problème: Distribution aux formateurs
Solution: Utiliser PyInstaller (déjà configuré avec .spec)
# build.sh
#!/bin/bash
pyinstaller agent_v0_tray.spec
# Résultat:
# dist/agent_v0_tray (Linux)
# dist/agent_v0_tray.exe (Windows)
# dist/agent_v0_tray.app (macOS)
Recommandations:
- Créer des installeurs - NSIS (Windows), DMG (macOS), DEB/RPM (Linux)
- Auto-update - Vérifier version au démarrage
- Signature de code - Éviter les warnings antivirus
🔧 Intégration avec RPA Vision V3
Côté Serveur (À Implémenter)
# server/api/upload_handler.py
from fastapi import FastAPI, UploadFile, File
from core.persistence import StorageManager
from core.models import RawSession
app = FastAPI()
storage = StorageManager(base_path="data/training")
@app.post("/api/traces/upload")
async def upload_session(
file: UploadFile = File(...),
session_id: str = Form(...)
):
# Sauvegarder ZIP
zip_path = f"data/training/uploads/{session_id}.zip"
with open(zip_path, "wb") as f:
f.write(await file.read())
# Extraire et valider
extract_dir = f"data/training/sessions/{session_id}"
with zipfile.ZipFile(zip_path, 'r') as zf:
zf.extractall(extract_dir)
# Charger RawSession
json_path = f"{extract_dir}/{session_id}/{session_id}.json"
session = RawSession.load_from_file(Path(json_path))
# Valider format
assert session.schema_version == "rawsession_v1"
# Stocker avec StorageManager
storage.save_raw_session(session)
return {"status": "success", "session_id": session_id}
Pipeline de Training
# training/process_agent_sessions.py
from core.models import RawSession, ScreenState
from core.embedding import StateEmbeddingBuilder
from core.graph import GraphBuilder
def process_agent_session(session_id: str):
# 1. Charger RawSession
session = storage.load_raw_session(session_id)
# 2. Construire ScreenStates
screen_states = []
for event in session.events:
if event.screenshot_id:
# Créer ScreenState à partir de screenshot
state = build_screen_state_from_event(event, session)
screen_states.append(state)
# 3. Générer embeddings
builder = StateEmbeddingBuilder()
for state in screen_states:
embedding = builder.build_embedding(state)
storage.save_embedding(embedding.vector, state.screen_state_id)
# 4. Construire workflow
graph_builder = GraphBuilder()
workflow = graph_builder.build_from_session(session)
storage.save_workflow(workflow)
return workflow
📊 Comparaison avec RPA Vision V3
| Aspect | Agent V0 | RPA Vision V3 |
|---|---|---|
| Plateforme | Windows/macOS/Linux | Linux (serveur) |
| Rôle | Capture données | Analyse + Exécution |
| Dépendances | Légères (mss, pynput) | Lourdes (CLIP, FAISS, Ollama) |
| UI | Tray icon | GUI complète |
| Stockage | Local + Upload | Base de données |
| Processing | Aucun | Embeddings + Matching |
| Taille | ~50 MB (packagé) | ~2 GB (avec modèles) |
🎯 Recommandations Prioritaires
Priorité 1 - Critique
- ✅ Implémenter window_info cross-plateforme (Windows/macOS)
- ✅ Ajouter check permissions au démarrage
- ✅ Chiffrer les ZIPs avant upload
Priorité 2 - Important
- ✅ Optimiser screenshots (JPEG, resize)
- ✅ Créer API serveur pour recevoir uploads
- ✅ Tester sur Windows/macOS réels
Priorité 3 - Nice to Have
- ✅ Auto-update mécanisme
- ✅ Anonymisation optionnelle screenshots
- ✅ Statistiques session (durée, nb events)
- ✅ Preview session avant upload
📝 Checklist de Déploiement
Avant Distribution
- Tester sur Windows 10/11
- Tester sur macOS 12+
- Tester sur Ubuntu 22.04+
- Vérifier permissions (Accessibility, Screen Recording)
- Créer installeurs (NSIS, DMG, DEB)
- Signer le code (éviter warnings antivirus)
- Documenter installation (README_AGENT.md)
- Créer guide utilisateur (PDF)
Côté Serveur
- Implémenter API
/api/traces/upload - Configurer stockage (data/training/)
- Implémenter pipeline de processing
- Ajouter monitoring (Prometheus/Grafana)
- Configurer backup automatique
- Tester charge (100+ formateurs simultanés)
🎉 Conclusion
L'agent V0 est une excellente base! L'architecture est propre, modulaire et bien pensée. Les principaux points à adresser sont:
- Compatibilité cross-plateforme (window_info)
- Sécurité (chiffrement, permissions)
- Optimisation (compression screenshots)
Avec ces améliorations, l'agent sera prêt pour déploiement production chez les formateurs.
Prochaines étapes suggérées:
- Implémenter
window_infopour Windows/macOS - Créer l'API serveur d'upload
- Tester sur les 3 OS
- Créer les installeurs
- Déployer en beta chez 2-3 formateurs pilotes
Besoin d'aide pour implémenter ces améliorations? Je peux t'aider à coder les parties manquantes! 🚀