Spaces:
Runtime error
Runtime error
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
|