Initial commit

This commit is contained in:
Dom
2026-03-05 00:20:25 +01:00
commit dcd4de9945
1954 changed files with 669380 additions and 0 deletions

View File

@@ -0,0 +1,275 @@
# 🎮 Système de Rejeu de Tâches
## Vue d'ensemble
Le système de rejeu permet de **rejouer automatiquement des tâches apprises** en utilisant la reconnaissance visuelle pour localiser les éléments d'interface, même si leur position a changé.
## Architecture
```
TaskReplayEngine
├── Chargement de tâche (load_task)
├── Recherche visuelle (find_element_visually)
│ ├── Capture d'écran
│ ├── Génération d'embeddings
│ └── Recherche par similarité
├── Exécution d'action (execute_action_at_location)
│ ├── Click
│ ├── Type
│ ├── Scroll
│ └── Drag
└── Monitoring en temps réel
```
## Fonctionnalités
### 1. Rejeu Basique
```python
from core.task_replay import TaskReplayEngine
# Rejouer une tâche
results = await replay_engine.replay_task(
task_id="task_fc1d3e52",
interactive=False
)
print(f"Succès: {results['success']}")
print(f"Actions exécutées: {results['executed_actions']}")
```
### 2. Rejeu avec Monitoring
```python
def on_step_completed(step_result):
print(f"Étape {step_result['step']}: {step_result['status']}")
results = await replay_engine.replay_task_with_monitoring(
task_id="task_fc1d3e52",
on_step_completed=on_step_completed
)
```
### 3. Liste des Tâches Disponibles
```python
tasks = replay_engine.list_available_tasks()
for task in tasks:
print(f"{task['task_name']}: {task['observation_count']} observations")
```
## Reconnaissance Visuelle
### Recherche par Grille
Le système divise l'écran en grille et recherche l'élément dans chaque cellule :
```python
# Grille 4x4 par défaut
grid_size = 4
# Pour chaque cellule :
# 1. Extraire la région
# 2. Générer l'embedding CLIP
# 3. Calculer la similarité avec l'embedding cible
# 4. Retourner les meilleures correspondances
```
### Seuil de Similarité
```yaml
replay:
similarity_threshold: 0.75 # Minimum pour accepter une correspondance
max_search_attempts: 3 # Nombre de tentatives
```
## Types d'Actions Supportées
| Type | Description | Paramètres |
|------|-------------|------------|
| `click` | Clic souris | x, y, button |
| `type` | Saisie texte | text, interval |
| `scroll` | Défilement | direction, amount |
| `drag` | Glisser-déposer | start_x, start_y, end_x, end_y |
## Gestion des Variations d'Interface
### Adaptation Automatique
Le système s'adapte aux changements :
1. **Position différente** : Recherche visuelle localise l'élément
2. **Taille différente** : Utilise le centre de la région trouvée
3. **Style différent** : L'embedding CLIP capture la sémantique
### Retry et Fallback
```python
# Retry automatique si élément non trouvé
max_search_attempts = 3
# Délai entre tentatives
retry_delay = 0.5 # secondes
```
## Mode Interactif
En mode interactif, le système demande confirmation avant chaque action :
```python
results = await replay_engine.replay_task(
task_id="task_fc1d3e52",
interactive=True # Demande confirmation
)
```
## Résultats du Rejeu
```python
{
"task_id": "task_fc1d3e52",
"success": True,
"total_actions": 3,
"executed_actions": 3,
"failed_actions": 0,
"actions": [
{
"step": 1,
"success": True,
"location": {
"x": 640,
"y": 360,
"confidence": 0.89,
"bbox": [600, 340, 680, 380]
},
"action_type": "click"
},
# ...
]
}
```
## Logging
Tous les événements sont loggés :
```python
# Démarrage du rejeu
{"action": "task_replay_started", "task_id": "...", "interactive": False}
# Élément trouvé
{"action": "element_found", "similarity": 0.89, "attempt": 1}
# Élément non trouvé
{"action": "element_not_found", "step": 2, "signature": "..."}
# Rejeu terminé
{"action": "task_replay_completed", "success": True, "executed": 3, "failed": 0}
```
## Utilisation avec le CLI
```bash
# Lister les tâches disponibles
python test_task_replay.py
# Le script vous guidera pour :
# 1. Voir les tâches disponibles
# 2. Choisir une tâche
# 3. Rejouer avec monitoring en temps réel
```
## Exemple Complet
```python
import asyncio
from core.task_replay import TaskReplayEngine
from core.learning_manager import LearningManager
from core.embeddings_manager import EmbeddingsManager
from core.utils.vision_utils import VisionUtils
from core.utils.input_utils import InputUtils
from core.logger import Logger
from core.config import load_config
async def replay_example():
# Initialiser
config = load_config()
logger = Logger(config)
embeddings_manager = EmbeddingsManager(logger, config)
learning_manager = LearningManager(embeddings_manager, logger, config)
vision_utils = VisionUtils(logger, config)
input_utils = InputUtils(logger, config)
replay_engine = TaskReplayEngine(
learning_manager,
embeddings_manager,
vision_utils,
input_utils,
logger,
config
)
# Lister les tâches
tasks = replay_engine.list_available_tasks()
print(f"Tâches disponibles: {len(tasks)}")
# Rejouer la première tâche
if tasks:
task_id = tasks[0]['task_id']
results = await replay_engine.replay_task(task_id)
if results['success']:
print("✅ Tâche rejouée avec succès!")
else:
print(f"❌ Échec: {results['failed_actions']} actions échouées")
# Exécuter
asyncio.run(replay_example())
```
## Limitations Actuelles
1. **Recherche par grille** : Peut manquer des petits éléments entre les cellules
2. **Pas de détection d'objets** : Utilise uniquement CLIP pour la similarité
3. **Mode interactif basique** : Pas d'interface graphique pour la confirmation
## Améliorations Futures
- [ ] Recherche multi-échelle (grilles de différentes tailles)
- [ ] Intégration avec OWL-v2 pour détection précise
- [ ] Interface graphique pour le mode interactif
- [ ] Gestion des erreurs avec rollback automatique
- [ ] Support des actions conditionnelles
- [ ] Rejeu parallèle de plusieurs tâches
## Configuration
```yaml
replay:
similarity_threshold: 0.75 # Seuil de similarité minimum
max_search_attempts: 3 # Tentatives de recherche
delay_between_actions: 0.5 # Délai entre actions (secondes)
grid_size: 4 # Taille de la grille de recherche
```
## Dépendances
- `numpy` : Calculs d'embeddings
- `PIL` : Manipulation d'images
- `pyautogui` : Capture d'écran et contrôle souris/clavier
- `asyncio` : Exécution asynchrone
## Tests
```bash
# Test complet avec interface interactive
python test_task_replay.py
# Test programmatique
python -c "
import asyncio
from test_task_replay import test_list_tasks
asyncio.run(test_list_tasks())
"
```