Spaces:
Running on Zero
Running on Zero
| """Elysium — gradio.Server entrypoint (matches small-talk pattern). | |
| We use `gr.Server` (a FastAPI host with Gradio's backend) so our custom | |
| frontend (Canvas2D bioluminescent hypergraph) takes priority over any default | |
| Gradio UI. All inference happens via /api routes registered by backend.server. | |
| """ | |
| import os | |
| import pathlib | |
| import gradio as gr | |
| from fastapi.responses import FileResponse | |
| from fastapi.staticfiles import StaticFiles | |
| from backend.server import attach | |
| DIST = pathlib.Path(__file__).parent / "frontend" / "dist" | |
| app = gr.Server() | |
| attach(app) # registers /api/* before static mounts | |
| class CachedStaticFiles(StaticFiles): | |
| """Hashed bundle assets — cache hard.""" | |
| def file_response(self, *args, **kwargs): | |
| r = super().file_response(*args, **kwargs) | |
| r.headers["Cache-Control"] = "public, max-age=31536000, immutable" | |
| return r | |
| # Mount static asset folders (won't collide with /api or Gradio internals) | |
| for sub in ("assets", "audio"): | |
| d = DIST / sub | |
| if d.is_dir(): | |
| cls = CachedStaticFiles if sub == "assets" else StaticFiles | |
| app.mount(f"/{sub}", cls(directory=str(d)), name=sub) | |
| _NO_CACHE = {"Cache-Control": "no-cache, must-revalidate"} | |
| async def index(): | |
| return FileResponse(DIST / "index.html", headers=_NO_CACHE) | |
| async def favicon(): | |
| return FileResponse(DIST / "index.html", headers=_NO_CACHE) | |
| if __name__ == "__main__": | |
| port = int(os.environ.get("GRADIO_SERVER_PORT", os.environ.get("PORT", 7860))) | |
| app.launch(server_name="0.0.0.0", server_port=port) | |