Skip to content

webui: treat configured models the same with and without UI management - #972

Merged
0xShug0 merged 1 commit into
0xShug0:mainfrom
KKTTSPJ:pr/webui-configured-models
Oct 18, 2026
Merged

0xShug0 merged 1 commit into
0xShug0:mainfrom
KKTTSPJ:pr/webui-configured-models

Conversation

@KKTTSPJ

@KKTTSPJ KKTTSPJ commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Summary

With --ui-management, the WebUI still assumes a server without a config. Most of the config-mode behaviour added for #234 exists only without UI management. This PR makes a configured model behave the same in both modes:

  1. Configured models are offered with UI management too.
  2. A configured model's memory can be released from the WebUI in both modes.
  3. A model with built-in voices lists the same voices in both modes.

What stays as it is: without UI management, the WebUI offers only the configured models, with no catalog, downloads or model switching (the request in #234). POST /v1/models/unload stays management-only.

It pairs with #971, which adds the configured field to GET /v1/models and keeps a config model's settings when the WebUI loads it. Without that PR, item 1 adds nothing and items 2 and 3 still apply.

Background

I am sending this because, while working on #941, I kept running into places where UI management and config mode disagree for no clear reason. So I traced where the two modes split.

The result today, with a config and --ui-management:

Without UI management, the WebUI cannot release a configured model's memory. Yet POST /v1/tasks/unload_models (#197) does exactly that and needs no UI management. Only POST /v1/models/unload, which is part of model switching, is management-only.

Changes

  • Configured models with UI management.
    • The model list adds the config's models whose id is not in the catalog, using configured from GET /v1/models.
    • These entries show their id beside the name, because they often share a catalog entry's name.
    • A config model under a catalog id stays that catalog entry, so other formats of it can still be loaded.
  • One notion of a configured entry.
    • isConfiguredEntry() is true for every entry without UI management, and for the entries added above with it.
    • Where the WebUI branched on ui_management for the selected model, it now branches on isConfiguredEntry(). That covers the model path, the installed check, load and ensure-loaded, settings import, the Arena and the LFM2 panel.
    • A configured entry therefore behaves the same in both modes: it loads on its first request and is never reloaded from the catalog.
  • Release.
    • When a configured entry is loaded, its model button releases it through POST /v1/tasks/unload_models.
    • After a request loads such a model, the WebUI refreshes the model list, so the button shows the model as loaded. Before, it stayed "Configured" until the next refresh.
  • Voice list for models with built-in voices.
    • Both modes now list the server's voices (presets and library names) and the built-in voices, leaving out the embedded demo recordings.
    • Before, the list held all server voices plus the built-in ones without UI management, and only the built-in ones with it.
    • Library WAVs still appear for such a model, as they already did without UI management.
  • The management-only parts are unchanged: the Models tab, downloads, the models folder and package choices.
  • dist/index.html is rebuilt.

Testing

  • npm run check: 0 errors, 0 warnings. npm run build.
  • Setup:
    • In a browser, against a CUDA build of upstream main (5b772fe0) with this PR and server: keep config model settings on WebUI loads, and offer demo voices with --ui #971 applied. "main" is the same build without the two PRs.
    • The config is the one our packaged Windows launcher writes: 10 models, some under catalog ids (irodori-tts) and some not (irodori-tts-anime), and a voice_dir with one WAV.
    • Added to it: my-irodori (not a catalog id, preset narr2), a preset narr on irodori-tts, and kokoro-test. kokoro-test is a kokoro_tts entry registered without its files, used only to look at its voice list.

With UI management:

Check main This PR
irodori-tts-anime, my-irodori and kokoro-test in the model list not offered offered, with the id beside the name
my-irodori: voice list — the library WAV and narr2
my-irodori: generate with narr2, then the model button — "Configured", then "Loaded" right after the request; a click releases it (loaded: false)
kokoro-test: voice list — heart (preset), the library WAV, then the built-in voices
irodori-tts (catalog entry): generate with narr, which makes the WebUI load it — works; narr is still listed afterwards

Without UI management:

Check main This PR
Model list, Models tab configured models only, no Models tab same
my-irodori after a request "Configured" until a refresh, then "Loaded" and not clickable "Loaded" right after the request; a click releases it (loaded: false)
kokoro-test: voice list heart, the library WAV, the built-in voices same

I did not run this PR without #971. Without it, configured is absent, so the code adds no entries for item 1.

🤖 Generated with Claude Code

The config-mode support added to the WebUI only covered servers without
UI management; with --ui-management the WebUI kept assuming a server
without a config. So:

- A config model under an id the catalog does not have was not offered
  at all with UI management. It is now listed (with its id beside the
  name) and used as configured, as without UI management: it loads on
  its first request and is not reloaded from the catalog. A config model
  under a catalog id stays that catalog entry; the server keeps its
  config settings when the WebUI loads it.
- A configured model's memory could not be released from the WebUI. Its
  button now releases a loaded model through POST /v1/tasks/unload_models,
  which needs no UI management; /v1/models/unload stays management-only.
  After a request loads such a model the button shows it as loaded.
- A model with built-in voices listed only those voices with UI
  management, hiding the server's presets. Both modes now list the
  server's voices and the built-in ones, leaving out the embedded demo
  recordings, which such a model cannot clone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@0xShug0
0xShug0 merged commit 4c4f5c6 into 0xShug0:main Oct 18, 2026
6 checks passed
@0xShug0

0xShug0 commented Oct 18, 2026

Copy link
Copy Markdown
Owner

Thanks, @KKTTSPJ PR Merged!

cunba-ai pushed a commit to cunba-ai/audio.cpp that referenced this pull request Oct 28, 2026
…ke-word/Whistle NEON + Drama3 deepening + per-model server device selection

Upstream commits a8ba5a3..5074956 (16):
- shared object libraries declared in model registrations (0xShug0#966)
- OpenWakeWord Alexa GGUF package (0xShug0#968)
- Whistle host decoder restored + opt-in NEON acceleration (0xShug0#967)
- opt-in NEON network execution for microWakeWord (0xShug0#969)
- fish_drama3: per-layer expert counts, speech-only head (0xShug0#959)
- server: exec_plan engines counted in free-memory guard (0xShug0#964)
- server: config model settings kept on WebUI loads, demo voices with --ui (0xShug0#971)
- fix(rknn): exec_plan engine lookup next to the model (0xShug0#963)
- webui: configured models treated same with/without UI management (0xShug0#972)
- perf(rknn): ladder engine priced by driver report (0xShug0#970)
- feat(server): per-model backend device selection (0xShug0#973)
- perf(fish_dac): chunked reference encoding cuts VRAM peak (0xShug0#960)
- webui: Vietnamese interface translations (0xShug0#839)
- Drama3 base/small release cleanup (0xShug0#976)
- text chunking: closing quotes kept with their sentence, tag-aware (0xShug0#977)
- fish_drama3: default top_k 4097 no cap, matching Fish's Space (0xShug0#978)

# Conflicts:
#	src/community_models/whistle_asr/session.cpp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants