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