| """Liveness + a hardware-adequacy signal for the UI banner and external monitors. |
| |
| `health_status()` powers both `GET /health` and the on-page status banner. It |
| reports `degraded: true` when the *real* model would run on CPU-only hardware |
| (where extraction can be slow or time out). `FORCE_DEGRADED=1` forces it on so |
| the banner can be exercised without actually changing the Space's hardware. |
| """ |
| from __future__ import annotations |
|
|
| import os |
|
|
|
|
| def gpu_available() -> bool: |
| """Best-effort GPU probe. This app serves via llama.cpp (no torch), so we |
| can't rely on torch.cuda — check for an NVIDIA device or `nvidia-smi`.""" |
| import glob |
| import shutil |
| import subprocess |
|
|
| if glob.glob("/dev/nvidia[0-9]*"): |
| return True |
| if shutil.which("nvidia-smi"): |
| try: |
| return subprocess.run(["nvidia-smi"], capture_output=True, timeout=5).returncode == 0 |
| except Exception: |
| return False |
| return False |
|
|
|
|
| def health_status() -> dict: |
| """Return liveness + the degraded/device/model signal (read at call time).""" |
| if os.environ.get("FORCE_DEGRADED") == "1": |
| return { |
| "ok": True, "device": "cpu", "model": "real", "degraded": True, |
| "reason": "Running the model on CPU-only hardware. Extraction may be slow " |
| "or time out. Upgrade to a GPU.", |
| } |
| |
| if os.environ.get("USE_STUB_EXTRACTOR") == "1": |
| return {"ok": True, "device": "cpu", "model": "stub", "degraded": False, "reason": ""} |
|
|
| |
| |
| |
| base = os.environ.get("INFERENCE_BASE_URL", "") |
| local = (not base) or ("127.0.0.1" in base) or ("localhost" in base) |
| gpu = gpu_available() |
| degraded = local and not gpu |
| device = "cuda" if (local and gpu) else ("cpu" if local else "remote") |
| reason = ( |
| "Running the model on CPU-only hardware. Extraction may be slow or time out. " |
| "Upgrade to a GPU." if degraded else "" |
| ) |
| return {"ok": True, "device": device, "model": "real", "degraded": degraded, "reason": reason} |
|
|