52 lines
2.3 KiB
Python
52 lines
2.3 KiB
Python
|
# 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))
|