Aoun-Ai / app /api /feedback.py
MuhammadMahmoud's picture
enhance rag
468ea61
"""
Feedback API — Endpoints for submitting and reviewing AI prediction corrections.
"""
import uuid
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
from typing import Optional
import logging
from app.services.feedback.feedback_store import feedback_store
router = APIRouter()
logger = logging.getLogger(__name__)
class FeedbackRequest(BaseModel):
"""Payload for submitting a correction to an AI prediction."""
prediction_id: str = Field(..., description="UUID of the original prediction")
original_prediction: str = Field(..., description="The original AI prediction (e.g. 'Medium')")
corrected_prediction: str = Field(..., description="The corrected value by the employee")
corrected_by: Optional[str] = Field(None, description="Employee ID or name")
reason: Optional[str] = Field(None, description="Reason for correction (optional)")
class FeedbackResponse(BaseModel):
message: str
feedback_id: str
@router.post("/feedback", response_model=FeedbackResponse)
async def submit_feedback(data: FeedbackRequest):
"""
Ingests explicit user feedback validating or rejecting prior AI-driven predictions.
Receives payloads mapping the original AI output alongside the human correction footprint.
Persists evaluation data chronologically into the structured feedback reporting store.
Returns a standard confirmation receipt bridging data gaps between AI logic and human oversight.
"""
feedback_id = str(uuid.uuid4())
try:
feedback_store.save_feedback({
"feedback_id": feedback_id,
**data.model_dump(),
})
except Exception as e:
logger.error("Feedback save failed: %s", e)
raise HTTPException(status_code=500, detail="Failed to save feedback.")
return FeedbackResponse(
message="تم حفظ التصحيح بنجاح.",
feedback_id=feedback_id,
)
@router.get("/feedback/summary")
async def get_feedback_summary():
"""
Aggregates accumulated AI prediction corrections into high-level evaluative statistics.
Scans the feedback repository to compute drift metrics, common patterns, and accuracy rates.
Designed primarily for platform administrators establishing continuous LLM refinement loops.
Returns a structured dictionary mapping distinct models to their respective human correction summaries.
"""
try:
return feedback_store.get_summary()
except Exception as e:
logger.error("Failed to get feedback summary: %s", e)
raise HTTPException(status_code=500, detail="Failed to retrieve feedback summary.")