double-exposure / space_app.py
Eddie Faillace
double-exposure app deploy snapshot 2026-07-21 (WP-24 calibration pass)
7dff04f
Raw
History Blame Contribute Delete
1.41 kB
"""Hugging Face Spaces entry point.
Spaces' Gradio SDK looks for a module-level `demo` in the file named by `app_file`
in README.md and launches it. We can't name this `app.py` (it would collide with the
`app/` package), so the README points `app_file` at `space_app.py`.
Local development still uses `python -m app.main`; this module only exists for Spaces.
"""
from __future__ import annotations
import os
# Disable Gradio 6 SSR before anything imports/launches gradio. Gradio's own
# default is client-side (SSR off), but the HF Spaces runtime turns SSR ON in the
# container — it puts a Node SSR proxy in front of the Python backend, and that
# layer fails to relay the API schema on Spaces, surfacing in the browser as
# "Could not get API info. Connection errored out." SSR is only a first-paint
# optimization; client-side rendering restores the direct frontend↔backend link.
# HF sets GRADIO_SSR_MODE itself, so this must OVERRIDE (not setdefault); HF also
# owns the launch() call, so the env var — not a launch(ssr_mode=…) kwarg — is the
# only lever that reaches the Spaces launch.
os.environ["GRADIO_SSR_MODE"] = "false"
from app.main import build_app
# Module-level `demo` is the canonical HF Spaces contract — the runtime finds and
# launches it. Building at import is intended here (Spaces imports this file).
demo = build_app()
if __name__ == "__main__":
demo.launch()