Spaces:
Sleeping
Sleeping
| 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 | |
| async def startup_event(): | |
| load_model() | |
| # API'nin "canlı" olup olmadığını kontrol etmek için basit bir endpoint | |
| 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 | |
| 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)}" | |
| ) | |