File size: 1,772 Bytes
5761792
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import json
import os
from datetime import datetime

from fastapi import APIRouter, Depends

from configs.config import settings
from configs.logging import get_logger
from core.pipeline import run_pipeline
from interfaces.api.dependencies import get_model_loader
from interfaces.schemas.complaint import ComplaintRequest, ComplaintResponse

logger = get_logger("predict_route")

router = APIRouter(prefix="/predict", tags=["Prediction"])

LOGS_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "logs")
LOGS_FILE = os.path.join(LOGS_DIR, "predictions.json")

def save_prediction_log(input_text: str, response: ComplaintResponse):
    os.makedirs(LOGS_DIR, exist_ok=True)

    entries = []
    if os.path.exists(LOGS_FILE):
        try:
            with open(LOGS_FILE, "r", encoding="utf-8") as f:
                entries = json.load(f)
                if not isinstance(entries, list):
                    entries = []
        except (json.JSONDecodeError, OSError):
            entries = []

    entries.append({
        "timestamp": datetime.now().isoformat(),
        "input_text": input_text,
        "response": response.model_dump(mode="json"),
    })

    with open(LOGS_FILE, "w", encoding="utf-8") as f:
        json.dump(entries, f, ensure_ascii=False, indent=2)

@router.post("", response_model=ComplaintResponse)
async def predict_complaint(request: ComplaintRequest, loader = Depends(get_model_loader)):
    result = run_pipeline(request.text, loader)
    if settings.ENABLE_PREDICTION_LOGGING:
        try:
            save_prediction_log(request.text, result)
        except Exception as exc:
            logger.warning(
                "prediction_log_failed",
                error=str(exc),
            )
    return result