| 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"} |