from __future__ import annotations import os import socket import uvicorn def find_free_port(host: str = "127.0.0.1") -> int: """Ask the OS for a currently available local TCP port.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: server_socket.bind((host, 0)) server_socket.listen(1) return int(server_socket.getsockname()[1]) def is_huggingface_space() -> bool: """Return True when running inside a Hugging Face Space runtime.""" return bool(os.getenv("SPACE_ID") or os.getenv("SPACE_HOST")) def bootstrap_runtime_port() -> None: """Seed PORT early so backend imports cannot override the Hugging Face runtime port.""" if is_huggingface_space() and not os.getenv("PORT", "").strip(): os.environ["PORT"] = "7860" bootstrap_runtime_port() from backend.main import app def resolve_server_port() -> int: """Use the runtime PORT when defined, keep Hugging Face on 7860, else pick a free local port.""" raw_port = os.getenv("PORT", "").strip() if raw_port: return int(raw_port) if is_huggingface_space(): os.environ["PORT"] = "7860" return 7860 port = find_free_port() os.environ["PORT"] = str(port) return port if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=resolve_server_port())