165 lines
6.7 KiB
Markdown
165 lines
6.7 KiB
Markdown
# OpenWebUI RollCalc Pipe
|
|
|
|
`rollcalc_pipe.py` registers **RollCalc Assistant** as a selectable OpenWebUI
|
|
Pipe model. It does not call an OpenWebUI chat model and contains no engineering
|
|
logic. Each user message is forwarded to the existing authenticated RollCalc
|
|
conversation API, and only its deterministic `message` plus a safe report link
|
|
is rendered.
|
|
|
|
## Deployment discovery
|
|
|
|
The OpenWebUI runtime was not visible from the coding sandbox: the Docker socket
|
|
was inaccessible, no native OpenWebUI files/processes were visible, and the
|
|
usual local ports were not reachable. Run these commands directly on
|
|
`fertigungski` before enabling the Pipe:
|
|
|
|
```bash
|
|
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
|
|
docker inspect <openwebui-container> --format '{{json .NetworkSettings.Networks}}'
|
|
docker exec <openwebui-container> python -c \
|
|
'from importlib.metadata import version; print(version("open-webui"))'
|
|
```
|
|
|
|
For a native installation, use:
|
|
|
|
```bash
|
|
systemctl list-units --type=service | grep -i open-webui
|
|
python3 -c 'from importlib.metadata import version; print(version("open-webui"))'
|
|
```
|
|
|
|
Also verify the actual route in both network contexts:
|
|
|
|
```bash
|
|
# From the OpenWebUI container/server namespace
|
|
curl -u "$ROLLCALC_USERNAME:$ROLLCALC_PASSWORD" \
|
|
"$ROLLCALC_API_BASE_URL/api/health"
|
|
|
|
# From a demo user's browser/network (run on a representative workstation)
|
|
curl -I "$ROLLCALC_PUBLIC_BASE_URL/api/conversations/reports/not-found.pdf"
|
|
```
|
|
|
|
An authenticated `404` for the deliberately invalid report is sufficient for
|
|
the second network check. A `401` confirms that the public route exists but the
|
|
browser has not authenticated yet.
|
|
|
|
## Install and enable
|
|
|
|
1. Open **Admin Panel → Workspace → Functions** in OpenWebUI.
|
|
2. Create/import a Function using the complete contents of
|
|
`integrations/openwebui/rollcalc_pipe.py`.
|
|
3. Save it and enable the Function.
|
|
4. Open its Valves and configure the values below.
|
|
5. Start a new chat and select **RollCalc Assistant** as the model.
|
|
|
|
The Pipe uses `pydantic` and asynchronous `httpx`, which are OpenWebUI runtime
|
|
dependencies; RollCalc's Python environment gains no package dependency.
|
|
|
|
## Configuration
|
|
|
|
Environment variables provide defaults; Function Valves can override them in
|
|
OpenWebUI:
|
|
|
|
| Variable / Valve | Purpose |
|
|
| --- | --- |
|
|
| `ROLLCALC_API_BASE_URL` | RollCalc base URL reachable by the OpenWebUI server/container. |
|
|
| `ROLLCALC_PUBLIC_BASE_URL` | RollCalc base URL reachable by the user's browser. |
|
|
| `ROLLCALC_USERNAME` | Basic-Auth user used by the Pipe for API calls. |
|
|
| `ROLLCALC_PASSWORD` | Basic-Auth password used by the Pipe for API calls. |
|
|
| `ROLLCALC_OPENWEBUI_TIMEOUT_SECONDS` | End-to-end request timeout; default `90`. |
|
|
| `ROLLCALC_OPENWEBUI_DEBUG` | Safe console diagnostics; default `false`. |
|
|
|
|
Do not put credentials into either URL. Store the password in the protected
|
|
OpenWebUI Valve/environment configuration and do not commit it.
|
|
|
|
`localhost` inside a container refers to that container. Typical internal URLs
|
|
are:
|
|
|
|
- `http://rollcalc:5000` when both services share a Docker network;
|
|
- `http://host.docker.internal:5000` when RollCalc runs on the host and the
|
|
Linux container has an explicit `host-gateway` mapping;
|
|
- the server's real internal DNS name when the services run on separate hosts.
|
|
|
|
The public URL must be the externally reachable origin/path, for example
|
|
`https://fertigungski.example/rollcalc`. It must never be an internal-only
|
|
container hostname.
|
|
|
|
Qwen remains configured on the RollCalc service, not in the Pipe. For the
|
|
validated local model, start RollCalc with:
|
|
|
|
```bash
|
|
export ROLLCALC_OLLAMA_MODEL=qwen3.5:35B-A3B
|
|
```
|
|
|
|
The existing `ROLLCALC_OLLAMA_URL`, timeout, temperature `0`, `think=false`,
|
|
and structured-output settings remain authoritative in `ollama_nlu.py`.
|
|
|
|
## Session and authentication behavior
|
|
|
|
The Pipe maps `(OpenWebUI user ID, OpenWebUI chat ID)` to one RollCalc
|
|
`conversation_id`. It serializes messages within one chat and allows different
|
|
chats to wait on Qwen independently. The mapping is process-local and is lost
|
|
when OpenWebUI reloads the Function or restarts. RollCalc's own conversation and
|
|
report stores are also process-local and are lost when RollCalc restarts.
|
|
|
|
If RollCalc reports an expired/unknown conversation, the Pipe removes the
|
|
mapping and asks the user to repeat a complete initial request. It deliberately
|
|
does not replay a follow-up into an empty technical state.
|
|
|
|
API calls authenticate server-to-server with the configured Basic-Auth account.
|
|
PDF links never contain those credentials. The existing PDF endpoint therefore
|
|
prompts the browser for RollCalc Basic Auth on first access. For the demo, open
|
|
and authenticate to `ROLLCALC_PUBLIC_BASE_URL` once in the same browser. Shared
|
|
SSO or a short-lived download token is not implemented.
|
|
|
|
Because all Pipe API calls use one service account, RollCalc's current access
|
|
log records that service identity rather than the individual OpenWebUI user.
|
|
|
|
## Demo procedure
|
|
|
|
For a repository-local validation, use separate terminals:
|
|
|
|
```bash
|
|
# Terminal 1
|
|
ollama serve
|
|
|
|
# Terminal 2
|
|
cd /opt/git-projects/RollCalcPython
|
|
ROLLCALC_OLLAMA_MODEL=qwen3.5:35B-A3B .venv/bin/python app.py
|
|
```
|
|
|
|
Start/restart the already-discovered OpenWebUI deployment using its actual
|
|
container or native service name; do not create a second deployment merely for
|
|
the Pipe. Configure and enable the Function as described above. Then open
|
|
`ROLLCALC_PUBLIC_BASE_URL` once and complete its Basic-Auth prompt.
|
|
|
|
Select **RollCalc Assistant** in OpenWebUI and use one chat for the entire
|
|
sequence:
|
|
|
|
```text
|
|
Welchen Durchmesser hat Bentofix NSP 4900, Artikelnummer 180205 bei 65 m Länge?
|
|
150 mm
|
|
Bitte ändere den Kern auf einen Stahlkern.
|
|
194 mm
|
|
Wie schwer ist die berechnete Rolle?
|
|
Ändere die Länge auf 80 m.
|
|
```
|
|
|
|
Select one of the candidate diameters actually offered by RollCalc if the preset
|
|
list differs. Verify that each successful recalculation has a new **PDF
|
|
herunterladen** link, that the weight remains visible after the final length
|
|
change, and that opening the links produces authenticated PDFs.
|
|
|
|
## Known demo limitations
|
|
|
|
- There is no streaming token output; the Pipe returns when the local Qwen plus
|
|
deterministic RollCalc request completes.
|
|
- Session mappings, RollCalc conversation state, and reports are in memory only.
|
|
- Multiple OpenWebUI or RollCalc workers do not share state.
|
|
- Browser and server-side Basic-Auth sessions are separate.
|
|
- RollCalc audit entries identify the configured Pipe service account, not the
|
|
originating OpenWebUI user.
|
|
- OpenWebUI direct API calls without a stable user/chat identifier are rejected
|
|
instead of sharing or guessing a session.
|
|
- OpenWebUI version, deployment topology, and the complete browser flow still
|
|
need verification in the actual `fertigungski` host namespace.
|