Spaces:
Running
Running
| import logging | |
| import time | |
| import gc | |
| from typing import Dict, Any | |
| from app.config_manager import get_active_text_model, is_multi_model_enabled | |
| from app.core.config import get_settings | |
| from app.utils.exceptions import SetupRequiredError | |
| from transformers import pipeline | |
| logger = logging.getLogger(__name__) | |
| # S艂ownik do keszowania klasyfikator贸w w RAM (zapobiega ci膮g艂emu prze艂adowywaniu przy multi-modelu) | |
| _loaded_classifiers = {} | |
| def _load_model(target_model_name: str): | |
| global _loaded_classifiers | |
| if target_model_name in _loaded_classifiers: | |
| return _loaded_classifiers[target_model_name] | |
| logger.info(f"Model {target_model_name} nie jest za艂adowany. 艁adowanie do RAM...") | |
| gc.collect() | |
| _loaded_classifiers[target_model_name] = pipeline( | |
| "text-classification", | |
| model=target_model_name, | |
| device=-1 | |
| ) | |
| logger.info(f"Model {target_model_name} zosta艂 pomy艣lnie za艂adowany.") | |
| return _loaded_classifiers[target_model_name] | |
| async def analyze_text(text: str, guild_id: str) -> Dict[str, Any]: | |
| start_time = time.time() | |
| settings = get_settings() | |
| # Sprawdzamy, czy w艂膮czony jest tryb wielomodelowy | |
| multi_model_active = is_multi_model_enabled(guild_id) | |
| if multi_model_active: | |
| models_to_run = settings.AVAILABLE_MODELS.get("text", []) | |
| if not models_to_run: | |
| raise ValueError("Brak zdefiniowanych modeli tekstowych w ustawieniach systemu.") | |
| logger.info(f"Rozpocz臋cie wielomodelowej analizy tekstu dla serwera {guild_id} ({len(models_to_run)} modeli)") | |
| individual_results = [] | |
| for m in models_to_run: | |
| try: | |
| classifier = _load_model(m) | |
| result = classifier(text) | |
| label = result[0]["label"] | |
| score = result[0]["score"] | |
| is_fake = label.lower() in ["fake", "ai", "chatgpt", "label_1", "machine-generated"] | |
| individual_results.append({ | |
| "model": m, | |
| "is_deepfake": is_fake, | |
| "confidence": round(score, 3) | |
| }) | |
| except Exception as e: | |
| logger.error(f"B艂膮d modelu {m} podczas wielomodelowej analizy: {e}") | |
| if not individual_results: | |
| raise ValueError("呕aden z modeli tekstowych nie dokona艂 pomy艣lnej analizy.") | |
| # Agregacja: G艂osowanie wi臋kszo艣ciowe | |
| fake_votes = sum(1 for r in individual_results if r["is_deepfake"]) | |
| is_deepfake = fake_votes > (len(individual_results) / 2) | |
| # Pewno艣膰: 艢rednia pewno艣膰 wszystkich modeli | |
| confidence = sum(r["confidence"] for r in individual_results) / len(individual_results) | |
| analysis_time = time.time() - start_time | |
| return { | |
| "is_deepfake": is_deepfake, | |
| "confidence": round(confidence, 3), | |
| "analysis_time": round(analysis_time, 3), | |
| "used_model": "Multi-Model Workflow (Ensemble)", | |
| "details": individual_results # Przekazujemy szczeg贸艂y do bota | |
| } | |
| else: | |
| # Tradycyjna analiza pojedynczego modelu | |
| active_model = get_active_text_model(guild_id) | |
| 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 | |
| return { | |
| "is_deepfake": is_deepfake, | |
| "confidence": round(confidence, 3), | |
| "analysis_time": round(analysis_time, 3), | |
| "used_model": active_model, | |
| "details": None | |
| } |