File size: 12,281 Bytes
946b866
3ffc027
946b866
3ffc027
946b866
 
 
 
 
 
 
3ffc027
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffc027
946b866
 
3ffc027
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffc027
946b866
 
3ffc027
946b866
 
 
 
 
 
3ffc027
 
946b866
3ffc027
 
 
 
946b866
3ffc027
946b866
 
 
3ffc027
 
 
946b866
 
3ffc027
 
 
 
 
946b866
3ffc027
946b866
 
3ffc027
 
946b866
 
 
 
 
 
 
3ffc027
946b866
3ffc027
946b866
 
3ffc027
946b866
 
 
 
3ffc027
 
946b866
 
 
 
 
 
 
 
3ffc027
 
946b866
 
 
 
 
 
 
 
 
3ffc027
 
 
 
 
 
 
946b866
 
 
 
 
 
 
 
 
3ffc027
 
 
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffc027
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffc027
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ffc027
946b866
 
 
 
 
 
 
 
3ffc027
946b866
3ffc027
946b866
 
 
 
 
 
3ffc027
946b866
3ffc027
946b866
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
"""

🚀 Nova AI - Hugging Face Spaces ZeroGPU

Teknova tarafından geliştirilen özgün yapay zeka modeli

ZeroGPU ile hızlandırılmış

"""

import gradio as gr
import torch
import os
import logging
import time
import spaces
from typing import List, Tuple

# Logging setup
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Global variables
model = None
tokenizer = None
device = "cuda" if torch.cuda.is_available() else "cpu"

def load_demo_responses():
    """

    Demo yanıtları - model yokken kullanılacak

    """
    demo_responses = {
        "merhaba": "Merhaba! Ben Nova AI, Teknova'nın özgün yapay zeka teknolojisi. Size nasıl yardımcı olabilirim?",
        "nasılsın": "Ben Nova AI'yım ve harika hissediyorum! Sizinle sohbet etmek için buradayım. Ne konuşmak istersiniz?",
        "nova ai nedir": "Nova AI, Teknova tarafından geliştirilen özgün bir yapay zeka modelidir. Türkçe konuşabilir ve çeşitli konularda yardımcı olabilirim.",
        "teknova": "Teknova, Türkiye'nin öncü yapay zeka teknoloji şirketidir. Özgün AI çözümleri geliştiriyoruz.",
        "yapay zeka": "Yapay zeka, bilgisayarların insan benzeri düşünme ve öğrenme yetenekleri göstermesidir. Ben de bir yapay zeka örneğiyim!",
        "projeler": "Size yenilikçi proje fikirleri önerebilirim: AI chatbot, veri analizi, web uygulaması, mobil uygulama gibi...",
        "gelecek": "Gelecekte yapay zeka, otonom araçlar, akıllı şehirler ve personalize eğitim gibi alanlarda devrim yaratacak!"
    }
    return demo_responses

def generate_demo_response(message: str) -> str:
    """

    Demo yanıt oluştur (model olmadığında)

    """
    message_lower = message.lower().strip()
    demo_responses = load_demo_responses()
    
    # Exact match
    if message_lower in demo_responses:
        return demo_responses[message_lower]
    
    # Partial match
    for key, response in demo_responses.items():
        if key in message_lower:
            return response
    
    # Default responses
    if "?" in message:
        return f"'{message}' hakkında çok ilginç bir soru sordunuz! Nova AI olarak elimden geldiğince yardımcı olmaya çalışırım. Bu konuda daha spesifik sorular sorabilirsiniz."
    
    return f"Nova AI burada! '{message}' konusunda konuşmak güzel. Size nasıl yardımcı olabilirim? Daha detaylı sorular sorabilirsiniz."

def chat_response(message: str, history: List[List[str]], max_length: int, temperature: float) -> Tuple[str, List[List[str]]]:
    """

    Chat response function

    """
    if not message.strip():
        return "", history
    
    # Simulate thinking time
    time.sleep(0.5)
    
    # Generate response
    if model and tokenizer:
        # Gerçek model ile yanıt (model yüklü ise)
        try:
            response = generate_real_response(message, max_length, temperature)
        except Exception as e:
            response = f"Model hatası: {str(e)} - Demo moduna geçiliyor..."
            response += "\n\n" + generate_demo_response(message)
    else:
        # Demo yanıt
        response = generate_demo_response(message)
        response += "\n\n💡 *Not: Bu demo modunda çalışıyor. Gerçek Nova AI modeli yüklendiğinde daha gelişmiş yanıtlar alacaksınız.*"
    
    # Add to history
    history.append([message, response])
    return "", history

