FastAPI (Python)

Add NjiraAI middleware to FastAPI apps for automatic context and tracing.

Install

pip install njiraai

Middleware

from fastapi import FastAPI
from pydantic import BaseModel

from njiraai import NjiraAI
from njiraai.middleware import create_middleware

app = FastAPI()

njira = NjiraAI(
    api_key="your-api-key",
    project_id="your-project-id",
    mode="active",
)

# Add middleware
app.add_middleware(create_middleware(njira))


class ChatRequest(BaseModel):
    message: str


@app.post("/chat")
async def chat(request: ChatRequest):
    # Enforce before processing
    decision = await njira.enforce_pre(
        input_data=request.message,
        metadata={"endpoint": "/chat"},
    )

    if decision["verdict"] == "block":
        return {
            "error": "Blocked",
            "reasons": decision["reasons"],
            "traceId": decision["traceId"],
        }

    # Your LLM logic here
    response = f"Echo: {request.message}"

    return {"response": response, "traceId": decision["traceId"]}

What the middleware does

  • Creates/propagates request_id from x-request-id header
  • Sets up per-request trace context via contextvars
  • Adds x-njira-trace-id and x-njira-request-id response headers
  • Flushes traces after the response

Custom user/tags extraction

def get_user(request):
    return request.headers.get("x-user-id")

def get_tags(request):
    return {"tenant": request.headers.get("x-tenant", "")}

app.add_middleware(create_middleware(njira, get_user=get_user, get_tags=get_tags))