toxic-detector/app/api/routes.py

52 lines
2.3 KiB
Python
Raw 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.

# app/api/routes.py
from fastapi import APIRouter, HTTPException, Depends
from app.models.schemas import TextInput, ToxicityOutput
from app.core.cache import cache
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**: Текст для оценки
"""
cache_key = get_cache_key(input.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:
# Отправляем задачу в очередь Celery
result = assess_toxicity_task.delay(input.text)
logger.info(f"Задача отправлена в очередь Celery для текста: {input.text}")
toxicity_score = result.get(timeout=10) # Ждем результат до 10 секунд
# Сохраняем результат в кеш
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=str(e))