OWI — Ollaya Web Interface

Web UI + HTTP API in front of the local Ollaya server (POST /api/decide, GET /api/tags, GET /api/ps, /v1/*, …) and its MCP server (ollaya mcp --http).

OWI — Decide tab with live metrics, model policy and answers

What it does

  • Decide playground — pick a model, a built-in preset (triage, email, guard, moderation, router, agent) or your own questions; answers with probabilities, load/eval timings, routing info.
  • Model manager — list local + loaded models, pull / delete / copy / create (Modelfile-style), load / unload, default-model keep-alive policy.
  • MCP control — local start/stop plus remote-host management over SSH (key auth), tool calls, resources, client config snippets.
  • Users & security — session login for the UI, bearer API keys for scripts, admin / user roles; per-user history and metrics scoping.
  • Performance & log — totals, p50/p95, per-model/per-preset/per-day, health history, searchable log with retention.
  • Full API — everything the UI does is a GET/POST /api/* call.

Contents

Install — pick one path

Requirements: Ollaya serving (default http://127.0.0.1:11435, tested against Ollaya 0.7.3), plus Python 3.10+ (bare metal) or Docker (container) — pick one path, not two on the same host.

Prebuilt image

Fastest try-out, no clone or build (see README):

mkdir -p data config
curl -s -o config/ollaya-webui.yaml \
  https://raw.githubusercontent.com/YOKurnaz/owi/main/config/ollaya-webui.yaml
docker run -d --name ollaya-webui --restart unless-stopped --network host \
  -e OWI_CONFIG=/config/ollaya-webui.yaml -e OWI_DB=/data/owi.db \
  -e OLLAYA_BASE_URL=http://127.0.0.1:11435 \
  -v ./config:/config:ro -v ./data:/data \
  ghcr.io/yokurnaz/owi:0.2.1
# UI: http://<HOST-IP>:11524 (first login: admin / admin)

Smoke-tested but not yet battle-tested — bare metal remains best-supported for now.

Bare metal

git clone https://github.com/YOKurnaz/owi.git
cd owi
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
bash run.sh
# UI: http://<HOST-IP>:11524

First login is admin / admin — change it immediately in the User tab. Or run as a service: see the README.

Docker

Prebuilt: ghcr.io/yokurnaz/owi:0.2.1 (docker pull it to skip the build).

git clone https://github.com/YOKurnaz/owi.git
cd owi
docker build -t ollaya-webui:latest .   # or: docker pull ghcr.io/yokurnaz/owi:0.2.1
mkdir -p data config
docker compose up -d --build
# UI: http://<HOST-IP>:11524 (first login: admin / admin)

Step-by-step (plain docker run, volumes, host.docker.internal, MCP notes) in the README.

Screenshots

Models — local library, loaded in memory, default-model policy

OWI — Models tab

Performance — per-model / per-preset / per-day, health history

OWI — Performance tab

Request log — search, filters, retention

OWI — Log tab

Audit — admin-only trail of management calls + denied attempts

OWI — Audit tab

Quick API taste

B=http://<HOST-IP>:11524
curl -s -c jar -X POST $B/api/auth/login \
  -H 'Content-Type: application/json' -d '{"username":"admin","password":"..."}'
curl -s -b jar -X POST $B/api/keys -d '{"name":"n8n"}'   # key shown ONCE
KEY=owi_...
curl -s $B/api/decide -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' -d '{
    "model": "laya", "preset": "triage",
    "state": {"message": "You charged me twice, refund NOW!"}
  }' | python3 -m json.tool

Full guide in the README — source code, feedback via GitHub issues.