Spaces:
Runtime error
Runtime error
File size: 8,340 Bytes
c6cade7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | #!/usr/bin/env python3
"""
Interface de Chat Avancée pour Barouia-Cortex
Gestion des conversations avec mémoire contextuelle
"""
import asyncio
import json
import logging
from typing import List, Dict, Any, Optional
from datetime import datetime
class ChatInterface:
"""
Gère les interactions conversationnelles avec Barouia-Cortex
"""
def __init__(self, cortex):
self.cortex = cortex
self.logger = logging.getLogger("chat_interface")
self.conversation_context = {}
self.user_profiles = {}
async def process_message(self, message: str, history: List[List[str]]) -> str:
"""
Traite un message utilisateur et retourne une réponse
"""
self.logger.info(f"📨 Message reçu: {message}")
try:
# Construction du contexte
context = await self._build_context(message, history)
# Traitement par le cortex
response = await self.cortex.process(message, context)
# Formatage de la réponse
formatted_response = self._format_response(response, message)
# Mise à jour du contexte
await self._update_conversation_context(message, formatted_response, response)
self.logger.info("✅ Réponse générée avec succès")
return formatted_response
except Exception as e:
self.logger.error(f"❌ Erreur de traitement: {e}")
return self._create_error_response(e)
async def _build_context(self, message: str, history: List[List[str]]) -> Dict[str, Any]:
"""Construit le contexte de conversation"""
context = {
'timestamp': datetime.now().isoformat(),
'message_length': len(message),
'conversation_history': history[-5:], # Derniers 5 échanges
'user_intent': await self._analyze_user_intent(message),
'conversation_tone': await self._detect_conversation_tone(history),
'topics_discussed': await self._extract_topics(history),
'system_state': await self.cortex.get_system_status()
}
# Ajout du profil utilisateur si disponible
user_profile = self._get_user_profile(history)
if user_profile:
context['user_profile'] = user_profile
return context
async def _analyze_user_intent(self, message: str) -> str:
"""Analyse l'intention de l'utilisateur"""
message_lower = message.lower()
if any(word in message_lower for word in ['question', 'pourquoi', 'comment', 'quand']):
return 'information_seeking'
elif any(word in message_lower for word in ['aide', 'problème', 'souci']):
return 'help_request'
elif any(word in message_lower for word in ['créer', 'générer', 'inventer']):
return 'creative_request'
elif any(word in message_lower for word in ['analyse', 'évalue', 'pense']):
return 'analysis_request'
else:
return 'general_conversation'
async def _detect_conversation_tone(self, history: List[List[str]]) -> str:
"""Détecte le ton de la conversation"""
if not history:
return 'neutral'
# Analyse simplifiée du ton
last_messages = ' '.join([msg[0] for msg in history[-3:] if len(msg) > 0])
last_messages_lower = last_messages.lower()
if any(word in last_messages_lower for word in ['merci', 'super', 'génial']):
return 'positive'
elif any(word in last_messages_lower for word in ['probleme', 'erreur', 'fâché']):
return 'negative'
else:
return 'neutral'
async def _extract_topics(self, history: List[List[str]]) -> List[str]:
"""Extrait les topics principaux de la conversation"""
topics = []
for exchange in history[-5:]:
if exchange and len(exchange) > 0:
message = exchange[0].lower()
if 'ia' in message or 'intelligence' in message:
topics.append('artificial_intelligence')
if 'apprentissage' in message or 'apprendre' in message:
topics.append('learning')
if 'futur' in message or 'innovation' in message:
topics.append('innovation')
return list(set(topics)) # Déduplication
def _format_response(self, cortex_response: Dict, original_message: str) -> str:
"""Formate la réponse du cortex pour l'utilisateur"""
if cortex_response.get('error'):
return f"❌ Désolé, une erreur s'est produite: {cortex_response['response']}"
main_response = cortex_response['response']
confidence = cortex_response.get('confidence', 0.5)
# Ajout d'indicateurs de confiance
if confidence < 0.5:
confidence_indicator = "🤔 Je ne suis pas entièrement certain, mais "
elif confidence < 0.8:
confidence_indicator = "💡 Selon mon analyse, "
else:
confidence_indicator = "🎯 Je suis confiant que "
# Construction de la réponse formatée
formatted_parts = [f"{confidence_indicator}{main_response}"]
# Ajout d'alternatives créatives si disponibles
creative_alternatives = cortex_response.get('creative_alternatives', [])
if creative_alternatives and len(creative_alternatives) > 1:
formatted_parts.append("\n\n💡 **Autres perspectives:**")
for i, alt in enumerate(creative_alternatives[1:3], 1):
formatted_parts.append(f"{i}. {alt}")
# Ajout de métriques si demandé
if 'analyse' in original_message.lower() or 'métriques' in original_message.lower():
processing_time = cortex_response.get('processing_time', 0)
formatted_parts.append(
f"\n\n📊 **Métriques:** Confiance: {confidence:.0%} | "
f"Temps: {processing_time:.2f}s"
)
return ''.join(formatted_parts)
def _create_error_response(self, error: Exception) -> str:
"""Crée une réponse d'erreur conviviale"""
error_messages = [
"Je rencontre quelques difficultés techniques. Pouvez-vous reformuler votre demande?",
"Mon système cognitif rencontre un problème passager. Essayons à nouveau!",
"Désolé, j'ai besoin d'un moment pour me recalibrer. Pouvez-vous répéter?",
"Problème de connexion neuronale détecté. Réessayons cette interaction!"
]
import random
return f"🔄 {random.choice(error_messages)}\n\n*Erreur technique: {str(error)}*"
def _get_user_profile(self, history: List[List[str]]) -> Optional[Dict]:
"""Extrait le profil utilisateur de l'historique"""
if len(history) < 3:
return None
# Profil basique basé sur les interactions
return {
'interaction_count': len(history),
'preferred_topics': self._extract_topics(history),
'conversation_style': await self._detect_conversation_tone(history)
}
async def _update_conversation_context(self, message: str, response: str, cortex_data: Dict):
"""Met à jour le contexte de conversation"""
self.conversation_context.update({
'last_interaction': datetime.now().isoformat(),
'last_user_message': message,
'last_system_response': response,
'last_analysis': cortex_data.get('analysis', {}),
'interaction_quality': cortex_data.get('confidence', 0.5)
})
async def get_conversation_analytics(self) -> Dict[str, Any]:
"""Retourne des analytics sur la conversation"""
return {
'total_interactions': len(self.conversation_context.get('history', [])),
'average_confidence': self.conversation_context.get('average_confidence', 0),
'preferred_topics': self.conversation_context.get('topics', []),
'user_engagement': 'high' # À implémenter
} |