devjhawar's picture
Upload folder using huggingface_hub
6d03b1a verified
"""Query router — answer questions against an ingested policy."""
from fastapi import APIRouter, HTTPException, Request
from api.schemas import QueryRequest, QueryResponse
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/query", tags=["query"])
@router.post("/", response_model=QueryResponse)
async def query_policy(body: QueryRequest, request: Request):
"""Run the RAG pipeline for a single policy question."""
query_service = request.app.state.query_service
try:
result = query_service.query(
question=body.question,
policy_id=body.policy_id,
k=body.k,
)
except Exception as exc:
logger.exception("QueryService.query failed")
raise HTTPException(status_code=500, detail=str(exc))
if not result:
raise HTTPException(status_code=500, detail="Empty result from QueryService")
logger.info(
"Query served | policy_id=%s | q='%s'",
body.policy_id,
body.question[:50],
)
return QueryResponse(
answer=result["answer"],
policy_id=result.get("policy_id", body.policy_id),
source_count=result["source_count"],
sources=result["sources"],
status="success",
)
from fastapi.responses import StreamingResponse
@router.post("/stream")
async def stream_query_policy(body: QueryRequest, request: Request):
"""Run the RAG pipeline for a single policy question with streaming response."""
query_service = request.app.state.query_service
def content_generator():
try:
for token in query_service.stream_query(
question=body.question,
policy_id=body.policy_id,
k=body.k,
):
yield token
except Exception as exc:
logger.exception("QueryService.stream_query failed")
yield f"Error: {str(exc)}"
return StreamingResponse(content_generator(), media_type="text/plain")