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