feat: Support SCAIL WanVideo model#12614
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds SCAIL support across the WAN video pipeline. Introduces SCAILWanModel (subclassing WanModel) with pose-aware patch embedding, pose-conditioned forward_orig/_forward, and pose-frequency concatenation in rope_encode. Adds WAN21_SCAIL model class and integrates pose_latents handling via extra_conds, extra_conds_shapes, and apply_model (including pose_start/pose_end gating and memory config updates). Extends detect_unet_config to detect SCAIL state dicts, registers WAN21_SCAIL in supported models, and adds a WanSCAILToVideo node to produce pose-conditioned video latents. 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@comfy_extras/nodes_wan.py`:
- Around line 1492-1503: The code always creates and encodes a zero
reference_image, causing reference conditioning to be applied even when no image
was provided; change the logic so you only call comfy.utils.common_upscale,
vae.encode and node_helpers.conditioning_set_values when the original
reference_image input is non-None (i.e., remove or guard the torch.zeros((1,
height, width, 3)) fallback and the subsequent ref_latent path unless
reference_image was actually supplied), leaving an explicit “use blank
reference” toggle if you need to preserve the previous behavior; update
references to reference_image, ref_latent, vae.encode,
comfy.utils.common_upscale, and node_helpers.conditioning_set_values
accordingly.
In `@comfy/model_base.py`:
- Around line 1500-1503: The pose-window gating in apply_model uses tensor
truthiness in "if t >= self.model_sampling.percent_to_sigma(pose_start) or t <=
self.model_sampling.percent_to_sigma(pose_end):", which breaks for batched
tensors; convert t to a Python scalar before the comparisons (e.g. t_val =
t.item() or float(t)) or explicitly reduce the tensor (e.g. t_val =
t.mean().item()) and then compare against model_sampling.percent_to_sigma(...)
and call kwargs.pop("pose_latents", None) based on that scalar; update the
apply_model function to use t_val in the two comparisons to avoid tensor
truthiness errors.
- Around line 1510-1519: The reported shapes in extra_conds_shapes are incorrect
because extra_conds appends a 4‑channel mask to the reference latents; update
the computed shape for the 'reference_latent' key in extra_conds_shapes so the
channel count increases by 4 (i.e., take the existing channel value 16 and add 4
to it when building the list), leaving the sum(...) // 16 computation for the
spatial/flattened dimension unchanged; modify the logic in the
extra_conds_shapes function (reference_latent key) accordingly so VRAM estimates
include the added mask channels.
- Around line 1479-1491: The pose embedding channel count is mismatched: code in
process_latent_in/pose_video_latent concatenates a 4-channel mask producing 20
channels but SCAILWanModel.patch_embedding_pose expects in_dim=16; fix by either
(A) removing the mask concatenation for pose_latents in comfy/model_base.py
(stop creating pose_mask and stop torch.cat for pose_latents so
out['pose_latents'] remains 16-channel), or (B) update SCAILWanModel to accept
20 channels by changing the Conv3d initialization patch_embedding_pose's in_dim
from 16 to 20 (and any in_dim references/configs) so the layer shape matches the
20-channel pose_latents.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
comfy/ldm/wan/model.pycomfy/model_base.pycomfy/model_detection.pycomfy/supported_models.pycomfy_extras/nodes_wan.py
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@comfy_extras/nodes_wan.py`:
- Around line 1477-1478: The pose_start and pose_end inputs
(io.Float.Input("pose_start", ...) and io.Float.Input("pose_end", ...)) allow
values up to 10.0 but are later interpreted as schedule fractions passed to
percent_to_sigma(), which expects values in [0.0, 1.0]; update both input
definitions to use max=1.0 (keeping min=0.0 and step=0.01) so user-entered
values match percent_to_sigma()'s expected range and prevent out-of-range
behavior.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@comfy/ldm/wan/model.py`:
- Around line 1726-1727: In _forward, don't blindly increment t_len when
"reference_latent" exists; instead check kwargs["reference_latent"] is not None
and determine the number of reference frames (e.g., if it's a tensor use
kwargs["reference_latent"].shape[1] or if list/tuple use len(...)) and add that
count to t_len so freqs aligns with actual reference frames; update the
conditional around t_len increment to handle None and multi-frame inputs (use
the symbols _forward, t_len, and reference_latent to locate and modify the
logic).
- Around line 1716-1729: In _forward, pad the pose_latents tensor to the model
patch size before using it in RoPE and before passing it to forward_orig: use
comfy.ldm.common_dit.pad_to_patch_size(pose_latents, self.patch_size) (similar
to how x and time_dim_concat are padded), assign the padded tensor back to
pose_latents (or a new var) and pass that padded tensor into
self.rope_encode(...) and into the call to forward_orig so the spatial token
counts match and Conv3d/patch_embedding_pose do not misalign on odd H/W.
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
comfy/ldm/wan/model.py (1)
1729-1730:⚠️ Potential issue | 🟠 MajorEnsure
t_lenmatches reference_latent frame count.Line 1729 adds
1, but Line 1633 concatenates the full reference sequence. Ifreference_latentcan contain multiple frames,t_lenshould addreference_latent.shape[2]to keep RoPE aligned. If it’s guaranteed to be a single frame, documenting that assumption would avoid future drift.🔧 Suggested adjustment (if multi-frame is possible)
- if "reference_latent" in kwargs: - t_len += 1 + reference_latent = kwargs.get("reference_latent") + if reference_latent is not None: + t_len += reference_latent.shape[2]🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@comfy/ldm/wan/model.py` around lines 1729 - 1730, The t_len increment when handling reference_latent is incorrect for multi-frame sequences: instead of adding a constant 1, update the logic in the block that checks "reference_latent" to add the actual frame count (use reference_latent.shape[2]) so t_len reflects the full reference sequence length (or, if only a single frame is truly guaranteed, add a comment/docstring near the reference_latent handling and keep the +1 but document the single-frame assumption); adjust the code that uses t_len (and any RoPE alignment logic) accordingly to ensure consistent lengths.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@comfy/ldm/wan/model.py`:
- Around line 1716-1731: The bug: when "reference_latent" is present in _forward
it’s concatenated to x without being padded, which can crash for odd H/W; fix by
calling comfy.ldm.common_dit.pad_to_patch_size on kwargs["reference_latent"]
(similar to x and pose_latents) before any concatenation and before the t_len +=
1 adjustment so the spatial dimensions match; update the handling in _forward to
replace kwargs["reference_latent"] with the padded tensor prior to
concatenation.
---
Duplicate comments:
In `@comfy/ldm/wan/model.py`:
- Around line 1729-1730: The t_len increment when handling reference_latent is
incorrect for multi-frame sequences: instead of adding a constant 1, update the
logic in the block that checks "reference_latent" to add the actual frame count
(use reference_latent.shape[2]) so t_len reflects the full reference sequence
length (or, if only a single frame is truly guaranteed, add a comment/docstring
near the reference_latent handling and keep the +1 but document the single-frame
assumption); adjust the code that uses t_len (and any RoPE alignment logic)
accordingly to ensure consistent lengths.
ℹ️ Review info
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
comfy/ldm/wan/model.pycomfy_extras/nodes_wan.py
🚧 Files skipped from review as they are similar to previous changes (1)
- comfy_extras/nodes_wan.py
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
comfy/ldm/wan/model.py (1)
1695-1713: Pose RoPE frequencies don't inherit temporalrope_optionsfromtransformer_options.
pose_transformer_optionsonly setsshift_y/xandscale_y/x. If the caller supplies temporal rope options (scale_t,shift_t) intransformer_options— e.g. for native context-window scheduling — those options are applied to main-token frequencies but silently dropped for pose frequencies, creating a temporal position mismatch between main and pose tokens.Consider merging temporal options from the outer
transformer_optionsbefore overriding spatial ones:♻️ Suggested fix
+ outer_rope_options = transformer_options.get("rope_options", {}) + pose_rope_options = { + **{k: v for k, v in outer_rope_options.items() if k in ("scale_t", "shift_t")}, + "shift_y": h_shift, "shift_x": 120.0 + w_shift, + "scale_y": h_scale, "scale_x": w_scale, + } - pose_transformer_options = {"rope_options": {"shift_y": h_shift, "shift_x": 120.0 + w_shift, "scale_y": h_scale, "scale_x": w_scale}} + pose_transformer_options = {"rope_options": pose_rope_options} pose_freqs = super().rope_encode(F_pose, H_pose, W_pose, t_start=t_start, device=device, dtype=dtype, transformer_options=pose_transformer_options)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@comfy/ldm/wan/model.py` around lines 1695 - 1713, The pose RoPE frequencies in rope_encode ignore temporal rope options passed in transformer_options, causing temporal misalignment; modify the construction of pose_transformer_options inside rope_encode so it merges any existing temporal entries (e.g., "scale_t", "shift_t" under "rope_options") from transformer_options into the new pose_transformer_options before overriding spatial keys ("scale_y", "scale_x", "shift_y", "shift_x"), ensuring pose_freqs are computed with the same temporal rope settings as main_freqs; update references to transformer_options and pose_transformer_options in rope_encode accordingly.comfy/model_base.py (1)
1476-1498:super().extra_conds()redundantly computesreference_latentbefore SCAIL overwrites it.
WAN21.extra_conds(the super call at line 1477) processesreference_latents[-1]and stores a 2D frame slice inout['reference_latent']. Lines 1479–1484 then immediately overwrite it with the 3D tensor including the mask. The work done by the parent is discarded every call.This is not a bug — the overwrite is correct — but extracting only the needed parts from
super()(cross-attn, clip_fea) and handlingreference_latentinline would eliminate the wasted allocation.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@comfy/model_base.py` around lines 1476 - 1498, super().extra_conds currently receives the full kwargs so the parent (WAN21.extra_conds) computes and stores out['reference_latent'], which you then immediately overwrite; to avoid that wasted allocation, call super().extra_conds with a copy of kwargs that has 'reference_latents' removed (e.g. kwargs_no_ref = dict(kwargs); kwargs_no_ref.pop('reference_latents', None)) so the parent returns only the other conds (cross-attn, clip_fea), then handle reference_latents inline in WAN21.extra_conds by processing reference_latents via self.process_latent_in(...) and creating out['reference_latent'] = comfy.conds.CONDRegular(...) as you already do.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@comfy/model_base.py`:
- Around line 1510-1514: The reported shape in extra_conds_shapes over-sums all
tensors in reference_latents while extra_conds only uses the last one; change
the computation to use only ref_latents[-1] (e.g., compute
math.prod(ref_latents[-1].size()) // 16) and keep the same list format, and also
guard for empty or None reference_latents the same way extra_conds does so you
don't raise on missing entries; update the logic in extra_conds_shapes to mirror
extra_conds's usage of reference_latents.
---
Nitpick comments:
In `@comfy/ldm/wan/model.py`:
- Around line 1695-1713: The pose RoPE frequencies in rope_encode ignore
temporal rope options passed in transformer_options, causing temporal
misalignment; modify the construction of pose_transformer_options inside
rope_encode so it merges any existing temporal entries (e.g., "scale_t",
"shift_t" under "rope_options") from transformer_options into the new
pose_transformer_options before overriding spatial keys ("scale_y", "scale_x",
"shift_y", "shift_x"), ensuring pose_freqs are computed with the same temporal
rope settings as main_freqs; update references to transformer_options and
pose_transformer_options in rope_encode accordingly.
In `@comfy/model_base.py`:
- Around line 1476-1498: super().extra_conds currently receives the full kwargs
so the parent (WAN21.extra_conds) computes and stores out['reference_latent'],
which you then immediately overwrite; to avoid that wasted allocation, call
super().extra_conds with a copy of kwargs that has 'reference_latents' removed
(e.g. kwargs_no_ref = dict(kwargs); kwargs_no_ref.pop('reference_latents',
None)) so the parent returns only the other conds (cross-attn, clip_fea), then
handle reference_latents inline in WAN21.extra_conds by processing
reference_latents via self.process_latent_in(...) and creating
out['reference_latent'] = comfy.conds.CONDRegular(...) as you already do.
Test Evidence CheckIf this PR modifies behavior that requires testing, a test explanation is required. PRs lacking applicable test explanations may not be reviewed until added. Please add test explanations to ensure code quality and prevent regressions. |
commit 16cd8d8a8f5f16ce7e5f929fdba9f783990254ea
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Fri Mar 13 19:33:28 2026 -0700
Update README. (#12931)
commit 7810f49702eac6e617eb7f2c30b00a8939ef1404
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Fri Mar 13 19:18:08 2026 -0700
comfy aimdo 0.2.11 + Improved RAM Pressure release strategies - Windows speedups (#12925)
* Implement seek and read for pins
Source pins from an mmap is pad because its its a CPU->CPU copy that
attempts to fully buffer the same data twice. Instead, use seek and
read which avoids the mmap buffering while usually being a faster
read in the first place (avoiding mmap faulting etc).
* pinned_memory: Use Aimdo pinner
The aimdo pinner bypasses pytorches CPU allocator which can leak
windows commit charge.
* ops: bypass init() of weight for embedding layer
This similarly consumes large commit charge especially for TEs. It can
cause a permanement leaked commit charge which can destabilize on
systems close to the commit ceiling and generally confuses the RAM
stats.
* model_patcher: implement pinned memory counter
Implement a pinned memory counter for better accounting of what volume
of memory pins have.
* implement touch accounting
Implement accounting of touching mmapped tensors.
* mm+mp: add residency mmap getter
* utils: use the aimdo mmap to load sft files
* model_management: Implement tigher RAM pressure semantics
Implement a pressure release on entire MMAPs as windows does perform
faster when mmaps are unloaded and model loads free ramp into fully
unallocated RAM.
Make the concept of freeing for pins a completely separate concept.
Now that pins are loadable directly from original file and don' touch
the mmap, tighten the freeing budget to just the current loaded model
- what you have left over. This still over-frees pins, but its a lot
better than before.
So after the pins are freed with that algorithm, bounce entire MMAPs
to free RAM based on what the model needs, deducting off any known
resident-in-mmap tensors to the free quota to keep it as tight as
possible.
* comfy-aimdo 0.2.11
Comfy aimdo 0.2.11
* mm: Implement file_slice path for QT
* ruff
* ops: put meta-tensors in place to allow custom nodes to check geo
commit e1f10ca0932faf289757e7ec27a54894e271fdde
Author: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
Date: Sat Mar 14 09:14:27 2026 +0900
bump manager version to 4.1b4 (#12930)
commit 6cd35a0c5fd7d22df858be175f6a6e6ee0212e55
Author: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Date: Sat Mar 14 03:31:25 2026 +0900
Bump comfyui-frontend-package to 1.41.19 (#12923)
commit f9ceed9eefe20f6b54b801096cb80f874316f5b2
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Fri Mar 13 19:10:40 2026 +0200
fix(api-nodes): Tencent TextToModel and ImageToModel nodes (#12680)
* fix(api-nodes): added "texture_image" output to TencentTextToModel and TencentImageToModel nodes. Fixed `OBJ` output when it is zipped
* support additional solid texture outputs
* fixed and enabled Tencent3DTextureEdit node
commit 4a8cf359fe596fc4c25a0d335d303e42c3f8605d
Author: Deep Mehta <42841935+deepme987@users.noreply.github.com>
Date: Thu Mar 12 21:17:50 2026 -0700
Revert "Revert "feat: Add CacheProvider API for external distributed caching"" (#12915)
* Revert "Revert "feat: Add CacheProvider API for external distributed caching …"
This reverts commit d1d53c14be8442fca19aae978e944edad1935d46.
* fix: gate provider lookups to outputs cache and fix UI coercion
- Add `enable_providers` flag to BasicCache so only the outputs cache
triggers external provider lookups/stores. The objects cache stores
node class instances, not CacheEntry values, so provider calls were
wasted round-trips that always missed.
- Remove `or {}` coercion on `result.ui` — an empty dict passes the
`is not None` gate in execution.py and causes KeyError when the
history builder indexes `["output"]` and `["meta"]`. Preserving
`None` correctly skips the ui_node_outputs addition.
commit 63d1bbdb407c69370d407ce5ced6ca3f917528a8
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Mar 12 20:41:48 2026 -0400
ComfyUI v0.17.0
commit 5df1427124f6ceb70166326ee257d52076adea37
Author: PxTicks <PxTicks@gmail.com>
Date: Fri Mar 13 00:44:15 2026 +0000
Fix audio extraction and truncation bugs (#12652)
Bug report in #12651
- to_skip fix: Prevents negative array slicing when the start offset is negative.
- __duration check: Prevents the extraction loop from breaking after a single audio chunk when the requested duration is 0 (which is a sentinel for unlimited).
commit d1d53c14be8442fca19aae978e944edad1935d46
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Mar 12 17:21:23 2026 -0700
Revert "feat: Add CacheProvider API for external distributed caching (#12056)" (#12912)
This reverts commit af7b4a921d7abab7c852d7b5febb654be6e57eba.
commit af7b4a921d7abab7c852d7b5febb654be6e57eba
Author: Deep Mehta <42841935+deepme987@users.noreply.github.com>
Date: Thu Mar 12 16:09:07 2026 -0700
feat: Add CacheProvider API for external distributed caching (#12056)
* feat: Add CacheProvider API for external distributed caching
Introduces a public API for external cache providers, enabling distributed
caching across multiple ComfyUI instances (e.g., Kubernetes pods).
New files:
- comfy_execution/cache_provider.py: CacheProvider ABC, CacheContext/CacheValue
dataclasses, thread-safe provider registry, serialization utilities
Modified files:
- comfy_execution/caching.py: Add provider hooks to BasicCache (_notify_providers_store,
_check_providers_lookup), subcache exclusion, prompt ID propagation
- execution.py: Add prompt lifecycle hooks (on_prompt_start/on_prompt_end) to
PromptExecutor, set _current_prompt_id on caches
Key features:
- Local-first caching (check local before external for performance)
- NaN detection to prevent incorrect external cache hits
- Subcache exclusion (ephemeral subgraph results not cached externally)
- Thread-safe provider snapshot caching
- Graceful error handling (provider errors logged, never break execution)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: use deterministic hash for cache keys instead of pickle
Pickle serialization is NOT deterministic across Python sessions due
to hash randomization affecting frozenset iteration order. This causes
distributed caching to fail because different pods compute different
hashes for identical cache keys.
Fix: Use _canonicalize() + JSON serialization which ensures deterministic
ordering regardless of Python's hash randomization.
This is critical for cross-pod cache key consistency in Kubernetes
deployments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* test: add unit tests for CacheProvider API
- Add comprehensive tests for _canonicalize deterministic ordering
- Add tests for serialize_cache_key hash consistency
- Add tests for contains_nan utility
- Add tests for estimate_value_size
- Add tests for provider registry (register, unregister, clear)
- Move json import to top-level (fix inline import)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* style: remove unused imports in test_cache_provider.py
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: move _torch_available before usage and use importlib.util.find_spec
Fixes ruff F821 (undefined name) and F401 (unused import) errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: use hashable types in frozenset test and add dict test
Frozensets can only contain hashable types, so use nested frozensets
instead of dicts. Added separate test for dict handling via serialize_cache_key.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: expose CacheProvider API via comfy_api.latest.Caching
- Add Caching class to comfy_api/latest/__init__.py that re-exports
from comfy_execution.cache_provider (source of truth)
- Fix docstring: "Skip large values" instead of "Skip small values"
(small compute-heavy values are good cache targets)
- Maintain backward compatibility: comfy_execution.cache_provider
imports still work
Usage:
from comfy_api.latest import Caching
class MyProvider(Caching.CacheProvider):
def on_lookup(self, context): ...
def on_store(self, context, value): ...
Caching.register_provider(MyProvider())
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: clarify should_cache filtering criteria
Change docstring from "Skip large values" to "Skip if download time > compute time"
which better captures the cost/benefit tradeoff for external caching.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: make should_cache docstring implementation-agnostic
Remove prescriptive filtering suggestions - let implementations
decide their own caching logic based on their use case.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: add optional ui field to CacheValue
- Add ui field to CacheValue dataclass (default None)
- Pass ui when creating CacheValue for external providers
- Use result.ui (or default {}) when returning from external cache lookup
This allows external cache implementations to store/retrieve UI data
if desired, while remaining optional for implementations that skip it.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: rename _is_cacheable_value to _is_external_cacheable_value
Clearer name since objects are also cached locally - this specifically
checks for external caching eligibility.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: async CacheProvider API + reduce public surface
- Make on_lookup/on_store async on CacheProvider ABC
- Simplify CacheContext: replace cache_key + cache_key_bytes with
cache_key_hash (str hex digest)
- Make registry/utility functions internal (_prefix)
- Trim comfy_api.latest.Caching exports to core API only
- Make cache get/set async throughout caching.py hierarchy
- Use asyncio.create_task for fire-and-forget on_store
- Add NaN gating before provider calls in Core
- Add await to 5 cache call sites in execution.py
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove unused imports (ruff) and update tests for internal API
- Remove unused CacheContext and _serialize_cache_key imports from
caching.py (now handled by _build_context helper)
- Update test_cache_provider.py to use _-prefixed internal names
- Update tests for new CacheContext.cache_key_hash field (str)
- Make MockCacheProvider methods async to match ABC
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address coderabbit review feedback
- Add try/except to _build_context, return None when hash fails
- Return None from _serialize_cache_key on total failure (no id()-based fallback)
- Replace hex-like test literal with non-secret placeholder
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use _-prefixed imports in _notify_prompt_lifecycle
The lifecycle notification method was importing the old non-prefixed
names (has_cache_providers, get_cache_providers, logger) which no
longer exist after the API cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add sync get_local/set_local for graph traversal
ExecutionList in graph.py calls output_cache.get() and .set() from
sync methods (is_cached, cache_link, get_cache). These cannot await
the now-async get/set. Add get_local/set_local that bypass external
providers and only access the local dict — which is all graph
traversal needs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: remove cloud-specific language from cache provider API
Make all docstrings and comments generic for the OSS codebase.
Remove references to Kubernetes, Redis, GCS, pods, and other
infrastructure-specific terminology.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* style: align documentation with codebase conventions
Strip verbose docstrings and section banners to match existing minimal
documentation style used throughout the codebase.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add usage example to Caching class, remove pickle fallback
- Add docstring with usage example to Caching class matching the
convention used by sibling APIs (Execution.set_progress, ComfyExtension)
- Remove non-deterministic pickle fallback from _serialize_cache_key;
return None on JSON failure instead of producing unretrievable hashes
- Move cache_provider imports to top of execution.py (no circular dep)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: move public types to comfy_api, eager provider snapshot
Address review feedback:
- Move CacheProvider/CacheContext/CacheValue definitions to
comfy_api/latest/_caching.py (source of truth for public API)
- comfy_execution/cache_provider.py re-exports types from there
- Build _providers_snapshot eagerly on register/unregister instead
of lazy memoization in _get_cache_providers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: generalize self-inequality check, fail-closed canonicalization
Address review feedback from guill:
- Rename _contains_nan to _contains_self_unequal, use not (x == x)
instead of math.isnan to catch any self-unequal value
- Remove Unhashable and repr() fallbacks from _canonicalize; raise
ValueError for unknown types so _serialize_cache_key returns None
and external caching is skipped (fail-closed)
- Update tests for renamed function and new fail-closed behavior
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: suppress ruff F401 for re-exported CacheContext
CacheContext is imported from _caching and re-exported for use by
caching.py. Add noqa comment to satisfy the linter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: enable external caching for subcache (expanded) nodes
Subcache nodes (from node expansion) now participate in external
provider store/lookup. Previously skipped to avoid duplicates, but
the cost of missing partial-expansion cache hits outweighs redundant
stores — especially with looping behavior on the horizon.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: wrap register/unregister as explicit static methods
Define register_provider and unregister_provider as wrapper functions
in the Caching class instead of re-importing. This locks the public
API signature in comfy_api/ so internal changes can't accidentally
break it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use debug-level logging for provider registration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: follow ProxiedSingleton pattern for Caching class
Add Caching as a nested class inside ComfyAPI_latest inheriting from
ProxiedSingleton with async instance methods, matching the Execution
and NodeReplacement patterns. Retains standalone Caching class for
direct import convenience.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: inline registration logic in Caching class
Follow the Execution/NodeReplacement pattern — the public API methods
contain the actual logic operating on cache_provider module state,
not wrapper functions delegating to free functions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: single Caching definition inside ComfyAPI_latest
Remove duplicate standalone Caching class. Define it once as a nested
class in ComfyAPI_latest (matching Execution/NodeReplacement pattern),
with a module-level alias for import convenience.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove prompt_id from CacheContext, type-safe canonicalization
Remove prompt_id from CacheContext — it's not relevant for cache
matching and added unnecessary plumbing (_current_prompt_id on every
cache). Lifecycle hooks still receive prompt_id directly.
Include type name in canonicalized primitives so that int 7 and
str "7" produce distinct hashes. Also canonicalize dict keys properly
instead of str() coercion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address review feedback on cache provider API
- Hold references to pending store tasks to prevent "Task was destroyed
but it is still pending" warnings (bigcat88)
- Parallel cache lookups with asyncio.gather instead of sequential
awaits for better performance (bigcat88)
- Delegate Caching.register/unregister_provider to existing functions
in cache_provider.py instead of reimplementing (bigcat88)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
commit 8d9faaa181b9089cf8e4e00284443ef5c3405a12
Author: Christian Byrne <cbyrne@comfy.org>
Date: Thu Mar 12 15:14:59 2026 -0700
Update requirements.txt (#12910)
commit 47e1e316c580ce6bf264cb069bffc10a50d3f167
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Mar 12 13:54:38 2026 -0700
Lower kv cache memory usage. (#12909)
commit 712411d53919350ae5050cbdf7ed60fcc2b52cda
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Fri Mar 13 03:16:54 2026 +0800
chore: update workflow templates to v0.9.21 (#12908)
commit 3fa8c5686dc86fe4e63ad3ca84d71524792a17b1
Author: Terry Jia <terryjia88@gmail.com>
Date: Thu Mar 12 10:14:28 2026 -0700
fix: use frontend-compatible format for Float gradient_stops (#12789)
Co-authored-by: guill <jacob.e.segal@gmail.com>
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 73d9599495e45c22ef3672176f34945deeea5444
Author: Terry Jia <terryjia88@gmail.com>
Date: Thu Mar 12 09:55:29 2026 -0700
add painter node (#12294)
* add painter node
* use io.Color
* code improve
---------
Co-authored-by: guill <jacob.e.segal@gmail.com>
commit 44f1246c899ed188759f799dbd00c31def289114
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Mar 12 08:30:50 2026 -0700
Support flux 2 klein kv cache model: Use the FluxKVCache node. (#12905)
commit 8f9ea495713d4565dfe564e0c06f362bd627f902
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 11 21:17:31 2026 -0700
Bump comfy-kitchen version to 0.2.8 (#12895)
commit 9ce4c3dd87c9c77dfe0371045fa920ce55e08973
Author: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Date: Thu Mar 12 10:16:30 2026 +0900
Bump comfyui-frontend-package to 1.41.16 (#12894)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
commit abc87d36693b007bdbdab5ee753ccea6326acb34
Author: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Date: Thu Mar 12 06:04:51 2026 +0900
Bump comfyui-frontend-package to 1.41.15 (#12891)
---------
Co-authored-by: Alexander Brown <DrJKL0424@gmail.com>
commit f6274c06b4e7bce8adbc1c60ae5a4c168825a614
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 11 13:37:31 2026 -0700
Fix issue with batch_size > 1 on some models. (#12892)
commit 4f4f8659c205069f74da8ac47378a5b1c0e142ca
Author: Adi Borochov <58855640+adiborochov@users.noreply.github.com>
Date: Wed Mar 11 19:04:13 2026 +0200
fix: guard torch.AcceleratorError for compatibility with torch < 2.8.0 (#12874)
* fix: guard torch.AcceleratorError for compatibility with torch < 2.8.0
torch.AcceleratorError was introduced in PyTorch 2.8.0. Accessing it
directly raises AttributeError on older versions. Use a try/except
fallback at module load time, consistent with the existing pattern used
for OOM_EXCEPTION.
* fix: address review feedback for AcceleratorError compat
- Fall back to RuntimeError instead of type(None) for ACCELERATOR_ERROR,
consistent with OOM_EXCEPTION fallback pattern and valid for except clauses
- Add "out of memory" message introspection for RuntimeError fallback case
- Use RuntimeError directly in discard_cuda_async_error except clause
---------
commit 3365008dfe5a7a46cbe76d8ad0d7efb054617733
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Wed Mar 11 18:53:55 2026 +0200
feat(api-nodes): add Reve Image nodes (#12848)
commit 980621da83267beffcb84839a27101b7092256e7
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Mar 11 08:49:38 2026 -0700
comfy-aimdo 0.2.10 (#12890)
Comfy Aimdo 0.2.10 fixes the aimdo allocator hook for legacy cudaMalloc
consumers. Some consumers of cudaMalloc assume implicit synchronization
built in closed source logic inside cuda. This is preserved by passing
through to cuda as-is and accouting after the fact as opposed to
integrating these hooks with Aimdos VMA based allocator.
commit 9642e4407b60b291744cc1d34501783cff6702e5
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Tue Mar 10 21:09:35 2026 -0700
Add pre attention and post input patches to qwen image model. (#12879)
commit 3ad36d6be66b2af2a7c3dc9ab6936eebc6b98075
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Tue Mar 10 17:09:12 2026 -0700
Allow model patches to have a cleanup function. (#12878)
The function gets called after sampling is finished.
commit 8086468d2a1a5a6ed70fea3391e7fb9248ebc7da
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Mar 10 09:05:31 2026 -0700
main: switch on faulthandler (#12868)
When we get segfault bug reports we dont get much. Switch on pythons
inbuilt tracer for segfault.
commit 535c16ce6e3d2634d6eb2fd17ecccb8d497e26a0
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Mon Mar 9 21:41:02 2026 -0700
Widen OOM_EXCEPTION to AcceleratorError form (#12835)
Pytorch only filters for OOMs in its own allocators however there are
paths that can OOM on allocators made outside the pytorch allocators.
These manifest as an AllocatorError as pytorch does not have universal
error translation to its OOM type on exception. Handle it. A log I have
for this also shows a double report of the error async, so call the
async discarder to cleanup and make these OOMs look like OOMs.
commit a912809c252f5a2d69c8ab4035fc262a578fdcee
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Mon Mar 9 20:50:10 2026 -0700
model_detection: deep clone pre edited edited weights (#12862)
Deep clone these weights as needed to avoid segfaulting when it tries
to touch the original mmap.
commit c4fb0271cd7fbddb2381372b1f7c1206d1dd58fc
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Mon Mar 9 20:37:58 2026 -0700
Add a way for nodes to add pre attn patches to flux model. (#12861)
commit 740d998c9cc821ca0a72b5b5d4b17aba1aec6b44
Author: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
Date: Tue Mar 10 11:49:31 2026 +0900
fix(manager): improve install guidance when comfyui-manager is not installed (#12810)
commit 814dab9f4636df22a36cbbad21e35ac7609a0ef2
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Tue Mar 10 10:03:22 2026 +0800
Update workflow templates to v0.9.18 (#12857)
commit 06f85e2c792c626f2cab3cb4f94cd30d43e9347b
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Mon Mar 9 22:08:51 2026 +0200
Fix text encoder lora loading for wrapped models (#12852)
commit e4b0bb8305a4069ef7ff8396bfc6057c736ab95b
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sun Mar 8 13:25:30 2026 -0700
Import assets seeder later, print some package versions. (#12841)
commit 7723f20bbe010a3ea4eac602f77b0ff496f123c4
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sun Mar 8 13:17:40 2026 -0700
comfy-aimdo 0.2.9 (#12840)
Comfy-aimdo 0.2.9 fixes a context issue where if a non-main thread does
a spurious garbage collection, cudaFrees are attempted with bad
context.
Some new APIs for displaying aimdo stats in UI widgets are also added.
These are purely additive getters that dont touch cuda APIs.
commit 29b24cb5177e9d5aa5b3d2e5869999efb4d538c7
Author: Luke Mino-Altherr <lminoaltherr@gmail.com>
Date: Sat Mar 7 17:37:25 2026 -0800
refactor(assets): modular architecture + async two-phase scanner & background seeder (#12621)
commit a7a6335be538f55faa2abf7404c9b8e970847d1f
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Sat Mar 7 16:52:39 2026 -0500
ComfyUI v0.16.4
commit bcf1a1fab1e9efe0d4999ea14e9c0318409e0000
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sat Mar 7 09:38:08 2026 -0800
mm: reset_cast_buffers: sync compute stream before free (#12822)
Sync the compute stream before freeing the cast buffers. This can cause
use after free issues when the cast stream frees the buffer while the
compute stream is behind enough to still needs a casted weight.
commit 6ac8152fc80734b084d12865460e5e9a5d9a4e1b
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Sat Mar 7 15:54:09 2026 +0800
chore: update workflow templates to v0.9.11 (#12821)
commit afc00f00553885eeb96ded329878fe732f6b9f7a
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Fri Mar 6 17:10:53 2026 -0800
Fix requirements version. (#12817)
commit d69d30819b91aa020d0bb888df2a5b917f83bb7e
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Fri Mar 6 16:11:16 2026 -0800
Don't run TE on cpu when dynamic vram enabled. (#12815)
commit f466b066017b9ebe5df67decfcbd09f78c5c66fa
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Fri Mar 6 15:20:07 2026 -0800
Fix fp16 audio encoder models (#12811)
* mp: respect model_defined_dtypes in default caster
This is needed for parametrizations when the dtype changes between sd
and model.
* audio_encoders: archive model dtypes
Archive model dtypes to stop the state dict load override the dtypes
defined by the core for compute etc.
commit 34e55f006156801a6b5988d046d9041cb681f12d
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Fri Mar 6 19:54:27 2026 +0200
feat(api-nodes): add Gemini 3.1 Flash Lite model to LLM node (#12803)
commit 3b93d5d571cb3e018da65f822cd11b60202b11c2
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Fri Mar 6 11:04:48 2026 +0200
feat(api-nodes): add TencentSmartTopology node (#12741)
* feat(api-nodes): add TencentSmartTopology node
* feat(api-nodes): enable TencentModelTo3DUV node
* chore(Tencent endpoints): add "wait" to queued statuses
commit e544c65db91df5a070be69a0a9b922201fe79335
Author: Dante <bunggl@naver.com>
Date: Fri Mar 6 11:51:28 2026 +0900
feat: add Math Expression node with simpleeval evaluation (#12687)
* feat: add EagerEval dataclass for frontend-side node evaluation
Add EagerEval to the V3 API schema, enabling nodes to declare
frontend-evaluated JSONata expressions. The frontend uses this to
display computation results as badges without a backend round-trip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Math Expression node with JSONata evaluation
Add ComfyMathExpression node that evaluates JSONata expressions against
dynamically-grown numeric inputs using Autogrow + MatchType. Sends
input context via ui output so the frontend can re-evaluate when
the expression changes without a backend round-trip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: register nodes_math.py in extras_files loader list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address CodeRabbit review feedback
- Harden EagerEval.validate with type checks and strip() for empty strings
- Add _positional_alias for spreadsheet-style names beyond z (aa, ab...)
- Validate JSONata result is numeric before returning
- Add jsonata to requirements.txt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: remove EagerEval, scope PR to math node only
Remove EagerEval dataclass from _io.py and eager_eval usage from
nodes_math.py. Eager execution will be designed as a general-purpose
system in a separate effort.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use TemplateNames, cap inputs at 26, improve error message
Address Kosinkadink review feedback:
- Switch from Autogrow.TemplatePrefix to Autogrow.TemplateNames so input
slots are named a-z, matching expression variables directly
- Cap max inputs at 26 (a-z) instead of 100
- Simplify execute() by removing dual-mapping hack
- Include expression and result value in error message
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add unit tests for Math Expression node
Add tests for _positional_alias (a-z mapping) and execute() covering
arithmetic operations, float inputs, $sum(values), and error cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: replace jsonata with simpleeval for math evaluation
jsonata PyPI package has critical issues: no Python 3.12/3.13 wheels,
no ARM/Apple Silicon wheels, abandoned (last commit 2023), C extension.
Replace with simpleeval (pure Python, 3.4M downloads/month, MIT,
AST-based security). Add math module functions (sqrt, ceil, floor,
log, sin, cos, tan) and variadic sum() supporting both sum(values)
and sum(a, b, c). Pin version to >=1.0,<2.0.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: update tests for simpleeval migration
Update JSONata syntax to Python syntax ($sum -> sum, $string -> str),
add tests for math functions (sqrt, ceil, floor, sin, log10) and
variadic sum(a, b, c).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: replace MatchType with MultiType inputs and dual FLOAT/INT outputs
Allow mixing INT and FLOAT connections on the same node by switching
from MatchType (which forces all inputs to the same type) to MultiType.
Output both FLOAT and INT so users can pick the type they need.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: update tests for mixed INT/FLOAT inputs and dual outputs
Add assertions for both FLOAT (result[0]) and INT (result[1]) outputs.
Add test_mixed_int_float_inputs and test_mixed_resolution_scale to
verify the primary use case of multiplying resolutions by a float factor.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: make expression input multiline and validate empty expression
- Add multiline=True to expression input for better UX with longer expressions
- Add empty expression validation with clear "Expression cannot be empty." message
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add tests for empty expression validation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address review feedback — safe pow, isfinite guard, test coverage
- Wrap pow() with _safe_pow to prevent DoS via huge exponents
(pow() bypasses simpleeval's safe_power guard on **)
- Add math.isfinite() check to catch inf/nan before int() conversion
- Add int/float converters to MATH_FUNCTIONS for explicit casting
- Add "calculator" search alias
- Replace _positional_alias helper with string.ascii_lowercase
- Narrow test assertions and add error path + function coverage tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update requirements.txt
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
Co-authored-by: Christian Byrne <abolkonsky.rem@gmail.com>
commit 1c218282369a6cc80651d878fc51fa33d7bf34e2
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Mar 5 17:25:49 2026 -0500
ComfyUI v0.16.3
commit 58017e8726bdddae89704b1e0123bedc29994424
Author: Tavi Halperin <tavi@lightricks.com>
Date: Thu Mar 5 23:51:20 2026 +0200
feat: add causal_fix parameter to add_keyframe_index and append_keyframe (#12797)
Allows explicit control over the causal_fix flag passed to
latent_to_pixel_coords. Defaults to frame_idx == 0 when not
specified, fixing the previous heuristic.
commit 17b43c2b87eba43f0f071471b855e0ed659a2627
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Mar 5 13:31:28 2026 -0800
LTX audio vae novram fixes. (#12796)
commit 8befce5c7b84ff3451a6bd3bcbae1355ad322855
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Thu Mar 5 22:37:25 2026 +0200
Add manual cast to LTX2 vocoder conv_transpose1d (#12795)
* Add manual cast to LTX2 vocoder
* Update vocoder.py
commit 50549aa252903b936b2ed00b5de418c8b47f0841
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Mar 5 13:41:06 2026 -0500
ComfyUI v0.16.2
commit 1c3b651c0a1539a374e3d29a3ce695b5844ac5fc
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Mar 5 10:35:56 2026 -0800
Refactor. (#12794)
commit 5073da57ad20a2abb921f79458e49a7f7d608740
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Fri Mar 6 02:22:38 2026 +0800
chore: update workflow templates to v0.9.10 (#12793)
commit 42e0e023eee6a19c1adb7bd3dc11c81ff6dcc9c8
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Thu Mar 5 10:22:17 2026 -0800
ops: Handle CPU weight in VBAR caster (#12792)
This shouldn't happen but custom nodes gets there. Handle it as best
we can.
commit 6481569ad4c3606bc50e9de39ce810651690ae79
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Thu Mar 5 09:04:24 2026 -0800
comfy-aimdo 0.2.7 (#12791)
Comfy-aimdo 0.2.7 fixes a crash when a spurious cudaAsyncFree comes in
and would cause an infinite stack overflow (via detours hooks).
A lock is also introduced on the link list holding the free sections
to avoid any possibility of threaded miscellaneous cuda allocations
being the root cause.
commit 6ef82a89b83a49247081dc57b154172573c9e313
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Mar 5 10:38:33 2026 -0500
ComfyUI v0.16.1
commit da29b797ce00b491c269e864cc3b8fceb279e530
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Thu Mar 5 23:23:23 2026 +0800
Update workflow templates to v0.9.8 (#12788)
commit 9cdfd7403bc46f75d12be16ba6041b8bcdd3f7fd
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Thu Mar 5 17:12:38 2026 +0200
feat(api-nodes): enable Kling 3.0 Motion Control (#12785)
commit bd21363563ce8e312c9271a0c64a0145335df8a9
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Thu Mar 5 14:29:39 2026 +0200
feat(api-nodes-xAI): updated models, pricing, added features (#12756)
commit e04d0dbeb8266aa9262b5a4c3934ba4e4a371e37
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Mar 5 04:06:29 2026 -0500
ComfyUI v0.16.0
commit c8428541a6b6e4b1e0fbd685e9c846efcb60179e
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Thu Mar 5 16:58:25 2026 +0800
chore: update workflow templates to v0.9.7 (#12780)
commit 4941671b5a5c65fea48be922caa76b7f6a0a4595
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 4 23:39:51 2026 -0800
Fix cuda getting initialized in cpu mode. (#12779)
commit c5fe8ace68c432a262a5093bdd84b3ed70b9d283
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Thu Mar 5 15:37:35 2026 +0800
chore: update workflow templates to v0.9.6 (#12778)
commit f2ee7f2d367f98bb8a33bcb4a224bda441eb8a07
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 4 22:21:55 2026 -0800
Fix cublas ops on dynamic vram. (#12776)
commit 43c64b6308f93c331f057e12799bad0a68be5117
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 4 17:06:20 2026 -0800
Support the LTXAV 2.3 model. (#12773)
commit ac4a943ff364885166def5d418582db971554caf
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Mar 4 13:33:14 2026 -0800
Initial load device should be cpu when using dynamic vram. (#12766)
commit 8811db52db5d0aea49c1dbedd733a6b9304b83a9
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Mar 4 12:12:37 2026 -0800
comfy-aimdo 0.2.6 (#12764)
Comfy Aimdo 0.2.6 fixes a GPU virtual address leak. This would manfiest
as an error after a number of workflow runs.
commit 0a7446ade4bbeecfaf36e9a70eeabbeb0f6e59ea
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Wed Mar 4 18:59:56 2026 +0200
Pass tokens when loading text gen model for text generation (#12755)
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 9b85cf955858b0aca6b7b30c30b404470ea0c964
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Mar 4 07:49:13 2026 -0800
Comfy Aimdo 0.2.5 + Fix offload performance in DynamicVram (#12754)
* ops: dont unpin nothing
This was calling into aimdo in the none case (offloaded weight). Whats worse,
is aimdo syncs for unpinning an offloaded weight, as that is the corner case of
a weight getting evicted by its own use which does require a sync. But this
was heppening every offloaded weight causing slowdown.
* mp: fix get_free_memory policy
The ModelPatcherDynamic get_free_memory was deducting the model from
to try and estimate the conceptual free memory with doing any
offloading. This is kind of what the old memory_memory_required
was estimating in ModelPatcher load logic, however in practical
reality, between over-estimates and padding, the loader usually
underloaded models enough such that sampling could send CFG +/-
through together even when partially loaded.
So don't regress from the status quo and instead go all in on the
idea that offloading is less of an issue than debatching. Tell the
sampler it can use everything.
commit d531e3fb2a885d675d5b6d3a496b4af5d9757af1
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Mar 4 07:47:44 2026 -0800
model_patcher: Improve dynamic offload heuristic (#12759)
Define a threshold below which a weight loading takes priority. This
actually makes the offload consistent with non-dynamic, because what
happens, is when non-dynamic fills ints to_load list, it will fill-up
any left-over pieces that could fix large weights with small weights
and load them, even though they were lower priority. This actually
improves performance because the timy weights dont cost any VRAM and
arent worth the control overhead of the DMA etc.
commit eb011733b6e4d8a9f7b67a1787d817bfc8c0a5b4
Author: Arthur R Longbottom <art.longbottom.jr@gmail.com>
Date: Tue Mar 3 21:29:00 2026 -0800
Fix VideoFromComponents.save_to crash when writing to BytesIO (#12683)
* Fix VideoFromComponents.save_to crash when writing to BytesIO
When `get_container_format()` or `get_stream_source()` is called on a
tensor-based video (VideoFromComponents), it calls `save_to(BytesIO())`.
Since BytesIO has no file extension, `av.open` can't infer the output
format and throws `ValueError: Could not determine output format`.
The sibling class `VideoFromFile` already handles this correctly via
`get_open_write_kwargs()`, which detects BytesIO and sets the format
explicitly. `VideoFromComponents` just never got the same treatment.
This surfaces when any downstream node validates the container format
of a tensor-based video, like TopazVideoEnhance or any node that calls
`validate_container_format_is_mp4()`.
Three-line fix in `comfy_api/latest/_input_impl/video_types.py`.
* Add docstring to save_to to satisfy CI coverage check
commit ac6513e142f881202c40eacc5e337982b777ccd0
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Mar 3 18:19:40 2026 -0800
DynamicVram: Add casting / fix torch Buffer weights (#12749)
* respect model dtype in non-comfy caster
* utils: factor out parent and name functionality of set_attr
* utils: implement set_attr_buffer for torch buffers
* ModelPatcherDynamic: Implement torch Buffer loading
If there is a buffer in dynamic - force load it.
commit b6ddc590ed8dafd50df8aad1e626b78276a690c0
Author: Terry Jia <terryjia88@gmail.com>
Date: Tue Mar 3 19:58:53 2026 -0500
CURVE type (#12581)
* CURVE type
* fix: update typed wrapper unwrap keys to __type__ and __value__
* code improve
* code improve
commit f719a9d928049f85b07b8ecc2259fba4832d37bb
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Tue Mar 3 14:35:22 2026 -0800
Adjust memory usage factor of zeta model. (#12746)
commit 174fd6759deee5ea73e4cde4ba2936e8d62d8d66
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Mar 3 08:51:15 2026 -0800
main: Load aimdo after logger is setup (#12743)
This was too early. Aimdo can use the logger in error paths and this
causes a rogue default init if aimdo has something to log.
commit 09bcbddfcf804634f008f53c1827b7ba9a3956ec
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Mar 3 08:50:33 2026 -0800
ModelPatcherDynamic: Force load all non-comfy weights (#12739)
* model_management: Remove non-comfy dynamic _v caster
* Force pre-load non-comfy weights to GPU in ModelPatcherDynamic
Non-comfy weights may expect to be pre-cast to the target
device without in-model casting. Previously they were allocated in
the vbar with _v which required the _v fault path in cast_to.
Instead, back up the original CPU weight and move it directly to GPU
at load time.
commit dff0a4a15887383c90a031e3fd48ebc41f6928e7
Author: xeinherjer <112741359+xeinherjer-dev@users.noreply.github.com>
Date: Tue Mar 3 10:17:51 2026 +0900
Fix VAEDecodeAudioTiled ignoring tile_size input (#12735) (#12738)
commit 9ebee0a2179b361a24c20838c1848d7988320636
Author: Lodestone <lodestone.rock@gmail.com>
Date: Tue Mar 3 07:43:47 2026 +0700
Feat: z-image pixel space (model still training atm) (#12709)
* draft zeta (z-image pixel space)
* revert gitignore
* model loaded and able to run however vector direction still wrong tho
* flip the vector direction to original again this time
* Move wrongly positioned Z image pixel space class
* inherit Radiance LatentFormat class
* Fix parameters in classes for Zeta x0 dino
* remove arbitrary nn.init instances
* Remove unused import of lru_cache
---------
Co-authored-by: silveroxides <ishimarukaito@gmail.com>
commit 57dd6c1aadf500d90f635a8d3c15418c0d6d6ecd
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Mon Mar 2 15:54:18 2026 -0800
Support loading zeta chroma weights properly. (#12734)
commit f1f8996e1562c3753666d1c568b2ff629edb9e36
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Tue Mar 3 01:13:42 2026 +0800
chore: update workflow templates to v0.9.5 (#12732)
commit afb54219fac341fa8614fdab090fe8096d0aec1e
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Mon Mar 2 09:24:33 2026 +0200
feat(api-nodes): allow to use "IMAGE+TEXT" in NanoBanana2 (#12729)
commit 7175c11a4ed41278c9cb9e6961b8d8776ef69f00
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sun Mar 1 22:21:41 2026 -0800
comfy aimdo 0.2.4 (#12727)
Comfy Aimdo 0.2.4 fixes a VRAM buffer alignment issue that happens in
someworkflows where action is able to bypass the pytorch allocator
and go straight to the cuda hook.
commit dfbf99a06172a5c54002d80abf3e74c0d82c10b9
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sun Mar 1 19:18:56 2026 -0800
model_mangament: make dynamic --disable-smart-memory work (#12724)
This was previously considering the pool of dynamic models as one giant
entity for the sake of smart memory, but that isnt really the useful
or what a user would reasonably expect. Make Dynamic VRAM properly purge
its models just like the old --disable-smart-memory but conditioning
the dynamic-for-dynamic bypass on smart memory.
Re-enable dynamic smart memory.
commit 602f6bd82c1f8b31d1b10b5f9ae4aa9637772ad5
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sun Mar 1 12:28:39 2026 -0800
Make --disable-smart-memory disable dynamic vram. (#12722)
commit c0d472e5b9b256d9e802ecac703bb6a8ca5f9eb8
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sun Mar 1 11:14:56 2026 -0800
comfy-aimdo 0.2.3 (#12720)
commit 4d79f4f0280da6c0a0e37123b9c80f24e2403536
Author: drozbay <17261091+drozbay@users.noreply.github.com>
Date: Sun Mar 1 10:38:30 2026 -0700
fix: handle substep sigmas in context window set_step (#12719)
Multi-step samplers (eg. dpmpp_2s_ancestral) call the model at intermediate sigma values not present in the schedule. This caused set_step to crash with "No sample_sigmas matched current timestep" when context windows were enabled.
The fix is to keep self._step from the last exact match when a substep sigma is encountered, since substeps are still logically part of their parent step and should use the same context windows.
Co-authored-by: ozbayb <17261091+ozbayb@users.noreply.github.com>
commit 850e8b42ff67cec295edb686c4b85dc7811f5e7f
Author: Christian Byrne <cbyrne@comfy.org>
Date: Sat Feb 28 21:38:19 2026 -0800
feat: add text preview support to jobs API (#12169)
* feat: add text preview support to jobs API
Amp-Thread-ID: https://ampcode.com/threads/T-019c0be0-9fc6-71ac-853a-7c7cc846b375
Co-authored-by: Amp <amp@ampcode.com>
* test: update tests to expect text as previewable media type
Amp-Thread-ID: https://ampcode.com/threads/T-019c0be0-9fc6-71ac-853a-7c7cc846b375
---------
commit d159142615e0a1a7ae4eb711a6ae9f66a5f2d76e
Author: Christian Byrne <cbyrne@comfy.org>
Date: Sat Feb 28 20:59:24 2026 -0800
refactor: rename Mahiro CFG to Similarity-Adaptive Guidance (#12172)
* refactor: rename Mahiro CFG to Similarity-Adaptive Guidance
Rename the display name to better describe what the node does:
adaptively blends guidance based on cosine similarity between
positive and negative conditions.
Amp-Thread-ID: https://ampcode.com/threads/T-019c0d36-8b43-745f-b7b2-e35b53f17fa1
Co-authored-by: Amp <amp@ampcode.com>
* feat: add search aliases for old mahiro name
Amp-Thread-ID: https://ampcode.com/threads/T-019c0d36-8b43-745f-b7b2-e35b53f17fa1
* rename: Similarity-Adaptive Guidance → Positive-Biased Guidance (per reviewer)
- display_name changed to 'Positive-Biased Guidance' to avoid SAG acronym collision
- search_aliases expanded: mahiro, mahiro cfg, similarity-adaptive guidance, positive-biased cfg
- ruff format applied
---------
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 1080bd442a7509d29bfe0b29cac9222de406c994
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sat Feb 28 19:23:28 2026 -0800
Disable dynamic vram on wsl. (#12706)
commit 17106cb124fcfa0b75ea24993c65aa024059fc8d
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sat Feb 28 19:21:32 2026 -0800
Move parsing of requirements logic to function. (#12701)
commit 48bb0bd18aa90bba0eac7b4c1a1400c4f7110046
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sat Feb 28 13:52:30 2026 -0800
cli_args: Default comfy to DynamicVram mode (#12658)
commit 5f41584e960d3ad90f6581278e57f7b52e771db4
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Sat Feb 28 13:50:18 2026 -0800
Disable dynamic_vram when weight hooks applied (#12653)
* sd: add support for clip model reconstruction
* nodes: SetClipHooks: Demote the dynamic model patcher
* mp: Make dynamic_disable more robust
The backup need to not be cloned. In addition add a delegate object
to ModelPatcherDynamic so that non-cloning code can do
ModelPatcherDynamic demotion
* sampler_helpers: Demote to non-dynamic model patcher when hooking
* code rabbit review comments
commit 1f6744162f606cce895f2d9818207ddecbce5932
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Sat Feb 28 23:49:12 2026 +0200
feat: Support SCAIL WanVideo model (#12614)
commit 95e1059661f7a1584b5f84a6ece72ed8d8992b73
Author: fappaz <fernando.augusto.paz@gmail.com>
Date: Sat Feb 28 19:18:40 2026 +1300
fix(ace15): handle missing lm_metadata in memory estimation during checkpoint export #12669 (#12686)
commit 80d49441e5e255f8d91d2f335f930e74ba85cbe8
Author: Christian Byrne <cbyrne@comfy.org>
Date: Fri Feb 27 20:53:46 2026 -0800
refactor: use AspectRatio enum members as ASPECT_RATIOS dict keys (#12689)
Amp-Thread-ID: https://ampcode.com/threads/T-019ca1cb-0150-7549-8b1b-6713060d3408
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 9d0e114ee380d3eac8aeb00260a9df1212b6046a
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Fri Feb 27 20:34:58 2026 -0800
PyOpenGL-accelerate is not necessary. (#12692)
commit ac4412d0fa2b9df8469fb6018e0036c47332397a
Author: Talmaj <Talmaj@users.noreply.github.com>
Date: Sat Feb 28 05:04:34 2026 +0100
Native LongCat-Image implementation (#12597)
commit 94f1a1cc9df69cbc75fe6d0f78a4de5d1d857d9d
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Fri Feb 27 17:16:24 2026 -0800
Limit overlap in image tile and combine nodes to prevent issues. (#12688)
commit e721e24136b5480c396bf0e37a114f6e4083482b
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Fri Feb 27 16:05:51 2026 -0800
ops: implement lora requanting for non QuantizedTensor fp8 (#12668)
Allow non QuantizedTensor layer to set want_requant to get the post lora
calculation stochastic cast down to the original input dtype.
This is then used by the legacy fp8 Linear implementation to set the
compute_dtype to the preferred lora dtype but then want_requant it back
down to fp8.
This fixes the issue with --fast fp8_matrix_mult is combined with
--fast dynamic_vram which doing a lora on an fp8_ non QT model.
commit 25ec3d96a323c8455c6ee69e43bdd7a5599d3cc0
Author: Reiner "Tiles" Prokein <ReinerBforartists@users.noreply.github.com>
Date: Sat Feb 28 01:03:45 2026 +0100
Class WanVAE, def encode, feat_map is using self.decoder instead of self.encoder (#12682)
commit 1f1ec377ce9d4c525d1615099524231756a69e5e
Author: Christian Byrne <cbyrne@comfy.org>
Date: Fri Feb 27 09:13:57 2026 -0800
feat: add ResolutionSelector node for aspect ratio and megapixel-based resolution calculation (#12199)
Amp-Thread-ID: https://ampcode.com/threads/T-019c179e-cd8c-768f-ae66-207c7a53c01d
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 0a7f8e11b6f280b1b574f5dd642e0b46b8f0e045
Author: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
Date: Fri Feb 27 16:13:24 2026 +0000
fix torch.cat requiring inputs to all be same dimensions (#12673)
commit 35e9fce7756604050f07a05d090e697b81322c44
Author: vickytsang <vtsang@amd.com>
Date: Thu Feb 26 17:16:12 2026 -0800
Enable Pytorch Attention for gfx950 (#12641)
commit c7f7d52b684f661d911f1747bb6954978fa1d1b9
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Fri Feb 27 02:59:05 2026 +0200
feat: Support SDPose-OOD (#12661)
commit 08b26ed7c2fe43417058f4c6c5934de3cebf3f20
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Thu Feb 26 15:59:24 2026 -0800
bug_report template: Push harder for logs (#12657)
We get a lot od bug reports without logs, especially for performance
issues.
commit b233dbe0bc179847b81680e0b59c493a8dc8d9a6
Author: fappaz <fernando.augusto.paz@gmail.com>
Date: Fri Feb 27 12:19:19 2026 +1300
feat(ace-step): add ACE-Step 1.5 lycoris key alias mapping for LoKR #12638 (#12665)
commit 3811780e4f73f9dbace01a85e6d97502406f8ccb
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Thu Feb 26 14:12:29 2026 -0800
Portable with cu128 isn't useful anymore. (#12666)
Users should either use the cu126 one or the regular one (cu130 at the moment)
The cu128 portable is still included in the latest github release but I will stop including it as soon as it becomes slightly annoying to deal with. This might happen as soon as next week.
commit 3dd10a59c00248d00f0cb0ab794ff1bb9fb00a5f
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Thu Feb 26 15:59:22 2026 -0500
ComfyUI v0.15.1
commit 88d05fe483a9f420a69d681e615422930404292b
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Fri Feb 27 04:52:45 2026 +0800
chore: update workflow templates to v0.9.4 (#12664)
commit fd41ec97cc2e457f322afdf136fd2f2b2454a240
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Thu Feb 26 22:52:10 2026 +0200
feat(api-nodes): add NanoBanana2 (#12660)
commit 420e900f692f72a4e0108594a80a3465c036bebe
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Thu Feb 26 12:19:38 2026 -0800
main: load aimdo earlier (#12655)
Some custom node packs are naughty, and violate the
dont-load-torch-on-load rule. This causes aimdo to lose preference on
its allocator hook on linux.
Go super early on the aimdo first-stage init before custom nodes
are mentioned at all.
commit 38ca94599f7444f55589308d1cf611fb77f6ca16
Author: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
Date: Thu Feb 26 11:07:35 2026 +0000
pyopengl-accelerate can cause object to be numpy ints instead of bare ints, which the glDeleteTextures function does not accept, explicitly cast to int (#12650)
commit 74b5a337dcc4d6b276e4af45aa8a654c82569072
Author: Christian Byrne <cbyrne@comfy.org>
Date: Thu Feb 26 01:00:32 2026 -0800
fix: move essentials_category to correct replacement nodes (#12568)
Move essentials_category from deprecated/incorrect nodes to their replacements:
- ImageBatch → BatchImagesNode (ImageBatch is deprecated)
- Blur → removed (should use subgraph blueprint)
- GetVideoComponents → Video Slice
Amp-Thread-ID: https://ampcode.com/threads/T-019c8340-4da2-723b-a09f-83895c5bbda5
commit 8a4d85c708435b47d0570637fdf1e89199702c48
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Feb 25 22:30:31 2026 -0800
Cleanups to the last PR. (#12646)
commit a4522017c518d1f0c3c5d2a803a2d31265da5cd4
Author: Tavi Halperin <tavi@lightricks.com>
Date: Thu Feb 26 08:25:23 2026 +0200
feat: per-guide attention strength control in self-attention (#12518)
Implements per-guide attention attenuation via log-space additive bias
in self-attention. Each guide reference tracks its own strength and
optional spatial mask in conditioning metadata (guide_attention_entries).
commit 907e5dcbbffab5e7011346af280a428dc40f3136
Author: Jukka Seppänen <40791699+kijai@users.noreply.github.com>
Date: Thu Feb 26 06:38:46 2026 +0200
initial FlowRVS support (#12637)
commit 72535316701ea8074b99755194f149a26e88b4c8
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Feb 25 20:13:47 2026 -0800
Fix ltxav te mem estimation. (#12643)
commit e14b04478c1712ec8417a046832b821af263ea13
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Wed Feb 25 19:36:02 2026 -0800
Fix LTXAV text enc min length. (#12640)
Should have been 1024 instead of 512
commit eb8737d675022e730364294c395111af3545d523
Author: Christian Byrne <cbyrne@comfy.org>
Date: Wed Feb 25 18:30:48 2026 -0800
Update requirements.txt (#12642)
commit 0467f690a85400c8bfa6dcb6bcc848914b57562a
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Feb 25 13:50:05 2026 -0800
comfy aimdo 0.2.2 (#12635)
Comfy Aimdo 0.2.2 moves the cuda allocator hook from the cudart API to
the cuda driver API on windows. This is needed to handle Windows+cu13
where cudart is statically linked.
commit 4f5b7dbf1f9ec61af8518e6a613499d5ab91835a
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Wed Feb 25 13:49:48 2026 -0800
Fix Aimdo fallback on probe to not use zero-copy sft (#12634)
* utils: dont use comfy sft loader in aimdo fallback
This was going to the raw command line switch and should respect main.py
probe of whether aimdo actually loaded successfully.
* ops: dont use deferred linear load in Aimdo fallback
Avoid changes of behaviour on --fast dynamic_vram when aimdo doesnt work.
commit 3ebe1ac22e090c10ecf4c478fe6f89dc8b398fa0
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Feb 24 16:13:46 2026 -0800
Disable dynamic_vram when using torch compiler (#12612)
* mp: attach re-construction arguments to model patcher
When making a model-patcher from a unet or ckpt, attach a callable
function that can be called to replay the model construction. This
can be used to deep clone model patcher WRT the actual model.
Originally written by Kosinkadink
https://github.com/Comfy-Org/ComfyUI/commit/f4b99bc62389af315013dda85f24f2bbd262b686
* mp: Add disable_dynamic clone argument
Add a clone argument that lets a caller clone a ModelPatcher but disable
dynamic to demote the clone to regular MP. This is useful for legacy
features where dynamic_vram support is missing or TBD.
* torch_compile: disable dynamic_vram
This is a bigger feature. Disable for the interim to preserve
functionality.
commit befa83d43448c3dc64f72aa3eb771159d20f89f1
Author: rattus <46076784+rattus128@users.noreply.github.com>
Date: Tue Feb 24 13:02:26 2026 -0800
comfy aimdo 0.2.1 (#12620)
Changes:
throttle VRAM threshold checks to restore performance in high-layer-rate
conditions.
commit 33f83d53ae3897962b8248c12276759192fde0c0
Author: Jedrzej Kosinski <kosinkadink1@gmail.com>
Date: Tue Feb 24 13:02:05 2026 -0800
Fix KeyError when prompt entries lack class_type key (#12595)
Skip entries in the prompt dict that don't contain a class_type key
in apply_replacements(), preventing crashes on metadata or non-node
entries.
Fixes Comfy-Org/ComfyUI#12517
commit b874bd2b8c324d58cfc37bff0754dd16815a8f3c
Author: comfyanonymous <comfyanonymous@protonmail.com>
Date: Tue Feb 24 12:37:16 2026 -0500
ComfyUI v0.15.0
commit 0aa02453bbe7d2fac332e829ade1f13a1cf53820
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Wed Feb 25 01:41:36 2026 +0800
chore: update embedded docs to v0.4.3 (#12601)
commit 599f9c50109d3c6fbb2791de1810ecf84601affa
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Tue Feb 24 09:28:25 2026 -0800
Don't crash right away if op is uninitialized. (#12615)
commit 11fefa58e987604711169845e9081d14b3915ba1
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Wed Feb 25 01:04:51 2026 +0800
chore: update workflow templates to v0.9.3 (#12610)
commit d8090013b87d787dc12a8c3956fcd8e0a60db38d
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Tue Feb 24 19:03:30 2026 +0200
feat(api-nodes): add ByteDance Seedream-5 model (#12609)
* feat(api-nodes): add ByteDance Seedream-5 model
* made error message more correct
* rename seedream 5.0 model
commit 048dd2f3219523202e19081f776536ea1e62ad4a
Author: Christian Byrne <cbyrne@comfy.org>
Date: Tue Feb 24 00:44:40 2026 -0800
Patch frontend to 1.39.16 (from 1.39.14) (#12604)
* Update requirements.txt
* Update requirements.txt
---------
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
commit 84aba95e03c6498f9e73df100cbcde9d14128ea9
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Mon Feb 23 21:50:03 2026 -0800
Temporality unbreak some LTXAV workflows to give people time to migrate. (#12605)
commit 9b1c63eb6927e42b36de8af7c3f58b2a554564ad
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Mon Feb 23 18:01:17 2026 -0800
Add SplitImageToTileList and ImageMergeTileList nodes. (#12599)
With these you can split an image into tiles, do operations and then combine it back to a single image.
commit 7a7debcaf11bf55257e667f33c447268ea76d412
Author: ComfyUI Wiki <contact@comfyui-wiki.com>
Date: Tue Feb 24 07:27:20 2026 +0800
chore: update workflow templates to v0.9.2 (#12596)
commit dba2766e5354a4b5ec957bd4e005550d83214a34
Author: Alexander Piskun <13381981+bigcat88@users.noreply.github.com>
Date: Mon Feb 23 21:27:16 2026 +0200
feat(api-nodes): add KlingAvatar node (#12591)
commit caa43d2395a69e93e52fe903da515fb2adbbb677
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sun Feb 22 13:00:02 2026 -0800
Fix issue loading fp8 ltxav checkpoints. (#12582)
commit 07ca6852e8dc332f98531f0b51735eff66469755
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sun Feb 22 00:18:20 2026 -0800
Fix dtype issue in embeddings connector. (#12570)
commit f266b8d352607799afb4adf339cdfa854025185e
Author: comfyanonymous <121283862+comfyanonymous@users.noreply.github.com>
Date: Sat Feb 21 19:29:58 2026 -0800
Move LTXAV av embedding connectors to diffusion model. (#12569)
commit b6cb30bab52c47ae38bc2ae404929f49ba765017
Author: Christian Byrne <cbyrne@comfy.org>
Date: Sat Feb 21 18:32:15 2026 -0800
chore: tune CodeRabbit config to limit review scope and disable for drafts (#12567)
* chore: tune CodeRabbit config to limit review scope and disable for drafts
- Add tone_instructions to focus only on newly introduced issues
- Add global path_instructions entry to ignore pre-existing issues in moved/reformatted code
- Disable draft PR reviews (drafts: false) and add WIP title keywords
- Disable ruff tool to prevent linter-based outside-diff-range comments
Addresses feedback from maintainers about CodeRabbit flagging pre-existing
issues in code that was merely moved or de-indented (e.g., PR #12557),
which can discourage community contributions and cause scope creep.
Amp-Thread-ID: https://ampcode.com/threads/T-019c82de-0481-7253-ad42-20cb595bb1ba
* chore: add 'DO NOT MERGE' to ignore_title_keywords
Amp-Thread-ID: https://ampcode.com/threads/T-019c82de-0481-7253-ad42-20cb595bb1ba
commit ee72752162fb8b56b8165aa93633c57f0d85002c
Author: Christian Byrne <cbyrne@comfy.org>
Date: Sat Feb 21 16:51:21 2026 -0800
Add category to Normalized Attention Guidance node (#12565)
commit 7591d781a7a1cdfd6f8f0a9ec6ecd692495e14b5
Author: Alexander Brown <DrJKL0424@gmail.com>
Date: Sat Feb 21 15:05:00 2026 -0800
fix: spe…
Adds model support for SCAIL: https://github.com/zai-org/SCAIL
Compatible weights:
https://huggingface.co/Kijai/WanVideo_comfy/blob/main/SCAIL/Wan21-14B-SCAIL-preview_comfy_bf16.safetensors
https://huggingface.co/Kijai/WanVideo_comfy_fp8_scaled/blob/main/SCAIL/Wan21-14B-SCAIL-preview_fp8_scaled_mixed.safetensors
Preprocessor nodes:
https://github.com/kijai/ComfyUI-SCAIL-Pose
Example scail_native_context_test.json:
scail_00002.mp4
Example pose input:
scail_pose_00002.mp4