import os import sys import traceback import json from fastapi import FastAPI from pydantic import BaseModel from unsloth import FastLanguageModel from transformers import pipeline from datetime import datetime # === 🕒 Zamanlı log fonksiyonu def log(message): timestamp = datetime.now().strftime("%H:%M:%S") line = f"[{timestamp}] {message}" print(line, flush=True) # === Model bilgileri MODEL_NAME = "atasoglu/Turkish-Llama-3-8B-function-calling" HF_TOKEN = os.getenv("HF_TOKEN") # === System prompt (bizim intent yapımız) SYSTEM_PROMPT = """ Siz bir görev tabanlı asistan botsunuz. Kullanıcının doğal dildeki mesajlarını anlayabilir, niyetlerini (intent) tespit edebilir, eksik bilgileri sorabilir ve backend API'lerine tetikleme hazırlığı yapabilirsiniz. ❗ Cevaplarınızda mutlaka aşağıdaki formatlı blokları döndürmelisiniz ve bunların dışında hiçbir metin, açıklama veya selamlama eklememelisiniz. ✅ Format: #ANSWER: #INTENT: (veya NONE) #PARAMS: {parametre_adı: değer, ...} #MISSING: [eksik_parametre_adı, ...] #ACTION_JSON: {api için gönderilecek json, eksikse boş bırak} ✅ Desteklenen intent'ler: - doviz-kuru-intent → parametre: currency (dolar, euro, TL) - yol-durumu-intent → parametreler: from_location, to_location (Ankara, İstanbul, İzmir) - hava-durumu-intent → parametre: city (Ankara, İstanbul, İzmir) ❗ Kullanıcıya hitap ederken formal bir dil kullanınız, sadece bu formatlı blokları döndürünüz. """ app = FastAPI() model = None tokenizer = None pipe = None class ChatRequest(BaseModel): prompt: str @app.on_event("startup") def load_model(): global model, tokenizer, pipe try: log("🚀 Uygulama başlatılıyor...") log("📥 Model yüklemesi başlatılıyor...") model, tokenizer = FastLanguageModel.from_pretrained( model_name=MODEL_NAME, load_in_4bit=True, token=HF_TOKEN ) FastLanguageModel.for_inference(model) pipe = pipeline( "text-generation", model=model, tokenizer=tokenizer, device_map="auto" ) log("✅ Model başarıyla yüklendi ve kullanılmaya hazır.") except Exception as e: log(f"❌ Model yükleme hatası: {e}") traceback.print_exc() sys.exit(1) @app.post("/chat") def chat(req: ChatRequest): try: log(f"💬 Yeni istek alındı: '{req.prompt}'") full_prompt = f"{SYSTEM_PROMPT}\n\nKullanıcı: {req.prompt}\nAsistan:" log("🧠 LLM çağrısı başlatılıyor...") outputs = pipe( full_prompt, max_new_tokens=256, temperature=0.2, top_p=0.95, repetition_penalty=1.1 ) answer = outputs[0]["generated_text"].replace(full_prompt, "").strip() log("✅ LLM cevabı başarıyla alındı.") return {"response": answer} except Exception as e: log(f"❌ /chat sırasında hata oluştu: {e}") traceback.print_exc() return {"error": f"Hata: {str(e)}"} @app.get("/") def health(): return {"status": "ok"}