DetectMeBotBackend / backend /app /services /text_analyzer.py
Gradii's picture
nowy model
c0426da
Raw
History Blame
2.7 kB
import logging
import time
import gc
from typing import Dict, Any
from app.config_manager import get_active_text_model
from app.utils.exceptions import SetupRequiredError
from transformers import pipeline
# Importujesz helpery z Kroku 2:
# from config_manager import get_active_text_model
logger = logging.getLogger(__name__)
# Przechowujemy nazwę aktualnie załadowanego modelu oraz sam obiekt klasyfikatora
_loaded_model_name = None
_text_classifier = None
def _load_model(target_model_name: str):
global _text_classifier, _loaded_model_name
# Jeśli model w pamięci jest tym, którego potrzebujemy, po prostu go zwracamy
if _text_classifier is not None and _loaded_model_name == target_model_name:
return _text_classifier
logger.info(f"Wymagana zmiana modelu. Obecny w RAM: {_loaded_model_name}, Nowy: {target_model_name}")
# Zwalnianie pamięci po poprzednim modelu
_text_classifier = None
gc.collect()
logger.info(f"Ładowanie modelu text detector: {target_model_name}...")
_text_classifier = pipeline(
"text-classification",
model=target_model_name,
device=-1 # -1 oznacza CPU, jeśli masz GPU ustaw np. 0
)
_loaded_model_name = target_model_name
logger.info(f"Model {target_model_name} został pomyślnie załadowany.")
return _text_classifier
async def analyze_text(text: str, guild_id: str) -> Dict[str, Any]:
start_time = time.time()
# Pobranie aktywnego modelu dla danej gildii
active_model = get_active_text_model(guild_id)
# BLOKADA: Jeżeli model to 'none' lub brak konfiguracji, natychmiast wyrzucamy błąd
if not active_model:
logger.warning(f"Zablokowano zapytanie! Serwer {guild_id} nie ma skonfigurowanego modelu.")
raise SetupRequiredError(
f"Serwer o ID '{guild_id}' nie został jeszcze skonfigurowany. "
"Użyj komendy setup na Discordzie przed wykonaniem analizy."
)
logger.info(f"Rozpoczęcie analizy tekstu dla serwera {guild_id} przy użyciu modelu: {active_model}")
classifier = _load_model(active_model)
result = classifier(text)
label = result[0]["label"]
score = result[0]["score"]
is_deepfake = label.lower() in ["fake", "ai", "chatgpt", "label_1", "machine-generated"]
confidence = score
analysis_time = time.time() - start_time
response = {
"is_deepfake": is_deepfake,
"confidence": round(confidence, 3),
"analysis_time": round(analysis_time, 3),
"used_model": active_model,
}
logger.info(f"Analiza zakończona sukcesem dla serwera {guild_id}.")
return response