Artupak's picture
Update app.py
f85f9aa verified
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
from huggingface_hub import hf_hub_download
import pandas # Gerekli
import os
from typing import List
import numpy as np # Olasılıklar için eklendi
# --- AYARLAR (v2) ---
# Modelin indirileceği YENİ v2 deposu
HF_USERNAME = "Artupak"
REPO_NAME = "checkmate-rf-classifier-v2" # <-- GÜNCELLENDİ
MODEL_FILE = "checkmate_rf_model.joblib"
# --- Ayarlar Bitti ---
print("API v2 Başlatılıyor...")
model = None
def load_model():
global model
try:
print(f"{HF_USERNAME}/{REPO_NAME} deposundan {MODEL_FILE} indiriliyor...")
model_path = hf_hub_download(
repo_id=f"{HF_USERNAME}/{REPO_NAME}",
filename=MODEL_FILE
)
model = joblib.load(model_path)
print("Model v2 başarıyla yüklendi.")
except Exception as e:
print(f"HATA: Model yüklenemedi: {e}")
app = FastAPI()
@app.on_event("startup")
async def startup_event():
load_model()
@app.get("/")
def read_root():
return {"status": "CheckMate API (v2 - Akıllı Model) Aktif", "model_loaded": model is not None}
# GİRİŞ MODELİ (messages listesi bekler)
class PredictRequest(BaseModel):
messages: List[str]
# ÇIKIŞ MODELİ (İstenen format)
class PredictResponse(BaseModel):
risk_type: str
message: str
# n8n'in çağıracağı ana tahmin endpoint'i
@app.post("/predict", response_model=PredictResponse) # response_model ile çıktı formatı garanti edildi
def predict(request: PredictRequest):
if model is None:
# Hata durumunda istenen formatı döndür
return PredictResponse(
risk_type="ERROR",
message="Model yüklenemedi. Lütfen FastAPI loglarını kontrol edin."
)
if not request.messages:
# Hata durumunda istenen formatı döndür
# Hata mesajı güncellendi: Kullanıcıya doğru format hatırlatılıyor
return PredictResponse(
risk_type="ERROR",
message="Boş 'messages' listesi alındı. Lütfen JSON gövdesini {'messages': ['metin']} formatında gönderin."
)
# V2, liste içinden ilk mesajı alır
input_text = [request.messages[0]]
try:
# 1. Tahmin ve Güven Skorunu Al
prediction_label = model.predict(input_text)[0] # 0 veya 1
probabilities = model.predict_proba(input_text)[0]
# 2. Risk Tipini Belirle
# Varsayım: 1 = DOĞRU / RİSK YOK (NONE); 0 = YALAN / DİSİNFORMASYON
if prediction_label == 1:
risk_type = "NONE"
confidence_score = probabilities[1]
message = f"Metin, v2 modeli tarafından %{confidence_score * 100:.2f} güvenle herhangi bir risk taşımayan (DOĞRU) bilgi olarak sınıflandırılmıştır."
elif prediction_label == 0:
risk_type = "DISINFORMATION"
confidence_score = probabilities[0]
message = f"Metin, v2 modeli tarafından %{confidence_score * 100:.2f} güvenle DİSİNFORMASYON riski taşıyan (YALAN) bilgi olarak sınıflandırılmıştır."
else:
risk_type = "ERROR"
message = "Model beklenmeyen bir etiket döndürdü."
# 4. İstenen PredictResponse Formatını Döndür
return PredictResponse(
risk_type=risk_type,
message=message
)
except Exception as e:
# Tahmin sırasında bir hata oluşursa istenen hata formatını döndür
return PredictResponse(
risk_type="ERROR",
message=f"Tahmin sırasında bir hata oluştu: {str(e)}"
)