File size: 3,252 Bytes
3e66fd0
8ab22e1
 
3e66fd0
 
 
46691cd
8ab22e1
3e66fd0
8ab22e1
 
 
 
 
 
46691cd
 
df72abf
46691cd
0021906
3e66fd0
46691cd
3e66fd0
 
 
 
 
 
 
46691cd
3e66fd0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8ab22e1
 
46691cd
0021906
 
 
 
 
 
 
46691cd
 
 
 
8ab22e1
 
 
 
 
 
3e66fd0
 
 
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
import os
import sys
import traceback
from fastapi import FastAPI
from pydantic import BaseModel
from llama_cpp import Llama
from huggingface_hub import hf_hub_download
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
REPO_ID = "oncu/Turkish-Llama-3-8B-function-calling-GGUF"
FILENAME = "turkish-llama-3-8b-function-calling.q8_0.gguf"
LOCAL_MODEL_PATH = f"/tmp/{FILENAME}"
HF_TOKEN = os.getenv("HF_TOKEN")  # ✅ Hugging Face Token (varsa)

# === System prompt (bizim test formatı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()
llm = None

class ChatRequest(BaseModel):
    prompt: str

@app.on_event("startup")
def load_model():
    global llm
    try:
        log("🚀 Uygulama başlatılıyor...")
        log("📥 Model indirme başlatılıyor...")

        model_path = hf_hub_download(
            repo_id=REPO_ID,
            filename=FILENAME,
            local_dir="/tmp",
            token=HF_TOKEN  # ✅ Eğer ortamda HF_TOKEN varsa kullan
        )
        log(f"✅ Model indirildi: {model_path}")

        log("📦 GGUF model yükleniyor...")
        llm = Llama(model_path=model_path, n_gpu_layers=-1, n_ctx=4096)
        log("✅ Model başarıyla yüklendi ve kullanılmaya hazır.")
        log("💡 Artık /chat endpoint'ine POST isteği gönderebilirsiniz.")
    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}'")
        prompt = f"{SYSTEM_PROMPT}\n\nKullanıcı: {req.prompt}\nAsistan:"
        log("🧠 LLM çağrısı başlatılıyor...")
        response = llm(prompt, max_tokens=512, stop=["Kullanıcı:", "Asistan:"], echo=False)
        answer = response["choices"][0]["text"].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"}