Spaces:
Runtime error
Runtime error
| 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 |