File size: 4,976 Bytes
25e927f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""

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
        )
        
        # Sohbet anahtar kelimeleri
        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"
        }
        
        # Genel konular
        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()
        
        # Sohbet anahtar kelimelerini kontrol et
        chat_score = 0
        for keyword in self.chat_keywords:
            if keyword in query_lower:
                chat_score += 0.15
        
        # Genel konuları kontrol et
        for topic in self.general_topics:
            if topic in query_lower:
                chat_score += 0.1
        
        # Soru işaretleri ve konuşma ifadeleri
        if "?" in query or "nedir" in query_lower or "nasıl" in query_lower:
            chat_score += 0.2
        
        # Uzun açıklama gerektiren sorular
        if any(word in query_lower for word in ["açıkla", "anlat", "detay", "neden"]):
            chat_score += 0.25
        
        # Kısa ve basit sorular için yüksek skor
        if len(query.split()) <= 10:
            chat_score += 0.1
        
        # Maksimum 1.0 skor
        return min(chat_score, 1.0)
    
    async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
        """Sohbet işlemi"""
        try:
            # Sohbet için özel prompt
            prompt = self._build_chat_prompt(query, context)
            
            # Yanıt üretimi
            response = await self.generate_response(
                prompt,
                max_tokens=self.config.get("max_tokens", 1024),
                temperature=0.7  # Sohbet için orta temperature
            )
            
            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"""
        
        # Konuşma geçmişi
        history = context.get("history", [])
        
        # Temel prompt
        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



"""
        
        # Konuşma geçmişi varsa ekle
        if history:
            prompt += "Önceki konuşma:\n"
            for i, msg in enumerate(history[-3:]):  # Son 3 mesajı al
                prompt += f"{'Kullanıcı' if i % 2 == 0 else 'Asistan'}: {msg}\n"
            prompt += "\n"
        
        # Mevcut soru
        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()
        
        # Selamlama
        if any(word in query_lower for word in ["merhaba", "selam", "günaydın"]):
            return "greeting"
        
        # Soru
        if "?" in query or any(word in query_lower for word in ["nedir", "nasıl", "neden"]):
            return "question"
        
        # Duygusal
        if any(word in query_lower for word in ["üzgün", "mutlu", "kızgın", "heyecanlı"]):
            return "emotional"
        
        # Bilgi arama
        if any(word in query_lower for word in ["açıkla", "anlat", "öğren", "bilgi"]):
            return "information"
        
        # Varsayılan
        return "general"