antigravity-ai / server.py
Sysnern's picture
Initial commit with LFS
bc916a6
Raw
History Blame Contribute Delete
2.89 kB
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, AutoConfig
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=False,
allow_methods=["*"],
allow_headers=["*"],
)
class AnalyzeRequest(BaseModel):
text: str
# ---------------------------------------------------------
# BERTurk Duygu Analizi / Sınıflandırma Modeli
# ---------------------------------------------------------
MODEL_PATH = "sentence_best_model 2.bin"
BASE_MODEL_NAME = "dbmdz/bert-base-turkish-cased"
print("Model yükleniyor, lütfen bekleyin...")
try:
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_NAME)
# Modelinizi eğitirken kelime dağarcığına (vocab) 30 adet yeni token eklemişsiniz.
# Orijinal BERTurk'ün vocab boyutu 32000 iken, sizin modelinizinki 32030 olmuş.
# Bu yüzden konfigürasyonda bunu belirtmemiz gerekiyor, yoksa çöker ve Nötr döner!
config = AutoConfig.from_pretrained(BASE_MODEL_NAME, num_labels=3, vocab_size=32030)
# Konfigürasyonla iskeleti oluşturuyoruz
model = AutoModelForSequenceClassification.from_config(config)
# Kendi eğittiğiniz ağırlıkları (.bin) içine yüklüyoruz
model.load_state_dict(torch.load(MODEL_PATH, map_location=torch.device('cpu'), weights_only=False))
model.eval()
print("Model başarıyla yüklendi!")
except Exception as e:
print(f"Model yüklenirken hata oluştu: {e}")
model = None
tokenizer = None
@app.post("/predict")
async def predict_sentiment(request: AnalyzeRequest):
"""
Frontend'den gelen günlüğü okur ve duygu durumunu sınıflandırır.
"""
if not model or not tokenizer:
return {"sentiment": "Neutral"}
inputs = tokenizer(request.text, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
outputs = model(**inputs)
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
predicted_class = torch.argmax(predictions, dim=-1).item()
# Sınıf numaralarını metne çevirme (Örnek: 0: Negative, 1: Neutral, 2: Positive)
# NOT: Kendi modelinizin label mapping'ine göre burayı değiştirebilirsiniz!
sentiment_map = {0: "Negative", 1: "Neutral", 2: "Positive"}
detected_sentiment = sentiment_map.get(predicted_class, "Neutral")
return {"sentiment": detected_sentiment}
@app.get("/health")
async def health_check():
"""
Konteynerin ve modelin durumunu kontrol etmek için health endpoint.
"""
if model and tokenizer:
return {"status": "healthy", "model_loaded": True}
return {"status": "degraded", "model_loaded": False, "message": "Model not loaded. Using fallback responses."}