diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 737af81..56e3df5 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -25,6 +25,21 @@ jobs: run: node smoke/ui-primitives.mjs - name: app shell and view model run: node smoke/shell.mjs + - name: collector boots and serves (headless) + run: | + set -euo pipefail + python3 collector/speculum.py --port 18792 & + pid=$! + trap 'kill "$pid" 2>/dev/null || true' EXIT + for i in $(seq 1 20); do + curl -sf http://127.0.0.1:18792/api/snapshot >/dev/null && break + sleep 0.5 + done + curl -sf http://127.0.0.1:18792/api/snapshot | python3 -m json.tool + tmp=$(mktemp) + timeout 2 curl -sN http://127.0.0.1:18792/api/stream > "$tmp" || true + head -n 2 "$tmp" + rm -f "$tmp" windows: runs-on: windows-latest diff --git a/README.md b/README.md index d2f977b..4352c5a 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ The deck holds twelve panels: | Panel | Shows | |---|---| -| **KPI** | ten metrics in four groups: Throughput (decode rate — which names the model it tracks, requests/min), Latency (first token, time per token, p95), Cache (hit rate, re-ingest tax, MTP acceptance), Capacity (VRAM, queue depth). Each carries a 60-min sparkline and a delta against 15 min ago. | +| **KPI** | ten metrics in four groups: Throughput (decode rate, which names the model it tracks, and requests/min), Latency (first token, time per token, p95), Cache (hit rate, re-ingest tax, MTP acceptance), Capacity (VRAM, queue depth). Each carries a 60-min sparkline and a delta against 15 min ago. | | **Throughput** | rolling decode tok/s, one trace per engine, 15 min to 30 d. Ranges past 1 h read from the history database. | | **GPU & host** | meters for temperature, utilisation, power draw and VRAM, with warn/crit ticks from the real power limit and VRAM total. Device readouts (SM and memory clock, fan, PCIe) plus host CPU, RAM, load and top processes. | | **Context** | one bar per live session: prompt tokens against the model window, ticks at 75 % and 90 %. | @@ -154,7 +154,7 @@ port = 9091 # default http://127.0.0.1:9090 url = "http://127.0.0.1:8090" # default http://127.0.0.1:8080 ``` -NInfer has no port of its own: it rides the proxy llama-swap reports in `/running`, so fixing `[llama_swap]` is enough. Ports configured here are skipped by discovery, so they are never mistaken for a separate engine. +NInfer has no port of its own: it uses the proxy that llama-swap reports in `/running`, so fixing `[llama_swap]` is enough. Ports configured here are skipped by discovery, so they are never mistaken for a separate engine. ## Demo mode @@ -226,7 +226,7 @@ node smoke/shell.mjs # real app.js shell, python3 -m http.server 8792 # → http://localhost:8792/?demo ``` -The UI files are ES modules, so `node --check` does not apply to them. The smoke scripts import and run them, which serves as the parse-and-run check. +The UI files are ES modules, so `node --check` does not apply to them. The smoke scripts import and run them, which is the parse-and-run check. The two `test_hostinfo.py` skips are platform gates: the `/proc` backend runs on Linux and the Win32 ctypes backend runs only on Windows. On a Linux box the Windows path is read, not executed, so its numbers stay unverified until you run the suite on Windows.