OPENWEBUI INTEGRATION
One thing to know first: this page uses <BOX-IP> as a
placeholder for this machine's address on your network. The build was done on a
different network; when the machine comes to you, find its address once with:
ip -br addr show enp191s0 # run on the box — note the inet address
Assign it whatever static IP you want on your network (your router's static-lease or
the box's NetworkManager — nmtui works). Then replace every
<BOX-IP> below with it. Also note: the box runs Tailscale and it
stays on the machine — the builder keeps admin access over the tailnet
(no root on the box; key-auth SSH only). Your OpenWebUI connection below works over your
LAN either way.
1. Install OpenWebUI (on any machine on your network)
Two supported routes — pick one:
Option A: Docker (recommended, simplest upgrades)
docker run -d -p 3000:8080 \ -v open-webui:/app/backend/data \ --name open-webui --restart always \ ghcr.io/open-webui/open-webui:main
Then browse to http://<openwebui-machine>:3000 and create your
admin account (first login is the admin).
Option B: Python (no Docker)
pip install open-webui open-webui serve # serves on port 8080 of that machine
2. Connect it to this box
In OpenWebUI: Settings → Admin Settings → Connections → OpenAI API:
- URL:
http://<BOX-IP>:8081/v1(gateway — recommended) or:8080/v1(raw lane) - Key: the API key for this box (issued with the machine — two independent
keys are live: builder key at
/srv/llm/secrets/api-key, your key at/srv/llm/secrets/api-key-2; both were emailed to the builder 2026-09-12 and both work on every endpoint)
Click save — all six chat models appear in the model picker:
qwen38-27b (fast daily driver, vision, tools) ·
flashnext-iq1s and flashnext-fp4 (176B MoE) ·
glm53-flash (313B deep reasoning) ·
dsv4-flash (284B, 1M context) ·
llama-3.3-70b.
Context lengths are pre-set to each model's maximum (262K–1M tokens) — no per-model tuning needed on your side.
3. Documents / RAG (his files, his machine)
OpenWebUI has built-in RAG: Workspace → Documents — upload PDFs/notes,
they become queryable knowledge in chat via the # mention.
For best retrieval quality, point its embedding model at this box:
Admin Settings → Documents → embedding model engine
openai, URL http://<BOX-IP>:8081/v1, model
embed. Optionally set the reranker:
http://<BOX-IP>:18190/v1/rerank (BGE reranker, runs on this box's CPU).
4. Image generation (ComfyUI on this box)
ComfyUI runs on this box at port 8188 (models staged: Qwen-Image,
Z-Image-Turbo, uncensored picks). In OpenWebUI:
Admin Settings → Images → engine ComfyUI, base URL
http://<BOX-IP>:8188. Then image generation works from any chat via the
image button. Note: image models load into the same 128G pool as the LLMs — if the pool is
busy with a large language model, ComfyUI may need it swapped out first (the box manages
this; generation just takes longer when models swap).
5. Tool calling
Verified working on this endpoint for: qwen38-27b,
flashnext-iq1s, flashnext-fp4,
dsv4-flash, llama-3.3-70b. GLM-5.3-Flash works with a template
fix already applied on the box.
OpenWebUI's built-in tools (web search, code execution via Jupyter, custom function tools) all pass through the OpenAI tool schema — define them in Workspace → Tools and they work with the models above.
6. Memory + grounding (the gateway)
The gateway service on this box layers persistent memory (mem0 +
Qdrant), tracing, and a server-side persona on top of every model — for every client,
not just OpenWebUI. Status: INSTALLED + verified 2026-09-11 — use
http://<BOX-IP>:8081/v1 as the connection URL; everything else stays the
same. The raw lane :8080/v1 also works but skips memory/tracing (admin/benchmark
use only). API key required on both.
7. Web search
Already working out of the box (builder's instance, Sept 2026): web search is enabled with the DuckDuckGo engine — no API key, no extra install. In a chat, click the + (plus) → Web Search toggle (or enable it per-chat from the input bar) and the model's answers get grounded with live results. OpenWebUI does the searching itself and injects results — this works with every model on the box, including ones that are shaky at tool-calling.
Recommended upgrades, in order of effort:
- Tavily (hosted, best quality/effort): free tier = 1,000
searches/mo. Get a key at
tavily.com, then Admin → Settings → Web Search → engine Tavily → paste key. One field, done. - Brave Search API: ~1,000 free queries/mo, raw results, key at
brave.com/search/api— same admin flow, engine Brave. - SearXNG (self-hosted, zero ongoing cost): needs
podmanordockeron the box (sudo dnf install podman— owner/root task), then:podman run -d --name searxng -p 127.0.0.1:8888:8080 searxng/searxng # then edit its settings.yml: under search: set formats: [html, json] (JSON output is # REQUIRED or OpenWebUI gets empty results) and set limiter: false (so your own AI # doesn't rate-limit itself), then: podman restart searxng
In OpenWebUI: Admin → Settings → Web Search → engine SearXNG → URLhttp://127.0.0.1:8888/search?q=<query>. The 127.0.0.1 bind keeps it private to the box. Caveat from community experience: SearXNG degrades under heavy daily use (upstream engines block the IP) — great for light use, Tavily/Brave for sustained agent workloads.
Agent-side search (MCP): the endpoint itself also carries two MCP
web tools (web-search via DuckDuckGo + web-fetch) registered on
the qwen38-27b and glm53-flash entries — agents using the raw
OpenAI tool-calling API can call them. Note (honest caveat): llama.cpp's MCP layer is
experimental — tool registration is verified, but structured
tool_calls emission varies by model (Qwen3.8 tends to emit the call JSON as
plain content). Harnesses that parse leniently handle it; OpenWebUI's own web search
(above) does not depend on it at all.
8. Firewall note (for your network)
This box ships with a restrictive firewall: only SSH (22) plus the AI ports (8080, 8081, 8188, 9621, 18190) are relevant, and the AI ports are scoped to the build network's range. On your network, allow your subnet once:
sudo firewall-cmd --permanent --zone=public \ --add-rich-rule='rule family="ipv4" source address=<YOUR-SUBNET> accept' sudo firewall-cmd --reload
Replace <YOUR-SUBNET> with your network (e.g. 192.168.1.0/24).
Or scope it tighter to just the ports, same pattern as the shipped rules.
Troubleshooting
- Connection refused → firewall (section 8) or wrong IP.
- 401 Unauthorized → API key mismatch; your key is on the box at
/srv/llm/secrets/api-key-2. - Model responds slowly at first → model swap; the box unloads one model to load another (up to a minute for the largest).
- Image gen fails → ComfyUI first start needs its model dir check:
ls /srv/llm/media/models/— see the Media Gen page.