Initial commit
This commit is contained in:
362
docs/implementation/WORKFLOW_DETECTION_IMPLEMENTATION.md
Normal file
362
docs/implementation/WORKFLOW_DETECTION_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,362 @@
|
||||
# 🔄 Implémentation de la Détection de Workflows
|
||||
|
||||
**Date** : 19 Novembre 2025
|
||||
**Objectif** : Implémenter la détection de workflows complets au lieu de micro-patterns
|
||||
|
||||
## ✅ Ce qui a été fait
|
||||
|
||||
### 1. SessionManager (`geniusia2/core/session_manager.py`)
|
||||
|
||||
**Rôle** : Segmenter les actions en sessions basées sur le temps et le contexte.
|
||||
|
||||
**Fonctionnalités** :
|
||||
- ✅ Détection automatique de début/fin de session
|
||||
- ✅ Timeout configurable (5 minutes par défaut)
|
||||
- ✅ Détection de changement de fenêtre
|
||||
- ✅ Historique des sessions
|
||||
- ✅ Callback `on_session_completed`
|
||||
- ✅ Statistiques (durée moyenne, actions par session)
|
||||
|
||||
**Classe `Session`** :
|
||||
```python
|
||||
@dataclass
|
||||
class Session:
|
||||
session_id: str
|
||||
start_time: datetime
|
||||
end_time: Optional[datetime]
|
||||
actions: List[Dict[str, Any]]
|
||||
window: Optional[str]
|
||||
```
|
||||
|
||||
**Méthodes principales** :
|
||||
- `add_action(action)` : Ajoute une action à la session courante
|
||||
- `should_start_new_session(action)` : Détermine si nouvelle session nécessaire
|
||||
- `finalize_current_session()` : Finalise la session courante
|
||||
- `get_recent_sessions(n)` : Retourne les N sessions récentes
|
||||
- `get_stats()` : Statistiques des sessions
|
||||
|
||||
### 2. WorkflowDetector (`geniusia2/core/workflow_detector.py`)
|
||||
|
||||
**Rôle** : Détecter les workflows répétés en analysant les sessions.
|
||||
|
||||
**Fonctionnalités** :
|
||||
- ✅ Analyse de sessions pour détecter des similarités
|
||||
- ✅ Seuil de répétition configurable (3 par défaut)
|
||||
- ✅ Seuil de similarité configurable (75% par défaut)
|
||||
- ✅ Création de workflows à partir de sessions similaires
|
||||
- ✅ Callback `on_workflow_detected`
|
||||
- ✅ Mise à jour des workflows existants
|
||||
|
||||
**Classe `Workflow`** :
|
||||
```python
|
||||
@dataclass
|
||||
class Workflow:
|
||||
workflow_id: str
|
||||
name: str
|
||||
steps: List[WorkflowStep]
|
||||
repetitions: int
|
||||
confidence: float
|
||||
last_seen: datetime
|
||||
```
|
||||
|
||||
**Classe `WorkflowStep`** :
|
||||
```python
|
||||
@dataclass
|
||||
class WorkflowStep:
|
||||
step_id: int
|
||||
action_type: str
|
||||
target_description: str
|
||||
position: tuple
|
||||
window: str
|
||||
embedding: Optional[np.ndarray]
|
||||
screenshot: Optional[np.ndarray]
|
||||
```
|
||||
|
||||
**Méthodes principales** :
|
||||
- `analyze_sessions(sessions)` : Analyse les sessions pour détecter des workflows
|
||||
- `_calculate_session_similarity(sessions)` : Calcule la similarité entre sessions
|
||||
- `_compare_two_sessions(s1, s2)` : Compare deux sessions
|
||||
- `_create_workflow_from_sessions(sessions)` : Crée un workflow
|
||||
- `get_workflows()` : Retourne tous les workflows détectés
|
||||
- `get_stats()` : Statistiques des workflows
|
||||
|
||||
### 3. Intégration dans EventCapture
|
||||
|
||||
**Modifications dans `geniusia2/core/event_capture.py`** :
|
||||
|
||||
```python
|
||||
# Initialisation
|
||||
self.session_manager = SessionManager(logger, self.config)
|
||||
self.workflow_detector = WorkflowDetector(logger, self.config)
|
||||
|
||||
# Connexion des callbacks
|
||||
self.session_manager.on_session_completed = self._on_session_completed
|
||||
self.workflow_detector.on_workflow_detected = self._on_workflow_detected
|
||||
```
|
||||
|
||||
**Nouveaux callbacks** :
|
||||
- `_on_session_completed(session)` : Appelé quand une session est terminée
|
||||
- `_on_workflow_detected(workflow)` : Appelé quand un workflow est détecté
|
||||
|
||||
**Nouvelles méthodes publiques** :
|
||||
- `capture_event(action)` : Capture un événement manuellement (pour tests)
|
||||
- `get_workflows()` : Retourne les workflows détectés
|
||||
- `get_sessions(count)` : Retourne les sessions récentes
|
||||
- `get_workflow_stats()` : Statistiques complètes
|
||||
- `force_finalize_session()` : Force la finalisation de la session
|
||||
|
||||
## 🔄 Flux de Détection
|
||||
|
||||
```
|
||||
1. Utilisateur effectue des actions
|
||||
↓
|
||||
2. EventCapture capture les événements
|
||||
↓
|
||||
3. SessionManager segmente en sessions
|
||||
├─ Timeout (5 min) → Nouvelle session
|
||||
├─ Changement fenêtre → Nouvelle session
|
||||
└─ Session terminée → Callback
|
||||
↓
|
||||
4. WorkflowDetector analyse les sessions
|
||||
├─ Compare les 3+ dernières sessions
|
||||
├─ Calcule la similarité (75% minimum)
|
||||
└─ Si similaires → Workflow détecté
|
||||
↓
|
||||
5. Workflow créé/mis à jour
|
||||
├─ Génération d'un nom descriptif
|
||||
├─ Création des étapes (WorkflowStep)
|
||||
└─ Callback → Notification
|
||||
```
|
||||
|
||||
## 📊 Algorithme de Détection
|
||||
|
||||
### Similarité entre Sessions
|
||||
|
||||
```python
|
||||
def _compare_two_sessions(session1, session2):
|
||||
# 1. Vérifier la longueur (tolérance de 2 actions)
|
||||
if abs(len(actions1) - len(actions2)) > 2:
|
||||
return 0.0
|
||||
|
||||
# 2. Comparer action par action
|
||||
for i in range(min_len):
|
||||
# Type d'action identique → +1 point
|
||||
if action1.type == action2.type:
|
||||
matches += 1
|
||||
|
||||
# Même fenêtre → +0.5 point bonus
|
||||
if action1.window == action2.window:
|
||||
matches += 0.5
|
||||
|
||||
# 3. Score normalisé (0-1)
|
||||
return matches / (min_len * 1.5)
|
||||
```
|
||||
|
||||
### Détection de Workflow
|
||||
|
||||
```python
|
||||
def analyze_sessions(sessions):
|
||||
# 1. Prendre N sessions consécutives (N = min_repetitions)
|
||||
for i in range(len(sessions) - N + 1):
|
||||
session_group = sessions[i:i + N]
|
||||
|
||||
# 2. Calculer similarité moyenne
|
||||
similarity = calculate_session_similarity(session_group)
|
||||
|
||||
# 3. Si similarité >= 75% → Workflow !
|
||||
if similarity >= 0.75:
|
||||
workflow = create_workflow_from_sessions(session_group)
|
||||
|
||||
# 4. Vérifier si workflow existe déjà
|
||||
existing = find_existing_workflow(workflow)
|
||||
|
||||
if existing:
|
||||
# Mettre à jour
|
||||
existing.repetitions += 1
|
||||
existing.confidence += 0.05
|
||||
else:
|
||||
# Nouveau workflow
|
||||
workflows.append(workflow)
|
||||
on_workflow_detected(workflow)
|
||||
```
|
||||
|
||||
## 🎯 Configuration
|
||||
|
||||
Dans `config.py`, ajouter :
|
||||
|
||||
```python
|
||||
"workflow": {
|
||||
# Timeout de session (secondes)
|
||||
"session_timeout": 300, # 5 minutes
|
||||
|
||||
# Nombre minimum de répétitions pour détecter un workflow
|
||||
"min_repetitions": 3,
|
||||
|
||||
# Seuil de similarité pour considérer deux sessions comme identiques
|
||||
"similarity_threshold": 0.75 # 75%
|
||||
}
|
||||
```
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Test Basique
|
||||
|
||||
```python
|
||||
from core.event_capture import EventCapture
|
||||
from core.config import get_config
|
||||
|
||||
# Initialiser
|
||||
config = get_config()
|
||||
event_capture = EventCapture(
|
||||
logger=logger,
|
||||
pattern_threshold=3,
|
||||
config=config
|
||||
)
|
||||
|
||||
# Simuler des actions répétées
|
||||
for i in range(3):
|
||||
# Session 1
|
||||
event_capture.capture_event({
|
||||
"action_type": "click",
|
||||
"position": (100, 50),
|
||||
"window": "Desktop",
|
||||
"timestamp": datetime.now()
|
||||
})
|
||||
|
||||
event_capture.capture_event({
|
||||
"action_type": "type",
|
||||
"text": "office",
|
||||
"window": "Desktop",
|
||||
"timestamp": datetime.now()
|
||||
})
|
||||
|
||||
# Finaliser la session
|
||||
event_capture.force_finalize_session()
|
||||
|
||||
# Vérifier les workflows
|
||||
workflows = event_capture.get_workflows()
|
||||
print(f"Workflows détectés: {len(workflows)}")
|
||||
```
|
||||
|
||||
### Test Complet
|
||||
|
||||
Voir `test_workflow_suggestion.py` pour un test complet avec :
|
||||
- Création de 3 sessions similaires
|
||||
- Détection automatique de workflow
|
||||
- Suggestion basée sur le début d'un workflow
|
||||
|
||||
## 📈 Avantages
|
||||
|
||||
### Avant (Micro-Patterns)
|
||||
- ❌ Détecte seulement les clics répétés
|
||||
- ❌ Inutilisable en pratique
|
||||
- ❌ Ne correspond pas à l'usage réel
|
||||
|
||||
### Après (Macro-Workflows)
|
||||
- ✅ Détecte les workflows complets
|
||||
- ✅ Utilisable en pratique
|
||||
- ✅ Correspond à l'usage réel
|
||||
- ✅ Vrai RPA Vision !
|
||||
|
||||
## 🚀 Prochaines Étapes
|
||||
|
||||
### Court Terme
|
||||
1. ✅ ~~Créer SessionManager~~ **Fait !**
|
||||
2. ✅ ~~Créer WorkflowDetector~~ **Fait !**
|
||||
3. ✅ ~~Intégrer dans EventCapture~~ **Fait !**
|
||||
4. 🔄 **Tester avec workflow réel** (OnlyOffice)
|
||||
5. 🔄 **Ajuster les seuils** si nécessaire
|
||||
|
||||
### Moyen Terme
|
||||
6. Intégrer dans SuggestionManager
|
||||
7. Afficher suggestions de workflow dans la GUI
|
||||
8. Permettre l'exécution de workflows complets
|
||||
|
||||
### Long Terme
|
||||
9. Apprentissage des variations de workflows
|
||||
10. Workflows conditionnels (if/else)
|
||||
11. Workflows avec boucles
|
||||
|
||||
## 📝 Exemple Concret
|
||||
|
||||
### Scénario : Ouvrir OnlyOffice
|
||||
|
||||
**Jour 1 - 10h00** :
|
||||
```
|
||||
Session 1:
|
||||
1. Clic sur lanceur (100, 50)
|
||||
2. Type "office"
|
||||
3. Clic sur OnlyOffice (150, 100)
|
||||
4. Clic "Nouveau document" (200, 150)
|
||||
```
|
||||
|
||||
**Jour 2 - 14h30** :
|
||||
```
|
||||
Session 2:
|
||||
1. Clic sur lanceur (100, 50)
|
||||
2. Type "office"
|
||||
3. Clic sur OnlyOffice (150, 100)
|
||||
4. Clic "Nouveau document" (200, 150)
|
||||
```
|
||||
|
||||
**Jour 3 - 16h00** :
|
||||
```
|
||||
Session 3:
|
||||
1. Clic sur lanceur (100, 50)
|
||||
2. Type "office"
|
||||
3. Clic sur OnlyOffice (150, 100)
|
||||
4. Clic "Nouveau document" (200, 150)
|
||||
```
|
||||
|
||||
**Résultat** :
|
||||
```
|
||||
🎉 Workflow détecté !
|
||||
Nom: "Click → Type → Click (+ 1 étapes)"
|
||||
Répétitions: 3x
|
||||
Confiance: 80%
|
||||
Étapes: 4
|
||||
```
|
||||
|
||||
**Jour 4 - Suggestion** :
|
||||
```
|
||||
Utilisateur fait:
|
||||
1. Clic sur lanceur
|
||||
2. Type "office"
|
||||
|
||||
Système détecte:
|
||||
"Tu es au début du workflow 'Ouvrir OnlyOffice'"
|
||||
|
||||
Suggestion:
|
||||
"Je peux continuer ce workflow pour toi ?"
|
||||
[Oui] [Non] [Corriger]
|
||||
```
|
||||
|
||||
## ✅ Checklist d'Implémentation
|
||||
|
||||
- [x] Créer `SessionManager`
|
||||
- [x] Créer `WorkflowDetector`
|
||||
- [x] Ajouter imports dans `EventCapture`
|
||||
- [x] Connecter les callbacks
|
||||
- [x] Ajouter méthodes publiques
|
||||
- [x] Corriger les appels de méthodes
|
||||
- [x] Ajouter `capture_event()` pour tests
|
||||
- [ ] Tester avec workflow réel
|
||||
- [ ] Ajuster les seuils
|
||||
- [ ] Intégrer dans SuggestionManager
|
||||
- [ ] Ajouter GUI pour workflows
|
||||
|
||||
## 🎊 Conclusion
|
||||
|
||||
Le système de détection de workflows est maintenant **implémenté** !
|
||||
|
||||
**Capacités** :
|
||||
- ✅ Segmentation en sessions
|
||||
- ✅ Détection de workflows répétés
|
||||
- ✅ Callbacks pour notifications
|
||||
- ✅ Statistiques complètes
|
||||
|
||||
**Prêt pour les tests ! 🚀**
|
||||
|
||||
---
|
||||
|
||||
**Implémenté le 19 Novembre 2025**
|
||||
Reference in New Issue
Block a user