2024-10-22 23:22:01 +02:00
|
|
|
|
from fastapi import APIRouter, HTTPException
|
2024-10-22 22:51:03 +02:00
|
|
|
|
from app.models.schemas import TextInput, ToxicityOutput
|
|
|
|
|
from app.core.cache import cache
|
2024-10-23 00:07:56 +02:00
|
|
|
|
from app.core.text_preprocessing import preprocess_text
|
2024-10-22 22:51:03 +02:00
|
|
|
|
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**: Текст для оценки
|
|
|
|
|
"""
|
2024-10-23 00:07:56 +02:00
|
|
|
|
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)
|
2024-10-22 22:51:03 +02:00
|
|
|
|
|
|
|
|
|
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:
|
2024-10-23 00:07:56 +02:00
|
|
|
|
result = assess_toxicity_task.delay(preprocessed_text)
|
|
|
|
|
logger.info(f"Задача отправлена в очередь Celery для текста: {preprocessed_text}")
|
2024-10-23 00:10:51 +02:00
|
|
|
|
toxicity_score = result.get(timeout=5)
|
2024-10-22 22:51:03 +02:00
|
|
|
|
|
|
|
|
|
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}")
|
2024-10-23 00:07:56 +02:00
|
|
|
|
raise HTTPException(status_code=500, detail="Ошибка при оценке токсичности текста.")
|