Files
rpa_vision_v3/AGENT_CONVERSATIONNEL_VISION.md
Dom c6a857b96b Refactor: Renommer command_interface en agent_chat
- command_interface/ → agent_chat/
- Mise à jour run.sh (--chat au lieu de --command)
- Mise à jour documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:13:26 +01:00

649 lines
24 KiB
Markdown

# AGENT CONVERSATIONNEL RPA VISION V3
## Vision & Architecture
**Date**: 14 janvier 2026
**Statut**: Document de conception
**Objectif**: Piloter le système RPA par langage naturel
---
## 1. CONCEPT
Permettre aux utilisateurs de commander le système RPA en langage naturel :
```
👤 "Envoie les factures impayées de plus de 30 jours aux clients concernés"
🤖 Agent → Comprend l'intention
→ Trouve les workflows pertinents
→ Extrait les paramètres (30 jours)
→ Demande confirmation
→ Exécute et rapporte le résultat
```
---
## 2. CE QUI EXISTE DÉJÀ
### 2.1 Interface de Commande
| Composant | Fichier | Description |
|-----------|---------|-------------|
| **Command Interface** | `agent_chat/app.py` | Interface web style Spotlight avec WebSocket |
| **CLI** | `cli.py` | Ligne de commande (status, record, play, list) |
| **Agent Tray** | `agent_v0/tray_ui.py` | Application système tray |
### 2.2 Matching Sémantique (DÉJÀ IMPLÉMENTÉ)
**Fichier**: `core/workflow/semantic_matcher.py`
```python
class SemanticMatcher:
def find_workflow(self, user_query: str) -> WorkflowMatch:
"""
Trouve le workflow correspondant à une requête naturelle.
Retourne:
- workflow_id, workflow_name
- confidence score
- extracted_params (paramètres extraits de la phrase)
- match_reason
"""
```
**Fonctionnalités**:
- Matching par embeddings sémantiques
- Matching par mots-clés et tags
- Extraction automatique de paramètres
- Support multi-langue (FR/EN)
**Exemple**:
```python
matcher = SemanticMatcher("data/workflows")
result = matcher.find_workflow("facturer le client Acme")
# → workflow: "facturation_client"
# → params: {client: "Acme"}
# → confidence: 0.87
```
### 2.3 Intégration LLM/Ollama (DÉJÀ IMPLÉMENTÉ)
**Fichier**: `core/gpu/ollama_manager.py`
```python
class OllamaManager:
def __init__(self, model="qwen3-vl:8b"):
self.endpoint = "http://localhost:11434"
def load_model(self) -> bool
def unload_model(self) -> bool
def is_available() -> bool
```
### 2.4 Exécution de Workflows (DÉJÀ IMPLÉMENTÉ)
| Composant | Fichier | Rôle |
|-----------|---------|------|
| **ActionExecutor** | `core/execution/action_executor.py` | Exécute les actions individuelles |
| **WorkflowChainer** | `core/workflow/workflow_chainer.py` | Chaîne plusieurs workflows |
| **WorkflowPipeline** | `core/pipeline/workflow_pipeline.py` | Orchestration complète |
### 2.5 Composition Avancée (DÉJÀ IMPLÉMENTÉ)
**Fichier**: `core/workflow/composition_models.py`
- `ChainConfig` : Chaînage de workflows
- `LoopConfig` : Boucles paramétrées
- `BranchConfig` : Branchements conditionnels
- `TriggerConfig` : Déclencheurs programmés
- `ExecutionContext` : Contexte d'exécution
### 2.6 API REST (DÉJÀ IMPLÉMENTÉ)
**Fichier**: `server/api_core.py`
```
POST /api/core/capture → Capture d'écran
POST /api/core/detect → Détection UI
POST /api/core/embed → Génération embeddings
POST /api/core/match → Matching d'écran
```
---
## 3. ARCHITECTURE CIBLE
```
┌─────────────────────────────────────────────────────────────────┐
│ INTERFACES UTILISATEUR │
├─────────────┬─────────────┬─────────────┬─────────────┬─────────┤
│ Chat Web │ CLI │ Vocal │ API REST │ Tray │
│ (React) │ (existant) │ (Whisper) │ (existant) │(existant│
└──────┬──────┴──────┬──────┴──────┬──────┴──────┬──────┴────┬────┘
│ │ │ │ │
└─────────────┴─────────────┴─────────────┴───────────┘
┌───────────────────────────────────────────────────────┐
│ AGENT CONVERSATIONNEL │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Intent │ │ Workflow │ │ Parameter │ │
│ │ Parser │ │ Matcher │ │ Extractor │ │
│ │ (LLM) │ │ (existant) │ │ (existant) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └─────────────────┼─────────────────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Confirmation │ │ Context │ │ Response │ │
│ │ Loop │ │ Manager │ │ Generator │ │
│ │ (à faire) │ │ (existant) │ │ (LLM) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└────────────────────────┬───────────────────────────────┘
┌───────────────────────────────────────────────────────┐
│ MOTEUR D'EXÉCUTION │
│ (existant) │
│ │
│ ActionExecutor ← WorkflowChainer ← WorkflowPipeline │
│ │
└───────────────────────────────────────────────────────┘
```
---
## 4. COMPOSANTS À DÉVELOPPER
### 4.1 Intent Parser (NOUVEAU)
**Objectif**: Comprendre l'intention de l'utilisateur via LLM
```python
class IntentParser:
def __init__(self, ollama: OllamaManager):
self.ollama = ollama
def parse(self, user_input: str) -> Intent:
"""
Analyse l'entrée utilisateur et retourne l'intention.
Intents possibles:
- EXECUTE_WORKFLOW: Exécuter un workflow existant
- LIST_WORKFLOWS: Lister les workflows disponibles
- GET_STATUS: Obtenir le statut d'une exécution
- SCHEDULE_WORKFLOW: Planifier une exécution
- CHAIN_WORKFLOWS: Enchaîner plusieurs workflows
- HELP: Demander de l'aide
- CANCEL: Annuler une action en cours
"""
prompt = f"""
Analyse cette demande utilisateur et identifie l'intention.
Demande: "{user_input}"
Réponds en JSON:
{{
"intent": "EXECUTE_WORKFLOW|LIST_WORKFLOWS|...",
"confidence": 0.0-1.0,
"entities": {{...}}
}}
"""
response = self.ollama.generate(prompt)
return Intent.from_json(response)
```
### 4.2 Confirmation Loop (NOUVEAU)
**Objectif**: Demander confirmation avant actions critiques
```python
class ConfirmationLoop:
def __init__(self):
self.critical_actions = ["delete", "send", "execute", "modify"]
def needs_confirmation(self, workflow: Workflow, params: dict) -> bool:
"""Détermine si une confirmation est nécessaire."""
# Actions critiques
if any(action in workflow.name.lower() for action in self.critical_actions):
return True
# Beaucoup d'éléments impactés
if params.get("count", 0) > 10:
return True
return False
def generate_confirmation_message(self, workflow: Workflow, params: dict) -> str:
"""Génère le message de confirmation."""
return f"""
Je vais exécuter "{workflow.name}":
- Paramètres: {params}
- Éléments impactés: {params.get('count', 'inconnu')}
Confirmes-tu ? (oui/non)
"""
```
### 4.3 Response Generator (NOUVEAU)
**Objectif**: Générer des réponses naturelles
```python
class ResponseGenerator:
def __init__(self, ollama: OllamaManager):
self.ollama = ollama
def generate(self, execution_result: ExecutionResult, context: dict) -> str:
"""Génère une réponse naturelle à partir du résultat."""
if execution_result.status == "SUCCESS":
return self._success_response(execution_result)
elif execution_result.status == "FAILED":
return self._error_response(execution_result)
else:
return self._pending_response(execution_result)
def _success_response(self, result: ExecutionResult) -> str:
# Utiliser le LLM pour générer une réponse naturelle
prompt = f"""
Génère une réponse courte et naturelle pour ce résultat:
- Action: {result.action}
- Statut: Succès
- Détails: {result.details}
Exemple: "C'est fait ! 23 factures ont été envoyées."
"""
return self.ollama.generate(prompt)
```
### 4.4 Conversation Manager (NOUVEAU)
**Objectif**: Gérer le contexte de conversation multi-tours
```python
class ConversationManager:
def __init__(self):
self.history: List[Message] = []
self.context: dict = {}
self.pending_confirmation: Optional[PendingAction] = None
def add_message(self, role: str, content: str):
self.history.append(Message(role=role, content=content, timestamp=now()))
def get_context_for_llm(self) -> str:
"""Retourne le contexte pour le LLM."""
recent = self.history[-10:] # 10 derniers messages
return "\n".join([f"{m.role}: {m.content}" for m in recent])
def set_pending_confirmation(self, action: PendingAction):
self.pending_confirmation = action
def handle_confirmation_response(self, response: str) -> Optional[PendingAction]:
if response.lower() in ["oui", "yes", "ok", "confirme"]:
action = self.pending_confirmation
self.pending_confirmation = None
return action
elif response.lower() in ["non", "no", "annule", "cancel"]:
self.pending_confirmation = None
return None
```
---
## 5. FLUX DE CONVERSATION
### 5.1 Flux Standard
```
┌─────────────────────────────────────────────────────────────────┐
│ │
│ USER INPUT │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Intent Parser │ ──── "Quelle est l'intention ?" │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Workflow Matcher│ ──── "Quel workflow correspond ?" │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │Param Extractor │ ──── "Quels paramètres ?" │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Needs Confirm? │──YES─▶│ Ask User │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ NO │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Execute │◀─────│ User Confirms │ │
│ └────────┬────────┘ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │Response Generate│ ──── "Générer réponse naturelle" │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ USER OUTPUT │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 5.2 Exemple de Conversation
```
👤 User: "Facture les clients du secteur santé"
🤖 Agent:
[IntentParser] → Intent: EXECUTE_WORKFLOW
[WorkflowMatcher] → Match: "facturation_client" (confidence: 0.92)
[ParamExtractor] → Params: {secteur: "santé"}
[ConfirmationLoop] → Needs confirmation: YES (action critique)
🤖 Agent: "J'ai trouvé le workflow 'Facturation Client'.
Je vais facturer tous les clients du secteur Santé.
3 clients concernés. Je lance ?"
👤 User: "Oui vas-y"
🤖 Agent:
[ConversationManager] → Confirmation reçue
[ActionExecutor] → Execute workflow
[ResponseGenerator] → Generate response
🤖 Agent: "C'est fait ! 3 factures générées :
- Hôpital Saint-Louis : 12,450€
- Clinique du Parc : 8,200€
- Labo Médical Plus : 3,100€
Total : 23,750€"
```
---
## 6. INTÉGRATION AVEC L'EXISTANT
### 6.1 Points d'Intégration
| Nouveau Composant | S'intègre avec | Comment |
|-------------------|----------------|---------|
| IntentParser | OllamaManager | Utilise le LLM pour parser |
| ConversationManager | SemanticMatcher | Passe la query au matcher |
| ConfirmationLoop | WorkflowChainer | Intercepte avant exécution |
| ResponseGenerator | ExecutionResult | Transforme résultat en texte |
### 6.2 Fichiers à Créer
```
core/
└── agent/
├── __init__.py
├── intent_parser.py # Nouveau
├── confirmation_loop.py # Nouveau
├── response_generator.py # Nouveau
├── conversation_manager.py # Nouveau
└── conversational_agent.py # Nouveau (orchestrateur)
```
### 6.3 Classe Principale
```python
# core/agent/conversational_agent.py
class ConversationalAgent:
"""Agent conversationnel pour piloter RPA Vision."""
def __init__(self):
# Composants existants
self.ollama = OllamaManager()
self.matcher = SemanticMatcher("data/workflows")
self.executor = ActionExecutor()
self.chainer = WorkflowChainer()
# Nouveaux composants
self.intent_parser = IntentParser(self.ollama)
self.confirmation = ConfirmationLoop()
self.response_gen = ResponseGenerator(self.ollama)
self.conversation = ConversationManager()
async def process_message(self, user_input: str) -> str:
"""Traite un message utilisateur et retourne la réponse."""
# 1. Ajouter au contexte
self.conversation.add_message("user", user_input)
# 2. Vérifier si c'est une réponse à une confirmation
if self.conversation.pending_confirmation:
return await self._handle_confirmation(user_input)
# 3. Parser l'intention
intent = self.intent_parser.parse(user_input)
# 4. Router selon l'intention
if intent.type == "EXECUTE_WORKFLOW":
return await self._handle_execute(intent)
elif intent.type == "LIST_WORKFLOWS":
return await self._handle_list()
elif intent.type == "HELP":
return self._handle_help()
else:
return "Je n'ai pas compris. Peux-tu reformuler ?"
async def _handle_execute(self, intent: Intent) -> str:
# Trouver le workflow
match = self.matcher.find_workflow(intent.query)
if match.confidence < 0.5:
return f"Je n'ai pas trouvé de workflow correspondant à '{intent.query}'"
# Vérifier si confirmation nécessaire
if self.confirmation.needs_confirmation(match.workflow, match.params):
self.conversation.set_pending_confirmation(
PendingAction(workflow=match.workflow, params=match.params)
)
return self.confirmation.generate_confirmation_message(
match.workflow, match.params
)
# Exécuter directement
result = await self.executor.execute(match.workflow, match.params)
return self.response_gen.generate(result)
```
---
## 7. INTERFACES UTILISATEUR
### 7.1 Chat Web (Extension de agent_chat)
```javascript
// Extension de agent_chat/static/app.js
const ChatInterface = {
async sendMessage(text) {
const response = await fetch('/api/agent/chat', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: text})
});
return response.json();
},
displayMessage(role, content) {
const bubble = document.createElement('div');
bubble.className = `message ${role}`;
bubble.textContent = content;
chatContainer.appendChild(bubble);
}
};
```
### 7.2 CLI Conversationnel
```python
# Extension de cli.py
@click.command()
def chat():
"""Mode conversation avec l'agent."""
agent = ConversationalAgent()
print("🤖 Agent RPA Vision prêt. Tapez 'quit' pour quitter.")
while True:
user_input = input("\n👤 Vous: ")
if user_input.lower() in ['quit', 'exit', 'q']:
print("👋 Au revoir !")
break
response = asyncio.run(agent.process_message(user_input))
print(f"\n🤖 Agent: {response}")
```
### 7.3 API REST
```python
# Nouveaux endpoints dans server/api_core.py
@app.route('/api/agent/chat', methods=['POST'])
def agent_chat():
"""Endpoint pour conversation avec l'agent."""
data = request.json
message = data.get('message', '')
session_id = data.get('session_id', 'default')
# Récupérer ou créer l'agent pour cette session
agent = get_or_create_agent(session_id)
# Traiter le message
response = asyncio.run(agent.process_message(message))
return jsonify({
'response': response,
'session_id': session_id
})
```
---
## 8. FONCTIONNALITÉS AVANCÉES (FUTUR)
### 8.1 Apprentissage des Habitudes
```python
class HabitLearner:
"""Apprend les habitudes de l'utilisateur."""
def analyze_patterns(self) -> List[Suggestion]:
"""Analyse l'historique et suggère des automatisations."""
# "Tous les lundis à 9h tu lances le rapport RH"
# → Suggérer de planifier automatiquement
```
### 8.2 Composition Intelligente
```python
class WorkflowComposer:
"""Compose des workflows à partir d'objectifs."""
def compose_from_goal(self, goal: str) -> List[Workflow]:
"""
Décompose un objectif en séquence de workflows.
Exemple:
"Assure-toi que tous les clients sont facturés"
→ 1. Lister clients non facturés
→ 2. Générer factures
→ 3. Envoyer par email
→ 4. Mettre à jour le CRM
"""
```
### 8.3 Mode Vocal
```python
class VoiceInterface:
"""Interface vocale avec Whisper."""
def listen(self) -> str:
"""Écoute et transcrit."""
audio = self.record_audio()
return whisper.transcribe(audio)
def speak(self, text: str):
"""Synthèse vocale."""
tts.speak(text)
```
---
## 9. PLAN D'IMPLÉMENTATION
### Phase 1 : MVP Conversationnel (1-2 semaines)
- [ ] Créer `core/agent/` structure
- [ ] Implémenter `IntentParser` basique
- [ ] Implémenter `ConversationManager`
- [ ] Connecter avec `SemanticMatcher` existant
- [ ] Ajouter endpoint `/api/agent/chat`
- [ ] Tester avec CLI
### Phase 2 : Confirmation & Réponses (1 semaine)
- [ ] Implémenter `ConfirmationLoop`
- [ ] Implémenter `ResponseGenerator`
- [ ] Intégrer avec `WorkflowChainer`
- [ ] Tests end-to-end
### Phase 3 : Interface Chat Web (1 semaine)
- [ ] Étendre `agent_chat` avec chat
- [ ] UI React pour conversation
- [ ] Historique des conversations
- [ ] WebSocket pour temps réel
### Phase 4 : Fonctionnalités Avancées (2-3 semaines)
- [ ] Apprentissage des habitudes
- [ ] Composition intelligente
- [ ] Mode vocal (optionnel)
- [ ] Multi-utilisateurs
---
## 10. MÉTRIQUES DE SUCCÈS
| Métrique | Objectif | Mesure |
|----------|----------|--------|
| Taux de compréhension | >90% | Intents correctement parsés |
| Taux de matching | >85% | Workflows correctement trouvés |
| Temps de réponse | <2s | Latence moyenne |
| Satisfaction utilisateur | >4/5 | Feedback utilisateurs |
| Taux d'exécution réussie | >95% | Workflows exécutés sans erreur |
---
## CONCLUSION
L'agent conversationnel est une extension naturelle du système RPA Vision V3. Grâce aux composants déjà implémentés (SemanticMatcher, OllamaManager, ActionExecutor), le développement peut se concentrer sur :
1. **Intent Parser** : Comprendre les intentions
2. **Confirmation Loop** : Sécuriser les actions critiques
3. **Response Generator** : Réponses naturelles
4. **Conversation Manager** : Contexte multi-tours
**Estimation totale** : 4-6 semaines pour un MVP fonctionnel.
---
*Document de conception - À implémenter après les démos*