from datetime import datetime from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from starlette.middleware.trustedhost import TrustedHostMiddleware from src.api.endpoints import demo from src.api.endpoints import search from src.config import config from src.lifespan import lifespan, DEV_MODE # Import bibliography utilities from src.utils.bibliography import format_citation, format_bibliography, get_bibtex_entry app = FastAPI(title=config.app.name, version=config.app.version, lifespan=lifespan) # Trust HuggingFace Spaces proxy @app.middleware("http") async def proxy_headers_middleware(request: Request, call_next): if "x-forwarded-proto" in request.headers: request.scope["scheme"] = request.headers["x-forwarded-proto"] response = await call_next(request) return response app.mount("/static", StaticFiles(directory="./public"), name="static") app.include_router(demo.router, prefix="/api/v1/demo", tags=["demo"]) app.include_router(search.router, prefix="/api/v1/search", tags=["search"]) templates = Jinja2Templates(directory="./src/templates") templates.env.globals["config"] = config templates.env.globals["DEV_MODE"] = DEV_MODE templates.env.globals["current_year"] = datetime.now().year if DEV_MODE: templates.env.globals["hot_reload"] = lambda: getattr(app.state, 'hot_reload', None) else: templates.env.globals["hot_reload"] = lambda: None templates.env.filters["cite"] = format_citation templates.env.filters["bibliography"] = format_bibliography templates.env.filters["bibtex"] = get_bibtex_entry @app.get("/", response_class=HTMLResponse) async def read_root(request: Request): return templates.TemplateResponse( "pages/index.jinja", { "request": request, "title": "Home", "search_result": [], "queries": [], } ) @app.get("/demo", response_class=HTMLResponse) async def read_demo(request: Request): return templates.TemplateResponse( "pages/demo/demo.jinja", {"request": request, "title": "Taylor-Russell Model Calculator"} )