Spaces:
Running
Running
| from typing import Any | |
| from fastapi import APIRouter, Request | |
| from app.core.logging import get_logger | |
| router = APIRouter() | |
| logger = get_logger(__name__) | |
| async def health_check(request: Request): | |
| """Basic liveness probe. Returns ok if the process is running.""" | |
| client_ip = request.headers.get("X-Forwarded-For", "direct") | |
| cf_ip = request.headers.get("CF-Connecting-IP", "none") | |
| return { | |
| "status": "ok", | |
| "proxy": { | |
| "x_forwarded_for": client_ip, | |
| "cf_connecting_ip": cf_ip, | |
| "via_cloudflare": cf_ip != "none", | |
| }, | |
| } | |
| async def readiness_probe(request: Request) -> dict[str, Any]: | |
| """Readiness probe: checks Qdrant connection and semantic cache are initialised.""" | |
| failing = [] | |
| try: | |
| qdrant = request.app.state.qdrant | |
| qdrant.get_collections() | |
| except Exception as e: | |
| logger.error("Qdrant connection failed during readiness check", exc_info=e) | |
| failing.append("qdrant") | |
| # Semantic cache: check it is initialised (not None). | |
| # In-memory cache never fails to connect — only check it exists. | |
| if getattr(request.app.state, "semantic_cache", None) is None: | |
| failing.append("semantic_cache") | |
| if failing: | |
| return {"status": "degraded", "failing": failing} | |
| return {"status": "ready"} | |