Files
rpa_vision_v3/docs/archive/misc/dashboard/DASHBOARD_PHASE1_CHANGES.md
Dom a27b74cf22 v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- 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>
2026-01-29 11:23:51 +01:00

11 KiB

Dashboard Phase 1 - Modifications Appliquées

Date: 7 janvier 2026 - 22:45 Objectif: Corriger les chemins screenshots + rendre visibles les screen_states


📝 Modifications Détaillées

Modification 1 - Fix Chemin Screenshots (Liste Sessions)

Fichier: web_dashboard/app.py Ligne: 206-210

AVANT :

# Compter les screenshots
screenshots_dir = session_dir / "screenshots"
screenshot_files = list(screenshots_dir.glob('*.png')) if screenshots_dir.exists() else []

APRÈS :

# Compter les screenshots
# Structure : sessions/{session_id}/{session_id}/shots/*.png
session_id = session.session_id
screenshots_dir = session_dir / session_id / "shots"
screenshot_files = list(screenshots_dir.glob('*.png')) if screenshots_dir.exists() else []

Raison :

  • La structure réelle est sessions/sess_xxx/sess_xxx/shots/shot_0001.png
  • L'ancien code cherchait dans sessions/sess_xxx/screenshots/ (n'existe pas)
  • Résultat : TOUJOURS 0 screenshots affichés

Impact :

  • Screenshots count sera correct pour les sessions non nettoyées
  • L'utilisateur voit le nombre réel de captures

Modification 2 - Fix Chemin Screenshots (Détails Session)

Fichier: web_dashboard/app.py Ligne: 251-261

AVANT :

screenshots_dir = session_dir / "screenshots"

APRÈS :

# Structure : sessions/{session_id}/{session_id}/shots/*.png
screenshots_dir = session_dir / session_id / "shots"

Impact :

  • La modal "📸 Screenshots" affiche les vraies images
  • Les URLs sont correctement générées

Modification 3 - Fix Route Get Screenshot

Fichier: web_dashboard/app.py Ligne: 287-320

AVANT :

screenshot_path = session_dir / "screenshots" / filename

APRÈS :

# Essayer le chemin correct en premier : {session_id}/shots/
screenshot_path = session_dir / session_id / "shots" / filename

if not screenshot_path.exists():
    # Essayer l'ancien chemin pour compatibilité
    screenshot_path = session_dir / "screenshots" / filename

if not screenshot_path.exists():
    # Essayer dans les sous-dossiers (fallback)
    for subdir in session_dir.iterdir():
        if subdir.is_dir():
            # Essayer shots/
            alt_path = subdir / "shots" / filename
            if alt_path.exists():
                screenshot_path = alt_path
                break
            # Essayer screenshots/
            alt_path = subdir / "screenshots" / filename
            if alt_path.exists():
                screenshot_path = alt_path
                break

if not screenshot_path.exists():
    return jsonify({'error': 'Screenshot non trouvé ou supprimé après traitement'}), 404

Raison :

  • Cherche d'abord dans le bon chemin
  • Fallback sur l'ancien chemin (compatibilité)
  • Message d'erreur clair si supprimé après traitement

Impact :

  • Images servies correctement
  • Message clair si screenshot supprimé (après cleanup)

Modification 4 - NOUVELLE Route /api/screen_states

Fichier: web_dashboard/app.py Ligne: 355-425

Code ajouté :

@app.route('/api/screen_states')
def list_screen_states():
    """Liste tous les screen states traités."""
    try:
        screen_states = []
        screen_states_path = DATA_PATH / "screen_states"

        if not screen_states_path.exists():
            return jsonify({'screen_states': [], 'total': 0})

        # Parcourir tous les fichiers JSON dans screen_states/
        for date_dir in screen_states_path.iterdir():
            if not date_dir.is_dir():
                continue

            for state_file in date_dir.glob('*.json'):
                try:
                    with open(state_file, 'r') as f:
                        state_data = json.load(f)

                    screen_states.append({
                        'screen_state_id': state_data.get('screen_state_id', state_file.stem),
                        'session_id': state_data.get('session_id', 'unknown'),
                        'timestamp': state_data.get('timestamp', ''),
                        'window': state_data.get('window', {}),
                        'tags': state_data.get('context', {}).get('tags', []),
                        'workflow_candidate': state_data.get('context', {}).get('current_workflow_candidate'),
                        'user_id': state_data.get('context', {}).get('user_id', 'unknown'),
                        'business_variables': state_data.get('context', {}).get('business_variables', {}),
                        'file_path': str(state_file),
                        'date': date_dir.name
                    })
                except Exception as e:
                    print(f"Erreur lecture screen state {state_file}: {e}")
                    continue

        # Trier par timestamp (plus récent en premier)
        screen_states.sort(key=lambda x: x['timestamp'], reverse=True)

        # Grouper par session
        sessions_grouped = {}
        for state in screen_states:
            session_id = state['session_id']
            if session_id not in sessions_grouped:
                sessions_grouped[session_id] = {
                    'session_id': session_id,
                    'screen_states': [],
                    'count': 0,
                    'first_timestamp': state['timestamp'],
                    'last_timestamp': state['timestamp'],
                    'tags': state['tags'],
                    'user_id': state['user_id']
                }
            sessions_grouped[session_id]['screen_states'].append(state)
            sessions_grouped[session_id]['count'] += 1

        return jsonify({
            'screen_states': screen_states,
            'total': len(screen_states),
            'sessions_grouped': list(sessions_grouped.values()),
            'sessions_count': len(sessions_grouped)
        })
    except Exception as e:
        return jsonify({'error': str(e)}), 500

