| """
|
| CRANE AI - Sohbet Modülü
|
| """
|
|
|
| from typing import Dict, Any
|
| from core.base_module import BaseMicroModule
|
| import logging
|
|
|
| logger = logging.getLogger(__name__)
|
|
|
| class ChatModule(BaseMicroModule):
|
| """Genel sohbet için özelleşmiş modül"""
|
|
|
| def __init__(self, config: Dict[str, Any]):
|
| super().__init__(
|
| model_id="Qwen/Qwen2.5-1.5B-Instruct",
|
| config=config
|
| )
|
|
|
|
|
| self.chat_keywords = {
|
| "merhaba", "selam", "nasılsın", "naber", "günaydın",
|
| "iyi akşamlar", "hoş geldin", "sohbet", "konuş",
|
| "anlat", "düşün", "fikir", "görüş", "yardım",
|
| "açıkla", "izah", "detay", "örnek", "hikaye"
|
| }
|
|
|
|
|
| self.general_topics = {
|
| "hava", "spor", "müzik", "film", "kitap", "yemek",
|
| "seyahat", "hobiler", "oyun", "teknoloji", "tarih",
|
| "kültür", "sanat", "bilim", "doğa", "eğitim"
|
| }
|
|
|
| def can_handle(self, query: str, context: Dict[str, Any]) -> float:
|
| """Sohbet sorguları için uygunluk skoru"""
|
| query_lower = query.lower()
|
|
|
|
|
| chat_score = 0
|
| for keyword in self.chat_keywords:
|
| if keyword in query_lower:
|
| chat_score += 0.15
|
|
|
|
|
| for topic in self.general_topics:
|
| if topic in query_lower:
|
| chat_score += 0.1
|
|
|
|
|
| if "?" in query or "nedir" in query_lower or "nasıl" in query_lower:
|
| chat_score += 0.2
|
|
|
|
|
| if any(word in query_lower for word in ["açıkla", "anlat", "detay", "neden"]):
|
| chat_score += 0.25
|
|
|
|
|
| if len(query.split()) <= 10:
|
| chat_score += 0.1
|
|
|
|
|
| return min(chat_score, 1.0)
|
|
|
| async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
| """Sohbet işlemi"""
|
| try:
|
|
|
| prompt = self._build_chat_prompt(query, context)
|
|
|
|
|
| response = await self.generate_response(
|
| prompt,
|
| max_tokens=self.config.get("max_tokens", 1024),
|
| temperature=0.7
|
| )
|
|
|
| return {
|
| "response": response,
|
| "module": "chat_module",
|
| "confidence": self.can_handle(query, context),
|
| "conversation_type": self._detect_conversation_type(query)
|
| }
|
|
|
| except Exception as e:
|
| logger.error(f"Chat processing error: {str(e)}")
|
| return {
|
| "error": str(e),
|
| "module": "chat_module"
|
| }
|
|
|
| def _build_chat_prompt(self, query: str, context: Dict[str, Any]) -> str:
|
| """Sohbet için prompt hazırlar"""
|
|
|
|
|
| history = context.get("history", [])
|
|
|
|
|
| prompt = f"""Sen yardımsever, dostane ve zeki bir asistansın. Kullanıcılarla doğal bir şekilde sohbet ediyorsun.
|
|
|
| Özellikler:
|
| - Türkçe konuşuyorsun
|
| - Samimi ve dostane bir ton kullanıyorsun
|
| - Bilgilendirici ama sıkıcı olmayan yanıtlar veriyorsun
|
| - Kullanıcının duygusal durumunu anlıyorsun
|
|
|
| """
|
|
|
|
|
| if history:
|
| prompt += "Önceki konuşma:\n"
|
| for i, msg in enumerate(history[-3:]):
|
| prompt += f"{'Kullanıcı' if i % 2 == 0 else 'Asistan'}: {msg}\n"
|
| prompt += "\n"
|
|
|
|
|
| prompt += f"Kullanıcı: {query}\nAsistan:"
|
|
|
| return prompt
|
|
|
| def _detect_conversation_type(self, query: str) -> str:
|
| """Konuşma türünü tespit eder"""
|
| query_lower = query.lower()
|
|
|
|
|
| if any(word in query_lower for word in ["merhaba", "selam", "günaydın"]):
|
| return "greeting"
|
|
|
|
|
| if "?" in query or any(word in query_lower for word in ["nedir", "nasıl", "neden"]):
|
| return "question"
|
|
|
|
|
| if any(word in query_lower for word in ["üzgün", "mutlu", "kızgın", "heyecanlı"]):
|
| return "emotional"
|
|
|
|
|
| if any(word in query_lower for word in ["açıkla", "anlat", "öğren", "bilgi"]):
|
| return "information"
|
|
|
|
|
| return "general" |