The FL Ksampler nodes (Plus, PlusV2, Basic, Sigma, ContextWindow,
XYZPlot) all run VAEDecode automatically against the sampled LATENT
to populate the IMAGE output socket. That works for SD / SDXL / Flux
where the sampler's latent shape matches what the paired VAE
expects, but it crashed on Wan / LTX-style packed-latent / video
models with an unhelpful low-level "expected 16 channels, got 128"
RuntimeError from the VAE's first conv layer.
Add a shared safe_vae_decode helper in nodes/ksamplers/_vae_helpers.py
that pre-checks samples.shape[1] against vae.latent_channels (a
public attribute ComfyUI's comfy.sd.VAE already sets per model).
On mismatch we skip the auto-decode entirely, log a single
warning line telling the user to wire an external VAE Decode node,
and return a 1x1 placeholder image so downstream IMAGE consumers
don't break. The LATENT output continues to flow unchanged in all
cases.
Routes all 6 ksampler nodes through the helper.
Bumps version 2.9.0 -> 2.9.1.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
README accuracy pass:
- Add 37 missing node rows across image / utility / ksamplers / ai /
audio / vfx / prompting / wip tables.
- Add new Kartel category section (FL_KartelJobInput,
FL_KartelJobOutput) plus a Table of Contents entry.
- Remove stale entries (FL_CodeNode, FL_HunyuanDelight) for nodes
that no longer exist in the codebase.
- Update FL_SamplerStrings / FL_SchedulerStrings descriptions to
reflect dynamic population via comfy.samplers.KSampler.SAMPLERS /
.SCHEDULERS (per PR #105).
- Polish stub-node labelling (FL_BulletHellGame, FL_TetrisGame,
FL_TimeLine) so they read as deliberate placeholders.
- Fix 15 broken images/nodes/*.png references whose filenames had
drifted from the README; drop 3 lingering screenshot blocks that
pointed at images that never existed.
Repo hygiene:
- Add Apache-2.0 LICENSE file and change pyproject.toml to
license = {file = "LICENSE"} (silences Registry validation
warning and matches the FL_VLM / FL_VoxCPM packs).
- Append node.zip / *.zip / temp_downloads/ to .gitignore so build
artifacts stop showing up in git status.
- Demote google-genai import-failure prints to logger.warning /
logger.info so they no longer spam stdout on every ComfyUI
startup when google-genai isn't installed.
Bumps version 2.8.0 -> 2.9.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Applied via `git add --renormalize .` after adding .gitattributes.
No semantic changes; only line-ending normalization in nodes/sup.py
and nodes/utils.py.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sets * text=auto eol=lf to standardize line endings to LF in the
index, silencing the recurring "LF will be replaced by CRLF" warning
on every commit. Marks binary asset types so git treats them
correctly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Displays a connected STRING input on the node via a flex-fill DOM
widget with header, length badge, monospace body, scrollbar styling,
and wheel-to-scroll capture so wheel events scroll the body instead
of zooming the canvas. The same string is passed through to the
output socket.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updated FL_SamplerStrings.py and FL_SchedulerStrings.py to display all of the schedulers/samplers available to them.
Obviously that list can get quite long, but I just hide the ones I don't care about by wrapping the node in a subgraph.
Four-node pipeline that partitions an image or video into uniform-area
Voronoi regions, optionally captions each region via OpenRouter vision
models, encodes per-region prompts through CLIP, and composites
per-region diffusion via cascade-paint:
- FL KSampler SEG Regions: grid-init + Lloyd relaxation Voronoi cells,
feathered overlapping soft masks for guaranteed coverage, on-node
preview with overlay or coverage-heatmap modes
- FL KSampler SEG Captioner: per-region vision-LLM captioning via
OpenRouter (gpt-4o-mini / gemini-flash / claude-haiku), with on-node
thumbnail grid that fills as captions arrive
- FL KSampler SEG Encoder: caption -> per-region CONDITIONING via CLIP
with prompt deduplication caching
- FL KSampler SEG: corner-anchored nearest-neighbor cascade-paint
composite, auto-detects model latent_format.spacial_downscale_ratio
so video models like LTX-Video (32x) and Hunyuan-Video (16x) work
out of the box, supports both 4D image and 5D video latents
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
FL KSampler Sigma: custom sampler with an on-node sigma curve editor.
Draw your own sigma schedule (monotone-cubic/PCHIP interpolation),
with log-Y axis, user-set axis bounds that preserve curve shape on
rescale, and a SIGMAS output for composability.
FL Fal GPT-Image-2 Edit: wraps openai/gpt-image-2/edit on fal.ai with
dynamic reference-image sockets (1-10), custom image sizes, optional
mask input, and exponential-backoff retries.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Race condition: Continue/Cancel button handlers were firing submitBlocking()
without awaiting it, then immediately calling close() which tore down the
modal. If the fetch got delayed or dropped by the DOM teardown, the Python
thread would stay blocked on event.wait() until the full timeout.
Symptoms: "sometimes Continue gets stuck and doesn't advance the workflow."
Fixes:
- PathAnimator: All exit paths (Continue, Cancel, ESC, overlay click, header
close) now await submitBlocking() before close(). On Continue failure,
the modal stays open with buttons re-enabled so user can retry.
- PathAnimator: submitBlocking now checks response.ok and throws on non-2xx,
surfacing 404 "Session not found" errors instead of swallowing them.
- PathAnimator: close() safeguard still uses fire-and-forget but now with
.catch() to log errors (it's a last-resort path after primary handlers).
- ImagePicker: sendSelection now checks response.ok and throws on non-2xx.
- ImagePicker: All callers wrapped in try/catch so failed submits don't
leave the modal in a half-closed state. Confirm failures keep the modal
open with a user-visible alert.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FL Path Animator now supports interactive image-driven workflow:
- New optional IMAGE input — when wired, execution blocks and auto-opens
the path editor with the image as canvas background at native resolution
- New Continue button saves drawn paths and unblocks execution
- Cancel button aborts the workflow via InterruptProcessing
- Countdown timer in footer shows remaining timeout
- Transitions existing edit-mode modal in place if one is already open
(preserves any paths the user already drew)
- ESC, overlay click, and header close all treated as Cancel in blocking mode
- Fully backward compatible: without image, behaves exactly as before
Pattern mirrors FL_ImagePicker (threading.Event, WebSocket dispatch, POST
endpoint). New endpoint: POST /fl_path_animator/submit. New WS event:
fl_path_animator_show.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cloned CoTrackerNode (with trajectory integration inlined) and
CreateShapeImageOnPath (from KJNodes) as self-contained FL nodes.
Includes multi-channel mask fix for CoTracker.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New node that replaces images or masks at a specific index within a batch.
Includes a grid preview with green border highlighting on replaced positions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add new audio node that calculates max frame count from audio duration and FPS.
Optimize FL_ImageListToImageBatch by replacing O(n²) incremental torch.cat loop
with a single torch.cat call for O(n) performance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add FL_ImageToMask node to convert IMAGE to MASK via luminance/channel extraction
- Fix force_square shadowing target_size parameter, breaking resize modes
- Auto-resize mask and context_mask to match image size instead of raising errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Preserve noise_mask from latent dict when passing tiles to common_ksampler
(fixes crash: 'NoneType' object has no attribute 'shape' in symmetric_patchifier)
- Adjust keyframe_idxs pixel coords per tile for correct RoPE positioning
- Adjust guide_attention_entries (pre_filter_count, latent_shape) per tile
- Slice noise_mask spatially alongside latent samples for each tile
- Retrieve VAE scale factors from model for accurate coordinate offsets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Preserve all latent dict keys (including noise_mask) when splitting
batches, instead of only copying the samples tensor. This fixes
inpainting not working when using InpaintModelConditioning upstream.
Fixes#84
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use api.fetchApi() instead of raw fetch() so the request reaches
the correct backend URL in Desktop/Electron environments.
Fixes#88
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap the 5 Gemini/Vertex node imports in try-except so a websockets
version conflict (15.x vs 13.x) degrades gracefully instead of
preventing all 100+ nodes from loading.
Fixes#100
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>