File size: 3,213 Bytes
3e66fd0 8ab22e1 7460785 3e66fd0 7460785 8ab22e1 3e66fd0 8ab22e1 46691cd 7460785 6557064 3e66fd0 7460785 3e66fd0 46691cd 3e66fd0 7460785 3e66fd0 7460785 8ab22e1 7460785 0021906 7460785 6557064 0021906 7460785 46691cd 8ab22e1 3e66fd0 8ab22e1 7460785 8ab22e1 de0a38c 7460785 6557064 7460785 8ab22e1 de0a38c 8ab22e1 3e66fd0 |
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 |
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: <cevap metni veya NONE>
#INTENT: <intent_adı> (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"}
|