Commit Graph
1427 Commits
Author SHA1 Message Date
digital-garbage a490b8a6ed revert(gguf): back to the load path from 6f04642
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.
2026-08-23 08:12:43 +03:00
digital-garbage c4d8018c09 fix(gguf): unwrap a (state dict, architecture) return; drop the disk cache
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.
2026-08-23 05:53:26 +03:00
digital-garbage ae337b5196 fix(gguf): expand one tensor at a time instead of all of them
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.
2026-08-23 05:34:28 +03:00
digital-garbageandClaude Opus 5 993e5e4d04 feat(gguf): read an unlisted architecture by default
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>
2026-08-23 05:26:32 +03:00
digital-garbageandClaude Opus 5 4bacc9c7d3 fix(loaders): name the stage a load failed at; gate the arch override
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>
2026-08-23 05:24:50 +03:00
digital-garbageandClaude Opus 5 78c9625a1a perf(gguf): load quantized where possible, expand only once
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>
2026-08-23 05:04:07 +03:00
digital-garbageandClaude Opus 5 6bf533e808 perf(loaders): stop re-reading the checkpoint for inference settings
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>
2026-08-23 05:00:29 +03:00
digital-garbageandClaude Opus 5 6f0464202d fix(update): install only missing packages, never upgrade
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>
2026-08-23 04:56:36 +03:00
digital-garbageandClaude Opus 5 ce9e679f0e fix: three silent fallbacks from tonight now say what they did
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>
2026-08-23 04:50:23 +03:00
digital-garbageandClaude Opus 5 f426b260b5 fix(editor): keep the log when the backend dies
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>
2026-08-23 04:38:58 +03:00
digital-garbageandClaude Opus 5 729027d7e1 feat: FUNPACK_FAULTHANDLER for crashes and hangs
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>
2026-08-23 04:35:41 +03:00
digital-garbageandClaude Opus 5 52724066a6 fix(studio): right tokenizer family, and never the network first
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>
2026-08-23 04:32:44 +03:00
digital-garbageandClaude Opus 5 9542b49d35 fix(lora): drop weights that cannot fit instead of attempting them
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>
2026-08-23 04:22:12 +03:00
digital-garbageandClaude Opus 5 1e98ad56bb feat: cap ComfyUI's pinned memory without a launch flag
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>
2026-08-23 04:17:41 +03:00
digital-garbageandClaude Opus 5 5cbae311b6 feat(update): report which packages pip moved
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>
2026-08-23 04:10:04 +03:00
digital-garbageandClaude Opus 5 1af51e034c feat(samplers): report the pinned-memory budget
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>
2026-08-23 04:06:59 +03:00
digital-garbageandClaude Opus 5 69fd454a0b feat(samplers): report memory around the decode
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>
2026-08-23 03:58:18 +03:00
digital-garbageandClaude Opus 5 9b46288159 feat(samplers): show a decoding phase and its duration
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>
2026-08-23 03:55:58 +03:00
digital-garbageandClaude Opus 5 2b3a97ec8d fix(studio): cap the negative_erase renorm gain
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>
2026-08-23 03:52:45 +03:00
digital-garbageandClaude Opus 5 5bb36dfc07 chore(studio): name the negative encode in the log
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>
2026-08-23 03:50:57 +03:00
digital-garbageandClaude Opus 5 33cf628d4b fix(samplers): say what the decode needs before it needs it
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>
2026-08-23 03:48:54 +03:00
digital-garbageandClaude Opus 5 5a791a96ed feat(editor): put the sampling settings on the export card
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>
2026-08-23 03:41:25 +03:00
digital-garbageandClaude Opus 5 7a2526a8b7 feat(studio): use the negative prompt at CFG 1
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>
2026-08-23 03:33:17 +03:00
digital-garbageandClaude Opus 5 2a259a24a7 feat(samplers): optional second_pass_sampler
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>
2026-08-23 03:25:10 +03:00
digital-garbageandClaude Opus 5 ae3cb228bf feat(editor): numbered reference slots
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>
2026-08-23 03:20:56 +03:00
digital-garbageandClaude Opus 5 c0d916d219 fix(editor): bypass as an A/B switch, and readable blocking errors
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>
2026-08-23 03:17:53 +03:00
digital-garbageandClaude Opus 5 efae0c5807 feat(editor): export the pipeline as a settings PNG
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>
2026-08-23 00:16:18 +03:00
digital-garbageandClaude Opus 5 a0fdc24142 feat(samplers): quality sharpness on any KSampler
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>
2026-08-23 00:08:57 +03:00
digital-garbage bb3e481f29 feat(editor): check custom node packs for updates
Fetches each pack's origin four at a time and reports behind/ahead on the
row. Anything uncomparable says why rather than reading as up to date.
2026-08-22 23:42:40 +03:00
digital-garbage ad12fa7e84 feat(editor): install, update and remove custom node packs
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.
2026-08-22 23:38:53 +03:00
digital-garbage cda2593997 feat(update): install requirements when an update changes them
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.
2026-08-22 23:34:26 +03:00
digital-garbage 8392461bb3 docs: changelog for the gguf requirement 2026-08-22 23:28:14 +03:00
digital-garbage c55d22752a feat(loaders): make gguf a FunPack requirement
A fresh install now reads .gguf with nothing extra. The no-backend message
points at re-running requirements rather than naming a lone package.
2026-08-22 23:27:48 +03:00
digital-garbage 9af45cf695 fix: Simple mode Advanced settings, and GGUF arch fallback
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.
2026-08-22 23:26:31 +03:00
digital-garbage ba9388f216 fix(loaders): GGUF by container magic, and mount the pack as a package
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.
2026-08-22 23:22:01 +03:00
digital-garbage a812c52189 feat(lora): report weights that match by name but not by shape
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.
2026-08-22 23:18:36 +03:00
digital-garbage b57db12eaf feat(loaders): load .gguf diffusion models and text encoders
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.
2026-08-22 23:13:46 +03:00
digital-garbage 13bcdb24f3 fix(sampler): H3 audit — context windows and ALG guide blur off and hidden
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.
2026-08-22 22:49:27 +03:00
digital-garbage dacfeeea0e fix(sampler): JoyAI-Echo overwrote the i2v anchor on H3
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.
2026-08-22 22:43:36 +03:00
digital-garbage bd92dbc555 feat(editor): pin an Engine category, not just the section
Sections can name an inner view via pinTarget/ctx.sub; a pin's identity
includes it, so two Engine categories don't evict each other.
2026-08-22 22:36:13 +03:00
digital-garbage 7172edac69 fix(models): a node opened from a pin closes on Save or Cancel
Landing in the Models list undid the point of the shortcut. Also end the
edit on section teardown — the buffer outlived the config it described.
2026-08-22 22:32:37 +03:00
digital-garbage 9fb64a41ca feat(editor): pin up to three Settings shortcuts to the toolbar
Slot number is the address: holes close up, surviving buttons keep their
numbers, so a shortcut never moves. Pinning with a node open pins the node.
2026-08-22 22:24:55 +03:00
digital-garbage 857215bca7 fix(editor): None clears the whole global prompt, not just scene texts
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.
2026-08-22 22:11:50 +03:00
digital-garbage 98f706c815 fix(editor): prompt templates are editable, deletable and dismissable
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.
2026-08-22 22:09:35 +03:00
digital-garbage 95fb87db0d fix(editor): dismissing pipeline setup could be undone by an in-flight reopen
chooseFamily reopens the modal after three round-trips, so a close during
that window was reverted. User closes now supersede pending continuations.
2026-08-22 20:06:27 +03:00
digital-garbage 641263c4a4 feat(models): name FunPack's own nodes, wire many outputs on add
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.
2026-08-22 19:57:54 +03:00
digital-garbage b1ce5bc605 feat(editor): reverse a clip, picture and audio
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.
2026-08-22 19:42:40 +03:00
digital-garbage ad55692847 feat(editor): flip, crop and fill-frame on timeline clips
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.
2026-08-22 19:39:48 +03:00
digital-garbage f31401760d feat(editor): double-click media to set a clip's anchor
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.
2026-08-22 19:35:44 +03:00
digital-garbage 897efde50d fix(player): a media reset left the preview stuck on "loading" forever
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.
2026-08-22 19:30:38 +03:00