from fastapi import APIRouter, HTTPException from app.models.schemas import TextInput, ToxicityOutput from app.core.cache import cache from app.core.text_preprocessing import preprocess_text import json import hashlib import logging from app.tasks import assess_toxicity_task router = APIRouter() logger = logging.getLogger(__name__) def get_cache_key(text: str) -> str: """Генерация уникального ключа для кеша на основе текста.""" return f"toxicity:{hashlib.sha256(text.encode()).hexdigest()}" @router.post("/toxicity", response_model=ToxicityOutput, summary="Оценка токсичности текста", response_description="Оценка токсичности") async def assess_toxicity(input: TextInput): """ Принимает текст и возвращает оценку его токсичности. - **text**: Текст для оценки """ try: preprocessed_text = preprocess_text(input.text) logger.info(f"Текст после предобработки: {preprocessed_text}") except Exception as e: logger.error(f"Ошибка при предобработке текста: {e}") raise HTTPException(status_code=400, detail="Ошибка при предобработке текста.") cache_key = get_cache_key(preprocessed_text) cached_result = await cache.get(cache_key) if cached_result: try: toxicity_score = json.loads(cached_result) logger.info(f"Получен результат из кеша для ключа {cache_key}: {toxicity_score}") return {"toxicity_score": toxicity_score} except json.JSONDecodeError: logger.warning(f"Кеш для ключа {cache_key} повреждён. Переходим к обработке.") try: result = assess_toxicity_task.delay(preprocessed_text) logger.info(f"Задача отправлена в очередь Celery для текста: {preprocessed_text}") toxicity_score = result.get(timeout=5) await cache.set(cache_key, json.dumps(toxicity_score)) logger.info(f"Результат сохранён в кеш для ключа {cache_key}: {toxicity_score}") return {"toxicity_score": toxicity_score} except Exception as e: logger.error(f"Ошибка при обработке текста: {e}") raise HTTPException(status_code=500, detail="Ошибка при оценке токсичности текста.")