Commit Graph
6071 Commits
Author SHA1 Message Date
mattmillerai 48275a98fa chore(openapi): sync shared API contract from cloud@9a47c07 2026-10-03 04:28:41 +00:00
Terry Jia 3c169c2c7d Echo the Create Bounding Boxes background as a UI preview (#16636) 2026-10-02 20:24:15 -07:00
Simon Pinfold 2e0316ea50 fix(assets): don't take the database lock when assets are off; warn when it's held (#16742)
* fix(assets): don't take the database lock when assets are off

An assets-off ComfyUI no longer initialises the database or takes its lock, so it
can't block a later assets-on start on the same install. If another process holds
the lock, it prints a startup warning saying a future version will refuse to
start the second instance, and keeps running.

* fix(assets): never let the lock check stop startup; tighten the lock tests

* fix(assets): keep the lock check's release inside its guard

* fix(assets): reword the shared-database startup warning
2026-10-02 20:14:30 -07:00
Simon Pinfoldandguill 30f15eaf5c feat(assets): report scan CPU and paused time, and classify scan failures (#16719)
seeder.scan_completed reported only elapsed_ms, which is wall-clock time
and includes every pause taken while prompts ran. It now also carries:
- cpu_ms: the scan thread's CPU time (time.thread_time()).
- paused_ms: time blocked at the pause gate, summed across pauses.
- dirs_listed_count: directories the input/output walk or the output
  rescan's folder listing listed.
- files_statted_count: os.stat calls on files in the scan's per-file
  loops (reference sync, the listing check, discovery, admission, seed,
  watch list and enrich).

Scan failure events carried only the exception class, so every SQLite
failure read as OperationalError. seeder.scan_failed, batch_insert_failed
and scanner.{fast_scan,temp_sync,mark_missing,stat,watch_stat,watch_seed}
_failed now also carry error_kind, one of a closed set:
expression_tree_too_large, too_many_variables, database_locked,
disk_full, disk_io, unable_to_open, database_corrupt, permission_denied,
file_locked, read_only, other.

It is a closed enum rather than a scrubbed message because str() of a
SQLAlchemy error includes the statement and its bound parameters, which
are file paths. Classification reads SQLite's result code where the
driver exposes it (Python 3.11+), then SQLite's fixed message on the
driver exception (exc.orig), then errno and, on Windows, winerror.

Co-authored-by: guill <jacob.e.segal@gmail.com>
2026-10-02 19:39:49 -07:00
rattusandtvukovic-amd 4d981c9b09 Disable pinned memory automatically on integrated GPUs (#16746)
* Disable pinned memory automatically on AMD APUs

APU VRAM is carved out of system RAM, so pinning host memory only takes
RAM away from the GPU. Detect AMD integrated GPUs and treat them as if
--disable-pinned-memory was passed. dGPUs and the flag are unchanged.

* mm: generalize is_integrated pin disable check to all cuda

---------

Co-authored-by: tvukovic-amd <tvukovic@amd.com>
2026-10-02 21:16:15 -04:00
Daxiong (Lin) 36c0b0a687 chore: update workflow templates to v0.11.76 (#16739) 2026-10-02 15:22:04 -07:00
Alexander Piskun f355cb183e [Partner Nodes] chore(Luma): deprecate Ray 2 nodes (#16741)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
2026-10-03 01:13:25 +04:00
comfyanonymous 2472a20bd2 Update comfy-kitchen version to 0.2.37 (#16738) 2026-10-02 14:50:19 -04:00
Simon Pinfold 65787d6683 fix(assets): batch prefix filters so scans work with many model folders (#16645)
* fix(assets): batch prefix filters so scans work with many model folders

Every scan prefix (one per model folder, including each extra_model_paths
base) adds terms to a single OR, and SQLite rejects an expression tree
deeper than 1000. From about 500 prefixes every models scan failed with
"Expression tree is too large" and the catalog stayed empty.

Run the prefix filter in batches of at most 200 prefixes and merge the
results, deduping rows that nested or overlapping prefixes put in more than
one batch. With 200 prefixes or fewer the statement is unchanged. The
enrichment candidate query merges each batch's keyset page, which yields
the same page a single statement would.

* fix(assets): filter enrich candidates in one pass above one prefix batch

Paging each prefix batch separately made every page scan to the end of
the table for any batch with few matches, which is quadratic in catalog
size. Above one batch, read the candidates in id order once and apply the
same prefix test in Python, stopping at the page limit. At 200 prefixes
or fewer the statement is unchanged.

Run the many-prefix tests under a 999 bound-variable cap too, the limit
of SQLite before 3.32, which each 200-prefix batch stays under.

* fix(assets): yield the GIL while filtering enrich candidates in Python

Above one prefix batch the enrich candidates are filtered in a Python loop,
which could hold the GIL across many rows outside the prefixes. Yield it per
row as the other scan loops do, so the UI stays responsive.

* Revert "fix(assets): yield the GIL while filtering enrich candidates in Python"

Measured, it bought nothing: with a 60k-asset catalogue at 450 and 2000
prefixes, p99 lateness of a 1 ms sleeper thread is the same within noise
either way, because the Python work between 500-row fetches is short and
sqlite3 releases the GIL during each fetch. The yield made the loop 30-90%
slower.

* test(assets): import db at module level in the many-prefix scan test
2026-10-01 22:49:13 -07:00
Purz fa98a189b4 chore: update workflow templates to v0.11.74 (#16724) 2026-10-01 18:22:15 -07:00
Alexander Piskun 43444cbf3c [Partner Nodes] feat(Grok): add grok-imagine-video-1.5-lite model to Grok Video node (#16721)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
2026-10-01 17:45:02 -07:00
Alexander PiskunandPurz 1b883beab1 [Partner Nodes] feat(BFL): add FLUX 3 Image node (#16716)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
Co-authored-by: Purz <97489706+purzbeats@users.noreply.github.com>
2026-10-02 02:17:05 +04:00
Deep Mehta 170594057a feat: add --offline and --disable-partner-nodes, deprecate --disable-api-nodes (#16672) 2026-10-01 16:45:30 -04:00
comfyanonymous 77c0f39e34 Update default bit depth for 'exr' option to 16 bit float. (#16715) 2026-10-01 13:43:11 -04:00
Tokha233andJukka Seppänen 2d6b73283a Reduce MiniMax-H3 peak VRAM by releasing embedding temporaries before blocks
* Release packed MiniMax H3 embedding temporaries before blocks

Signed-off-by: Tokha233 <61346912+Tokha233@users.noreply.github.com>
Co-authored-by: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
2026-10-01 15:04:56 +03:00
Comfy Org PR Bot 651ca296a7 Bump comfyui-frontend-package to 1.53.10 (#16456) 2026-09-30 20:44:36 -07:00
comfyanonymous 0e70b969c6 Add 16-bit float support to Save EXR. (#16706) 2026-09-30 23:00:44 -04:00
Daxiong (Lin) b65d1ffaca chore: update workflow templates to v0.11.73 (#16693) 2026-09-30 13:06:44 -07:00
Alexander Piskun 051ddedaae [Partner Nodes] feat(HeyGen): add HeyGen Video 1.0 reference-to-video and image-to-video nodes (#16695)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
2026-09-30 23:31:58 +04:00
comfyanonymous 83071e1aec Fix minimax vae offload issue. (#16698) 2026-09-30 14:52:07 -04:00
Alexander Piskun 33ee2b36d2 [Partner Nodes] feat(Ideogram): add Ideogram 4.5 text-to-image, edit and precise edit nodes (#16689)
Signed-off-by: bigcat88 <bigcat88@icloud.com>
2026-09-30 22:07:59 +04:00
Alexander Piskun 8cfe5e1ecb [Partner Nodes] feat(Anthropic): add Sonnet 5.5 model (#16647)
* [Partner Nodes] feat(Anthropic): add Claude Sonnet 5.5 to the Claude node

Signed-off-by: bigcat88 <bigcat88@icloud.com>

* [Partner Nodes] feat(Anthropic): allow max_tokens down to 1024 for Opus 5.5 and Sonnet 5.5

Signed-off-by: bigcat88 <bigcat88@icloud.com>

---------

Signed-off-by: bigcat88 <bigcat88@icloud.com>
2026-09-30 13:50:27 +04:00
comfyanonymous fb2315f11d Fix crash when selecting int8 or int4 cache in qwen image 2.1 (#16667) 2026-09-30 00:00:09 -04:00
Simon Pinfold e6beab52ef fix(assets): recover records when a drive comes back with hashing off (#16646)
* fix(assets): recover records when a drive comes back with hashing off

A scan that runs while a drive is offline marks every row on it missing. With
hashing off (the default), nothing could recover those rows when the drive
returned, so the scan created new records and the user's names, tags, metadata
and job links stayed on the orphaned originals.

- With hashing off, a file that reappears at a path no live row occupies
  recovers the missing row there whose size and mtime match exactly. If several
  match, the newest recovers. Hashing on is unchanged.
- A reference stat that fails with an I/O error other than not-found leaves the
  row live, as the output listing rescan already does.
- seeder.marked_missing is emitted per root when a fast scan marks rows missing,
  and scan_completed carries missing_marked_count and recovered_count.

* fix(assets): read recovery candidates before the write transaction; count recoveries only once committed

* test(assets): a pruned model folder recovers its records when it is registered again

* fix(assets): never recover a missing row whose records were all deleted

* docs(assets): scope the multiple-match rule to hashing on

* docs(assets): only new content splits a same-path edit

* test(assets): scan_completed carries nonzero missing and recovered counts

* perf(assets): let the partial live-path index serve the hashing-off recovery check

Written as IS 0, the check that no live row occupies the path scanned
asset_contents once per recovered file, inside the batch's write transaction.
At 50k rows that stretched each batch's lock window to about 2.5s and made
concurrent output registrations time out.

* ci: run the checks against master

* test(assets): import folder_paths at module level
2026-09-29 20:15:02 -07:00
Simon Pinfold ebd432a78a fix(assets): don't let a model category that can't be listed abort the scan (#16658)
folder_paths.get_filename_list raises when a folder it cached earlier has gone
away (or on an OSError other than not-found), and collect_models_files let that
abort the whole asset scan, so nothing in models, input or output was
catalogued. Fall back to a fresh listing of the category, which skips a folder
that's gone; if that raises too, skip the category with a warning and scan the
rest.
2026-09-29 19:48:59 -07:00
jaeone lee 2d2fa46e18 feat: add DynamicGroup widget input (#16260) 2026-09-30 10:42:08 +09:00
comfyanonymous a65316bd54 Use higher quality defaults for Save Video encoding. (#16663)
Default CRF is now 18 on h264 and 24 on AV1.
2026-09-29 20:49:35 -04:00
Daxiong (Lin) 9d80841aa1 chore: update embedded docs to v0.5.13 (#16618) 2026-09-29 16:45:14 -04:00
Jukka Seppänen 986c4d154e Support LynnReal light Minimax-H3 vae (#16657) 2026-09-29 15:02:05 -04:00
comfyanonymous 6b747c0428 ComfyUI v0.38.0 v0.38.0 2026-09-29 14:46:44 -04:00
comfyanonymous 7a8f3add24 Update codeowners. (#16655) 2026-09-29 14:31:52 -04:00
comfyanonymous a716932248 Avoid unnecessary write. (#16639) 2026-09-29 00:37:37 -04:00
comfyanonymous 67f11ccbaa Speedup generation on qwen3.5/3.8 with long contexts. (#16638) 2026-09-29 00:17:11 -04:00
Simon Pinfold 56c50055cf perf(assets): keep the UI responsive during asset scans and rescan output by listing folders (#16546)
With --enable-assets, the scans that keep the asset database in sync could starve the web server's event loop and burn CPU on large libraries. Three changes:

- First scan yields the GIL. The loop that derives names and tags for new files now sleeps briefly every 2 ms of work, so the event loop keeps running. At 51k files, time to a usable UI on the first run drops from 4.7 s to 2.0 s (1.5 s with assets off); the first scan takes about 3% longer. (was #16546)
- Output rescans list folders instead of stat'ing every file. The post-prompt output rescan compares directory listings against the database instead of stat'ing each catalogued file. That per-file stat was 70–95% of the rescan's cost: ~5.8 s per rescan at 200k outputs on local SSD, ~57 s at 10k on NFS. Any row the listing can't vouch for gets an individual stat before it is retired, and only "file not found" retires it: case-insensitive or normalizing filesystems, hidden folders, folders that fail to list, symlink aliases, and permission or I/O errors keep their rows. The one behaviour left to the next full scan is a file overwritten in place under the same name. (was #16599)
- Rescan loops pause. The listing and comparison loops pause every 10 ms of work, so prompts start and the UI stays responsive during a long rescan. At 200k outputs, without this a prompt could wait ~1 s to start. This costs 7–15% more rescan time. (was #16600)

Assets-only: none of this runs with assets off.
2026-09-28 20:04:41 -07:00
Simon Pinfold d669bcfeb1 fix(assets): Start without the assets packages; --enable-assets reports what is missing and runs with assets disabled (#16580)
ComfyUI failed to start when the assets database packages (sqlalchemy, alembic, blake3) were missing, e.g. in a venv not re-synced after requirements.txt changed. That happened with assets off too, although that mode never needs them.

- The asset imports in lifecycle.py, manager.py and server.py are guarded by db.py's existing dependencies_available() check. Without the packages, NoAssets registers no asset routes and temp cleanup still runs.
- --enable-assets without the packages logs which packages are missing, prints the install command, and continues with assets disabled.
- /view resolves blake3: filenames only when assets are enabled. Trade-off: if assets are turned off on an install whose saved workflows hold blake3: widget values, those previews return 404. Running such workflows already fails, since execution never resolves hashes.
2026-09-28 19:55:01 -07:00
Simon Pinfold a35fcbac26 fix(db): wait briefly for the database lock at startup (#16602)
* fix(db): wait briefly for the database lock at startup

A relaunch can start while the previous process is still exiting and
holding the lock. Wait up to 5 seconds for it to be released before
treating the database as in use, and log how long the wait took. The
lock is never taken from a holder.

* fix(db): log the lock wait at info without guessing its cause

* fix(db): say when startup waits for the database lock

Log once before the wait instead of after it, so a lock that stays held
explains the pause before the error. Document the wait in the docstring,
and make the wait test release the lock only after the wait has started.
2026-09-28 19:46:19 -07:00
comfyanonymous 9671d89fea Fixes for last PR. (#16637) 2026-09-28 22:31:51 -04:00
Jukka Seppänen 491bf3b928 Support w6a8 quantization format (#16483) 2026-09-28 21:44:44 -04:00
Jukka Seppänen 84131a6471 Optimize Seedvr2 (#16530) 2026-09-28 21:43:07 -04:00
comfyanonymous 6f6a274216 Update comfy-kitchen package version to 0.2.36 (#16635) 2026-09-28 21:11:28 -04:00
Jukka Seppänen 3b3939a788 Support Qwen-Image 2.1 union fun controlnet (#16519) 2026-09-28 19:31:05 -04:00
comfyanonymous 2139131e88 Searching "kitchen" now returns the attention node. (#16632) 2026-09-28 16:38:51 -04:00
rattus 7fbcfa8be9 Speedup Yue2 AR (#16626) 2026-09-28 14:21:36 -04:00
comfyanonymous 8d534945eb Add comfy_attention and AttentionTensorContainer to a few models. (#16595) 2026-09-27 18:45:17 -04:00
Davide bert 47e63a20a4 Clamp Qwen Image 2.1 fp16 activations in place. (#16608) 2026-09-27 17:37:32 -04:00
Alexander Piskun a9b777bc4e [Partner Nodes] chore(Sora): remove deprecated nodes (#16609) 2026-09-28 00:46:56 +04:00
comfyanonymous 4ef23c34d9 Fix potential regression with previous PR. (#16596) 2026-09-26 22:40:47 -04:00
Jukka Seppänen 5c4d2568fb Support ID-V2V (#15139) 2026-09-26 22:34:47 -04:00
Jukka Seppänen a73d24ba17 Support tiny VAE for Qwen-Image 2.1 (#16552) 2026-09-26 20:46:14 -04:00
comfyanonymous 79be670e2d Mention some ComfyUI optimization details in README. (#16576) 2026-09-25 20:10:52 -07:00