Releases: Wecury/dsh-owui-chat2api
Release list
v0.8.0
Highlights
-
🟢 Login results land in the panel — finishing the login flow now pops a
green "credential saved" (or yellow failure) notice in the sticky bar, so the
outcome of a browser sign-in is visible without digging through logs. -
🚀 Nothing blocks the request path any more — python/deps probing is fully
async (no more worst-case ~27s event-loop freezes), and the one-click model &
reasoning sync answers immediately: the scan runs on the host and the
result arrives through the status poll, with a steady "scan running" notice. -
🧱 A modular host —
lib/index.jsshrank from 650 to 193 lines of pure
wiring; config, diagnostics, process lifecycle and settings-sync each live in
their own module. Zero behavior change, verified by a new test suite. -
🧪 First test suite —
npm testships 18node:testcases covering the
settings.yamlpatcher: idempotency, CRLF handling, byte-level preservation
of comments and unrelated providers, and the verify-after-write round-trip. -
🩹 Startup credential validation (ported from upstream
32df4a5) — saved
credentials are checked against the backend at proxy start. A revoked token
now opens the sign-in window instead of silently serving 401s; an unreachable
backend keeps serving so a transient outage can't kill DSH autostart. Plus the
0.7.2 streaming fixes: truncated streams end gracefully and upstream failures
answer 502 instead of hanging.
Changelog
Features
- ✨ login: the flow's outcome surfaces in the sticky notice — green when a
credential was saved, yellow on failure; a 10-minute freshness window means a
panel reopened hours later never replays stale results - ✨ sync: effort-scan returns instantly (
{ async: true }) and reports via
/api/status(mirrors start/login); double clicks are refused host-side
("a scan is already running") - ✨ proxy: validate saved credentials at startup (upstream
32df4a5,
plugin-adapted: only a definite 401/403 falls back to the browser — an
unreachable backend keeps the saved credential and serves)
Bug Fixes
- 🐛 proxy: truncated upstream streams finish gracefully — a final chunk with
the observedfinish_reason(orstop) plus usage and[DONE], so strict
clients no longer fail with "Stream ended without finish_reason"; upstream
failures answer 502 instead of leaving the request hanging (0.7.2) - 🐛 panel: info notices tinted with real DSH blue tokens — the brand alias is
near-monochrome, so they previously rendered gray - 🐛 panel: boot anchor poll stops once the shell is pinned (ResizeObserver
takes over); closed-panel status polling slowed from 3s to 10s
Refactoring
- ♻️ host:
index.jssplit intolib/config.js,lib/diagnostics.js,
lib/proxy-process.js,lib/effort-scan.js— the entry file is a 193-line
wiring layer only - ♻️ panel: styles extracted to
lib/panel.css(served via/panel.css),
dictionaries tolib/panel-i18n.jsinjected beforepanel.js - ⚡ host: probing rewritten on async
spawnwith in-flight dedup — even a cold
probe never blocks the event loop - 🔧 pack: auto-relinks the junction + profile dependency and always writes the
profilepackage.jsonBOM-free — the local test loop is now exactly
"pack + restart"
Tests
- ✅
npm test: 18node:testcases forsettings-patch.js— effort-block
insertion & indentation, idempotency (NO_CHANGE+already), CRLF
detection & preservation, byte-for-byte comment/provider preservation, empty
models:lists,ensureProviderchain creation & name-collision avoidance,
and the three-round verify-after-write invariant
Full Changelog: v0.7.1...v0.8.0
v0.7.1
Highlights
-
🧩 One-click model & reasoning sync — the panel button scans the upstream
through the proxy, auto-creates the model provider in~/.dsh/settings.yaml
when none points at the local proxy (inline auth header included, so no API key
is ever asked for), adds every backend model that isn't declared yet, and
writesreasoningEffortsfor the models that accept the parameter. Fresh
installs: log in once, click Sync, restart DSH — nothing to type in Settings. -
🛡️ Credentials leave the plugin directory — the Open WebUI session token (a
live JWT) now lives in~/.dsh/dsh-owui-chat2api-token.json(via
DSH_OWUI_TOKEN_FILE), never inside the install folder; a stray bundle-side
token is migrated once and removed.token.json/usage.db/.chrome-profile
/__pycache__are hard-excluded from the package even when built from a
working copy. -
⚡ Effort scan that survives real backends — probes run concurrently
(8 workers, cache preserved) with a 20-minute host budget, so large model lists
are no longer killed mid-scan; a Force re-scan button re-probes everything. -
🧠 Native reasoning levels in DSH — supported models show
Off / Low / Medium / High in DSH's own model picker via auto-written
reasoningEffortsentries. -
🔐 Dependable browser login — the token read from Open WebUI is validated
before it's accepted; a stale token reopens the browser for a real sign-in
instead of silently breaking every request with 502s.
Changelog
Features
- ✨ sync: create the
llm-pi-ai > providerschain insettings.yamlwhen no
provider points at the local proxy — no manual "add provider + fill key" step - ✨ sync: auto-created provider carries an inline
Authorizationheader, so DSH
never prompts for a key (the proxy ignores incoming keys and uses its own token) - ✨ sync: declare missing backend models (
- id:+name:) in the matching
provider only; every other provider and byte of the file is untouched - ✨ sync: timestamped
.bak-reasoning-*backup before any write; re-runs are
idempotent - ✨ sync: Force re-scan re-probes every model, ignoring the cached results
- ✨ login: prefer a long-lived Open WebUI API key when authenticating
Bug Fixes
- 🐛 pack:
files-allowlist negations +.npmignore/.gitignore— a JWT can no
longer ride a tarball even if a login ran inside the repo copy - 🐛 scan: concurrency + explicit host timeout — large model lists aren't killed
at 90s any more; results are collected in one run - 🐛 scan: host-side busy guard + long panel busy window — two clicks can't start
a second concurrent scan that races the settings.yaml write - 🐛 settings: keep only the newest 4
.bak-reasoning-*files so~/.dshisn't
buried over years - 🐛 settings: verify-after-write — the patched file is re-read and re-checked
(provider exists / models present / efforts applied) and warns if not - 🐛 login: validate the saved token against the upstream instead of trusting
localStorage— no more flash-and-close window followed by dead 502s - 🐛 login: keep the browser open until a valid token is stored; auto re-auth on
401/403 - 🐛 proxy: refuse oversized request bodies (>8 MiB) before reading
- 🐛 panel: effort-scan and Save results show inline under the buttons instead of
the top status banner - 🐛 panel: close/language controls respond to Enter/Space (keyboard a11y);
overlay warns once when falling back to the page body and pauses while hidden - 🐛 panel: save / sync results surface in the single sticky notice bar (one
notification language, consistent auto-clear)
Full Changelog: v0.5.1...v0.7.1
v0.5.1
v0.5.1 — First public release
dsh-owui-chat2api is a DeepSeek Harness plugin that runs Open WebUI's
chat2api reverse proxy inside DSH and lets you control it from a floating
panel — no manual Python setup, config files, or separate terminal.
What's inside
- 📌 Floating control pill docked to the top-right of the DSH content area
(themed, EN/中文) ▶️ Start / Stop / Login controls with a live status card and dependency
diagnostics (checks Python +requests+ Playwright)- 📊 Usage dashboard: Today / Yesterday / Month / Cumulative — stat cards for
calls, in/out/cached tokens, latency, errors, plus a per-model share-bar
ranking (top 6 + "Other N", hover for the full breakdown) - 🤖 Auto-start toggle (persisted), pre-filled base URL
- 💾 Stable usage tracking in
<DSH_HOME>; one-time merge of legacy data - 🔐 Login session kept in a private browser profile — never shipped in the
artifact; bundle carries no credentials by design - 📦 Packed bundle (
npm pack/pack.ps1, MIT + THIRD_PARTY_NOTICES)
Fixes in this release
- Pill now sits below the DSH top bar instead of under the window close button
- Fixed the pill shrinking and overflowing its label (left+right layout bug);
width stays content-sized, 28px from the right edge - Host messages (login success, etc.) localized to Chinese when the UI language
is Chinese - Safe repack:
pack.ps1(now mirror-mode) preserves the live login profile - README release commands fixed for Windows PowerShell
Install
npm i <link to the .tgz in DSH profile> # or follow README's profile wiring