12 KiB
Design - Amélioration GUI et Logs
Overview
Ce document décrit l'architecture et le design de la nouvelle interface utilisateur minimaliste et du système de logs amélioré pour GeniusIA v2.
Architecture
┌─────────────────────────────────────────────────────────┐
│ Main Application │
└────────────────┬────────────────────────────────────────┘
│
┌────────┴────────┐
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ Orchestrator │ │ Improved GUI │
│ │ │ │
│ - Détecte │──│ - System Tray │
│ - Apprend │ │ - Logs Panel │
│ - Suggère │ │ - Popups │
└──────┬───────┘ └──────────────────┘
│
▼
┌──────────────┐
│ HumanLogger │
│ │
│ - Messages │
│ - Formatting │
└──────────────┘
Components and Interfaces
1. HumanLogger
Classe pour générer des messages lisibles par l'utilisateur.
class HumanLogger:
"""
Logger qui génère des messages simples pour l'utilisateur.
"""
def log_observation(self, action_type: str, window: str):
"""Log une action observée."""
return f"👀 Action dans {window}"
def log_pattern_detected(self, repetitions: int, task_name: str):
"""Log un pattern détecté."""
return f"🎯 Pattern détecté: {task_name} (répété {repetitions}x)"
def log_workflow_learned(self, task_name: str, count: int):
"""Log un workflow appris."""
return f"📚 Workflow appris: {task_name} ({count} observations)"
def log_mode_change(self, old_mode: str, new_mode: str):
"""Log un changement de mode."""
return f"✅ Mode {new_mode} activé"
def log_finetuning_started(self, num_examples: int):
"""Log le début du fine-tuning."""
return f"🧠 Amélioration du modèle ({num_examples} exemples)..."
def log_finetuning_completed(self, duration: float):
"""Log la fin du fine-tuning."""
return f"✅ Modèle amélioré (en {duration:.1f}s)"
2. ImprovedGUI
Interface minimaliste avec system tray.
Layout Principal
┌─────────────────────────────────────┐
│ GeniusIA v2 [_][X]│
├─────────────────────────────────────┤
│ │
│ Mode: 👀 Observation │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 📊 Activité: │
│ • 12 actions observées │
│ • 2 patterns détectés │
│ │
│ 🧠 Fine-tuning: │
│ • 8/10 exemples collectés │
│ │
├─────────────────────────────────────┤
│ 📝 Journal: │
│ ┌─────────────────────────────────┐│
│ │14:23 👀 J'observe... ││
│ │14:24 🎯 Pattern: Calculer 9/9 ││
│ │14:24 📚 J'apprends... ││
│ │14:25 💡 Prêt à suggérer ││
│ │14:26 ✅ Mode Suggestions activé ││
│ └─────────────────────────────────┘│
│ │
│ [Pause] [Arrêter] │
└─────────────────────────────────────┘
System Tray
Icône dans la barre: 🤖
Menu clic droit:
┌─────────────────────┐
│ 🤖 GeniusIA v2 │
├─────────────────────┤
│ 👀 Mode: Shadow │
│ 📊 12 actions │
├─────────────────────┤
│ Afficher │
│ Masquer │
│ ───────────────── │
│ Quitter │
└─────────────────────┘
Popup Interactif
┌─────────────────────────────────────────┐
│ 💡 J'ai une idée ! │
│ │
│ J'ai remarqué que vous faites souvent: │
│ "Calculer 9/9 dans la calculatrice" │
│ │
│ Est-ce que je peux essayer de vous │
│ suggérer cette action la prochaine │
│ fois ? │
│ │
│ [Oui, essaie !] [Non, continue] │
│ │
│ ⏱️ Fermeture auto dans 10s │
└─────────────────────────────────────────┘
3. LogsPanel
Widget pour afficher les logs avec scroll.
class LogsPanel(QWidget):
"""
Panneau d'affichage des logs avec scroll.
- Affiche 5 dernières actions
- Scrollable jusqu'à 30
- Auto-scroll si en bas
- Format: HH:MM emoji Message
"""
def add_log(self, message: str, emoji: str = "ℹ️"):
"""Ajoute un log avec timestamp."""
pass
def clear(self):
"""Efface tous les logs."""
pass
def get_logs(self) -> List[str]:
"""Retourne l'historique."""
pass
4. InteractiveDialog
Popup pour dialogues avec timeout.
class InteractiveDialog(QDialog):
"""
Dialogue interactif avec timeout automatique.
- Non-bloquant (l'app continue)
- Timeout 10 secondes
- Callbacks pour réponses
"""
def __init__(
self,
title: str,
message: str,
on_accept: Callable,
on_reject: Callable,
timeout: int = 10
):
pass
Data Models
LogMessage
@dataclass
class LogMessage:
"""Message de log pour affichage."""
timestamp: datetime
emoji: str
message: str
level: str # 'info', 'success', 'warning', 'error'
technical_details: Optional[str] = None # Pour logs techniques
GUIState
@dataclass
class GUIState:
"""État de la GUI."""
mode: str # 'shadow', 'assist', 'auto'
is_running: bool
actions_count: int
patterns_count: int
workflows_count: int
finetuning_status: Optional[str] # None, 'collecting', 'training', 'completed'
finetuning_progress: Optional[int] # 0-100 ou None
Error Handling
Erreurs GUI
- Erreur d'affichage : Logger et continuer sans GUI
- Erreur system tray : Fallback vers fenêtre normale
- Erreur popup : Logger et utiliser notification simple
Erreurs Logs
- Fichier de log inaccessible : Créer nouveau fichier avec timestamp
- Disque plein : Nettoyer anciens logs automatiquement
- Permission refusée : Logger dans /tmp en fallback
Testing Strategy
Unit Tests
- Test HumanLogger : Vérifier format des messages
- Test LogsPanel : Vérifier scroll et limite 30
- Test InteractiveDialog : Vérifier timeout
- Test GUIState : Vérifier mise à jour
Integration Tests
- Test Orchestrator → GUI : Vérifier envoi de messages
- Test Popup → Orchestrator : Vérifier callbacks
- Test System Tray : Vérifier menu et actions
Manual Tests
- Test sur Ubuntu : Vérifier system tray et thème
- Test avec actions répétitives : Vérifier détection
- Test timeout : Vérifier fermeture auto après 10s
Correctness Properties
A property is a characteristic or behavior that should hold true across all valid executions of a system.
Property 1: Log History Bounds
For any sequence of log messages, the visible history should never exceed 30 messages.
Validates: Requirements 3.3
Property 2: Timeout Consistency
For any interactive dialog, if no user response is received within 10 seconds, the dialog should close automatically.
Validates: Requirements 4.3
Property 3: Mode Display Consistency
For any mode change, the GUI should display the correct mode icon and label within 100ms.
Validates: Requirements 5.1
Property 4: Message Ordering
For any sequence of events, the logs should appear in chronological order.
Validates: Requirements 2.1, 2.2, 2.3, 2.4
Property 5: Non-blocking Dialogs
For any interactive dialog displayed, the Orchestrator should continue processing events.
Validates: Requirements 4.2
Implementation Notes
PyQt5 Signals
Utiliser des signaux Qt pour communication thread-safe :
class GUISignals(QObject):
"""Signaux pour communication Orchestrator → GUI."""
log_message = pyqtSignal(str, str) # (emoji, message)
update_stats = pyqtSignal(dict) # GUIState
show_dialog = pyqtSignal(str, str, object, object) # (title, msg, on_accept, on_reject)
mode_changed = pyqtSignal(str) # nouveau mode
System Tray Ubuntu
Utiliser QSystemTrayIcon avec fallback si non supporté :
if QSystemTrayIcon.isSystemTrayAvailable():
self.tray_icon = QSystemTrayIcon(QIcon.fromTheme("robot"))
self.tray_icon.setToolTip("GeniusIA v2")
else:
# Fallback: fenêtre normale
self.setWindowFlags(Qt.Window)
Logs Techniques
Format structuré pour parsing facile :
2024-11-20 14:23:45.123 [INFO] EventCapture: Mouse click at (450, 320) in "Calculator"
2024-11-20 14:23:46.456 [DEBUG] SessionManager: Action added to session_001
2024-11-20 14:24:12.789 [INFO] WorkflowDetector: Pattern detected (3 repetitions)
Performance
- Logs GUI : Max 30 messages en mémoire
- Logs fichier : Rotation à 10MB
- Mise à jour GUI : Max 10 fois/seconde
- Popups : Timeout 10s pour éviter accumulation
UI/UX Considerations
Discrétion
- Fenêtre petite (300x400px)
- Minimisable
- System tray toujours visible
- Pas de sons
Clarté
- Messages courts (max 50 caractères)
- Emojis pour reconnaissance rapide
- Couleurs pour niveaux (info/success/warning/error)
- Timestamps relatifs ("il y a 2 min")
Réactivité
- Mise à jour en temps réel
- Pas de freeze
- Feedback immédiat sur actions
Migration Plan
Phase 1: Créer nouveaux composants
- HumanLogger
- ImprovedGUI
- LogsPanel
- InteractiveDialog
Phase 2: Modifier Orchestrator
- Ajouter envoi de messages humains
- Connecter aux signaux GUI
- Déclencher dialogues interactifs
Phase 3: Remplacer ancienne GUI
- Renommer
minimal_gui.py→minimal_gui_old.py - Renommer
improved_gui.py→minimal_gui.py - Tester
Phase 4: Cleanup
- Supprimer anciens boutons (liste blanche, etc.)
- Supprimer code inutilisé
- Documentation
Security Considerations
- Logs techniques : Ne pas logger de données sensibles
- Popups : Timeout pour éviter DOS
- System tray : Vérifier permissions Ubuntu
Accessibility
- Contraste suffisant pour lisibilité
- Taille de police ajustable
- Support clavier complet
- Screen reader compatible (ARIA labels)