English | 简体中文
An adapter that exposes the models in your Open WebUI as a standard
OpenAI-compatible /v1 API for DSH
(DSH Desktop or the stock web UI), plus a usage dashboard that lives inside DSH.
It bundles chat2api, runs it as a local reverse proxy, and adds a control panel to the DSH web shell:
DeepSeek Harness (or any OpenAI-compatible client)
│ standard /v1 API → http://127.0.0.1:8000
▼
dsh-owui-chat2api (local reverse proxy, keeps its own login)
▼
your Open WebUI (browser sign-in once, session reused afterwards)
▶️ Start / stop the proxy from the panel- 🩺 Environment check: is Python available, are the dependencies installed? — and a one-click Install dependencies button when they are not, so no terminal is needed
- ⚙️ Configure your Open WebUI URL, host and port
- 📊 Usage dashboard: today / yesterday / month / total, ranked per model with colorful share bars — plus a manual price table (per 1M tokens, cached tokens priced separately) that turns the stats into a cost estimate
- ⚡ Honest cache tracking: a cache-hit-rate card when the backend reports cached tokens, a clear note when it doesn't; estimated and failed calls are surfaced too
- 🪟 One engine, mounted where it belongs: in DSH Desktop the console is a right-sidebar dock tab beside your conversation; the web UI gets the floating OWUI pill (the desktop shell deliberately skips the pill so it never covers the chat)
- 🧠 One-click model and reasoning-level sync (see Reasoning effort) — it also drops models you deleted in Open WebUI, so the list tracks the backend instead of only ever growing
- 📜 Process log with error highlighting, follow mode and copy
- 🎨 Color-coded sections with inline Tabler icons that follow the DSH theme (dark / light), zero external requests
Pick one of four ways: A is two clicks in the DSH UI, B is a single
command, C needs no git, D lets your DSH assistant do the whole thing.
DSH Desktop has a plugin manager built in: open the Plugins page in the right sidebar (or the Add plugin control, the +) and paste this URL:
https://github.com/Wecury/dsh-owui-chat2api#v0.10.2
Confirm, and DSH fetches the plugin, registers it in your profile and offers to
enable it. The #v0.10.2 fragment pins the release tag — drop it to follow
main, or swap in the version you want. This is the same dsh plugin add
machinery as Option B, just without a terminal; git must be on PATH.
Then restart DSH and install the Python dependencies with one click (see Dependencies) — the panel's diagnostics card has a button for it.
The dsh CLI ships a plugin manager. One command installs the plugin and
registers it in your profile (dependencies + bundles). Pick the profile that
matches your setup — desktop for DSH Desktop, web for the stock web UI:
dsh plugin --profile desktop add github:Wecury/dsh-owui-chat2api#v0.10.2
dsh plugin --profile web add github:Wecury/dsh-owui-chat2api#v0.10.2-
#v0.10.2pins the release tag — use the version you want (omit it to followmain). Thehttps://github.com/...#v0.10.2form works here too. -
Requires
giton PATH (pnpm clones the repo). Behind a proxy? Exporthttp_proxy/https_proxyfirst. -
Hit
[ERR_PNPM_EPERM] ... rename ..._tmp_...on Windows? A junction left by an earlier manual install (Option C) is in the way — remove only the link, then run the command again:cmd /c rmdir "%USERPROFILE%\.dsh\profiles\<desktop|web>\node_modules\dsh-owui-chat2api"
(
rmdiron a junction removes the link only, never the target folder.) -
Restart DSH when it finishes. Later updates (same
--profileas install):dsh plugin --profile <desktop|web> update dsh-owui-chat2api.
-
From Releases → Assets, download
dsh-owui-chat2api-<version>.tgz. (The Source code (zip) button is the development tree — for contributing, not for installing.) -
Unpack it into the plugins folder. The tarball extracts to a
package/directory — move and rename it (tarships with Windows 10+):tar -xzf dsh-owui-chat2api-0.10.2.tgz Move-Item package "$env:USERPROFILE\.dsh\plugins\dsh-owui-chat2api-0.10.2"
Upgrading over a previous manual install? If
%USERPROFILE%\.dsh\profiles\<desktop|web>\node_modules\dsh-owui-chat2apialready exists (an old junction), remove the link first —cmd /c rmdir "<that path>"— so the newlink:dependency resolves to the new folder instead of a stale target. -
Register the unpacked folder with the plugin manager — it writes the profile
package.json(link:dependency +dsh.profile.bundles) itself, so you do not have to hand-edit it (desktopfor DSH Desktop,webfor the stock web UI):dsh plugin --profile desktop add link:%USERPROFILE%\.dsh\plugins\dsh-owui-chat2api-0.10.2
Match the folder name to the version you downloaded. Hand-editing the profile
package.jsonalso works, but the manager owns that file now: it reconciles the profile against its own records on the next install or remove, and can revert rows it did not write (that is how another bundle once fell back to a stale pin).
Paste this to your DSH assistant and it will do the rest:
请帮我安装 DSH 插件 dsh-owui-chat2api(GitHub 仓库 Wecury/dsh-owui-chat2api)。
步骤:
1. 执行:dsh plugin --profile desktop add github:Wecury/dsh-owui-chat2api#v0.10.2
(用原版 web 界面就把 --profile desktop 换成 --profile web。需要本机有 git。
也可以在 DSH 的插件页面直接用 URL 安装:
https://github.com/Wecury/dsh-owui-chat2api#v0.10.2
如果都不行,改用手动方式:从仓库 Releases 的 Assets 下载
dsh-owui-chat2api-<版本>.tgz,解压得到 package/ 文件夹,移动并改名为
%USERPROFILE%\.dsh\plugins\dsh-owui-chat2api-<版本>;然后在
%USERPROFILE%\.dsh\profiles\<desktop|web>\package.json 的 dependencies 里加
"dsh-owui-chat2api": "link:<该目录的绝对路径>",并把 "dsh-owui-chat2api"
加进 dsh.profile.bundles 数组)
2. 重启 DSH。
3. 打开面板的 Configuration 区,点"一键安装依赖"装好 python 依赖。
4. 验证:右侧栏出现 OWUI Console 标签;点开面板,Status 区能显示状态即成功。
The proxy is Python: it needs requests and playwright (plus the chromium
build playwright drives). You do not need a terminal for this — the panel does
it:
- Open the panel → Configuration → the diagnostics card. If Python is found but the packages are missing, the card shows an Install dependencies button.
- Click it. It runs
pip install requests playwright, thenplaywright install chromium, streaming pip's output into the process log so a slow download is visible instead of a frozen button. On a system Python it adds--userautomatically; inside a venv that flag is refused, so it is skipped there. - The card flips to Ready when it finishes. A proxy that was already running keeps its old interpreter until you stop and start it.
If Python itself is missing, install it first from python.org (that installer bundles pip) — the panel cannot install an interpreter for you.
- Restart DSH (after any install option above). The console appears as an OWUI Console tab in the right sidebar (DSH Desktop), or as the OWUI pill in the top-right corner (web UI).
- Open the panel and set your Open WebUI URL (the default is a placeholder).
- Click Start. The first run opens a browser window for a one-time sign-in; the session is reused afterwards.
| Symptom | What to do |
|---|---|
| Diagnostics shows Attention | Click Install dependencies in the diagnostics card (or run pip install requests playwright + playwright install chromium yourself) |
| Login fails / asks to sign in again | Click Login in the panel and sign in once in the window |
| Models missing from the DSH picker | Click Sync models & reasoning levels, then restart DSH |
The URL is your-open-webui.example.com |
That's the placeholder — set your real address, then Start |
[ERR_PNPM_EPERM] ... rename ..._tmp_... when installing |
An old junction from a previous manual install is in the way — `cmd /c rmdir "%USERPROFILE%.dsh\profiles<desktop |
Reasoning models (e.g. served behind a vLLM gateway) honour reasoning_effort,
so DSH's model picker shows the levels that model actually accepts (off means
"send no reasoning_effort at all").
The easiest way is the Sync models & reasoning levels button in the
Configuration section: it probes each level of each model, declares only the
levels the backend accepted, and writes a backup first. That matters because
acceptance is not a range — DeepSeek V4.1 takes low/high/xhigh/max but rejects
medium, and Qwen3.8-27B takes xhigh but rejects high — and a level the backend
rejects turns that pick into an HTTP 400. When your backend gains a model, click it
again — already-probed models hit the cache. A mapping that drifted out of date is
corrected in place. Models you deleted in Open WebUI are dropped from
settings.yaml on the next sync, so the list tracks the backend instead of only
ever growing.
For manual declaration or using chat2api.py standalone, see
DEVELOPMENT.md.
- Your Open WebUI session (
.chrome-profile,token.json, the usage database) stays on this machine and is excluded from git and from the package. - The usage database and the proxy config live under
~/.dsh, outside the plugin directory, so they survive plugin updates. - The proxy listens on
127.0.0.1only.
See DEVELOPMENT.md for the code layout, conventions and how to test a change locally.
- Plugin code (outside
chat2api/): MIT — see LICENSE. - The bundled
chat2api/proxy: MIT © openwebui-chat2api contributors — see THIRD_PARTY_NOTICES.md and Sozbo-Tang/openwebui-chat2api.
