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))
|