@spaces.GPU
def generate_real_response(message: str, max_length: int, temperature: float) -> str:
    """

    Gerçek model ile yanıt oluştur - ZeroGPU destekli

    """
    if not model or not tokenizer:
        return generate_demo_response(message)
    
    try:
        inputs = tokenizer.encode(message, return_tensors="pt")
        if device == "cuda":
            inputs = inputs.to(device)
        
        with torch.no_grad():
            outputs = model.generate(
                inputs,
                max_length=max_length,
                temperature=temperature,
                do_sample=True,
                pad_token_id=tokenizer.eos_token_id,
                no_repeat_ngram_size=3,
                top_p=0.9
            )
        
        response = tokenizer.decode(outputs[0], skip_special_tokens=True)
        if message in response:
            response = response.replace(message, "").strip()
        
        return response if response else generate_demo_response(message)
        
    except Exception as e:
        logger.error(f"Model generation error: {e}")
        return generate_demo_response(message)

@spaces.GPU
def load_model():
    """

    Teknova Nova AI modelini yükle - ZeroGPU destekli

    """
    global model, tokenizer
    
    try:
        from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
        
        # Model path - Local model kullan
        model_path = "./nova-ai-small"
        
        # Eğer local model yoksa, demo modunda çalış
        if not os.path.exists(model_path):
            logger.info("⚠️ Local model bulunamadı, demo modunda çalışacak")
            return "⚠️ Demo modunda çalışıyor"
        
        logger.info(f"🚀 Teknova Nova AI modeli yükleniyor: {model_path}")
        
        # Tokenizer yükle
        tokenizer = AutoTokenizer.from_pretrained(
            model_path, 
            trust_remote_code=True,
            use_fast=True
        )
        
        # Pad token ayarla
        if tokenizer.pad_token is None:
            tokenizer.pad_token = tokenizer.eos_token
        
        # Model yükle - ZeroGPU optimizasyonu
        model = AutoModelForCausalLM.from_pretrained(
            model_path,
            device_map="auto",
            trust_remote_code=True,
            torch_dtype=torch.float16,
            low_cpu_mem_usage=True
        )
        
        logger.info(f"✅ Nova AI model yüklendi ({device})")
        return f"✅ Teknova Nova AI hazır! ({device})"
        
    except Exception as e:
        logger.error(f"Model yükleme hatası: {e}")
        return f"❌ Model yüklenemedi: {str(e)} - Demo modunda çalışacak"

@spaces.GPU
def chat_with_nova(message: str, history: List[Tuple[str, str]]) -> str:
    """

    Nova AI ile sohbet et - ZeroGPU destekli

    """
    global model, tokenizer
    
    if model is None or tokenizer is None:
        # Demo yanıt ver
        return generate_demo_response(message) + "\n\n💡 *Not: Demo modunda çalışıyor.*"
    
    if not message.strip():
        return "❓ Lütfen bir mesaj yazın."
    
    try:
        # Konuşma geçmişini hazırla
        conversation = ""
        for user_msg, bot_msg in history:
            if user_msg and bot_msg:
                conversation += f"Kullanıcı: {user_msg}\nNova AI: {bot_msg}\n"
        
        # Yeni mesajı ekle
        conversation += f"Kullanıcı: {message}\nNova AI:"
        
        # Tokenize et
        inputs = tokenizer(
            conversation, 
            return_tensors="pt", 
            truncation=True, 
            max_length=2048,
            padding=True
        )
        
        # GPU'ya taşı
        if torch.cuda.is_available():
            inputs = {k: v.to(model.device) for k, v in inputs.items()}
        
        # Yanıt üret
        with torch.no_grad():
            outputs = model.generate(
                **inputs,
                max_new_tokens=256,
                temperature=0.7,
                top_p=0.9,
                do_sample=True,
                pad_token_id=tokenizer.pad_token_id,
                eos_token_id=tokenizer.eos_token_id,
                repetition_penalty=1.1
            )
        
        # Yanıtı decode et
        response = tokenizer.decode(outputs[0], skip_special_tokens=True)
        
        # Sadece yeni üretilen kısmı al
        new_response = response[len(conversation):].strip()
        
        return new_response if new_response else "Üzgünüm, yanıt üretemedi."
        
    except Exception as e:
        logger.error(f"Chat hatası: {e}")
        return f"❌ Yanıt üretirken hata: {str(e)}"

