From 316f2f5f4558cf4d9d748ba6fb842fc418deed9d Mon Sep 17 00:00:00 2001 From: Abiba Date: Fri, 12 Jun 2026 18:11:23 +0000 Subject: [PATCH] fix(router): handle None temp_c/vram_pct in gpu_health_score AMD sidecar returns null for temp_c/power_w fields. gpu_health_score now uses fallback for all numeric fields. check_gpu_health also defaults temp_c and gpu_util_pct to 0. Fixes 500 error on /metrics/gpu-health --- router/router.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/router/router.py b/router/router.py index efa44fa..23f9c8e 100644 --- a/router/router.py +++ b/router/router.py @@ -226,13 +226,13 @@ def gpu_health_score(model): h = check_gpu_health(model, sidecar_timeout=1.5, gpu_timeout=1) if h.get("status") == "down": return 999 # never pick down GPUs - vram_pct = h.get("vram_pct", 50) - temp_c = h.get("temp_c", 50) + vram_pct = h.get("vram_pct") or 50 + temp_c = h.get("temp_c") or 50 active = gpu_active_count(model) max_c = GPU_MAX_CONCURRENT.get(model, 1) - load_pct = (active / max_c) * 100 + load_pct = (active / max_c) * 100 if max_c > 0 else 0 # Score: lower = better (more headroom, cooler, less loaded) - score = vram_pct * 0.4 + max(temp_c - 30, 0) * 0.3 + load_pct * 0.3 + score = (vram_pct or 0) * 0.4 + max((temp_c or 50) - 30, 0) * 0.3 + load_pct * 0.3 return score def select_best_gpu(candidates, reason, agent=""):