File size: 1,307 Bytes
2167c4f | 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 | 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"}
|