webui: resolve install packages by target directory, not a family allowlist - #408
Closed
CryptVenture wants to merge 1 commit into
Closed
webui: resolve install packages by target directory, not a family allowlist#408CryptVenture wants to merge 1 commit into
CryptVenture wants to merge 1 commit into
Conversation
…owlist
A third of the shipped GGUF packages could not be installed from the native
WebUI. catalog.ts grouped install choices with a hardcoded six-family
allowlist: families on the list exposed every package, everything else was
narrowed to at most one q8 and one fp16 button. Measured by executing
catalog.ts against the real specs, 130 of the published packages were
reachable; after this change 143 are, and none are lost.
- Group install choices by target_directory. Packages that are precision
variants of one model share a directory; packages that are different models
do not. The allowlist had to be edited by hand for every new family.
- Extend the precision-suffix list to q2_k..q6_k, q4_0, q5_0 and f32. It
covered only q8/f16/bf16/safetensors/orig, so an entry whose download_id
ended in an uncovered suffix collapsed to that single package and hid its
siblings, which is why PersonaPlex offered only Q4_K while its own spec
marks Q8_0 default.
- Honour ui.recommended_package. Every spec has one, all of them resolve to a
real package, and nothing read the field.
- Match relatedness on target_directory instead of an id prefix. The prefix
test pulled the IndexTTS2.5 packages into the IndexTTS2 entry, whose fp16
slot was then decided by spec-file array order.
- Keep an entry that has no installable package, flagged, instead of letting
the model disappear from the UI entirely.
Labels come from the same resolution step, so they are here rather than in a
follow-up: the button text is chosen while the choice is built, and shipping
one without the other would leave either a label nothing produces or buttons
whose text does not fit. Each entry's buttons are labelled by build ("Q8_0",
"Q4_K ConvRot"); where several models share a directory and collide on
precision, the label keeps what their display names do not share ("XL Turbo
BF16"), and falls back to the full name if even that is ambiguous. No entry has
two buttons that read alike, and the longest label is 13 characters. The full
name stays on the title and the aria-label, and both button lines clamp inside
the border.
+page.svelte now renders the slots catalog.ts hands it (studioPackageSlots is
installPackageSlots) rather than re-deriving the set from family names.
Validation:
npx svelte-check --tsconfig ./tsconfig.json # 153 files, 0 errors
reachable packages 130 -> 143, none lost, measured by loading catalog.ts
through Vite's SSR loader and diffing the id sets
CryptVenture
force-pushed
the
pr/webui-package-resolution
branch
from
September 3, 2026 00:50
23345a3 to
c84dcb5
Compare
Contributor
Author
|
Closing for now to stay inside the 3-concurrent-PR policy (see the discussion on #422). Nothing is wrong with the change and CI is green on it; I will reopen it as review slots free. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Split out of #373 as requested. This PR is the package resolver in
catalog.tsand the button rendering it drives; the catalog entries, the request wiring, the transcript display and the UI text fixes are separate PRs.The problem
catalog.tsgrouped install choices with a hardcoded six-family allowlist. Families on the list exposed every package; every other family was narrowed to at most one q8 and one fp16 button. Measured by executingcatalog.tsagainst the real specs, 130 of the published packages were reachable from the WebUI.The change
target_directory, not by family name. Packages that are precision variants of one model share a directory; packages that are different models do not. The allowlist had to be hand-edited for every new family and silently hid the rest.q2_k…q6_k,q4_0,q5_0,f32. It covered only q8/f16/bf16/safetensors/orig, so an entry whosedownload_idended in an uncovered suffix collapsed to that single package and hid its siblings — which is why PersonaPlex offered only Q4_K while its own spec marks Q8_0 default.ui.recommended_package. Every spec has one, all resolve to a real package, and nothing read the field.target_directory, not an id prefix. The prefix test pulled the IndexTTS2.5 packages into the IndexTTS2 entry, whose fp16 slot was then decided by spec-file array order.Why the labels are in this PR
The button text is chosen while the choice is built, in the same function. Shipping the two separately would leave one PR with a label nothing produces, or buttons whose text does not fit their border. Each entry's buttons are labelled by build (
Q8_0,Q4_K ConvRot); where several models share a directory and collide on precision the label keeps what their display names do not share (XL Turbo BF16), falling back to the full name if even that is ambiguous. The full name stays on thetitleandaria-label.Validation
Reachability measured by loading
catalog.tsthrough Vite's SSR loader and diffing the resolved package-id sets:mainLabel check over every entry: 0 entries with two buttons reading alike, longest label 13 characters (
XL Turbo BF16).Scope
catalog.ts,types.ts, the package-button block of+page.svelte, and the button rules inapp.css. The generated bundle (webui/native/dist/index.html) is deliberately excluded: it is not byte-reproducible, so regenerating it in each PR of this split would make the PRs conflict with each other. Happy to send one bundle-regeneration PR once the series lands.