Fonctionnalités :

  • Liste TOUS les screen_states (236 actuellement)
  • Groupe par session
  • Retourne métadonnées (tags, workflow candidate, user, etc.)
  • Tri par timestamp (plus récent en premier)

Réponse JSON :

{
  "screen_states": [...],
  "total": 236,
  "sessions_grouped": [
    {
      "session_id": "sess_20260107T220743_6be50905",
      "count": 40,
      "screen_states": [...],
      "tags": ["Facturation_T2A_demo"],
      "user_id": "demo_user"
    }
  ],
  "sessions_count": 6
}

Modification 5 - NOUVELLE Route /api/screen_states/<session_id>

Fichier: web_dashboard/app.py Ligne: 428-462

Code ajouté :

@app.route('/api/screen_states/<session_id>')
def get_session_screen_states(session_id):
    """Récupère tous les screen states d'une session."""
    try:
        screen_states = []
        screen_states_path = DATA_PATH / "screen_states"

        if not screen_states_path.exists():
            return jsonify({'error': 'Screen states directory not found'}), 404

        # Parcourir tous les fichiers JSON dans screen_states/
        for date_dir in screen_states_path.iterdir():
            if not date_dir.is_dir():
                continue

            for state_file in date_dir.glob('*.json'):
                try:
                    with open(state_file, 'r') as f:
                        state_data = json.load(f)

                    if state_data.get('session_id') == session_id:
                        screen_states.append(state_data)
                except Exception as e:
                    continue

        # Trier par timestamp
        screen_states.sort(key=lambda x: x.get('timestamp', ''))

        return jsonify({
            'session_id': session_id,
            'screen_states': screen_states,
            'total': len(screen_states)
        })
    except Exception as e:
        return jsonify({'error': str(e)}), 500

Fonctionnalités :

  • Récupère tous les screen_states d'une session spécifique
  • Retourne les données COMPLÈTES (pas de résumé)
  • Tri chronologique

Vérifications Avant Déploiement

Rétrocompatibilité

  • Aucune route existante n'a été SUPPRIMÉE
  • Les routes existantes fonctionnent toujours (avec chemins corrigés)
  • 2 nouvelles routes AJOUTÉES (pas de modification d'existantes)

Pas de Breaking Changes

  • /api/system/status - INCHANGÉ
  • /api/agent/sessions - CHEMINS CORRIGÉS (amélioration)
  • /api/agent/sessions/<id> - CHEMINS CORRIGÉS (amélioration)
  • /api/agent/sessions/<id>/screenshot/<filename> - CHEMINS CORRIGÉS (amélioration)
  • /api/workflows - INCHANGÉ
  • /api/chains - INCHANGÉ
  • /api/triggers - INCHANGÉ

📋 Déploiement

Option 1 - Script Automatique (Recommandé)

cd /home/dom/ai/rpa_vision_v3
./deploy_dashboard_fix.sh

Option 2 - Manuel

# Sauvegarde
sudo cp /opt/rpa_vision_v3/web_dashboard/app.py \
        /opt/rpa_vision_v3/web_dashboard/app.py.backup_phase1_$(date +%Y%m%d_%H%M%S)

# Déploiement
sudo cp /home/dom/ai/rpa_vision_v3/web_dashboard_app.py \
        /opt/rpa_vision_v3/web_dashboard/app.py
sudo chown rpa:rpa /opt/rpa_vision_v3/web_dashboard/app.py
sudo chmod 644 /opt/rpa_vision_v3/web_dashboard/app.py

# Redémarrage
sudo systemctl restart rpa-vision-v3-dashboard.service

# Vérification
systemctl status rpa-vision-v3-dashboard.service

🧪 Tests Post-Déploiement

Test 1 - Nouvelle Route Screen States

curl http://localhost:5001/api/screen_states | python3 -m json.tool | head -50

Attendu :

{
  "total": 236,
  "sessions_count": 6,
  "screen_states": [...]
}

Test 2 - Screenshots Count Corrigé

curl http://localhost:5001/api/agent/sessions | python3 -m json.tool | grep screenshots_count

Attendu :

  • Sessions non nettoyées : "screenshots_count": 30 (ou autre nombre > 0)
  • Sessions nettoyées : "screenshots_count": 0 (normal, supprimés après traitement)

Test 3 - Pas de Régression

curl http://localhost:5001/api/system/status | python3 -m json.tool

Attendu :

{
  "status": "online",
  "sessions_count": 8,
  "workflows_count": 2,
  ...
}

Test 4 - Dashboard Web

Ouvrir dans le navigateur : http://localhost:5001

Vérifier :

  • Onglet "Sessions" affiche screenshots_count > 0 pour sessions non nettoyées
  • Aucune erreur JavaScript dans la console
  • Toutes les anciennes fonctionnalités marchent

📊 Impact Utilisateur

Avant Phase 1

  • Screenshots count toujours à 0
  • 236 screen_states invisibles
  • Impossible de voir les données traitées

Après Phase 1

  • Screenshots count correct
  • Nouvelle API /api/screen_states pour accéder aux 236 screen_states
  • Groupement par session disponible
  • TOUTES les anciennes fonctionnalités intactes

🚀 Prochaines Étapes (Phase 2)

  1. Créer onglet "Données Traitées" dans le dashboard

    • Afficher les 236 screen_states
    • Grouper par session
    • Filtrage par date, user, tags
  2. Ajouter stats de processing

    • Route /api/processing/stats
    • Afficher dans "Vue d'ensemble"
  3. Distinction Raw vs Processed

    • Renommer "Sessions" → "Sessions Brutes"
    • Ajouter statut (🟡 Attente, 🟢 Traité, 🔴 Erreur)

Version : 1.0 - Phase 1 Complète Status : Prêt pour Déploiement