# 🔍 Diagnostic - Screenshots Manquants **Date**: 7 janvier 2026 **ProblĂšme**: Les screenshots ne sont pas stockĂ©s aprĂšs l'upload --- ## 📊 Situation Actuelle ### ✅ Ce qui Fonctionne 1. **Upload rĂ©ussi** : Session uploadĂ©e avec succĂšs (HTTP 200) 2. **DĂ©chiffrement OK** : Le mot de passe de chiffrement est synchronisĂ© 3. **JSON sauvegardĂ©** : `/opt/rpa_vision_v3/data/training/sessions/2026-01-07/session_sess_20260107T182507_3a3709d4.json` 4. **Screen states créés** : 8+ fichiers dans `/opt/rpa_vision_v3/data/training/screen_states/2026-01-07/` ### ❌ Le ProblĂšme **Screenshots manquants** : - Le JSON rĂ©fĂ©rence 16 screenshots : `"relative_path": "shots/shot_0001.png"` Ă  `shot_0016.png` - Le rĂ©pertoire `/opt/rpa_vision_v3/data/screenshots/` existe mais est **VIDE** - Aucun fichier `.png` trouvĂ© dans `/opt/rpa_vision_v3/data/` --- ## 🔍 Analyse du Flux ### Flux Actuel (api_upload.py) ``` 1. RĂ©ception ZIP chiffrĂ© → /data/training/uploads/sess_*.enc 2. DĂ©chiffrement → /data/training/uploads/sess_*.zip 3. Extraction ZIP → /data/training/sessions/sess_*/ ├── sess_*/sess_*.json └── sess_*/shots/shot_*.png ← Screenshots ici temporairement 4. Chargement RawSession depuis JSON 5. StorageManager.save_raw_session() → /data/training/sessions/2026-01-07/session_*.json ⚠ Ne copie QUE le JSON, PAS les screenshots 6. Nettoyage ? → RĂ©pertoire d'extraction supprimĂ© ? ``` ### RĂ©sultat - Le JSON est sauvegardĂ© avec organisation par date ✅ - Les screenshots restent dans le rĂ©pertoire d'extraction temporaire ❌ - Le rĂ©pertoire d'extraction est probablement nettoyĂ© aprĂšs ❌ - **Perte des screenshots** ❌ --- ## 🔧 Solutions Possibles ### Solution 1 : Modifier StorageManager pour Copier les Screenshots **Avantage** : Solution propre, centralisĂ©e **InconvĂ©nient** : NĂ©cessite modification du code core **ImplĂ©mentation** : ```python # Dans StorageManager.save_raw_session() def save_raw_session(self, session: RawSession, session_id: str, screenshots_dir: Optional[Path] = None): # Sauvegarder JSON (existant) date_path = self._get_date_path("sessions") json_path = date_path / f"session_{session_id}.json" # ... save JSON ... # NOUVEAU : Copier les screenshots if screenshots_dir and screenshots_dir.exists(): screenshots_dest = self.base_path / "screenshots" / session_id screenshots_dest.mkdir(parents=True, exist_ok=True) for screenshot in session.screenshots: src = screenshots_dir / screenshot.relative_path if src.exists(): dest = screenshots_dest / src.name shutil.copy2(src, dest) # Mettre Ă  jour le chemin relatif dans session screenshot.relative_path = f"{session_id}/{src.name}" ``` ### Solution 2 : Modifier api_upload.py pour Copier Avant StorageManager **Avantage** : Pas de modification du core **InconvĂ©nient** : Logique dupliquĂ©e **ImplĂ©mentation** : ```python # Dans api_upload.py aprĂšs extraction extract_dir = SESSIONS_DIR / session_id with zipfile.ZipFile(zip_path, 'r') as zf: zf.extractall(extract_dir) # NOUVEAU : Copier screenshots vers /data/screenshots screenshots_src = extract_dir / session_id / "shots" if screenshots_src.exists(): screenshots_dest = Path("data/screenshots") / session_id screenshots_dest.mkdir(parents=True, exist_ok=True) shutil.copytree(screenshots_src, screenshots_dest, dirs_exist_ok=True) ``` ### Solution 3 : Ne PAS Supprimer le RĂ©pertoire d'Extraction **Avantage** : Simple, pas de code Ă  changer **InconvĂ©nient** : Duplication des donnĂ©es, espace disque **ImplĂ©mentation** : - Conserver le rĂ©pertoire `/data/training/sessions/sess_*/` - Les screen_states rĂ©fĂ©rencent dĂ©jĂ  le bon chemin relatif - Mettre Ă  jour les chemins dans le JSON si nĂ©cessaire --- ## 🎯 Recommandation pour le POC/MVP **Pour la dĂ©mo investisseurs (court terme)** : → **Solution 3** : Ne pas nettoyer le rĂ©pertoire d'extraction **Avantages** : - Aucune modification de code nĂ©cessaire - Rapide Ă  implĂ©menter - Screenshots accessibles immĂ©diatement - RĂ©versible **Actions** : 1. VĂ©rifier si le nettoyage est dĂ©jĂ  dĂ©sactivĂ© 2. Si actif, commenter le code de nettoyage dans api_upload.py 3. Tester avec une nouvelle session **Pour la production (moyen terme)** : → **Solution 1** : Modifier StorageManager proprement --- ## 📝 VĂ©rifications Ă  Faire 1. **VĂ©rifier si le rĂ©pertoire d'extraction existe** : ```bash find /opt/rpa_vision_v3/data/training/sessions -type d -name "sess_*" ``` 2. **Si oui, vĂ©rifier les screenshots** : ```bash find /opt/rpa_vision_v3/data/training/sessions/sess_* -name "*.png" ``` 3. **Si non, modifier le code pour les prĂ©server** --- ## 🔍 Tests de Validation AprĂšs correction, vĂ©rifier : ```bash # 1. Lancer l'agent et capturer une session cd /home/dom/ai/rpa_vision_v3/agent_v0 && ./run.sh # 2. VĂ©rifier que les screenshots sont sauvegardĂ©s ls -lh /opt/rpa_vision_v3/data/screenshots/sess_*/shots/ # OU (selon solution choisie) ls -lh /opt/rpa_vision_v3/data/training/sessions/sess_*/shots/ # 3. VĂ©rifier la cohĂ©rence JSON <> fichiers python3 -c " import json with open('/opt/rpa_vision_v3/data/training/sessions/2026-01-07/session_*.json') as f: session = json.load(f) print(f\"Screenshots dans JSON: {len(session['screenshots'])}\") " # Compter les fichiers PNG rĂ©els find /opt/rpa_vision_v3/data -name 'shot_*.png' | wc -l ``` --- ## 💡 Impact pour la DĂ©mo **Critique pour** : - ✅ DĂ©monstration visuelle du systĂšme - ✅ Validation de la capture complĂšte - ✅ Analyse UI/UX par les investisseurs - ✅ Preuve de fonctionnement end-to-end **Sans screenshots** : - ❌ Impossible de montrer ce que l'agent a capturĂ© - ❌ Pas de validation visuelle des workflows - ❌ Moins convaincant pour les investisseurs --- ## 🚀 Prochaine Étape Choisir une solution et l'implĂ©menter avant la dĂ©mo.