Compare commits

...
Author SHA1 Message Date
Frank 71c6b5e758 docs(openwebui): frank-dragoon enabled in the picker beside frank-zealot
Live DB trio applied on Dankclaw (enable idx 0, model row + global
access_grant, restart); verified /api/models as admin and role=user,
chat answers pong. Battery rewritten to gate on /api/models —
/api/v1/models/list lists only workspace models on 0.6.x.
2026-10-09 20:43:28 -07:00
2 changed files with 57 additions and 13 deletions
+34 -13
View File
@@ -24,7 +24,7 @@ https://github.com/open-webui/open-webui
| Upstream latest | 0.11.4 (2026-09-21) — security/access-control advisory; `:main` is the rolling image, not a stable pin. Imagegen endpoint is `POST /api/v1/images/generations` (the `comfyui` engine is still upstream). | | Upstream latest | 0.11.4 (2026-09-21) — security/access-control advisory; `:main` is the rolling image, not a stable pin. Imagegen endpoint is `POST /api/v1/images/generations` (the `comfyui` engine is still upstream). |
| Port | 3005 (host) → 8080 (container). Port 3000 is Gitea's HTTP, so it is not usable. | | Port | 3005 (host) → 8080 (container). Port 3000 is Gitea's HTTP, so it is not usable. |
| Data volume | `/home/dank/Containers/open-webui/data` → `/app/backend/data` | | Data volume | `/home/dank/Containers/open-webui/data` → `/app/backend/data` |
| Backends | Picker exposes exactly one model — `frank-secondary` (host.containers.internal:7771). The `frank-large` and `frank-primary` connections remain configured in the DB, disabled (2026-10-07) — see [The LLM backends](#the-llm-backends) | | Backends | Picker exposes two models — `frank-zealot` (host.containers.internal:7771) and `frank-dragoon` (host.containers.internal:7770, added 2026-10-09). The `frank-archon` (Dankserver) connection remains configured in the DB, disabled — see [The LLM backends](#the-llm-backends) |
| Network | Pinned bridge `systemd-open-webui` (`10.89.3.0/24`, gateway `10.89.3.1`) — see [History](#history) | | Network | Pinned bridge `systemd-open-webui` (`10.89.3.0/24`, gateway `10.89.3.1`) — see [History](#history) |
| Persistence | Quadlet unit `open-webui.service`; `[Install] WantedBy=default.target` | | Persistence | Quadlet unit `open-webui.service`; `[Install] WantedBy=default.target` |
| Deploy | `scripts/deploy-open-webui-quadlet.sh dankclaw` | | Deploy | `scripts/deploy-open-webui-quadlet.sh dankclaw` |
@@ -34,17 +34,20 @@ https://github.com/open-webui/open-webui
The picker is built from the `model` table in `webui.db` (one row per model) The picker is built from the `model` table in `webui.db` (one row per model)
plus the `model_ids` of each **enabled** OpenAI connection, NOT from live plus the `model_ids` of each **enabled** OpenAI connection, NOT from live
connection discovery — so the picker shows exactly what is seeded there. connection discovery — so the picker shows exactly what is seeded there.
As of 2026-10-07 the picker exposes **exactly one model: `frank-secondary`**. As of 2026-10-09 the picker exposes **two models: `frank-zealot` and
`frank-dragoon`**.
| Connection (`openai.api_configs` idx) | URL | Enabled | `model_ids` | Runtime | Host | | Connection (`openai.api_configs` idx) | URL | Enabled | `model_ids` | Runtime | Host |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| 0 | `http://host.containers.internal:7770/v1` | no (2026-10-07) | `frank-large` | halogen flash-server (Strix Halo iGPU) | Dankclaw | | 0 | `http://host.containers.internal:7770/v1` | yes (2026-10-09) | `frank-dragoon` | halogen flash-server (Strix Halo iGPU) | Dankclaw |
| 1 | `http://192.168.0.235:7770/v1` | no (2026-10-07) | `frank-primary` | radiance TP=2 (2× R9700) | Dankserver | | 1 | `http://192.168.0.235:7770/v1` | no (2026-10-07) | `frank-archon` | radiance TP=2 (2× R9700) | Dankserver |
| 2 | `http://host.containers.internal:7771/v1` | yes | `frank-secondary` | llama.cpp CUDA (RTX 3090, 2×200,704) | Dankclaw | | 2 | `http://host.containers.internal:7771/v1` | yes | `frank-zealot` | llama.cpp CUDA (RTX 3090, 2×200,704) | Dankclaw |
The `model` table carries exactly one decoration row, `frank-secondary` The `model` table carries one decoration row per picker model:
(context length 200,704 = the per-slot window; description: Qwen3.5-9B `frank-zealot` (context length 200,704 = the per-slot window; description:
Q6_K + BF16 vision mmproj). Qwen3.5-9B Q6_K + BF16 vision mmproj) and `frank-dragoon` (context length
262,144 = the per-slot `HALOGEN_CTX`; description: Swift1.5 v2 abliterated,
MTP, vision ON).
A third gate sits *after* the table, and it is the one that bites family A third gate sits *after* the table, and it is the one that bites family
accounts (2026-10-07): a model row is only visible to a non-admin user when accounts (2026-10-07): a model row is only visible to a non-admin user when
@@ -112,8 +115,11 @@ The Ollama connection is disabled (`ollama.enable=false`).
## Verification battery ## Verification battery
1. `GET /api/v1/models/list?limit=100` → returns EXACTLY the intended 1. `GET /api/models` (the picker endpoint; response key `data`) → lists
models. Response key is `items`, not `data`. EXACTLY the intended models, **as an admin AND as a `role='user'` token**.
Do NOT gate on `GET /api/v1/models/list` (the Admin Panel → Models page):
on the 0.6.x image it returns `items: []` for connection-backed models
(workspace-list only; measured 2026-10-09 on both picker ids).
2. `POST /api/chat/completions` per model with a trivial prompt ("Reply 2. `POST /api/chat/completions` per model with a trivial prompt ("Reply
with exactly one word: pong") → each returns content `pong`. Reasoning with exactly one word: pong") → each returns content `pong`. Reasoning
models need a generous budget: frank-secondary (Qwen3.5 template) returns models need a generous budget: frank-secondary (Qwen3.5 template) returns
@@ -191,9 +197,9 @@ browser-driven and only touches the two exempt vhosts (`ai.` and `auth.`).
run with host `python3` over ssh against run with host `python3` over ssh against
`/home/dank/Containers/open-webui/data/webui.db` (no `sqlite3` CLI on `/home/dank/Containers/open-webui/data/webui.db` (no `sqlite3` CLI on
Dankclaw; table is `user`, singular; no `active` column). No per-user model Dankclaw; table is `user`, singular; no `active` column). No per-user model
grant is needed: the picker model `frank-secondary` carries the global grant is needed: both picker models (`frank-zealot`, `frank-dragoon`) carry
`access_grant` row `(model, frank-secondary, user, *, read)`, so any the global `access_grant` row `(model, <id>, user, *, read)`, so any
`role='user'` account sees it. Flip on FIRST-LOGIN SIGHTING — the row does `role='user'` account sees them. Flip on FIRST-LOGIN SIGHTING — the row does
not exist until the account signs in (2026-10-09: five provisioned accounts not exist until the account signs in (2026-10-09: five provisioned accounts
had no row). had no row).
- **IdP reachability:** the container is on its own bridge (10.89.3.0/24) and - **IdP reachability:** the container is on its own bridge (10.89.3.0/24) and
@@ -308,6 +314,21 @@ on large sizes ⇒ check ComfyUI resources; 401 ⇒ the token is bad.
name: /selected model/i })`) and the welcome text "How can I help you name: /selected model/i })`) and the welcome text "How can I help you
today?"; that snapshot is also the cheapest proof the picker is populated. today?"; that snapshot is also the cheapest proof the picker is populated.
- **2026-10-09 — `frank-dragoon` added to the picker.** Per Frank: expose the
halogen endpoint (service `frank-large`, `host.containers.internal:7770`)
beside `frank-zealot`. Three id-keyed writes (the trio the 10-07 rebuild
proved): `openai.api_configs` idx 0 `enable: true` (its `model_ids` already
carried `frank-dragoon` from the wire rename), a `model` row (`id`/`name`
`frank-dragoon`, `params.context.length` 262144 = the per-slot
`HALOGEN_CTX`, description of the v2 abliterated payload), and the global
`access_grant` `(model, frank-dragoon, user, *, read)`. Snapshot
`webui.db.bak-20261009b`, apply with host `python3` over ssh, then
`systemctl --user restart open-webui.service`. Verified: `/api/models`
lists `frank-dragoon` as admin AND as the QA `role='user'` account, and
`POST /api/chat/completions` through the app answers `pong` at
`max_tokens 1500`. Halogen's `/v1/models` is OpenAI-shaped, so discovery
would have worked too — `model_ids` stays authoritative.
## See Also ## See Also
- [[Dankclaw Stack]] - [[Dankclaw Stack]]
+23
View File
@@ -1562,3 +1562,26 @@ every restart since the cutover.
so the honest claim is ~184 s of inductor/AOT build recovered per restart — so the honest claim is ~184 s of inductor/AOT build recovered per restart —
not a proportional boot cut. not a proportional boot cut.
## 2026-10-09 — OpenWebUI picker: `frank-dragoon` enabled beside `frank-zealot`
- Per Frank: make `frank-dragoon` (service `frank-large`, halogen
flash-server, `host.containers.internal:7770`) selectable in OpenWebUI. The
connection (idx 0) already carried `model_ids: ["frank-dragoon"]` from the
wire rename; it lacked the other two legs of the trio: `enable: false`, no
`model` row, no `access_grant`.
- Applied on the live DB (snapshot `webui.db.bak-20261009b`): idx 0
`enable: true`; `model` row `frank-dragoon` with
`params.context.length = 262144` (per-slot `HALOGEN_CTX`) and the v2
abliterated description; `access_grant`
`(model, frank-dragoon, user, *, read)`. Then
`systemctl --user restart open-webui.service` (drops cached model list;
browser JWTs die with it — expect one SSO re-round-trip per tab).
- Verified: `/api/models` lists `frank-dragoon` as admin AND as the QA
`role='user'` account (picker truth, key `data`); `POST
/api/chat/completions` through the app answers `pong` at `max_tokens
1500`. `/api/v1/models/list` reads `items: []` for connection-backed
models on this 0.6.x image (pre-existing for `frank-zealot` too) — the
battery in [[OpenWebUI]] is rewritten to gate on `/api/models`.
- Docs: [[OpenWebUI]] Facts/LLM-backends/battery/history updated;
`frank-archon` (idx 1, Dankserver) intentionally stays disabled.