Cookbook polish: auto-reconnect, ctx slider fixes, scoring, lots of UI
Backend (services/hwfit + routes):
- VRAM column sort now shows global highest first (was special-cased to
ascending then truncated top-N, which made "highest VRAM" mathematically
unreachable). Every column path uses reverse=True for the truncation.
- Hardware probe cache TTL 30min -> 24h so changing filters doesn't keep
re-probing the rig during a session; Rescan button still forces fresh.
- Multi-GPU rigs filter GGUF Q*/IQ quants (vLLM/SGLang can't serve them);
default non-prequantized to BF16 on 2+ GPUs.
- AWQ / AWQ-8bit / GPTQ-8bit get a -1.0 quality penalty so FP8 wins ties.
- Version-aware tiebreaker (parse Mn.n / Vn) — MiniMax-M2.7 ranks above M2.5.
- hf_models.json: zai-org/GLM-5.1 added; zai-org/GLM-5 quantization flipped
Q4_K_M -> BF16. DeepSeek-V4-Flash / -Pro + their -Base variants registered
with new FP4-MoE-Mixed / FP8-Mixed quant keys (calibrated BPP from the
actual 156 GB / 284 GB disk footprints).
- New FP4-MoE-Mixed + FP8-Mixed entries in QUANT_BPP / QUANT_SPEED_MULT /
QUANT_QUALITY_PENALTY / QUANT_BYTES_PER_PARAM / PREQUANTIZED_PREFIXES.
Frontend — Scan/Download:
- Engine + Quant swapped in the toolbar; Quant defaults to "All".
- Ctx (range slider) ported from origin/main: 8k/16k/32k/50k/128k/Max. Drag
re-sorts by vram ascending (smallest fitting first); back to Max → score.
- Ctx slider rail now visible — was background:transparent in a duplicate
later-cascade rule. Hardcoded grey + !important.
- Search input moved to the far right of the toolbar.
- Type/Standard default; "Context" not uppercased; Search placeholder dimmed.
- Engine "?" + Quant "?" inline help chips inside their dropdown boxes.
- Fit-column dot toggles fit-only filter; un-toggling re-sorts by VRAM desc.
- Quant column truncates to 9 chars + ellipsis ("FP4-MoE-M..."), full in
tooltip. Smart title-suffix strips the parts already in the repo name
(QuantTrio/MiniMax-M2-AWQ + quant AWQ-4bit -> just "(4bit)").
- Conditional warning for safetensors models on non-GPU rigs only.
- Dependency Install / Installed / Installed▾ / N/A all 75.85px wide.
- Rebuild llama.cpp moved into the llama_cpp dep row, styled as a tag.
- Foldable Download admin-card (h2 chevron); line under h2 only when folded.
- HF token save gets a green ✓ + "Saved" flash.
- Cached scan no longer counts stalled rows as downloaded.
- Footer: "Request it →" link with GitHub mark to the public discussion
(#1962) for model-add requests.
Frontend — Running tab:
- Strict download-finish check (DOWNLOAD_OK or /snapshots/, not bare
"Download complete"). True overall % for multi-shard downloads:
((N-1)+frac)/total instead of hf_transfer's per-shard aggregate.
- ETA in the uptime ticker: "downloading: 12m 34s · ETA 1h 23m".
- Clear button kills the tmux session too; if the output still shows a
live shard line, the pill is hidden + relabels as "reconnect" + revives
on click.
- Self-heal: on cookbook open AND every bg-monitor cycle (10s, throttled
to 8s), scan persisted done/error/crashed downloads and probe their
tmux session — if alive, flip status back to running and reattach.
- Per-launch zombie probe: clicking Download on a model whose persisted
state is done but tmux is still alive revives the existing task and
refuses to start a duplicate.
- Pre-launch GPU probe: vllm / sglang / diffusers serve check
/api/cookbook/gpus first; warns + confirms if no GPU is visible.
- Server-side state guard: rejects "done" POSTs for downloads lacking
DOWNLOAD_OK / DOWNLOAD_FAILED / /snapshots/ when the last-mentioned
shard is N<total — stale tabs can't poison persisted state any more.
- Running count includes tasks whose output looks active even if persisted
status got stuck. Dir text on the running row, font matched to uptime.
Serve panel:
- Ctx text input always resets to model max on open (default 20000 when
metadata is missing).
- Max Seqs default 8 -> 4. KV Cache dtype select 32px tall.
- Lightning icon on Launch (same as Action toggle).
- Diagnosis card simplified (no fold/copy/dismiss), suggestion font
matches body; action buttons get icons on the left (Retry/Copy/Edit/
Install/Kill/Switch/etc.).
- Incomplete-download serve warning when model status is
downloading / stalled / has_incomplete.
- MTP "?" tooltip ("supported on a few model families … up to ~3× faster").
This commit is contained in:
160
static/style.css
160
static/style.css
@@ -18628,16 +18628,41 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
background: color-mix(in srgb, var(--fg) 10%, transparent);
|
||||
color: color-mix(in srgb, var(--fg) 60%, transparent);
|
||||
}
|
||||
/* Rebuild tag — same look as the LLM category tag, sits to its left. */
|
||||
.cookbook-dep-rebuild {
|
||||
background: color-mix(in srgb, var(--fg) 10%, transparent);
|
||||
color: color-mix(in srgb, var(--fg) 75%, transparent);
|
||||
border: 1px solid color-mix(in srgb, var(--fg) 20%, transparent);
|
||||
cursor: pointer;
|
||||
font-family: inherit;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
}
|
||||
.cookbook-dep-rebuild:hover {
|
||||
background: color-mix(in srgb, var(--accent, var(--red)) 18%, transparent);
|
||||
color: var(--accent, var(--red));
|
||||
border-color: color-mix(in srgb, var(--accent, var(--red)) 45%, transparent);
|
||||
}
|
||||
.cookbook-dep-installed {
|
||||
background: color-mix(in srgb, var(--green, #50fa7b) 18%, transparent);
|
||||
color: var(--green, #50fa7b);
|
||||
border: 1px solid color-mix(in srgb, var(--green, #50fa7b) 35%, transparent);
|
||||
/* Match the Install button + Installed ▾ split width so all three variants
|
||||
align in a mixed row. */
|
||||
min-width: 75.85px;
|
||||
padding: 0 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.cookbook-dep-na {
|
||||
background: color-mix(in srgb, var(--fg) 8%, transparent);
|
||||
color: color-mix(in srgb, var(--fg) 60%, transparent);
|
||||
border: 1px solid color-mix(in srgb, var(--fg) 16%, transparent);
|
||||
cursor: help;
|
||||
/* Match other dep tag widths so N/A rows line up with Install / Installed. */
|
||||
min-width: 75.85px;
|
||||
padding: 0 10px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.cookbook-dep-install {
|
||||
background: var(--accent, var(--red));
|
||||
@@ -18648,12 +18673,30 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
font-weight: 500;
|
||||
position: relative;
|
||||
top: -3px;
|
||||
/* Width matches the measured Installed ▾ split button (75.85px) so a row of
|
||||
mixed Install / Installed deps lines up. */
|
||||
min-width: 75.85px;
|
||||
padding: 0 10px;
|
||||
/* Strip the native button box so it's the same height as the sibling tags
|
||||
(Firefox renders <button> taller otherwise); height comes from .cookbook-dep-tag. */
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
}
|
||||
/* Conditional line under the Download h2: only when the section is folded
|
||||
(collapsed). When expanded, the body content provides separation; the
|
||||
underline reads as clutter. */
|
||||
#cookbook-dl-tab-fold { border-bottom: none !important; padding-bottom: 0 !important; }
|
||||
#cookbook-dl-tab-fold.is-folded {
|
||||
border-bottom: 1px solid color-mix(in srgb, var(--border) 40%, transparent) !important;
|
||||
padding-bottom: 6px !important;
|
||||
}
|
||||
/* Center the "?" glyph inside the help chip. Without text-align it sits 0.5px
|
||||
left of true center because of the character's natural baseline offset. */
|
||||
.hwfit-help-chip {
|
||||
text-align: center;
|
||||
padding-left: 0.5px;
|
||||
}
|
||||
.cookbook-dep-install:hover { opacity: 0.85; }
|
||||
/* Installed split button: "Installed" label + separator + ▾ caret; clicking it
|
||||
opens the actions menu (Update). Replaces the old ⋮ button. */
|
||||
@@ -18709,12 +18752,13 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 4px;
|
||||
background: var(--bg);
|
||||
font-size: 11px;
|
||||
font-size: 12px; /* match .cookbook-field-input so Context reads same size as Engine/Quant */
|
||||
}
|
||||
.hwfit-ctx-control span {
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.3px;
|
||||
opacity: 0.75;
|
||||
/* Match Quant/Engine select label style: no uppercase, no letter-spacing. */
|
||||
text-transform: none;
|
||||
letter-spacing: 0;
|
||||
opacity: 0.9;
|
||||
}
|
||||
/* Editor-style slider (same look as the gallery editor sliders): thin pill
|
||||
rail that fattens on interaction, circular red thumb that grows on hover. */
|
||||
@@ -18726,11 +18770,19 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
background: color-mix(in srgb, var(--fg) 25%, transparent);
|
||||
/* Hard-coded grey so the rail is GUARANTEED visible regardless of theme —
|
||||
every theme-derived color we tried (--fg-muted, --border, accent-bg mix)
|
||||
kept blending into the panel background on at least one theme. */
|
||||
background: rgba(150, 150, 150, 0.65);
|
||||
border-radius: 999px;
|
||||
accent-color: var(--red);
|
||||
cursor: pointer;
|
||||
transition: height 0.15s ease;
|
||||
transition: height 0.15s ease, background 0.15s ease;
|
||||
}
|
||||
.hwfit-ctx-control input[type="range"]:hover,
|
||||
.hwfit-ctx-control input[type="range"]:focus,
|
||||
.hwfit-ctx-control input[type="range"]:active {
|
||||
background: var(--fg);
|
||||
}
|
||||
.hwfit-ctx-control input[type="range"]:hover,
|
||||
.hwfit-ctx-control input[type="range"]:focus,
|
||||
@@ -19324,9 +19376,12 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
position: relative;
|
||||
top: -4px;
|
||||
cursor: pointer;
|
||||
padding: 1px 6px 1px 4px;
|
||||
/* Tightened vertical padding so the hover-background isn't disproportionately
|
||||
tall vs the icon+label. */
|
||||
padding: 0 6px 0 4px;
|
||||
height: 14px;
|
||||
border: 0;
|
||||
border-radius: 9px;
|
||||
border-radius: 7px;
|
||||
background: transparent;
|
||||
color: var(--fg);
|
||||
font-family: inherit;
|
||||
@@ -20028,6 +20083,17 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
border-color: var(--color-error);
|
||||
background: color-mix(in srgb, var(--color-error) 12%, transparent);
|
||||
}
|
||||
/* Icons on the left of diagnosis action buttons (Retry / Copy / Edit / etc.). */
|
||||
.cookbook-diag-btn,
|
||||
.cookbook-diag-menu button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
.cookbook-diag-btn-ico {
|
||||
flex-shrink: 0;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* ── What Fits? (hardware model fitting tab in cookbook) ── */
|
||||
.cookbook-group.hidden { display: none !important; }
|
||||
@@ -20500,6 +20566,40 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
.hwfit-toolbar .hwfit-usecase { min-width: 70px; flex-shrink: 0; }
|
||||
.hwfit-toolbar .hwfit-quant { min-width: 50px; flex-shrink: 0; }
|
||||
.hwfit-toolbar .hwfit-search { flex: 1; min-width: 80px; }
|
||||
/* Lower-opacity "Search models..." placeholder so it reads as a hint, not
|
||||
a label — matches the muted form-field feel of the inline filters. */
|
||||
.hwfit-search::placeholder { opacity: 0.5; }
|
||||
.hwfit-search::-webkit-input-placeholder { opacity: 0.5; }
|
||||
.hwfit-search::-moz-placeholder { opacity: 0.5; }
|
||||
|
||||
/* Dot inside the Fit column header — click to toggle the fit-only filter
|
||||
(off = show too-tight rows; on = hide them). */
|
||||
.hwfit-fit-dot {
|
||||
display: inline-block;
|
||||
margin-right: 4px;
|
||||
font-size: 8px;
|
||||
line-height: 1;
|
||||
color: color-mix(in srgb, var(--fg) 35%, transparent);
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
top: -1px; /* nudge 1px up so the small dot sits centered with the "Fit" caps */
|
||||
transition: color 0.12s ease, text-shadow 0.12s ease;
|
||||
}
|
||||
/* Quant suffix appended to model names when the storage format isn't in the
|
||||
repo id — e.g. "(FP4-MoE-Mixed)" after DeepSeek-V4-Flash. Muted to read as
|
||||
metadata, not part of the name. */
|
||||
.hwfit-name-quant {
|
||||
font-size: 0.78em;
|
||||
opacity: 0.55;
|
||||
font-weight: 400;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.hwfit-fit-dot:hover { color: var(--accent, var(--red)); }
|
||||
.hwfit-fit-dot.active {
|
||||
color: var(--green, #50fa7b);
|
||||
text-shadow: 0 0 4px color-mix(in srgb, var(--green, #50fa7b) 55%, transparent);
|
||||
}
|
||||
.hwfit-help-chip {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
@@ -20526,6 +20626,28 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
.hwfit-help-chip-inline {
|
||||
margin-left: -2px;
|
||||
margin-right: 0;
|
||||
top: 0; /* parent rule sets top:-1px; nudge inline variant 1px lower */
|
||||
}
|
||||
/* Quant select + inline ? wrapper — the ? sits inside the dropdown's bordered
|
||||
box, anchored on the right just left of the chevron. */
|
||||
.hwfit-quant-wrap, .hwfit-engine-wrap {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
.hwfit-quant-wrap .hwfit-quant,
|
||||
.hwfit-engine-wrap .hwfit-engine {
|
||||
/* Make room for the ? on the right edge, in addition to the native chevron. */
|
||||
padding-right: 32px;
|
||||
}
|
||||
.hwfit-quant-wrap .hwfit-quant-help,
|
||||
.hwfit-engine-wrap .hwfit-engine-help {
|
||||
position: absolute;
|
||||
right: 20px; /* sits just left of the native select chevron */
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
pointer-events: auto;
|
||||
margin: 0;
|
||||
}
|
||||
.hwfit-ctx-control {
|
||||
height: 28px;
|
||||
@@ -20539,21 +20661,27 @@ body.gallery-selecting .gallery-dl-btn,
|
||||
border-radius: 4px;
|
||||
color: var(--fg-muted);
|
||||
background: var(--bg);
|
||||
font-size: 10px;
|
||||
font-size: 12px; /* match .cookbook-field-input — was 10px and read smaller than siblings */
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.hwfit-ctx-control span {
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.3px;
|
||||
opacity: 0.75;
|
||||
/* Match Quant/Engine select label style: no uppercase, no letter-spacing. */
|
||||
text-transform: none;
|
||||
letter-spacing: 0;
|
||||
opacity: 0.9;
|
||||
}
|
||||
.hwfit-ctx-control input[type="range"] {
|
||||
width: 54px;
|
||||
min-width: 54px;
|
||||
height: 16px;
|
||||
width: 64px;
|
||||
min-width: 64px;
|
||||
height: 4px;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
/* Hardcoded grey rail — was background:transparent here, which was the
|
||||
LATER-in-cascade override that kept making the rail invisible. */
|
||||
background: rgba(150, 150, 150, 0.65) !important;
|
||||
border-radius: 999px;
|
||||
accent-color: var(--accent, var(--red));
|
||||
}
|
||||
.hwfit-ctx-control output {
|
||||
|
||||
Reference in New Issue
Block a user