File size: 2,701 Bytes
8e30b6a
 
c0426da
8e30b6a
c0426da
 
 
dcb5a1a
c0426da
 
8e30b6a
 
 
c0426da
 
dcb5a1a
 
c0426da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dcb5a1a
8e30b6a
c0426da
8e30b6a
 
c0426da
 
8e30b6a
c0426da
 
 
 
 
 
 
 
 
 
 
dcb5a1a
 
 
 
 
c0426da
dcb5a1a
8e30b6a
 
dcb5a1a
8e30b6a
 
 
c0426da
8e30b6a
 
c0426da
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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