Artupak commited on
Commit
5043059
·
verified ·
1 Parent(s): 1451ed3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -20
app.py CHANGED
@@ -2,8 +2,9 @@ from fastapi import FastAPI
2
  from pydantic import BaseModel
3
  import joblib
4
  from huggingface_hub import hf_hub_download
5
- import pandas # scikit-learn'ün TF-IDF'i için gerekli
6
  import os
 
7
 
8
  # --- AYARLAR ---
9
  # Modelin indirileceği depo (Sizin depo bilgileriniz)
@@ -20,6 +21,8 @@ def load_model():
20
  global model
21
  try:
22
  print(f"{HF_USERNAME}/{REPO_NAME} deposundan {MODEL_FILE} indiriliyor...")
 
 
23
  model_path = hf_hub_download(
24
  repo_id=f"{HF_USERNAME}/{REPO_NAME}",
25
  filename=MODEL_FILE
@@ -39,38 +42,70 @@ async def startup_event():
39
  # API'nin "canlı" olup olmadığını kontrol etmek için basit bir endpoint
40
  @app.get("/")
41
  def read_root():
42
- return {"status": "CheckMate API Aktif", "model_loaded": model is not None}
43
 
44
- # Tahmin için kullanılacak veri modelini tanımla
45
  class PredictRequest(BaseModel):
46
  text: str
47
 
 
 
 
 
 
48
  # n8n'in çağıracağı ana tahmin endpoint'i
49
- @app.post("/predict")
50
  def predict(request: PredictRequest):
51
  if model is None:
52
- return {"error": "Model yüklenemedi, lütfen Space loglarını kontrol edin."}
 
 
 
 
53
 
54
- # Gelen metni bir liste içine almalıyız, çünkü pipeline liste bekler
55
  input_text = [request.text]
56
 
57
  try:
58
- # Tahmin yap (etiketi döner, örn: [1])
59
- prediction_label = model.predict(input_text)[0]
60
-
61
- # Güven skorunu al (olasılıkları döner, örn: [[0.1, 0.9]])
62
  probabilities = model.predict_proba(input_text)[0]
63
- confidence_score = probabilities[prediction_label] # Tahmin edilen etiketin skoru
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
 
65
- # Etiketi (0/1) anlaşılır metne çevir
66
- #label_map = {0: "YALAN", 1: "DOĞRU"}
67
 
68
- return {
69
- "text": request.text,
70
- "prediction_label": int(prediction_label),
71
- #"prediction_text": label_map.get(int(prediction_label), "Bilinmiyor"),
72
- "confidence_score": float(confidence_score)
73
- }
74
 
75
  except Exception as e:
76
- return {"error": "Tahmin sırasında bir hata oluştu", "details": str(e)}
 
 
 
 
 
2
  from pydantic import BaseModel
3
  import joblib
4
  from huggingface_hub import hf_hub_download
5
+ # pandas yerine scikit-learn'ün TF-IDF'i için gerekli olan diğer kütüphaneler de listelenmeli
6
  import os
7
+ import numpy as np # olasılıklar için
8
 
9
  # --- AYARLAR ---
10
  # Modelin indirileceği depo (Sizin depo bilgileriniz)
 
21
  global model
22
  try:
23
  print(f"{HF_USERNAME}/{REPO_NAME} deposundan {MODEL_FILE} indiriliyor...")
24
+ # NOT: Pipeline'ınızın içinde kullanılan tüm kütüphaneler (örneğin TfidfVectorizer)
25
+ # burada yüklü olmalıdır. joblib, pickle ile yüklediği objenin kütüphanelerini ister.
26
  model_path = hf_hub_download(
27
  repo_id=f"{HF_USERNAME}/{REPO_NAME}",
28
  filename=MODEL_FILE
 
42
  # API'nin "canlı" olup olmadığını kontrol etmek için basit bir endpoint
43
  @app.get("/")
44
  def read_root():
45
+ return {"status": "CheckMate RF Sınıflandırma API Aktif", "model_loaded": model is not None}
46
 
47
+ # Tahmin için kullanılacak veri modelini tanımla (Giriş)
48
  class PredictRequest(BaseModel):
49
  text: str
50
 
51
+ # Çıktı için kullanılacak veri modelini tanımla (İstenen format)
52
+ class PredictResponse(BaseModel):
53
+ risk_type: str
54
+ message: str
55
+
56
  # n8n'in çağıracağı ana tahmin endpoint'i
57
+ @app.post("/predict", response_model=PredictResponse)
58
  def predict(request: PredictRequest):
59
  if model is None:
60
+ # Eğer model yüklenemediyse istenen hata formatını döndür
61
+ return PredictResponse(
62
+ risk_type="ERROR",
63
+ message="Model yüklenemedi. Lütfen FastAPI loglarını kontrol edin."
64
+ )
65
 
 
66
  input_text = [request.text]
67
 
68
  try:
69
+ # 1. Tahmin ve Güven Skorunu Al
70
+ prediction_label = model.predict(input_text)[0] # 0 veya 1
 
 
71
  probabilities = model.predict_proba(input_text)[0]
72
+
73
+ # prediction_label 0 (YALAN/DISINFORMATION) veya 1 (DOĞRU/NONE) olmalı.
74
+ # Bu mapping, modelinizin 0'ı neye karşılık getirdiğine bağlıdır.
75
+ # Genellikle 0 = Negatif (Yalan), 1 = Pozitif (Doğru) olarak kabul edilir.
76
+
77
+ # 2. Risk Tipini Belirle
78
+ if prediction_label == 1: # Varsayım: 1 = DOĞRU / RİSK YOK
79
+ risk_type = "NONE"
80
+ # Tahmin edilen skor, 1'in olasılığıdır
81
+ confidence_score = probabilities[1]
82
+
83
+ # 3. Mesajı Oluştur
84
+ 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."
85
+
86
+ elif prediction_label == 0: # Varsayım: 0 = YALAN / DİSİNFORMASYON
87
+ risk_type = "DISINFORMATION"
88
+ # Tahmin edilen skor, 0'ın olasılığıdır
89
+ confidence_score = probabilities[0]
90
+
91
+ # 3. Mesajı Oluştur
92
+ 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."
93
+
94
+ else:
95
+ # Beklenmeyen bir etiket gelirse
96
+ risk_type = "ERROR"
97
+ message = "Model beklenmeyen bir etiket döndürdü."
98
 
 
 
99
 
100
+ # 4. İstenen Formatı Döndür
101
+ return PredictResponse(
102
+ risk_type=risk_type,
103
+ message=message
104
+ )
 
105
 
106
  except Exception as e:
107
+ # Tahmin sırasında bir hata oluşursa istenen hata formatını döndür
108
+ return PredictResponse(
109
+ risk_type="ERROR",
110
+ message=f"Tahmin sırasında bir hata oluştu: {str(e)}"
111
+ )