""" 🚀 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("""

🚀 Teknova Nova AI

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

🧠 Nova AI • 🇹�� Türkçe Optimize • ⚡ ZeroGPU Hızlı
""") # 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("""

🌟 Teknova Nova AI - Tamamen özgün Türkçe dil modeli

🚀 ZeroGPU teknolojisi ile hızlandırılmış

⚡ Teknova Innovation ile güçlendirilmiştir

""") # 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 )