Files
ducoterra 48bc92b9af
Build and Push Container / build-and-push (push) Successful in 38s
initial import: read-only gufo + vLLM dashboard
Single-file FastAPI proxy plus a no-CDN vanilla-JS page for watching a gufo
server and a vLLM server side by side: one Prometheus parser (class Prom) with
per-engine field maps, measured Δcounter/Δt rates for engines that export no
rate gauge, and strict read-only GET-only routing. Engines are opt-in via
*_BASE_URL — unset means no panel, no poll, and a 404 {"configured": false}
without dialling.

Includes the container image and CI so the dashboard can be deployed as an
image rather than a checkout:

- Containerfile: uv-locked two-stage build on python:3.14-slim, non-root
  (uid 10001), binds 8090 (8000 is vLLM's port in this fleet), healthcheck on
  /api/config so a dead engine never marks the dashboard unhealthy. No frontend
  build stage — static/index.html is bundler-free by design and is copied as-is.
- .gitea/workflows/build-and-push.yml: publishes
  gitea.reeseapps.com/Experimental/llm-monitor on main + release tags.

114 tests, no network and no real engines required.

LLM-Generated: true
2026-10-16 12:49:45 -04:00

39 lines
1.1 KiB
TOML

[project]
name = "llm-monitor"
version = "1.0.0"
description = "Read-only real-time dashboard for a gufo server and a vLLM server (sessions, queueing, cache pressure, throughput, latency)"
readme = "README.md"
requires-python = ">=3.10"
# Deliberately tiny: the Prometheus exposition is parsed in-process (class Prom in
# app.py) rather than pulled in as prometheus_client, and the frontend has zero
# runtime deps (vanilla JS + inline SVG, no CDN).
dependencies = [
"fastapi>=0.111",
"httpx>=0.27",
"uvicorn[standard]>=0.30",
]
# uv dev group: installed by plain `uv sync` (skip with `uv sync --no-dev`).
[dependency-groups]
dev = [
"pytest>=8",
"pytest-cov>=5",
]
# Not a distributable package — a single-file app run as `uv run uvicorn app:app`.
# package=false means no build backend, nothing to install, `uv run` just syncs deps.
[tool.uv]
package = false
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-q --strict-markers"
[tool.coverage.run]
source = ["app"]
omit = ["tests/*"]
[tool.coverage.report]
show_missing = true
skip_covered = false