LibBee / src /api /feedback.py
nikeshn's picture
Upload 5 files
2167c4f verified
Raw
History Blame Contribute Delete
1.31 kB
import json
import time
from pathlib import Path
from typing import Optional
from fastapi import APIRouter
from pydantic import BaseModel, field_validator
from src.config import get_settings
router = APIRouter()
class FeedbackRequest(BaseModel):
question: str
feedback: str
answer_excerpt: Optional[str] = ""
@field_validator("feedback")
@classmethod
def valid_feedback(cls, v: str) -> str:
if v not in {"up", "down"}:
raise ValueError("feedback must be up or down")
return v
@router.post("")
async def save_feedback(req: FeedbackRequest):
settings = get_settings()
payload = {
"timestamp": time.time(),
"question": req.question[:1000],
"feedback": req.feedback,
"answer_excerpt": (req.answer_excerpt or "")[:1500],
}
settings.feedback_path.parent.mkdir(parents=True, exist_ok=True)
with settings.feedback_path.open("a", encoding="utf-8") as handle:
handle.write(json.dumps(payload, ensure_ascii=False) + "\n")
try:
from app import metrics_service
metrics_service.incr("feedback_total")
metrics_service.incr_bucket("feedback_breakdown", req.feedback)
except Exception:
pass
return {"status": "ok"}