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