# Model yüklemeyi başlat
logger.info("Model yükleme başlatılıyor...")
load_status = load_model()
logger.info(f"Model durumu: {load_status}")

# Gradio arayüzü
with gr.Blocks(
    theme=gr.themes.Soft(),
    title="Teknova Nova AI - ZeroGPU",
    css="""

    .gradio-container {

        max-width: 900px;

        margin: 0 auto;

    }

    .header-text {

        text-align: center;

        padding: 20px;

        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

        color: white;

        border-radius: 15px;

        margin-bottom: 20px;

    }

    """
) as demo:
    
    # Header
    gr.HTML("""

    <div class="header-text">

        <h1 style="font-size: 2.5rem; margin: 0; font-weight: bold;">

            🚀 Teknova Nova AI

        </h1>

        <p style="font-size: 1.2rem; margin: 10px 0; opacity: 0.9;">

            Türkiye'nin Özgün Yapay Zeka Modeli

        </p>

        <div style="background: rgba(255,255,255,0.2); padding: 8px 16px; border-radius: 20px; display: inline-block; font-size: 0.9rem;">

            🧠 Nova AI • 🇹�� Türkçe Optimize • ⚡ ZeroGPU Hızlı

        </div>

    </div>

    """)
    
    # Chat interface
    chatbot = gr.Chatbot(
        height=500,
        show_label=False,
        show_share_button=True,
        show_copy_button=True,
        avatar_images=[None, "🤖"],
        bubble_full_width=False
    )
    
    with gr.Row():
        msg = gr.Textbox(
            placeholder="Nova AI'ya mesajınızı yazın... (Örn: Merhaba, nasılsın?)",
            show_label=False,
            scale=4,
            container=False
        )
        submit = gr.Button("🚀 Gönder", scale=1, variant="primary")
    
    with gr.Row():
        clear = gr.Button("🗑️ Temizle", scale=1)
        retry = gr.Button("🔄 Tekrar Dene", scale=1)
    
    # Examples
    gr.Examples(
        examples=[
            "Merhaba Nova AI, nasılsın?",
            "Yapay zeka nedir?",
            "Teknova hakkında bilgi ver",
            "Bana bir hikaye anlat",
            "Python programlama hakkında bilgi ver"
        ],
        inputs=msg,
        label="💡 Örnek Sorular"
    )
    
    # Footer
    gr.HTML("""

    <div style="text-align: center; padding: 15px; color: #666; font-size: 0.9rem;">

        <p>🌟 <strong>Teknova Nova AI</strong> - Tamamen özgün Türkçe dil modeli</p>

        <p>🚀 ZeroGPU teknolojisi ile hızlandırılmış</p>

        <p style="color: #999;">⚡ Teknova Innovation ile güçlendirilmiştir</p>

    </div>

    """)
    
    # Event handlers
    def user_message(message, history):
        return "", history + [[message, None]]
    
    @spaces.GPU
    def bot_message(history):
        """Bot yanıtı oluştur - ZeroGPU destekli"""
        if history and history[-1][1] is None:
            user_msg = history[-1][0]
            bot_response = chat_with_nova(user_msg, history[:-1])
            history[-1][1] = bot_response
        return history
    
    @spaces.GPU
    def retry_last(history):
        """Son mesajı yeniden dene - ZeroGPU destekli"""
        if history and history[-1][1] is not None:
            user_msg = history[-1][0]
            bot_response = chat_with_nova(user_msg, history[:-1])
            history[-1][1] = bot_response
        return history
    
    # Event bindings
    msg.submit(user_message, [msg, chatbot], [msg, chatbot], queue=False).then(
        bot_message, chatbot, chatbot
    )
    submit.click(user_message, [msg, chatbot], [msg, chatbot], queue=False).then(
        bot_message, chatbot, chatbot
    )
    clear.click(lambda: None, None, chatbot, queue=False)
    retry.click(retry_last, chatbot, chatbot)

# Launch
if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=False,
        show_error=True
    )