Reverts 6bf533e, 78c9625, 4bacc9c, 993e5e4, ae337b5 and c4d8018 —
gguf_support.py, loaders.py and their tests are byte-identical to
6f04642. Nothing else is touched.
The quantized path loaded fast and gave the sampler a model it could not
run: shape [21504, 5376] against an input of 22848x5376, one 1344-token
unit apart. Expanding at load is slow and works.
ComfyUI-GGUF hands back either the state dict or a (state_dict, arch)
pair depending on version. Passed on whole, ComfyUI iterates the tuple,
gets the dict as its first element and raises "'dict' object has no
attribute 'startswith'" — an error naming nothing that led back here.
Unwrapped, and the shape check now runs on every load rather than only
when FunPack had overridden the architecture list, which is why a pack
that already knew the architecture went through unvalidated.
The expansion cache is gone. It wrote the model's full dequantized size
beside it, and rented disk is billed. A leftover from it is named with
its size on the next load; deleting it is left to the user.
Dequantizing produces float32 — four times the width the weight ends up
at. Every tensor was collected before any was cast, so the peak was the
whole checkpoint in float32 plus a copy of each: tens of GB of transient
host allocation on a video model, enough to take the machine down rather
than just the load. ThreadPoolExecutor.map made it worse by submitting
everything at once and buffering results in order.
Now cast-and-release per tensor, with a fixed in-flight window. Peak is
the finished model plus a handful of tensors. Pool capped at 4.
Also prints the path and tensor count before the wait, so a load killed
part way leaves evidence of which backend it chose.
No env var. Stepping around the pack's guard means doing its job here:
the returned state dict is validated, and anything unexpected raises
into the existing fallback rather than reaching ComfyUI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A bare "'dict' object has no attribute 'startswith'" names neither the
step nor the file. Each stage now labels itself in the re-raise. The
ComfyUI-GGUF architecture override is opt-in, not default.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Add an unlisted architecture to ComfyUI-GGUF's image list so the
quantized path works, and cache the dequantized weights beside the
file when it does not, so the expansion is paid once.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Attention and SLA are applied to a clone of a one-entry weight cache
keyed on file identity + dtypes, so a sparsity change skips the disk.
GGUF dequantization now runs across threads instead of serially.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
pip install -r upgrades anything below its floor; moving numpy or
transformers under ComfyUI's compiled extensions segfaults hours later.
Absent packages are installed by name; outdated ones are reported with
the command and left alone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Unreadable modality tags widened the erase to every position including
an image span; a partly-failed erase left some scenes changed; an
unreadable sigma disabled sharpening while still reporting it active.
A malformed reference slot claimed nothing was marked.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The panel replaced the whole log with the fetch error — destroying the
last lines the server sent at the exact moment they matter, and what
Copy would hand over. It now holds them and backfills across a restart
from ComfyUI's own log file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Native crashes print a Python traceback instead of nothing, and
kill -USR1 dumps every thread's stack from a hung process without
attaching anything or restarting it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
MiniMax H3 encodes with Qwen3-VL; the stand-in path fetched a 12B Gemma
tokenizer regardless. Local HF cache is now tried before any download,
and a download announces itself — it blocks the run with no timeout.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Comfy materialises the full delta before discovering it will not
reshape: 51 blocks x 96768x2688 on a curve-form H3 checkpoint, ~25 GB
churned in bf16, for adapters that could never have applied.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
FUNPACK_PINNED_MEMORY=off|<GB>|<pct>%, applied at import — after the
budget is computed, before any model is staged. Only ever lowers it.
Unevictable pinned pages wedge a host rather than killing the process.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Freeze before and after the requirements install and print the diff.
A silent bump of numpy or transformers under ComfyUI's compiled
extensions segfaults hours later with nothing pointing at the update.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Page-locked pages cannot be swapped or reclaimed, so a budget near
total RAM is what wedges a Linux host rather than killing the process.
Warn when ComfyUI's budget exceeds 80% of RAM.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
RSS, host RAM, swap, VRAM and what ComfyUI is holding (with how much
sits on the CPU), before and after the decode — the call that evicts
model weights from VRAM into host RAM.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A decode is one uninterruptible call with no progress of its own, so a
slow decode looked identical to a hung one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A token pointing along the negative is left with rounding error after
projection; restoring its norm amplified that noise ~1000x into the
conditioning. Cap the gain and refuse a non-finite result.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
On H3 it is a Qwen3-VL-32B forward whose output CFG 1.0 never reads.
It still has to happen, but it must be visible when accounting for
what a run loaded and when.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Log latent shape, estimated CPU pixel size, free VRAM/RAM, and empty
torch's cache before decoding — a decode that kills the process leaves
no traceback. Sharpness proxy releases its retained prediction.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Render geometry, sampler + schedule, second pass when running, Studio
and Chain Sampler overrides. Only the selected algorithm's block is
printed, and pass 2 only when it is actually on.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Erase the negative's pooled direction from the positive conditioning
(projection by default, never the vision span). Plus an option to let a
wired positive CONDITIONING own the prompt while CLIP keeps its jobs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Pass 2 can run a different algorithm. Unwired it reuses pass 1; in the
Editor it is behind Second pass > Own sampler, and Studio mirrors the
high pass into that output when off, so existing projects are unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wire a socket to "Reference image 1" and re-order marks in the bin
without opening a node page. Per-kind numbering; an unmarked slot is
left unconnected silently, never auto-wired to a substitute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A bypassed slot claims no input, is not a second source, and needs no
pass-through for a consumer that is fed elsewhere or does not require
one. Long errors wrap, scroll and copy instead of running off-canvas.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Loaders, LoRAs, typed-in custom-node values and host torch/CUDA/GPU.
Wired inputs are marked, not printed. Themed, watermarked, and carries
the report as JSON in a tEXt chunk.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Lift the unsharp out of the sampler loop through a denoiser proxy, the
same way ALG does. Window is a fraction of the schedule; audio excluded.
Off by default; an unwrappable sampler keeps sampling and says so.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Clone from a git URL, ff-only pull, delete. node_dir() is the whole safety
story for the delete: one path segment, resolved, must be a direct child of
custom_nodes, never FunPack itself.
Pulled code but never dependencies, so a release adding one broke the
import silently. pip runs against sys.executable, opt-in from the route,
off the event loop; failures name the manual command.
The panel is the Editor's Properties column: collapsed there it stayed
display:none, and its folds are hidden in Simple mode, so the button opened
nothing. ComfyUI-GGUF refusing an arch now falls back to dequantizing.
A .gguf renamed .safetensors reached the safetensors parser (UTF-8 decode
error); content now decides. ComfyUI-GGUF's loader uses relative imports, so
its directory is mounted as a package instead of loaded file-by-file.
Curve-form H3 checkpoints read adaLN from a compact basis, so a full-width
turbo LoRA matches all 51 adaLN keys and merges into none. Named explicitly
instead of 51 generic warnings under a clean-looking status line.
Core lists no .gguf, so the files were invisible. Backend is whichever is
installed: ComfyUI-GGUF keeps weights quantized, the gguf package
dequantizes at load. Family detection reads GGUF containers too.
Both are structurally inert on H3; context windowing also mis-reported the
cause as an old ComfyUI. alg_anchor deliberately kept: a continuation scene
carries real latent frames for it to act on.
H3 keys keyframe pins by frame index and takes only first/last, so memory
frame 0 evicted the anchor and the rest were refused. Forced off with a
reason; hidden in Engine Settings. Tooltips now state the LoRA requirement.
The prompt is anchor + transitions + scene texts, so clearing only the
bodies left it non-empty. Postfix and variables are separate settings and
are untouched.
The bar never recorded which template was applied, so there was nothing to
rename, delete or leave; deletePromptTemplate had no caller at all. Clearing
is now explicit because applyGlobalPromptQuiet refuses empty text.
Built-in loaders show an icon and a plain name instead of their class;
third-party nodes keep theirs. The add-node panel reuses the node page's
multi-destination editor, gate included.
No CSS equivalent, so a reversed clip always takes the preview-segment
path instead of the raw source. Guarded on frame count: ffmpeg's reverse
buffers the whole clip, and a wrong-direction render is worse than an error.
Preview and render share one geometry_filters() definition so they cannot
drift. Effects are now visible on the clip and clearable; back-fill new
presets into libraries that predate them.
The inner <img> hijacked the card's drag with a native image drag, so the
drop payload was a URL, not a media id — and it got worse the bigger the
image. Opt the image out and give the drag a cheap ghost.
Recovery keyed on v.error, which a reset never sets, so nothing restarted
the load and _isSeeking() froze the transport at readyState 0. Play took
the same wait-for-metadata branch, so it was a no-op.