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"}