diff --git a/.github/skills/reference-catalog/SKILL.md b/.github/skills/reference-catalog/SKILL.md index 27bfdcc32..476fc7559 100644 --- a/.github/skills/reference-catalog/SKILL.md +++ b/.github/skills/reference-catalog/SKILL.md @@ -31,6 +31,7 @@ Use this skill to audit and update SD.Next model reference catalogs with minimal - Preserve existing field names and conventions used by neighboring entries. - Prefer deterministic normalization (stable key order, consistent value style). - Do not overwrite real thumbnails with placeholders. +- For `size` backfill, use `cli/hf-info.py` as the primary source of truth. ## Validation Checklist @@ -62,13 +63,23 @@ Use this skill to audit and update SD.Next model reference catalogs with minimal - Validate field value formats (e.g. size in GB, date format). - Ensure that all fields are consistent and not null, empty or contain zero values. +7. Size backfill checks (`size: 0`) +- Enumerate all entries with `"size": 0` across `data/reference*.json`. +- For each Hugging Face repo-style path (`owner/name`), run `cli/hf-info.py`. +- Parse `data.size` from tool output when present (format is MB string, e.g. `"23933.4MB"`). +- Convert MB to GB using deterministic rounding: `gb = round(mb / 1024, 2)`. +- Update only the `size` field for resolvable records; do not modify unrelated fields. +- If `cli/hf-info.py` returns `ok: false`, missing `data.size`, or non-repo paths, leave `size` unchanged and report as unresolved. +- Do not invent fallback sizes unless explicitly requested. + ## Safe Edit Workflow 1. Identify target entries and category intent. 2. Audit only relevant catalog files first. -3. Propose minimal edits (or apply when asked). -4. Re-validate JSON and duplicate checks. -5. Summarize exact changed records and rationale. +3. Run size backfill using `cli/hf-info.py`. +4. Propose minimal edits (or apply when asked). +5. Re-validate JSON and duplicate checks. +6. Summarize exact changed records and rationale. ## Common Failure Modes To Prevent @@ -77,6 +88,9 @@ Use this skill to audit and update SD.Next model reference catalogs with minimal - Breaking JSON structure while editing by hand - Inconsistent key naming across similar entries - Creating placeholder thumbnail over an existing asset +- Running `cli/hf-info.py` with the wrong Python environment/interpreter +- Treating `subfolder` variants as unsupported when the repo path itself is valid +- Writing guessed `size` values when `cli/hf-info.py` returns no size ## Output Contract @@ -87,4 +101,5 @@ When using this skill, provide: - Exact records changed (before/after summary) - Duplicate/conflict report across catalogs - Thumbnail sync result for `models/Reference` +- `size: 0` backfill report: total candidates, updated count, unresolved count, unresolved reasons - Residual risks or follow-up items diff --git a/CHANGELOG.md b/CHANGELOG.md index f64803901..fb3218124 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ - wrap `hf-download` methods - additional *typing* and *typechecks*, thanks @awsr - refactor `hash-cache` management, thanks @awsr + - validate all `reference` jsons and backfill all fields - **Fixes** - Prohibit `python==3.14` unless `--experimental` - UI CSS fixes, thanks @awsr @@ -92,7 +93,6 @@ - patch `z-image` for fp16 compatibility, thanks @resonantsky - patch `unipc` for timesteps device placement, thanks @resonantsky - `civitai` search and base-model discovery improvements - - validate all `reference` jsons - ui log formatting ## Update for 2026-04-01 diff --git a/data/reference-distilled.json b/data/reference-distilled.json index ab40f8fe6..ad7b07ddb 100644 --- a/data/reference-distilled.json +++ b/data/reference-distilled.json @@ -62,7 +62,7 @@ "desc": "ERNIE-Image-Turbo is a distilled ERNIE-Image variant optimized for fast generation with fewer denoising steps.", "skip": true, "extras": "sampler: Default, cfg_scale: 1.0, steps: 8", - "size": 0, + "size": 23.37, "tags": "distilled", "date": "2026 April" }, @@ -155,7 +155,7 @@ "extras": "", "tags": "distilled", "skip": true, - "size": 0, + "size": 51.93, "date": "2025 August" }, diff --git a/data/reference-nunchaku.json b/data/reference-nunchaku.json index 8852da7f7..27ffbcad5 100644 --- a/data/reference-nunchaku.json +++ b/data/reference-nunchaku.json @@ -7,7 +7,7 @@ "skip": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 32.95, "date": "2025 June" }, "FLUX.1-Schnell Nunchaku SVDQuant": { @@ -19,7 +19,7 @@ "nunchaku": ["Model", "TE"], "tags": "nunchaku", "extras": "sampler: Default, cfg_scale: 1.0, steps: 4", - "size": 0, + "size": 32.93, "date": "2025 June" }, "FLUX.1-Kontext Nunchaku SVDQuant": { @@ -30,7 +30,7 @@ "skip": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 32.95, "date": "2025 June" }, "FLUX.1-Krea Nunchaku SVDQuant": { @@ -41,7 +41,7 @@ "skip": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 32.95, "date": "2025 June" }, "FLUX.1-Fill Nunchaku SVDQuant": { @@ -53,7 +53,7 @@ "hidden": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 33.12, "date": "2025 June" }, "FLUX.1-Depth Nunchaku SVDQuant": { @@ -65,7 +65,7 @@ "hidden": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 42.66, "date": "2025 June" }, "Shuttle Jaguar Nunchaku SVDQuant": { @@ -76,7 +76,7 @@ "skip": true, "nunchaku": ["Model", "TE"], "tags": "nunchaku", - "size": 0, + "size": 32.93, "date": "2025 June" }, "Qwen-Image Nunchaku SVDQuant": { @@ -87,7 +87,7 @@ "skip": true, "nunchaku": ["Model"], "tags": "nunchaku", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Lightning (8-step) Nunchaku SVDQuant": { @@ -99,7 +99,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "steps: 8", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Lightning (4-step) Nunchaku SVDQuant": { @@ -111,7 +111,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "steps: 4", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Image-Edit Nunchaku SVDQuant": { @@ -122,7 +122,7 @@ "skip": true, "nunchaku": ["Model"], "tags": "nunchaku", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Lightning-Edit (8-step) Nunchaku SVDQuant": { @@ -134,7 +134,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "steps: 8", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Lightning-Edit (4-step) Nunchaku SVDQuant": { @@ -146,7 +146,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "steps: 4", - "size": 0, + "size": 56.35, "date": "2025 June" }, "Qwen-Image-Edit-2509 Nunchaku SVDQuant": { @@ -157,7 +157,7 @@ "skip": true, "nunchaku": ["Model"], "tags": "nunchaku", - "size": 0, + "size": 56.35, "date": "2025 September" }, "Sana 1.6B 1k Nunchaku SVDQuant": { @@ -168,7 +168,7 @@ "skip": true, "nunchaku": ["Model"], "tags": "nunchaku", - "size": 0, + "size": 23.3, "date": "2025 June" }, "Z-Image-Turbo Nunchaku SVDQuant": { @@ -180,7 +180,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "sampler: Default, cfg_scale: 1.0, steps: 9", - "size": 0, + "size": 32.06, "date": "2025 June" }, "SDXL Base Nunchaku SVDQuant": { @@ -191,7 +191,7 @@ "skip": true, "nunchaku": ["Model"], "tags": "nunchaku", - "size": 0, + "size": 33.55, "date": "2025 June" }, "SDXL Turbo Nunchaku SVDQuant": { @@ -203,7 +203,7 @@ "nunchaku": ["Model"], "tags": "nunchaku", "extras": "sampler: Default, cfg_scale: 1.0, steps: 4", - "size": 0, + "size": 20.33, "date": "2025 June" } } diff --git a/data/reference.json b/data/reference.json index 844006788..8fe66e55d 100644 --- a/data/reference.json +++ b/data/reference.json @@ -472,7 +472,7 @@ "desc": "X-Omni: Reinforcement learning makes discrete autoregressive image generative models great again", "preview": "X-Omni--X-Omni-SFT.jpg", "skip": true, - "size": 0, + "size": 23.8, "date": "2024 September", "experimental": true }, @@ -577,7 +577,7 @@ "preview": "hunyuanvideo-community--HunyuanImage-2.1-Diffusers.jpg", "extras": "", "skip": true, - "size": 0, + "size": 51.88, "date": "2025 August" }, "Tencent HunyuanImage 2.1 Refiner": { @@ -586,7 +586,7 @@ "preview": "hunyuanvideo-community--HunyuanImage-2.1-Diffusers.jpg", "extras": "", "skip": true, - "size": 0, + "size": 48.01, "date": "2025 August" }, "Tencent HunyuanDiT 1.2": { diff --git a/javascript/logMonitor.js b/javascript/logMonitor.js index 186c9dc73..3534b9e51 100644 --- a/javascript/logMonitor.js +++ b/javascript/logMonitor.js @@ -31,7 +31,8 @@ async function logMonitor() { if (l.level === 'WARNING') logWarnings++; if (l.level === 'ERROR') logErrors++; const module = `${l.module}`; - const facility = l.facility !== 'sd' ? `${l.facility}` : ''; + const facilityText = l.facility.length > 20 ? `${l.facility.substring(0, 20)}...` : l.facility; + const facility = l.facility !== 'sd' ? `${facilityText}` : ''; row.innerHTML = `${dateToStr(l.created)}${level}${facility}${module}${htmlEscape(l.msg)}`; logMonitorEl.appendChild(row); } catch (e) { diff --git a/modules/modeldata.py b/modules/modeldata.py index bf8f93057..ceda5805c 100644 --- a/modules/modeldata.py +++ b/modules/modeldata.py @@ -80,6 +80,8 @@ def get_model_type(pipe): model_type = 'pixartsigma' elif "PixArtAlpha" in name: model_type = 'pixartalpha' + elif 'FIBO' in name: + model_type = 'fibo' elif "Bria" in name: model_type = 'bria' elif 'Kolors' in name: diff --git a/modules/sd_hijack_hfhub.py b/modules/sd_hijack_hfhub.py index ebffbd4cd..46d0a58d9 100644 --- a/modules/sd_hijack_hfhub.py +++ b/modules/sd_hijack_hfhub.py @@ -1,4 +1,5 @@ import os +import time from modules.logger import log @@ -14,11 +15,13 @@ def http_get_hijack(*args, **kwargs): jobid = state.begin('Download') fn = kwargs.get("displayed_filename", None) size = kwargs.get("expected_size", None) - if fn and not fn.endswith(".json"): + if fn and not fn.endswith(".json") and size is not None and size > 10240: log.debug(f'Download start: type=http fn="{fn}" size={size}') debug(f'Download start: type=http args={args} kwargs={kwargs}') + t0 = time.time() res = orig_http_get(*args, **kwargs) - debug(f'Download end: type=http res={res}') + t1 = time.time() + debug(f'Download end: type=http res={res} time={t1-t0:.2f} perf={size/(t1-t0)/1024/1024:.2f} MB/s') state.end(jobid) return res diff --git a/modules/vae/sd_vae_taesd.py b/modules/vae/sd_vae_taesd.py index ea0e22972..7a5347fbb 100644 --- a/modules/vae/sd_vae_taesd.py +++ b/modules/vae/sd_vae_taesd.py @@ -69,12 +69,12 @@ def get_model(model_type = 'decoder', variant = None): elif model_cls in {'f1', 'h1', 'zimage', 'lumina2', 'chroma', 'longcat', 'omnigen2', 'flite', 'ovis', 'kandinsky5', 'glmimage', 'cogview3', 'cogview4'}: model_cls = 'f1' variant = 'TAE FLUX.1' - elif model_cls == 'f2': + elif model_cls in {'f2', 'ernieimage'}: model_cls = 'f2' variant = 'TAE FLUX.2' - elif model_cls == 'sd3': + elif model_cls in {'sd3'}: variant = 'TAE SD3' - elif model_cls in {'wanai', 'qwen', 'chrono', 'cosmos'}: + elif model_cls in {'wanai', 'qwen', 'chrono', 'cosmos', 'nucleusimage', 'fibo'}: variant = variant or 'TAE WanVideo' elif model_cls not in supported: warn_once(f'cls={shared.sd_model.__class__.__name__} type={shared.sd_model_type} unsuppported', variant=variant)