docker-compose.webui.yml.
Compatibility: Tested with Open WebUI v0.8.11–0.8.12. Set OPENWEBUI_VERSION in .env to pin.
Not a fork. Everything is bolted on via the official plugin API (tools + functions) + build-time patches for missing features. Stock Open WebUI v0.8.11–0.8.12 works if you install the tool and filter. Patches are applied at Docker build time — strongly recommended; 4 of them affect user-visible UX.
What’s installed
Theopenwebui/ directory contains:
Auto-init (bundled compose)
On firstdocker compose -f docker-compose.webui.yml up, the init script:
- Creates an admin user (
ADMIN_EMAIL/ADMIN_PASSWORD). - Installs the Computer Use tool via
POST /api/v1/tools/create. - Installs the filter via
POST /api/v1/functions/create. - Configures both Valves:
ORCHESTRATOR_URL=http://computer-use-server:8081(internal, server↔server). - Marks the tool public-read (grants for both
group:*anduser:*) so non-admin users see it. - Marks the filter active and global (two separate toggles — active-but-not-global silently does nothing).
- Merges
{function_calling: "native", stream_response: true}intoDEFAULT_MODEL_PARAMS.
.computer-use-initialized) prevents re-running.
Manual setup (standalone Open WebUI)
- Workspace → Tools → Create → paste
openwebui/tools/computer_use_tools.py. - Set Tool ID =
ai_computer_use(the filter looks for this). - Configure Valves:
ORCHESTRATOR_URL= internal URL of the Computer Use Server. - Open the tool’s ⋯ → Share → set access to Public (grants read to both
group:*anduser:*). - Workspace → Functions → Create → paste
openwebui/functions/computer_link_filter.py. - Toggle the function Active and Global (two separate switches).
- In model settings, set Function Calling = Native and Stream Chat Response = On — or globally in Admin → Settings → Models → Advanced Params.
Four traps when embedding Open WebUI in your own stack
If you run Open WebUI outside the stock compose file — downstream compose, Kubernetes, Portainer — four things silently break Computer Use. In order.1. Build from openwebui/Dockerfile, don’t pull upstream
Pulling ghcr.io/open-webui/open-webui:vX.Y.Z gives you a stock image without the patches:
Use
build: mirroring docker-compose.webui.yml:11-15:
2. COMPUTER_USE_SERVER_URL must be the PUBLIC domain
This is the confusing one. COMPUTER_USE_SERVER_URL is a build argument — not a network endpoint. It’s compiled into a regex inside the minified Svelte chunks by fix_preview_url_detection. The regex matches {COMPUTER_USE_SERVER_URL}/(files|preview)/... in assistant messages.
The model writes whatever URL the server injected into the system prompt — the server’s PUBLIC_BASE_URL — which is your public domain. So the regex must match that.
Change after build = rebuild the image (
--build). The value is compiled in, not read at runtime.
3. Three URL settings, two roles
v4.0.0 simplified the old “threeFILE_SERVER_URL places” footgun. Three places, two roles — public (browser-reachable) vs internal (Docker-local):
4. Four env vars on the open-webui container
Related
- Open WebUI filter reference
- Claude Code gateway — routing Claude Code through LiteLLM
