Skip to content

fix(dashboard): register core services on CPU hosts so Hermes card is clickable - #288

Merged
azilber merged 1 commit into
mainfrom
worktree-fix+core-services-cpu-gpu-backends
Aug 11, 2026
Merged

fix(dashboard): register core services on CPU hosts so Hermes card is clickable#288
azilber merged 1 commit into
mainfrom
worktree-fix+core-services-cpu-gpu-backends

Conversation

@azilber

@azilber azilber commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary

On the dashboard the Hermes Agent tile renders but is not clickable on a CPU install. Root cause traced live (GPU_BACKEND=cpu, host 10.1.1.17).

The four core base-stack service manifests — llama-server, dashboard-api, dashboard, open-webui — declared gpu_backends: [amd, nvidia]. The dashboard-api manifest loader skips any service whose gpu_backends omits the host backend and doesn't include "all" (config.py backend filter). So on GPU_BACKEND=cpu all four core services were dropped from SERVICES entirely — absent from /services and /api/status.

calculate_feature_status() (routers/features.py) marks a required service "missing" unless it's present and healthy. With dashboard-api/llama-server absent, the Hermes feature (requires: [hermes, hermes-proxy, dashboard-api] + any of [llama-server, litellm]) got status: "services_needed", which the frontend maps to disabled → a non-clickable <div> (Dashboard.jsx). Exactly the reported symptom.

Fix

Set gpu_backends: [all] on the four core manifests — matching every bundled extension manifest and reflecting that these base-stack services run on all backends including CPU. comfyui is intentionally left GPU-only. No config.py change needed ("all" already short-circuits the filter; apple hosts already bypass it).

Evidence & verification (live on the box)

  • Before: GET /services returned 18 services with none of the four core ones; GET /api/featureshermes-agent servicesMissing: ["dashboard-api","llama-server"], status: "services_needed".
  • All four core health endpoints return 200 from inside ods-dashboard-api via docker DNS, so once loaded they report healthy.
  • Ran the container's own load_extension_manifests against the edited manifests: all four core services now register under cpu / nvidia / apple with no errors.
  • Frontend link host comes from window.location.hostname (serviceUrls.js), so the clickable tile resolves to http://<lan-ip>:9120/ (magic-link gated by the proxy, by design).

Tests

  • test_core_services_load_on_cpu_backend — loads the real service manifests under GPU_BACKEND=cpu and asserts the four core services register (guards against a core manifest reintroducing a backend-restrictive value).
  • test_backend_filter_skips_restrictive_gpu_backends — documents the filter ([amd, nvidia] skipped on cpu, [all] kept).
  • make lint ✅; scripts/validate-manifests.sh ✅ (27 compatible, 0 errors); test file byte-compiles.

🤖 Generated with Claude Code

… clickable

The four core base-stack service manifests (llama-server, dashboard-api,
dashboard, open-webui) declared `gpu_backends: [amd, nvidia]`. The dashboard-api
manifest loader (config.py) skips any service whose gpu_backends omits the host
backend and does not include "all". On a CPU install (GPU_BACKEND=cpu) all four
core services were therefore dropped from SERVICES entirely — absent from
/services and /api/status.

Because calculate_feature_status() marks a required service "missing" unless it
is present and healthy, every feature that requires a core service was gated to
status "services_needed". The frontend maps that to `disabled` and renders a
non-clickable <div>, so the Hermes Agent tile (requires dashboard-api +
llama-server) showed but could not be clicked.

Fix: set `gpu_backends: [all]` on the four core manifests, matching every bundled
extension manifest and reflecting that these base-stack services run on all
backends including CPU. Verified in-container: with [all] the loader registers
all four core services under cpu/nvidia/apple; all four health endpoints return
200 from the dashboard-api container, so they report healthy and the Hermes
feature becomes enabled/clickable (linking to hermes-proxy :9120, host resolved
from window.location).

Adds regression tests: real core manifests load under GPU_BACKEND=cpu, and a
synthetic check documenting the backend filter (restrictive gpu_backends skipped,
[all] kept). comfyui is intentionally left GPU-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@azilber
azilber merged commit 154df16 into main Aug 11, 2026
20 checks passed
@azilber
azilber deleted the worktree-fix+core-services-cpu-gpu-backends branch August 11, 2026 09:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant