File size: 1,960 Bytes
1691f52 f76c26d 1691f52 7fde94d f76c26d 1691f52 f76c26d 1691f52 f76c26d 1691f52 f76c26d 1691f52 f76c26d 1691f52 dae7f12 f76c26d 1691f52 f76c26d 1691f52 f76c26d 1691f52 2032cb9 | 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 | import time
import traceback
from fastapi import FastAPI, HTTPException, status, Request
from rich import print as rprint
from rich.panel import Panel
from models import QueryRequest, QueryResponse, Question
from query_service import QueryService
app = FastAPI(
title="High-Performance RAG API",
description="Processes documents and answers a list of questions efficiently with intelligent caching.",
version="3.0.0",
)
query_service = QueryService()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = f"{process_time:.4f} sec"
rprint(f"Request '{request.method} {request.url.path}' completed in {process_time:.4f}s")
return response
@app.post(
"/api/v1/hackrx/run",
response_model=QueryResponse,
tags=["RAG Pipeline"],
summary="Process a Document and Answer a Batch of Questions",
status_code=status.HTTP_200_OK
)
async def run_submission(request_body: QueryRequest):
try:
rprint(Panel(f"New Query Request"))
questions = [Question(question=q) for q in request_body.questions]
results = query_service.process_queries(str(request_body.documents), questions)
final_answers = [result.answer for result in results]
return QueryResponse(answers=final_answers)
except ValueError as e:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e))
except Exception as e:
tb_str = traceback.format_exc()
rprint(Panel(f"[bold red]Querying failed:[/bold red]\n{tb_str}", title="[red]Server Error[/red]"))
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="An internal server error occurred.")
@app.get("/health", tags=["Monitoring"], summary="API Health Check")
def health_check():
return {"status": "ok"} |