diff --git a/serverAppConfigs-docs/Dankclaw/OpenWebUI.md b/serverAppConfigs-docs/Dankclaw/OpenWebUI.md index 6563e7c..00e70e8 100644 --- a/serverAppConfigs-docs/Dankclaw/OpenWebUI.md +++ b/serverAppConfigs-docs/Dankclaw/OpenWebUI.md @@ -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). | | 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` | -| 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) | | Persistence | Quadlet unit `open-webui.service`; `[Install] WantedBy=default.target` | | 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) plus the `model_ids` of each **enabled** OpenAI connection, NOT from live 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 | |---|---|---|---|---|---| -| 0 | `http://host.containers.internal:7770/v1` | no (2026-10-07) | `frank-large` | 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 | -| 2 | `http://host.containers.internal:7771/v1` | yes | `frank-secondary` | llama.cpp CUDA (RTX 3090, 2×200,704) | 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-archon` | radiance TP=2 (2× R9700) | Dankserver | +| 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` -(context length 200,704 = the per-slot window; description: Qwen3.5-9B -Q6_K + BF16 vision mmproj). +The `model` table carries one decoration row per picker model: +`frank-zealot` (context length 200,704 = the per-slot window; description: +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 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 -1. `GET /api/v1/models/list?limit=100` → returns EXACTLY the intended - models. Response key is `items`, not `data`. +1. `GET /api/models` (the picker endpoint; response key `data`) → lists + 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 with exactly one word: pong") → each returns content `pong`. Reasoning 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 `/home/dank/Containers/open-webui/data/webui.db` (no `sqlite3` CLI on Dankclaw; table is `user`, singular; no `active` column). No per-user model - grant is needed: the picker model `frank-secondary` carries the global - `access_grant` row `(model, frank-secondary, user, *, read)`, so any - `role='user'` account sees it. Flip on FIRST-LOGIN SIGHTING — the row does + grant is needed: both picker models (`frank-zealot`, `frank-dragoon`) carry + the global `access_grant` row `(model, , user, *, read)`, so any + `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 had no row). - **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 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 - [[Dankclaw Stack]] diff --git a/serverAppConfigs-docs/log.md b/serverAppConfigs-docs/log.md index d8e86d9..0433f4b 100644 --- a/serverAppConfigs-docs/log.md +++ b/serverAppConfigs-docs/log.md @@ -1562,3 +1562,26 @@ every restart since the cutover. so the honest claim is ~184 s of inductor/AOT build recovered per restart — 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. +