"""Inference backends — dispatches to OpenRouter (UI server) or Codex (local). Backend selection (`active_backend`): * On a Hugging Face Space (``SPACE_ID``/``SPACE_HOST`` set) -> ALWAYS ``openrouter``. A Space can't hold codex's interactive OAuth and the codex CLI isn't installed there. * Otherwise -> env ``INFERENCE_BACKEND`` (``openrouter`` | ``codex``), default ``openrouter``. Local computing sets ``INFERENCE_BACKEND=codex`` in ``.env`` to bill the ChatGPT subscription via the codex CLI instead of the OpenRouter API. Both backends expose the same surface, so callers (ui/cache.py, ui/app.py) are unchanged. """ from __future__ import annotations import os _BACKENDS = {"openrouter", "codex"} def active_backend() -> str: """Resolve the inference backend for this process (see module docstring).""" if os.environ.get("SPACE_ID") or os.environ.get("SPACE_HOST"): return "openrouter" name = os.environ.get("INFERENCE_BACKEND", "openrouter").strip().lower() return name if name in _BACKENDS else "openrouter" def backend_label() -> str: """Human label for the active backend (UI health line).""" return "Codex" if active_backend() == "codex" else "OpenRouter" def _backend(): if active_backend() == "codex": from inference import codex as module else: from inference import openrouter as module return module def run_inference( system_prompt: str, user_prompt: str, *, model: str | None = None, timeout: float | None = None ) -> str: """Run one completion through the active backend. ``timeout`` is forwarded only when given, so each backend applies its own default (OpenRouter 180s, Codex 900s).""" kwargs: dict = {"model": model} if timeout is not None: kwargs["timeout"] = timeout return _backend().run_inference(system_prompt, user_prompt, **kwargs) def available_models() -> list[str]: return _backend().available_models() def default_model() -> str: return _backend().default_model() def healthcheck() -> tuple[bool, str]: return _backend().healthcheck() __all__ = [ "active_backend", "backend_label", "available_models", "default_model", "healthcheck", "run_inference", ]