"""Minimal FastAPI entrypoint; product endpoints are added in stage 2.""" from typing import Any import psycopg import uvicorn from fastapi import FastAPI, HTTPException, status from app import __version__ from app.core.config import get_settings from app.core.secrets import SecretFileError app = FastAPI(title="Geological RAG API", version=__version__) @app.get("/api/v1/health/live", tags=["health"]) def live() -> dict[str, str]: return {"status": "ok", "version": __version__} @app.get("/api/v1/health/ready", tags=["health"]) def ready() -> dict[str, str]: settings = get_settings() try: dsn = settings.database_url().set(drivername="postgresql") with psycopg.connect( dsn.render_as_string(hide_password=False), connect_timeout=2, ) as connection: connection.execute("SELECT 1") except (OSError, SecretFileError, psycopg.Error) as exc: raise HTTPException( status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="database unavailable", ) from exc return {"status": "ready"} @app.get("/api/v1/meta", tags=["meta"]) def meta() -> dict[str, Any]: settings = get_settings() return { "name": settings.app_name, "environment": settings.app_env, "version": __version__, "models": { "embedding": settings.embedding_model, "rerank": settings.rerank_model, "generation": settings.llm_model, }, } if __name__ == "__main__": # Container ingress is controlled by Compose; only the edge proxy publishes a port. uvicorn.run("app.main:app", host="0.0.0.0", port=8000) # noqa: S104