checkmate-api / app.py
Artupak's picture
Update app.py
5043059 verified
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
from huggingface_hub import hf_hub_download
# pandas yerine scikit-learn'ün TF-IDF'i için gerekli olan diğer kütüphaneler de listelenmeli
import os
import numpy as np # olasılıklar için
# --- AYARLAR ---
# Modelin indirileceği depo (Sizin depo bilgileriniz)
HF_USERNAME = "Artupak"
REPO_NAME = "checkmate-rf-classifier"
MODEL_FILE = "checkmate_rf_model.joblib"
# --- Ayarlar Bitti ---
print("API Başlatılıyor...")
model = None
def load_model():
"""Modeli Hugging Face Hub'dan indirir ve yükler."""
global model
try:
print(f"{HF_USERNAME}/{REPO_NAME} deposundan {MODEL_FILE} indiriliyor...")
# NOT: Pipeline'ınızın içinde kullanılan tüm kütüphaneler (örneğin TfidfVectorizer)
# burada yüklü olmalıdır. joblib, pickle ile yüklediği objenin kütüphanelerini ister.
model_path = hf_hub_download(
repo_id=f"{HF_USERNAME}/{REPO_NAME}",
filename=MODEL_FILE
)
model = joblib.load(model_path)
print("Model başarıyla yüklendi.")
except Exception as e:
print(f"HATA: Model yüklenemedi: {e}")
app = FastAPI()
# API başladığında modeli yükle
@app.on_event("startup")
async def startup_event():
load_model()
# API'nin "canlı" olup olmadığını kontrol etmek için basit bir endpoint
@app.get("/")
def read_root():
return {"status": "CheckMate RF Sınıflandırma API Aktif", "model_loaded": model is not None}
# Tahmin için kullanılacak veri modelini tanımla (Giriş)
class PredictRequest(BaseModel):
text: str
# Çıktı için kullanılacak veri modelini tanımla (İstenen format)
class PredictResponse(BaseModel):
risk_type: str
message: str
# n8n'in çağıracağı ana tahmin endpoint'i
@app.post("/predict", response_model=PredictResponse)
def predict(request: PredictRequest):
if model is None:
# Eğer model yüklenemediyse istenen hata formatını döndür
return PredictResponse(
risk_type="ERROR",
message="Model yüklenemedi. Lütfen FastAPI loglarını kontrol edin."
)
input_text = [request.text]
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]
# prediction_label 0 (YALAN/DISINFORMATION) veya 1 (DOĞRU/NONE) olmalı.
# Bu mapping, modelinizin 0'ı neye karşılık getirdiğine bağlıdır.
# Genellikle 0 = Negatif (Yalan), 1 = Pozitif (Doğru) olarak kabul edilir.
# 2. Risk Tipini Belirle
if prediction_label == 1: # Varsayım: 1 = DOĞRU / RİSK YOK
risk_type = "NONE"
# Tahmin edilen skor, 1'in olasılığıdır
confidence_score = probabilities[1]
# 3. Mesajı Oluştur
message = f"Metin, modelimiz 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: # Varsayım: 0 = YALAN / DİSİNFORMASYON
risk_type = "DISINFORMATION"
# Tahmin edilen skor, 0'ın olasılığıdır
confidence_score = probabilities[0]
# 3. Mesajı Oluştur
message = f"Metin, modelimiz 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:
# Beklenmeyen bir etiket gelirse
risk_type = "ERROR"
message = "Model beklenmeyen bir etiket döndürdü."
# 4. İstenen Formatı 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)}"
)