toxic-detector/app/api/routes.py

55 lines
2.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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="Ошибка при оценке токсичности текста.")