Extensions/OmniNodes
ComfyUI Extension

OmniNodes

utility nodes for comfyui

By TensorVizionΒ·Created 3 months agoΒ·Updated 9 days agoΒ· 0
TensorVizion/OmniNodes
Nodes128
On cloudLocal install
CategoryTensorVizion/Workflow, TensorVizion/Audio
Stars0
Updated9 days ago

Nodes (128)

Any Switch πŸ”€

One Switch to Route Any Socket Type β€” OmniNodes' Any Switch πŸ”€

TensorVizion/Workflow
Audio Beat Detect πŸ₯

Timestamps, BPM, and the Foundation of Audio-Reactive Video

TensorVizion/Audio
Audio Loudness Match 🎚️

The 'Color Match' That Levels Don't

TensorVizion/Audio
Audio Mixer 🎚️

Four Tracks, Gain, Pan, Mute β€” a Mini Console Inside Your Graph

TensorVizion/Audio
Audio Normalize πŸ”Š

Make It Loud Without Making It Clip

TensorVizion/Audio
Audio Pitch Shift 🎼

Two Octaves of Transpose, No librosa Required

TensorVizion/Audio
Audio Reverb πŸ›οΈ

Put Generated Audio in a Room That Doesn't Exist

TensorVizion/Audio
Audio Sidechain Duck πŸ¦†

The 'Turn the Music Down Under the Voice' Node

TensorVizion/Audio
Audio Spectrogram πŸŽ›οΈ

See Your Audio Before You Listen to It

TensorVizion/Audio
Audio Stem Splitter (Freq Band) 🍰

Bass, Mid, High β€” Not the 'Vocal Remover' You Hope It Is

TensorVizion/Audio
Audio-to-Latent Modulator 🎧

The Bridge That Makes Your Video Dance to the Music

TensorVizion/Audio
Audio Transient Shaper πŸ₯Š

The Punch Button for Drum Hits That Sound Like Pillows

TensorVizion/Audio
Audio Waveform 🎡

The Audio-Edition of 'Show Me the Shape'

TensorVizion/Audio
KSampler Base+Refiner 🎭

The Two-Model Handoff, Done Correctly in One Node

TensorVizion/Sampling
Batch Counter πŸ”’

A Counter That Survives Restarts β€” and Hands You a Fresh Seed Every Run

TensorVizion/Workflow
Batch Folder Loader πŸ“‚

Load a Checkpoint by Folder β€” and See What's Actually In There

TensorVizion/Model Utilities
CLIP Skip βœ‚οΈ (TensorVizion)

The clip skip node your anime checkpoint actually expects

TensorVizion/Prompt
CLIP Text Compare πŸ”

Put a Number on How Similar Two Prompts Actually Are

TensorVizion/Model Utilities
CLIP Text Encode (Simple) ✍️

The Same Encoder You Already Have, With a Receipt

TensorVizion/Prompt
CLIP Text Weight βš–οΈ

Prompt Strength as a Slider Instead of Bracket Soup

TensorVizion/Model Utilities
KSampler Conditioning Blend πŸ”€

Two Prompts, One Slider, One Sampler

TensorVizion/Sampling
Conditioning Composer 🧩 (TensorVizion)

One node for every way two prompts can share a frame

TensorVizion/Prompt
Contact Sheet Maker πŸ—ΊοΈ

The OmniNodes contact sheet for batch QA

TensorVizion/Image
ControlNet Apply (Advanced) πŸ•ΉοΈ

ControlNet Apply, the step everyone forgets to wire

TensorVizion/Model Utilities
ControlNet Loader πŸ•ΉοΈ

The ControlNet Loader that is really just ComfyUI's, with a summary bolted on

TensorVizion/Model Utilities
ControlNet Preprocessor πŸ•ΉοΈ

Canny, lineart, and a 'depth' that's really a guess β€” the zero-download ControlNet preprocessor

TensorVizion/Model Utilities
Custom Folder Batch Saver πŸ“

Saving straight to the client's folder, with numbering that never collides

TensorVizion/Image
Detailer (Crop-Inpaint-Paste) πŸ”Ž (TensorVizion)

The fix-a-face loop, without the Impact Pack install

TensorVizion/Sampling
Discord Notify πŸ””

Get a Discord ping when ComfyUI finishes β€” no API key, just a webhook

TensorVizion/Web API
DoRA Loader (Custom) 🎯

The DoRA loader that does the real decomposition, not a scaled LoRA β€” with honest limits

TensorVizion/Model
Dual Model Merger πŸ”€

Weighted sum, add difference, and a slerp that isn't quite slerp

TensorVizion/Model Utilities
Embedding Helper 🧷

Pick from what's actually installed

TensorVizion/Prompt
Empty Latent Image ⬜

Blank latents with SDXL resolution presets you don't have to memorize

TensorVizion/Model Utilities
Endpoint Poller ⏳

The OmniNodes poll loop

TensorVizion/Web API
Folder Watcher πŸ‘οΈ

Process the next file, every run

TensorVizion/Web API
GGUF Checkpoint Converter πŸ”„

Make your own quantized model files (and when it's not worth it)

TensorVizion/GGUF
GGUF CLIP Loader πŸ“

Open quantized text encoders without another extension install

TensorVizion/GGUF
GGUF Diffusion Model Loader 🧠

It reads .gguf files, but it is not the VRAM trick you're hoping for

TensorVizion/GGUF
GGUF File Info πŸ”

The 'read the label before you trust the filename' node

TensorVizion/GGUF
GGUF Quant Validator βœ…

The two-second 'is this download actually fine?' check

TensorVizion/GGUF
GGUF VAE Loader πŸ—οΈ

The niche-of-a-niche node (and when it's actually the answer)

TensorVizion/GGUF
HTTP Request (WebAPI)

The node that's just HTTP β€” no key, no AI, surprisingly handy

TensorVizion/Web API
Aspect Ratio Bucket πŸ“

Every image snapped to the bucket the trainer expects, no squashing

TensorVizion/Image
Image Blend πŸ–ŒοΈ

The boring-but-handy blender that ties the pack together

TensorVizion/Image
Image Color Grade 🎨

Exposure through tint, all in the right order

TensorVizion/Image
Face Detect & Crop πŸ™‚

Find the face, crop the square, ship the batch

TensorVizion/Image
Image Grid Compare πŸ†š

A labeled comparison grid for sweeps β€” and a highlight ring for the winner

TensorVizion/Image
Image Mask Composite πŸ–ΌοΈ

Darken, blur, or tint a region β€” with a real mask you control

TensorVizion/Image
Image Noise Inject 🎞️

The cheapest fix for the too-clean AI look

TensorVizion/Image
Image Prompt Apply πŸ–ΌοΈ (TensorVizion)

Make your prompt listen to a reference image

TensorVizion/Model Utilities
Image Prompt Loader πŸ–ΌοΈ (TensorVizion)

Load the two files every image-prompt workflow needs, in one node

TensorVizion/Model Utilities
Image Sharpen & Blur πŸ”Ž

Sharpen and blur in one node β€” and yes, 'sharpen' is really a blur trick

TensorVizion/Image
Image Vignette & Glow ✨

Vignette for the cinematic frame, bloom for the brights β€” two film looks, one node

TensorVizion/Image
JSON Builder 🧱

Build a request body without typing a single brace

TensorVizion/Web API
JSON Field Extractor πŸ”Ž

Pull Anything Out of Nested JSON

TensorVizion/Web API
Latent Anomaly Mask 🚩

The Latent X-Ray That Flags Weird Spots Before You Decode

TensorVizion/Latent
Latent Blend πŸŒ€

Blending Latents Like Photoshop, But Nobody Can See What You're Doing

TensorVizion/Latent
Latent Channel Mixer 🎚️

Knobs That Don't Map to RGB (And Why That's Fine)

TensorVizion/Latent
Latent Histogram πŸ“Š

Read Your Latent's Distribution Before the VAE Tells You Something's Wrong

TensorVizion/Latent
Latent Interpolate πŸŒ‰

Walk Between Two Latents Frame by Frame

TensorVizion/Latent
Latent Mask 🎭 (TensorVizion)

Draw a Mask Straight on the Latent and Skip the Round Trip

TensorVizion/Latent
Latent Noise Inject 🌊

Inject Noise Straight Into the Latent (Yes, On Purpose)

TensorVizion/Latent
Latent Palette Extractor 🧬

'Different Enough to Decode?' Now It's a Number

TensorVizion/Latent
Latent QC Gate 🚧

The Night-Watch Gate That Stops a Corrupted Latent Before It Costs You a Run

TensorVizion/Latent
Latent Structure Probe πŸ“‘

See the Shape of a Latent's Energy With a Heatmap

TensorVizion/Latent
Latent Visualizer πŸ”¬

What Your Channels Actually Look Like

TensorVizion/Latent
Load Image + Recovered Metadata πŸ”

Get the workflow data back out of a PNG, and load it right-side up

TensorVizion/Image
LoHa Loader (Custom) πŸŒ€

The LoHa Loader That Refuses to Fake the Math

TensorVizion/Model
LoKr Loader (Custom) 🧩

Because Character LoRAs Are Mostly LoKr Now

TensorVizion/Model
LoRA Info Inspector πŸ”¬

Rank, Alpha, and What It Touches, Without Loading It

TensorVizion/Model Utilities
LoRA Stack πŸ—‚οΈ

Stacking Without the Spaghetti

TensorVizion/Model Utilities
Multi-LoRA Weight Sweep πŸ“Ά

Find a LoRA's Sweet Spot With One Node and Zero Parallel Samplers

TensorVizion/Model
3D LUT Apply 🎞️

Drop a Film LUT on Your Render Without Leaving ComfyUI

TensorVizion/Image
LyCORIS Format Inspector πŸ”¬

Before You Load That 'LoRA,' Ask It What It Actually Is

TensorVizion/Model
KSampler Masked Inpaint πŸ–ŒοΈ

Image + Mask In, Fixed Latent Out

TensorVizion/Sampling
Mask Morphology 🩹

Grow, feather, or shrink a mask without opening an image editor

TensorVizion/Image
Metadata Embed 🏷️

Stamp your own notes into a PNG before you save it

TensorVizion/Model
Metadata Reader πŸ”–

Read any PNG's hidden text chunks back out

TensorVizion/Model
Model Block Freeze 🧊

Freeze parts of a model mid-graph to see what each block actually does

TensorVizion/Model Utilities
Model Info Inspector πŸ”¬

Find out what a checkpoint actually is before you commit to loading it

TensorVizion/Model Utilities
LoRA Metadata Diff πŸ†š

Diff two LoRAs side by side before you upload a batch

TensorVizion/Model
Model Merge Weighted πŸ”€

Merge two checkpoints without leaving the graph

TensorVizion/Model Utilities
Negative Prompt Presets 🚫

Stop retyping the same negative prompt in every workflow

TensorVizion/Prompt
OAuth2 Token Manager (WebAPI)

Grab an OAuth2 token inside the graph for API-heavy workflows

TensorVizion/Web API
Prompt Cleaner 🧹

De-mess a prompt after wildcards and concatenation did their worst

TensorVizion/Prompt
Prompt Combiner βž•

Build one prompt out of up to four pieces, with per-piece weights

TensorVizion/Prompt
Prompt List Iterator πŸ“œ

Run 50 prompts overnight without touching the queue once

TensorVizion/Workflow
Prompt Random Line 🎯

Pick a random lighting/style line from a pasted list, reproducibly

TensorVizion/Prompt
Prompt Token Counter πŸ”’

Know your prompt is about to get truncated before you waste a generation

TensorVizion/Prompt
Prompt Weight Scheduler ⏳

Animate a prompt's emphasis across frames instead of freezing it

TensorVizion/Prompt
Quick LoRA Stacker ⚑

Stack up to three LoRAs with one weight each, no ceremony

TensorVizion/Model Utilities
Quick Save Image πŸ’Ύ (TensorVizion)

Save an image with the story attached, not just the pixels

TensorVizion/Image
Resize to Multiple πŸ“

Fix the 'not divisible by 8' error before the VAE complains

TensorVizion/Image
Response Saver πŸ’Ύ

Persist an API response to disk before it evaporates

TensorVizion/Web API
RSS Feed Parser (WebAPI)

Pull a feed's headlines into your graph as data

TensorVizion/Web API
Seed Stepper 🌱

Never repeat a seed you've already used β€” unless you want to

TensorVizion/Sampling
KSampler Seed Variator 🎲

One KSampler, a handful of seeds, zero duplicate nodes

TensorVizion/Sampling
Simple KSampler 🌑️

The KSampler you already know, with receipts

TensorVizion/Model Utilities
Simple SDXL Loader πŸ“€

One node, the whole SDXL stack

TensorVizion/Model Utilities
Smart Unloader 🧹

Forget the VRAM panic β€” put an unloader in your graph

TensorVizion/Model Utilities
Text Overlay ✏️

Burn text onto images without leaving ComfyUI

TensorVizion/Image
Timer Start ⏱️▢️

Benchmark a workflow section without touching a stopwatch

TensorVizion/Workflow
Timer Stop ⏱️⏹️

The other half of the timer β€” and what -1 actually means

TensorVizion/Workflow
Trigger Word Extractor 🏹

The LoRA filename decoder ring

TensorVizion/Model
Try/Catch (Value Guard) πŸ›Ÿ

Your workflow's seatbelt β€” a value guard, not a real try/except

TensorVizion/Workflow
Universal Checkpoint Loader 🌐 (TensorVizion)

One loader that works across every checkpoint family

TensorVizion/Model Utilities
VAE Decode πŸ”“

Turning latents back into pixels β€” the node that finishes every workflow

TensorVizion/Model Utilities
VAE Encode πŸ”’

The door from pixels to latent space (and why each trip costs a little)

TensorVizion/Model Utilities
VAE Loader πŸ—οΈ

When you want a specific VAE, not whatever the checkpoint bundled

TensorVizion/Model Utilities
Video Color Match 🎨

Make clip B look like it was graded with clip A

TensorVizion/Video
Video Concat / Splice πŸ”—

Stitching clips end-to-end, crossfade optional

TensorVizion/Video
Video Frame Interpolate πŸŽ₯

Smoothing out a choppy AI clip without an ML model

TensorVizion/Video
Video Load πŸ“Ή

Getting a video file into your graph as frames

TensorVizion/Video
Video Loop Composer πŸ”‚

Make that clip loop without a visible seam

TensorVizion/Video
Video Motion Trail 🌌

Ghosting, star trails, and the long-exposure look

TensorVizion/Video
Video Mux Audio πŸ”Š

Put sound on your generated video

TensorVizion/Video
Video Save 🎬

The last node in every video workflow

TensorVizion/Video
Video Scene Detect 🎬

Find the hard cuts before you feed footage to an I2V model

TensorVizion/Video
Video Speed Ramp 🐒

Speed ramps in ComfyUI, without a frame synthesizer

TensorVizion/Video
Video Trim / Extract βœ‚οΈ

Trim dead frames off a clip, or pull one scene out of a batch

TensorVizion/Video
VRAM / Model Size Estimator πŸ“

Will this stack OOM before it starts? Ask before you queue

TensorVizion/Model
Webhook Listener (Dummy) (WebAPI)

This webhook listener is a lie β€” and it's fine that it is

TensorVizion/Web API
Wildcard List Inspector πŸ“‹

What wildcards do you actually have? This node tells you

TensorVizion/Prompt
Wildcard Loader 🎲

The seeded wildcard resolver that needs no extra packs

TensorVizion/Prompt
Wildcard Prompt Builder 🧩

Inline {this|that} prompt variety without a single file

TensorVizion/Prompt
Conditional Gate 🚦

One node that compares, decides, and routes

TensorVizion/Workflow
Workflow End 🏁

A finish line for your workflow β€” and a done-file for your scripts

TensorVizion/Workflow
Workflow Manifest Writer πŸ“‹

Every render deserves a receipt β€” this is the receipt

TensorVizion/Workflow
Readme

OmniNodes β€” ComfyUI Custom Node Pack

By TensorVizion Β· 130 node files across 10 categories Β· Verified against the actual pack contents on 2026-09-05.

A production-grade ComfyUI custom node pack covering audio processing, image post-processing, latent space manipulation, model utilities, GGUF quantized model loading, prompt/wildcard tooling, sampling primitives, video processing, web API integration, and workflow control.

Most of the pack (Audio/Image/Latent/Model/Prompt/Sampling/Video/Workflow) is built on PyTorch, NumPy, and Pillow β€” all bundled with any ComfyUI install, so no extra pip install is needed for those eight categories. The Web API and GGUF categories are the exceptions: Web API's HTTP-dependent nodes need requests, and all six GGUF Nodes need the gguf package (see Requirements).


Installation

# Option A β€” Git clone (recommended)
cd ComfyUI/custom_nodes/
git clone https://github.com/TensorVizion/OmniNodes

# Option B β€” Manual
# Download the zip, extract, and place the OmniNodes/ folder into:
# ComfyUI/custom_nodes/OmniNodes/

If you plan to use the Web API or GGUF categories, also install their external dependencies:

cd ComfyUI/custom_nodes/OmniNodes/
pip install -r requirements.txt

# Or install just the GGUF dependency on its own:
pip install gguf

Restart ComfyUI after installing. The loader (__init__.py) recursively scans every .py file in the pack β€” nodes don't need to follow a specific filename pattern to be picked up, but each file must define its own NODE_CLASS_MAPPINGS dict or it will be silently skipped.

Nodes appear in the node search menu under ten sub-groups: Audio, Image, Latent, Model Utilities/Model, GGUF, Prompt, Sampling, Video, Web API, and Workflow β€” see Known Quirks for why Model and Sampling nodes are split the way they are.


Node Reference

🎡 Audio Nodes β€” TensorVizion/Audio (12 nodes)

| Node | Summary | |------|---------| | Audio Beat Detect πŸ₯ | Energy-based onset detection; returns beat timestamps, count, and estimated BPM. | | Audio Loudness Match 🎚️ | Matches one audio clip's perceived loudness to a reference clip β€” the audio equivalent of Video Color Match. Differs from Audio Normalize by targeting another clip's actual level rather than a fixed dBFS number. | | Audio Mixer 🎚️ | 4-channel stereo mixer with per-track gain, pan, and mute. | | Audio Normalize πŸ”Š | Peak or RMS normalization to a target dBFS level, with DC-offset removal and soft-clip. | | Audio Pitch Shift 🎼 | Phase-vocoder pitch shift, Β±24 semitones, pure NumPy. | | Audio Reverb πŸ›οΈ | Algorithmic (Schroeder comb + allpass) or convolution (synthetic IR) reverb. | | Audio Sidechain Duck πŸ¦† | Ducks one audio signal's level based on another's envelope (classic sidechain compression). | | Audio Spectrogram πŸŽ›οΈ | Renders an STFT spectrogram as an IMAGE, with linear/log-power scaling and 4 colormaps. | | Audio Stem Splitter (Freq Band) 🍰 | Frequency-band splitter into bass/mid/high stems (not source-separation ML). | | Audio-to-Latent Modulator 🎧 | Converts an audio envelope into a per-frame FLOAT curve and a scaled LATENT for audio-reactive generation. | | Audio Transient Shaper πŸ₯Š | Boosts or reduces the attack/sustain portions of a signal. | | Audio Waveform 🎡 | Renders a waveform visualization as an IMAGE. |

πŸ–ΌοΈ Image Nodes β€” TensorVizion/Image (18 nodes)

| Node | Summary | |------|---------| | Apply Upscale Model πŸ”­ (new) | Runs an UPSCALE_MODEL (loaded by Upscale Model Loader) over an image, with an optional post-resize to a target long-edge size. Closes the gap between loading an upscale model and actually using it β€” previously the pack had no node to run one. | | Quick Save Image πŸ’Ύ (new) | Saves a single image into ComfyUI's own managed output tree (gallery-visible immediately, standard prefix_00001_ naming) with seed/model/notes embedded as PNG text chunks. Different from Metadata Embed and Custom Folder Batch Saver, both of which save outside the managed output tree. | | 3D LUT Apply 🎞️ | Loads a standard Adobe/IRIDAS .cube 3D LUT file and applies it via trilinear interpolation, with an adjustable strength blend. | | Contact Sheet Maker πŸ—ΊοΈ | Tiles a batch of images into an unlabeled thumbnail grid for browsing. | | Custom Folder Batch Saver πŸ“ | Saves a batch to an arbitrary directory (not ComfyUI's managed output root) with persistent zero-padded numbering. | | Aspect Ratio Bucket πŸ“ | Snaps an image to the nearest standard SD/SDXL aspect-ratio training bucket. | | Image Blend πŸ–ŒοΈ | Blends two images with selectable blend modes, ratio, strength, and optional mask. | | Image Color Grade 🎨 | Exposure/contrast/saturation/gamma/lift/gain/temperature/tint grading. | | Image Grid Compare πŸ†š | Labeled side-by-side comparison grid β€” one text label per cell, plus an optional highlight border. Genuinely different from Contact Sheet Maker: this is built for labeled comparison (sampler/strength/seed sweeps), not just browsing a batch. | | Face Detect & Crop πŸ™‚ | Detects faces and returns cropped outputs plus a detection mask. | | Image Mask Composite πŸ–ΌοΈ | Draws shape/effect masks (darken, brighten, blur, color) directly onto an image. | | Image Noise Inject 🎞️ | Adds film-grain-style noise with selectable blend mode and monochrome option. | | Image Sharpen & Blur πŸ”Ž | Unsharp-mask sharpening or Gaussian blur in one node. | | Image Vignette & Glow ✨ | Vignette darkening plus a bloom/glow effect on bright regions. | | Load Image + Recovered Metadata πŸ” (new) | A LoadImage-equivalent (delegates actual pixel/mask decoding to core LoadImage) that ALSO recovers embedded generation parameters β€” seed, prompt, steps, cfg, sampler, checkpoint β€” from A1111/Forge-style PNG text chunks or ComfyUI's own embedded workflow JSON, exposed as individually-wireable outputs rather than a text dump. See details below. | | Mask Morphology 🩹 | Grow, shrink, feather, or invert a MASK. | | Resize to Multiple πŸ“ | Pads, crops, or stretches an image to the nearest multiple of N (8 by default, for SD/SDXL VAE compatibility). | | Text Overlay ✏️ | Draws text onto an image with font/size/color/anchor-position/stroke/background-box controls. |

Load Image + Recovered Metadata details

Drag in any finished PNG β€” your own past output, or a shared render β€” and if it has embedded generation data, this node hands back a real seed INT you can wire into Seed Stepper, a real positive_prompt STRING you can wire into CLIPTextEncode, and the sampler/steps/cfg/checkpoint it was made with, instead of a paragraph of text you'd read and retype by hand. source selects auto (tries ComfyUI's embedded workflow JSON first, falls back to A1111-style text), comfyui, or a1111 explicitly. If no embedded metadata exists (a photo, a hand-drawn image, an unsupported tool's output), metadata_found is False and the text/numeric outputs return empty/zero defaults β€” the image still loads normally either way. For ComfyUI-format graphs with multiple CLIPTextEncode nodes, the longest text is guessed as positive and the shortest as negative β€” a heuristic, not a guarantee, for workflows that don't follow a simple single-KSampler structure. Different KSampler-family core nodes use different seed parameter names (KSampler uses seed, KSamplerAdvanced uses noise_seed) β€” both are checked.

πŸŒ€ Latent Nodes β€” TensorVizion/Latent (12 nodes)

| Node | Summary | |------|---------| | Latent Anomaly Mask 🚩 | Flags statistically anomalous latent regions and outputs a corrected latent + mask. | | Latent Blend πŸŒ€ | Blends two latents by weighted average. | | Latent Channel Mixer 🎚️ | Mixes/reweights latent channels, analogous to Image Channel Mixer. | | Latent Histogram πŸ“Š | Renders a per-channel value-distribution histogram as an image, plus an outlier-percentage stat. A different diagnostic from Latent Visualizer's point statistics β€” shows distribution SHAPE (bimodal/heavy-tailed patterns point stats can hide). | | Latent Interpolate πŸŒ‰ | Walks between two latents (spherical/linear interpolation). | | Latent Mask 🎭 | Generates rectangle/ellipse/gradient masks directly in latent space. | | Latent Noise Inject 🌊 | Adds controlled noise directly to a latent tensor. | | Latent Palette Extractor 🧬 | Extracts a signature/fingerprint summary from a latent for comparison. | | Latent QC Gate 🚧 | Automated PASS/FAIL sanity check on a sampled latent β€” NaN/Inf, near-blank (suspiciously flat) output, and outlier saturation (via median/MAD, robust to large-fraction contamination unlike a naive mean/std check) β€” with an optional fallback latent on failure. Nothing else in the pack checks a LATENT tensor itself before it reaches VAEDecode/Save; Try/Catch (Workflow Nodes) only covers STRING/scalar values. | | MiniMax H3 AV QC Gate 🚧 (new) | The Latent QC Gate concept, but for MiniMax H3's genuinely different joint video+audio latent shape (a comfy.nested_tensor.NestedTensor wrapping separate [B,24,T,H//16,W//16] video and [B,32,2,T] audio tensors, confirmed from ComfyUI core's real EmptyMiniMaxH3LatentAV source) β€” checks each modality independently, since a broken audio branch and a broken video branch are unrelated failures. A normal LATENT QC check cannot handle this shape at all. | | Latent Structure Probe πŸ“‘ | Renders a heatmap of latent activation structure. | | Latent Visualizer πŸ”¬ | Renders a human-viewable preview image of raw latent channels, plus stats. |

🧰 Model Nodes β€” TensorVizion/Model Utilities and TensorVizion/Model (33 nodes)

| Node | Summary | |------|---------| | ControlNet Apply (Advanced) πŸ•ΉοΈ (new) | Applies a loaded ControlNet + control image to positive/negative conditioning, with strength and start/end-percent windowing. Was the one missing step between ControlNet Loader / ControlNet Preprocessor and sampling β€” previously required dropping back to a stock node. | | Universal Checkpoint Loader 🌐 (new) | Model-family-agnostic MODEL/CLIP/VAE loader (SD1.5/SD2.x/SDXL/SD3/Flux), with a filename-based family guess in its summary output as a sanity check before wiring into family-specific sampling. Complements Simple SDXL Loader, which is SDXL-only. | | Image Prompt Loader πŸ–ΌοΈ (new) | Loads a CLIP vision encoder + style model pair in one node, for image-conditioned ("style transfer from a reference image") workflows β€” a conditioning path the pack had none of before. Pairs with Image Prompt Apply. | | Image Prompt Apply πŸ–ΌοΈ (new) | Encodes a reference image and applies it through a style model onto conditioning, at an adjustable strength. | | Simple SDXL Loader πŸ“€ | One-node MODEL/CLIP/VAE loader for SDXL checkpoints. | | Batch Folder Loader πŸ“‚ | Loads a checkpoint by name from a subfolder under ComfyUI's registered checkpoint roots. | | CLIP Text Compare πŸ” | Encodes two prompts and reports a similarity score between their conditioning. | | CLIP Text Weight βš–οΈ | Applies a scalar weight multiplier to CLIP conditioning. | | ControlNet Loader πŸ•ΉοΈ | Loads a ControlNet model with a summary output. | | ControlNet Preprocessor πŸ•ΉοΈ | Converts an IMAGE into ControlNet conditioning (canny edges, a lightweight depth estimate, or lineart) without needing a separate ControlNet-aux install. | | DoRA Loader (Custom) 🎯 | Real magnitude/direction-decomposition DoRA merge engine β€” computes W' = mΒ·(Wβ‚€+BA)/β€–Wβ‚€+BAβ€–_c directly rather than treating DoRA as a scaled LoRA. See Known Quirks for real limitations. | | Dual Model Merger πŸ”€ | Merges two MODELs by weighted sum. | | Krea 2 Guidance Helper 🎚️ (new) | Calculator/sanity-check for Krea 2's confirmed real guidance formula (cond + guidance_scale*(cond-uncond)). Recommends the right default per variant (1.0 Turbo / 4.5 Raw) or flags a manual value that's far off-spec, with a rough "how much is guidance actually doing" preview percentage. | | Krea 2 Variant Validator βœ… (new) | Catches the single most consequential Krea 2 misconfiguration: applying Raw-variant settings (28 steps, cfg 4.5, negative prompt) to a loaded Turbo checkpoint, or vice versa β€” both loading paths look identical in the graph, so nothing else stops this mistake, which produces a technically-running but badly wrong result rather than an error. | | LoHa Loader (Custom) πŸŒ€ | Real Hadamard-product LoHa merge engine β€” Ξ”W = (W1a@W1b) βŠ™ (W2a@W2b), applied via ComfyUI's add_patches API. | | LoKr Loader (Custom) 🧩 | Real Kronecker-product LoKr merge engine β€” Ξ”W = W1 βŠ— W2, supporting both fully-dense and factored (low-rank) forms of either factor. | | LoRA Info Inspector πŸ”¬ | Reports rank, alpha, and target modules of a LoRA file without loading it into a pipeline. | | LoRA Stack πŸ—‚οΈ | Chains multiple LoRAs onto a MODEL/CLIP pair in one node. | | LyCORIS Format Inspector πŸ”¬ | Reads a LoRA-family file's actual tensor key names to identify whether it's really LoRA, LoHa, LoKr, or DoRA-tagged β€” run this before any of the three loaders above, since misidentifying the format means applying the wrong math entirely. | | Metadata Embed 🏷️ | Embeds custom metadata into a saved file. | | Metadata Reader πŸ”– | Reads embedded metadata back out as raw text and parsed JSON. | | Model Block Freeze 🧊 | Freezes specific U-Net blocks (for partial fine-tuning workflows). | | Model Info Inspector πŸ”¬ | Reports key count, architecture guess, and precision of a loaded MODEL. | | LoRA Metadata Diff πŸ†š | Compares two LoRA files' metadata and reports structural compatibility. | | Model Merge Weighted πŸ”€ | Weighted merge of two models with a single output. | | Multi-LoRA Weight Sweep πŸ“Ά | Applies one LoRA at a range of strengths, outputting a real ComfyUI list so downstream nodes (KSampler, etc.) automatically run once per strength value β€” no manual duplication of your sampler chain. Pairs with Image Grid Compare. | | Quick LoRA Stacker ⚑ | Lighter/faster variant of LoRA Stack for simple single-LoRA cases. | | Smart Unloader 🧹 | Frees VRAM by unloading models and running garbage collection; passes any type through unchanged. | | Trigger Word Extractor 🏹 | Pulls a LoRA's trigger word out of a prompt and returns the cleaned remainder. | | Upscale Model Loader πŸ”­ | Loads an upscale model (ESRGAN-family, etc.) with a summary output. | | VAE Loader πŸ—οΈ | Loads a VAE with a summary output. | | VRAM / Model Size Estimator πŸ“ | Estimates VRAM footprint for a checkpoint + up to 4 LoRAs, reading file headers only (no full load). Reports inference AND full-fine-tune estimates β€” a floor estimate, not a guarantee. |

DoRA / LyCORIS node details

LyCORIS Format Inspector β€” Reads only the safetensors header (tensor names/shapes), never the weight data, so it's fast even on large files. Detects format from real key-naming conventions: LoRA/LoCon (lora_down.weight/lora_up.weight/alpha), LoHa (hada_w1_a/hada_w1_b/ hada_w2_a/hada_w2_b), LoKr (lokr_w1/lokr_w2, or their factored _a/_b variants), and a DoRA marker (dora_scale) that can appear alongside any of the above. Reports detected_format="mixed" with a warning if a file contains more than one format's keys β€” unusual, but not impossible for a hand-merged file.

LoHa Loader / LoKr Loader / DoRA Loader (Custom) β€” All three compute their weight delta directly from the real published formulas (Hadamard product, Kronecker product, and magnitude/direction decomposition respectively β€” see each node's module docstring for the exact math and citations) and apply it via ComfyUI's own ModelPatcher.add_patches() API, never by editing a state_dict directly. This matters because ComfyUI's built-in LyCORIS auto-detection has a documented, open issue (ComfyUI #8683) where LoHa/LoKr files can be silently mis-routed through the plain-LoRA merge path, producing a technically-running but mathematically wrong result. Loading explicitly through these nodes β€” after confirming the format with LyCORIS Format Inspector β€” avoids depending on that auto-detection succeeding. Conv2d (4D) weight support is NOT implemented in any of the three loaders (Linear/2D layers only) β€” see Known Quirks.

Multi-LoRA Weight Sweep β€” Uses OUTPUT_IS_LIST = (True, True, True), ComfyUI's real "List processing" mechanism (new to this pack β€” no other node uses it) β€” connecting the model/clip outputs into a downstream KSampler causes ComfyUI to run that KSampler once per strength value automatically. Wire the labels output into Image Grid Compare's labels input for an automatically-labeled comparison grid across the whole sweep.

🧬 GGUF Nodes β€” TensorVizion/GGUF (6 nodes) (new)

Requires the external gguf package β€” see Requirements. All six nodes are read/write tools around the GGUF quantized-model file format (the same format used by llama.cpp), for opening pre-quantized .gguf diffusion/CLIP/VAE checkpoints and for making your own.

| Node | Summary | |------|---------| | GGUF File Info πŸ” | Read-only inspector: architecture/name metadata plus a per-tensor quantization-type breakdown (real mixed-precision mix, not just a filename guess). Run this first on any downloaded .gguf file. | | GGUF Diffusion Model Loader 🧠 | Loads a quantized UNet/diffusion-model .gguf file, dequantizing every tensor to fp16/fp32 and handing the result to ComfyUI's own diffusion-model-loading path β€” output is a normal MODEL. | | GGUF CLIP Loader πŸ“ | Loads one or two quantized text-encoder .gguf files (CLIP-L/CLIP-G/T5-XXL) into a normal CLIP, mirroring core CLIPLoader/DualCLIPLoader's clip_type selector. | | GGUF VAE Loader πŸ—οΈ | Loads a quantized VAE .gguf file into a normal VAE. Included for symmetry β€” GGUF VAEs are uncommon in the wild since VAE weights are already small. | | GGUF Checkpoint Converter πŸ”„ | The write-side counterpart to the three loaders above: quantizes any checkpoint ComfyUI can load into a new .gguf file (Q4_0 through Q8_0, or plain F16/F32), via the real gguf package's own GGML block-quantization code β€” not a custom scheme only this pack understands. | | GGUF Quant Validator βœ… | Spot-dequantizes a sample of tensors from a .gguf file and flags NaN/Inf, all-zero, or zero-element tensors β€” a fast sanity check for a truncated download or bad conversion before it fails confusingly three nodes downstream. |

GGUF node details

All three loaders (Diffusion Model / CLIP / VAE) work the same way under the hood: they fully dequantize every tensor to fp16 (or fp32) at load time, then hand a plain state dict to ComfyUI's own core loading functions. That means the resulting MODEL/CLIP/VAE behaves identically to one loaded from safetensors β€” but it also means loading one of these files uses the full fp16/fp32 VRAM/RAM footprint, not the reduced footprint a dedicated quantized-inference extension (like the community ComfyUI-GGUF extension, which keeps weights quantized on the GPU via custom ops) provides. Use these nodes when you want to open a .gguf file without installing that extension and don't need its memory savings; reach for that extension instead when VRAM headroom is the actual point of using GGUF for you.

GGUF Checkpoint Converter's block-quant types (Q4_0/Q4_1/Q5_0/Q5_1/ Q8_0) require each tensor's last dimension to be divisible by 32. Tensors that don't satisfy this (commonly small 1-D bias/norm vectors) are automatically kept at F16 instead of being dropped, so the output file is always complete β€” the fallback count is reported in report. K-quants (Q4_K etc.) are intentionally not offered here, since a faithful K-quant conversion needs an importance-matrix-aware pipeline that a single generic tensor-by-tensor pass can't do properly.

🎲 Prompt Nodes β€” TensorVizion/Prompt (13 nodes)

| Node | Summary | |------|---------| | CLIP Skip βœ‚οΈ (new) | Stops CLIP text-encoding early at N layers from the end β€” the standard "clip skip" option many SD1.5-era/anime checkpoints expect, and a basic utility the pack was missing entirely. | | Conditioning Composer 🧩 (new) | One node covering combine / concat / set_area modes for merging two conditionings β€” regional and multi-concept prompting without needing three separate stock nodes. | | CLIP Text Encode (Simple) ✍️ | Minimal CLIP text encode with a summary output, as a lighter alternative to core CLIPTextEncode. | | Embedding Helper 🧷 | Helps format/insert textual-inversion embedding tokens into a prompt. | | Negative Prompt Presets 🚫 | Dropdown-selectable common negative-prompt blocks. | | Prompt Cleaner 🧹 | Strips duplicate tags, extra whitespace, and malformed weighting syntax from a prompt. | | Prompt Combiner βž• | Joins multiple prompt fragments into one string with configurable separators. | | Prompt Random Line 🎯 | Picks a random line from a multi-line text block, seeded. | | Prompt Token Counter πŸ”’ | Counts CLIP tokens in a prompt and warns if it will be truncated. | | Prompt Weight Scheduler ⏳ | Produces a prompt fragment with a scheduled/varying attention weight. | | Wildcard List Inspector πŸ“‹ | Lists available wildcard files and their line counts. | | Wildcard Loader 🎲 | Loads and resolves __wildcard__ syntax from text files, seeded. | | Wildcard Prompt Builder 🧩 | Assembles a full prompt from multiple wildcard categories in one node. |

🌑️ Sampling Nodes β€” TensorVizion/Model Utilities and TensorVizion/Sampling (10 nodes)

| Node | Summary | |------|---------| | Detailer (Crop-Inpaint-Paste) πŸ”Ž (new) | Full region-fix loop: crops a masked region (e.g. from Face Detect & Crop) to its bounding box, upscales it for a full-resolution sampling pass, re-samples with fresh conditioning, then feather-pastes the result back. The pack had detection and sampling as separate pieces with nothing tying them into one pass β€” this is that missing connective node. | | Empty Latent Image ⬜ | Creates a blank latent at a given resolution/batch size, wrapping core EmptyLatentImage with a summary output. | | KSampler Base+Refiner 🎭 (new) | Real SDXL base+refiner two-stage handoff in one node β€” two MODEL inputs, internally runs KSamplerAdvanced twice with a correct leftover-noise handoff at switch_fraction (default 0.8, matching Stability AI's own published recommendation), instead of needing two manually-wired KSamplerAdvanced nodes. | | KSampler Conditioning Blend πŸ”€ (new) | Takes TWO positive CONDITIONING inputs and a blend_ratio, weighted-averages them (same math as ComfyUI's own core ConditioningAverage), then samples β€” one extra CONDITIONING input instead of an extra model or image/mask pair. | | KSampler Masked Inpaint πŸ–ŒοΈ (new) | Takes IMAGE+MASK directly instead of a pre-built LATENT β€” encodes via core VAEEncodeForInpaint (mask-grow handled correctly, not reimplemented) then samples in one call, fewer required inputs than the usual two-node VAE-Encode-for-Inpainting β†’ KSampler chain. | | KSampler Seed Variator 🎲 (new) | One config, many outputs: samples the same prompt across num_variations consecutive seeds and returns one batched LATENT β€” a "seed lottery" pass without wiring N separate KSampler nodes in parallel. | | Seed Stepper 🌱 | Tracks a persistent history of seeds used across queue runs. Supports increment, random-but-never-repeat, and cycle-through-a-fixed-list modes β€” Batch Counter already derives a fresh seed per run, but has no memory of which specific seeds were used. Uses CATEGORY = "TensorVizion/Sampling", distinct from this category's other nodes β€” see Known Quirks. | | Simple KSampler 🌑️ | Wraps core KSampler with a summary output describing the sampling run. | | VAE Decode πŸ”“ | Wraps core VAEDecode with a summary output. | | VAE Encode πŸ”’ | Wraps core VAEEncode with a summary output. |

Empty Latent Image, Simple KSampler, VAE Decode, and VAE Encode are thin summary-adding wrappers around ComfyUI's own core sampling nodes. Seed Stepper is an independent utility node. The four new KSampler variants each delegate their actual sampling math to ComfyUI's own core KSampler/KSamplerAdvanced/VAEEncodeForInpaint classes (called via getattr(instance, instance.FUNCTION) rather than a hardcoded method name, so they stay correct even if a future core version renames the internal method) β€” none of them reimplement diffusion sampling from scratch. Each one differs from the others in its actual input/output SHAPE (two models vs. two conditionings vs. image+mask vs. a seed-count widget), not just its default parameter values.

🎬 Video Nodes β€” TensorVizion/Video (12 nodes)

| Node | Summary | |------|---------| | MiniMax H3 Duration Calculator ⏱️ (new) | Converts a plain "how many seconds" value into MiniMax H3's real required frame count, snapped to the model's confirmed 17k+5 frame grid at 24fps (the official ComfyUI template does this with a raw MathExpression string β€” this wraps the same confirmed formula into a labeled, documented, reusable node), plus resolution validation the official template skips entirely. | | Video Color Match 🎨 | Matches the color grade of a video batch to a reference frame/image. | | Video Concat / Splice πŸ”— | Joins or splices IMAGE batches (ComfyUI's "video = batch of images" convention) end-to-end. | | Video Frame Interpolate πŸŽ₯ | Generates in-between frames to increase apparent frame rate. | | Video Load πŸ“Ή | Loads a video file into an IMAGE batch, reporting source FPS and frame count. | | Video Loop Composer πŸ”‚ | Builds seamless ping-pong/looping sequences from a batch. | | Video Motion Trail 🌌 | Adds a motion-trail/ghosting effect across frames. | | Video Mux Audio πŸ”Š | Muxes an audio track onto a saved video file. | | Video Save 🎬 | Encodes an IMAGE batch to MP4/WEBM/GIF via imageio (requires the imageio/imageio-ffmpeg packages β€” not bundled). | | Video Scene Detect 🎬 | Detects hard cuts and reports scene boundaries/timestamps. | | Video Speed Ramp 🐒 | Applies variable-speed time-remapping to a batch. | | Video Trim / Extract βœ‚οΈ | Crops a batch to a start/end frame range. |

🌐 Web API Nodes β€” TensorVizion/Web API (10 nodes)

The category that submits requests, waits on async jobs, extracts/builds JSON, saves results, notifies on completion, and tracks simple file queues.

| Node | Summary | |------|---------| | HTTP Request (WebAPI) | Sends a GET/POST/PUT/DELETE request; returns JSON, raw text, status code, and headers. | | OAuth2 Token Manager (WebAPI) | Obtains an OAuth2 access token via client-credentials or password grant. | | RSS Feed Parser (WebAPI) | Fetches and parses an RSS/Atom feed into a list of entries. | | Webhook Listener (Dummy) (WebAPI) | ⚠️ Does not actually start an HTTP server β€” see Known Quirks. | | JSON Field Extractor πŸ”Ž | Pulls one value out of nested JSON via a dot-path (e.g. data.items.0.title), with a fallback if the path doesn't resolve. | | JSON Builder 🧱 | Assembles a JSON object from up to 4 key/value pairs (with auto type coercion) plus an optional merged JSON blob β€” for constructing request bodies without hand-typing JSON. | | Endpoint Poller ⏳ | Repeatedly GETs a URL until a JSON field matches an expected value (or any 2xx if no field given), for async job-style APIs. Times out cleanly after max_wait_seconds. | | Response Saver πŸ’Ύ | Writes a JSON or text response to disk with the pack's standard collision-avoiding numbered-filename convention. | | Discord Notify πŸ”” | Posts a message, optionally with an attached image, to a Discord webhook URL β€” the "ping me when this batch finishes" node. | | Folder Watcher πŸ‘οΈ | Scans a folder and returns the next file not yet recorded in a manifest, enabling simple queue-style batch processing without a real job queue. |

Web API node details

HTTP Request β€” Sends GET/POST/PUT/DELETE to url with JSON headers/body widgets (parsed as JSON if valid, otherwise sent empty/raw). Returns the parsed response JSON, raw response text, HTTP status code, and response headers. Catches all exceptions internally and returns status_code=0 with the error message in response_text rather than crashing the queue.

OAuth2 Token Manager β€” Supports client_credentials and password grant types against any standard OAuth2 token endpoint. Returns access token, refresh token, a computed expires_at unix timestamp, and token type. Exceptions are caught and surfaced as an "Error: ..." string in the token_type output rather than raising.

RSS Feed Parser β€” Fetches feed_url and extracts <item> blocks via regex (not a full XML parser), pulling title/link/description/pubDate. filter_keyword optionally restricts results to entries whose title or summary contains that keyword (case-insensitive). Regex-based parsing means malformed or heavily-namespaced feeds may parse incorrectly β€” for strict RSS compliance, a real XML parser would be more robust.

Webhook Listener (Dummy) β€” See Known Quirks below; this node's port/endpoint/auth_token inputs currently have no effect.

JSON Field Extractor β€” Accepts either a JSON dict (e.g. from HTTP Request's response_json) or a raw JSON string on the same socket, auto- detecting which it received. field_path uses dot notation with numeric segments indexing into arrays ("data.items.2.name"). Returns found=False and the fallback string if the path doesn't resolve, rather than raising β€” a bad path won't stop the workflow.

JSON Builder β€” 4 key/value text-widget pairs with light type coercion: "true"/"false" β†’ booleans, "null" β†’ JSON null, plain numeric strings β†’ int/float, and values starting with {, [, or a quoted string are parsed as nested JSON. extra_json optionally merges in a larger hand-written object for cases needing more than 4 fields.

Endpoint Poller β€” GETs url every interval_seconds. If success_field_path is set, polls until that dot-path resolves to success_value (string-compared); if left blank, any 2xx response counts as success. Stops and reports timed_out=True after max_wait_seconds regardless of which mode is used. Requires requests β€” see Requirements.

Response Saver β€” Accepts JSON (dict/list, pretty-printed on save) or a plain string (saved verbatim, or re-parsed and pretty-printed if format="json" and it happens to be a JSON string) on the same content socket. Uses the same name_001, name_002 collision-avoidance numbering as Video Save and Custom Folder Batch Saver, so repeat runs never overwrite a previous save.

Discord Notify β€” Posts message to webhook_url via Discord's webhook API. If an image is connected, the first frame of the batch is attached as a PNG β€” for multiple images, either call this node once per image or combine them into one image upstream with Contact Sheet Maker first. Requires requests; if missing, returns a clear error rather than crashing. Treat the webhook URL like a password β€” anyone with it can post to that Discord channel.

Folder Watcher β€” Scans folder_path for files matching extensions, sorted alphabetically, and returns the first one not yet recorded in a manifest JSON file (defaults to <folder_path>/.tensorvizion_processed.json). mode="scan_and_return" finds and returns the next unprocessed file; mode="mark_only" records a specific filename as processed without scanning β€” useful if you don't want mark_processed_immediately to fire until downstream processing actually succeeds. Uses only the Python standard library, no extra dependency.

πŸ”€ Workflow Nodes β€” TensorVizion/Workflow (9 nodes)

| Node | Summary | |------|---------| | Any Switch πŸ”€ | Boolean-gated router for any ComfyUI type β€” one reusable switch instead of a type-specific one per socket type. | | Batch Counter πŸ”’ | Tracks a run count across queue executions and derives a seed from it. | | Timer Start ⏱️▢️ | Starts a named timer, passing any type through unchanged. | | Timer Stop ⏱️⏹️ | Stops a named timer and reports elapsed seconds. | | Conditional Gate 🚦 | Routes to one of two outputs based on a boolean condition, reporting which branch fired. | | Prompt List Iterator πŸ“œ | Reads prompts from a text file (one per line) or a folder of .txt files and returns the Nth one β€” pair with Batch Counter's index output to step through a whole list one prompt per queue run. | | Try/Catch (Value Guard) πŸ›Ÿ | Checks an upstream value against common failure signals (None, an error-prefixed string, NaN/Inf) and substitutes a fallback if detected. See its docstring for an important scope note β€” it cannot intercept an upstream node crashing outright, only validate a value an upstream node's own error handling already produced. | | Workflow End 🏁 | Terminal node that accepts up to 4 inputs of any type and produces a run summary. | | Workflow Manifest Writer πŸ“‹ | Writes a JSON record of the parameters that produced a given output β€” checkpoint, prompt, sampler settings, seed, LoRA stack β€” saved alongside the image with matching numbering. The pack had no "what exactly produced this image" record-keeping before this. |


Known Quirks

These are real, verified characteristics of the current pack β€” not bugs introduced by this doc rewrite, but worth knowing before you build around them:

  • Web API category naming was inconsistent until this update. The original 4 Web API nodes (node_http_request.py, node_oauth_manager.py, node_rss_parser.py, node_webhook_listener.py) used CATEGORY = "WebAPI Nodes" β€” the only category in the pack not prefixed with TensorVizion/. This has been corrected to TensorVizion/Web API to match every other category.
  • Webhook Listener is a dummy/stub. Its docstring says it "starts a local HTTP server," but the code never binds a port or starts a listener β€” it only checks a class-level _last_payload attribute that nothing in the file ever sets. As written, this node will always return new_data=False. Treat it as a placeholder for a future real implementation, not a working webhook receiver.
  • Model nodes are split across two category strings. Most Model Nodes use CATEGORY = "TensorVizion/Model Utilities", but four files (metadata_embed_node.py, metadata_reader_node.py, model_lora_metadata_diff_node.py, trigger_word_extractor_node.py) use CATEGORY = "TensorVizion/Model" instead β€” so they'll show up in a separate submenu from the rest of the category in the node search.
  • Sampling Nodes live in TensorVizion/Model Utilities, not their own category despite having their own Sampling Nodes/ folder on disk. This is a folder-vs-category mismatch, not a bug β€” the loader doesn't care what folder a file is in, only its CATEGORY string.
  • latent_mask_node.py had a real syntax error (four lines each containing two statements with no separator, e.g. x0 = int(x * W) y0 = int(y * H)) that made the entire file fail to import in every prior release. This has been fixed as part of this update β€” see the Changelog.
  • Seed Stepper uses CATEGORY = "TensorVizion/Sampling", a new category string not used by any other file in the Sampling Nodes folder (the other four use TensorVizion/Model Utilities). This was a deliberate choice β€” Seed Stepper is a standalone utility, not a core-node wrapper like the other four β€” but it means the Sampling Nodes folder now spans two submenus in the node search, similar to the existing Model Nodes split.
  • ControlNet Preprocessor's depth_lite mode is a heuristic, not a real depth model. It estimates "near vs. far" from luminance and local sharpness, which works reasonably for a clear-subject-against-soft- background composition but is not comparable to a trained MiDaS/Depth- Anything model. Use a real depth ControlNet preprocessor node for anything depth-accuracy-sensitive; this mode exists for quick iteration without an extra model download.
  • 3D LUT Apply only supports 3D .cube LUTs (LUT_3D_SIZE header), not 1D LUTs (LUT_1D_SIZE) β€” it raises a clear error naming the file if a 1D LUT is loaded, rather than silently misreading it.
  • LoHa Loader, LoKr Loader, and DoRA Loader only support Linear-style 2D weights β€” Conv2d (4D) layers are NOT implemented in any of the three. Real LoHa/LoKr/DoRA files commonly include both Linear (attention projections) and Conv2d (ResBlock/UNet conv) layers; this pack's engines will apply the Linear layers correctly and report every Conv2d layer as skipped in the node's summary output, rather than silently ignoring them or (worse) applying incorrect math to them. This means a full file's effect will typically be PARTIAL, not complete, until Conv2d support is added in a future update. Always check the summary output's skip counts before assuming a merge fully applied.
  • The key-name translation from LyCORIS's flattened naming (lora_unet_...) to ComfyUI's internal dotted module paths is a best-effort heuristic (documented in each loader's _map_to_model_key method), not a verified mapping table for every architecture. It's been tested against the standard SD1.5/SDXL UNet naming convention; other architectures (video models, non-UNet DiTs) may have layers that fail to map and get skipped. This mirrors a real, currently-open upstream ComfyUI issue (#12638) where LoKr keys go completely unloaded for at least one non-UNet architecture β€” this pack's loaders make that failure visible in summary rather than silent, but do not solve the underlying mapping problem for every possible architecture.
  • DoRA Loader requires reading the model's CURRENT weight for each affected layer to compute its magnitude/direction decomposition correctly. If other patches were already applied to those same layers earlier in your workflow graph, the DoRA math will be computed relative to the already-patched weight, not the original base checkpoint weight β€” for predictable results, apply DoRA Loader before other model-patching nodes in your graph, not after.
  • The 4 new KSampler variants call ComfyUI's core sampler classes via getattr(instance, instance.FUNCTION) rather than a hardcoded method name β€” this is deliberate (verified against real core source during development, where a naive assumption about KSamplerAdvanced's exact parameter name for seed turned out to be wrong: it's noise_seed, not seed, unlike plain KSampler). If ComfyUI core ever changes a sampler's parameter order (not just method name), these nodes would need updating β€” they pass arguments positionally, matching core's confirmed real signatures as of this pack's last verification date.
  • Load Image + Recovered Metadata's ComfyUI-format parser uses a heuristic for multi-prompt graphs: with more than one CLIPTextEncode node in the embedded workflow, the longest text is guessed as positive and the shortest as negative. This is correct for the common single positive/negative pair but not guaranteed for workflows with several prompt nodes (e.g. a base+refiner workflow with separate refiner prompts, or a regional-prompting setup).
  • Latent QC Gate's outlier check uses median/MAD, not mean/std β€” deliberately. An earlier mean/std version failed to catch a deliberately-constructed test case where 20% of a latent's values were extreme outliers, because that large a contaminated fraction pulls the mean and standard deviation far enough to hide the very values that should have tripped the check (the "masking effect" β€” mean/std have a 0% breakdown point; median/MAD have 50%). If you're comparing this node's outlier-percent output to Latent Histogram's outlier stat (Latent Nodes), note that node still uses mean/std β€” the two aren't computing the exact same statistic, by design, for different purposes (a chart you read yourself vs. an automated gate that needs to resist being fooled by a large bad batch).

Folder Structure

OmniNodes/
β”œβ”€β”€ __init__.py                 ← recursive auto-discovery loader
β”œβ”€β”€ README.md
β”œβ”€β”€ requirements.txt             ← declares `requests` for Web API, `gguf` for GGUF Nodes
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ Model Links.md               ← creator links (CivitAI/Ko-fi/Patreon), not node docs
β”‚
β”œβ”€β”€ Audio Nodes/                  (12 files, TensorVizion/Audio)
β”œβ”€β”€ Image Nodes/                  (16 files, TensorVizion/Image)
β”‚   └── load_image_with_metadata_node.py ← new
β”œβ”€β”€ Latent Nodes/                  (11 files, TensorVizion/Latent)
β”‚   └── latent_qc_gate_node.py           ← new
β”œβ”€β”€ Model Nodes/                  (26 files, TensorVizion/Model Utilities + TensorVizion/Model)
β”œβ”€β”€ GGUF Nodes/                    (6 files, TensorVizion/GGUF) ← new
β”‚   β”œβ”€β”€ gguf_file_info_node.py
β”‚   β”œβ”€β”€ gguf_diffusion_model_loader_node.py
β”‚   β”œβ”€β”€ gguf_clip_loader_node.py
β”‚   β”œβ”€β”€ gguf_vae_loader_node.py
β”‚   β”œβ”€β”€ gguf_checkpoint_converter_node.py
β”‚   └── gguf_quant_validator_node.py
β”œβ”€β”€ Prompt Nodes/                 (11 files, TensorVizion/Prompt)
β”œβ”€β”€ Sampling Nodes/                 (9 files, TensorVizion/Model Utilities + TensorVizion/Sampling)
β”‚   β”œβ”€β”€ ksampler_base_refiner_node.py       ← new
β”‚   β”œβ”€β”€ ksampler_masked_inpaint_node.py     ← new
β”‚   β”œβ”€β”€ ksampler_seed_variator_node.py      ← new
β”‚   └── ksampler_conditioning_blend_node.py ← new
β”œβ”€β”€ Video Nodes/                  (11 files, TensorVizion/Video)
β”œβ”€β”€ Web API Nodes/                 (10 files, TensorVizion/Web API)
β”œβ”€β”€ Workflow Nodes/                 (9 files, TensorVizion/Workflow)
β”‚
└── Configs/                      ← JSON schema files for select nodes

Requirements

| Dependency | Notes | |------------|-------| | ComfyUI | Any recent version | | Python 3.9+ | Included with ComfyUI | | PyTorch | Included with ComfyUI | | NumPy | Included with ComfyUI | | Pillow | Included with ComfyUI | | requests | NOT bundled with ComfyUI. Required for HTTP Request, OAuth2 Token Manager, RSS Feed Parser, and Endpoint Poller. Install with pip install -r requirements.txt from the pack folder, or pip install requests directly. Nodes that need it check for its presence and return a clear error message (rather than crashing) if it's missing. | | gguf | NOT bundled with ComfyUI. Required for all 6 GGUF Nodes (File Info, Diffusion Model Loader, CLIP Loader, VAE Loader, Checkpoint Converter, Quant Validator). Install with pip install -r requirements.txt or pip install gguf directly. Every GGUF node checks for its presence and returns a clear error message (rather than crashing) if it's missing. | | imageio + imageio-ffmpeg | Optional. Only required for Video Save's mp4/webm output (GIF works with plain imageio). Not bundled with ComfyUI. |

All Audio/Image/Latent processing (FFT, phase vocoder, reverb, beat detection, color grading, blending, channel mixing) is implemented in pure NumPy/PyTorch/Pillow. The Model Utilities nodes use ComfyUI's own folder_paths, comfy.sd, comfy.utils, and comfy.model_management modules, already part of any ComfyUI install. The GGUF Nodes use those same comfy.sd/comfy.utils/folder_paths modules for the actual MODEL/CLIP/VAE construction, plus the external gguf package for reading, dequantizing, and writing .gguf files.


Troubleshooting

Nodes do not appear after install Restart ComfyUI completely. Check the terminal for [OmniNodes] log lines β€” βœ… Loaded means the file registered, ⚠️ No NODE_CLASS_MAPPINGS means the file was found but skipped, and ❌ Error importing means a real failure with a traceback printed below it.

Web API nodes fail to import with ModuleNotFoundError: No module named 'requests' Run pip install -r requirements.txt from inside the OmniNodes/ folder (or pip install requests directly) into the same Python environment ComfyUI runs in, then restart ComfyUI.

Endpoint Poller always times out Check success_field_path matches the actual shape of the JSON your endpoint returns β€” a typo'd path never resolves, so the node polls until max_wait_seconds and reports timed_out=True. Leave success_field_path blank to instead succeed on any 2xx response if your endpoint has no status field to check.

Webhook Listener never returns new data This is expected β€” see Known Quirks. It's a dummy node that was never wired to a real HTTP server.

Import error on a specific node Read the traceback in the ComfyUI terminal. Failures here are almost always missing ComfyUI internals (e.g. folder_paths, comfy.sd, or core nodes like KSampler/VAEDecode) not being on the Python path, which usually means the pack isn't actually inside ComfyUI/custom_nodes/ β€” check the install location first.

LoRA Stack / Quick LoRA Stacker / LoRA Info Inspector say LoRA not found LoRA filenames come from ComfyUI's folder_paths registry. Make sure your LoRAs are in the folder ComfyUI expects (usually ComfyUI/models/loras/).

Simple SDXL Loader / Batch Folder Loader can't find a checkpoint Same as above β€” both nodes only see files under ComfyUI's registered checkpoints/ search paths, not arbitrary filesystem locations.

Smart Unloader doesn't seem to free any VRAM Check the summary output string β€” if CUDA isn't available, it reports "CUDA not available" and skips VRAM accounting, since there's nothing to measure. The unload/GC calls still run either way.


Changelog

2026-09-05

  • Added a new GGUF Nodes category (TensorVizion/GGUF, 6 nodes) β€” the pack's first support for quantized .gguf model files:
    • GGUF File Info πŸ” β€” architecture/metadata + per-tensor quant-type breakdown, read-only.
    • GGUF Diffusion Model Loader 🧠, GGUF CLIP Loader πŸ“, GGUF VAE Loader πŸ—οΈ β€” dequantize-and-load a GGUF UNet/CLIP/VAE into a normal MODEL/CLIP/VAE via ComfyUI's own core loading functions. See these nodes' docstrings (and GGUF node details) for the VRAM trade-off vs a dedicated quantized-inference extension.
    • GGUF Checkpoint Converter πŸ”„ β€” quantizes any checkpoint into a real .gguf file (Q4_0–Q8_0/F16/F32) using the gguf package's own GGML block-quantization code.
    • GGUF Quant Validator βœ… β€” spot-checks a .gguf file for NaN/Inf, all-zero, or zero-element tensors before it gets loaded downstream.
    • Requires the new external gguf dependency β€” see Requirements.

2026-08-31

  • Added 8 new nodes closing the biggest gaps preventing a fully self-contained workflow from being built with OmniNodes alone (no dropping back to stock ComfyUI nodes for these steps):
    • ControlNet Apply (Advanced) πŸ•ΉοΈ (Model Nodes) β€” the missing apply step between ControlNet Loader / ControlNet Preprocessor and sampling.
    • Apply Upscale Model πŸ”­ (Image Nodes) β€” runs the model Upscale Model Loader loads; previously nothing in the pack executed it.
    • Universal Checkpoint Loader 🌐 (Model Nodes) β€” model-family-agnostic loader (SD1.5/SD2.x/SDXL/SD3/Flux) alongside the SDXL-only Simple SDXL Loader.
    • Conditioning Composer 🧩 (Prompt Nodes) β€” combine/concat/set_area in one mode-switching node for regional/multi-concept prompting.
    • Detailer (Crop-Inpaint-Paste) πŸ”Ž (Sampling Nodes) β€” full crop β†’ upscale β†’ resample β†’ feathered-paste loop off a mask input (e.g. from Face Detect & Crop), the pack's first complete "fix a region" node.
    • Image Prompt Loader πŸ–ΌοΈ and Image Prompt Apply πŸ–ΌοΈ (Model Nodes) β€” a CLIP-vision/style-model pair enabling image-conditioned generation, a conditioning path the pack had none of before.
    • CLIP Skip βœ‚οΈ (Prompt Nodes) β€” standard clip-skip utility.
    • Quick Save Image πŸ’Ύ (Image Nodes) β€” single-image save into ComfyUI's managed output tree with seed/model/notes embedded as PNG metadata.
  • Version bumped to 0.8.0.

2026-08-09

  • Added 4 new nodes supporting MiniMax H3 and Krea 2 β€” both very recent (H3 merged into ComfyUI core Aug 3, 2026) models with native ComfyUI support already; these are OmniNodes-style QC/utility additions on top of the official nodes, not replacements for them. Built against real confirmed source (ComfyUI core's actual comfy_extras/nodes_minimax_h3.py and the official H3 template), not assumed API shapes.
    • MiniMax H3 AV QC Gate 🚧 (Latent Nodes) β€” the Latent QC Gate concept adapted for H3's genuinely different joint video+audio latent (a NestedTensor wrapping separate video/audio tensors, confirmed from core source), checking each modality independently.
    • MiniMax H3 Duration Calculator ⏱️ (Video Nodes) β€” wraps the confirmed real 17k+5 frame-grid snap formula (verified against known real grid points, including the exact 124-frame value cited in an independent community source for a 5-second clip) into a labeled node.
    • Krea 2 Variant Validator βœ… (Model Nodes) β€” catches Turbo/Raw variant setting mismatches (8-step/cfg-1.0 vs 28-step/cfg-4.5) before a wasted run.
    • Krea 2 Guidance Helper 🎚️ (Model Nodes) β€” calculator/sanity-check for Krea 2's confirmed guidance formula and per-variant defaults.
  • All 4 new nodes are covered by real functional tests, including a test built around a genuine mock NestedTensor matching H3's confirmed real structure, and a 1000-iteration randomized test confirming the frame-grid snap formula always lands on a valid grid point.

2026-08-08

  • Added 6 new nodes: 4 KSampler variants with genuinely different input/output shapes, plus a Load Image variant and a Latent QC gate.
    • KSampler Base+Refiner 🎭 β€” real SDXL base+refiner handoff (two MODEL inputs) via two internal KSamplerAdvanced calls with correct leftover-noise handoff, not two independent samples stitched together.
    • KSampler Masked Inpaint πŸ–ŒοΈ β€” IMAGE+MASK in, LATENT out; encodes via core VAEEncodeForInpaint internally.
    • KSampler Seed Variator 🎲 β€” one config in, one batched LATENT out across N seeds; the inverse shape of Base+Refiner.
    • KSampler Conditioning Blend πŸ”€ β€” two positive CONDITIONING inputs blended by ratio before sampling, using the same weighted-average approach as core's own ConditioningAverage node.
    • All four call ComfyUI's core sampler classes via getattr(instance, instance.FUNCTION) rather than a hardcoded method name, and were built against real core source (not assumed) β€” development caught a real signature difference (KSamplerAdvanced uses noise_seed, not seed) before it shipped as a bug.
    • Load Image + Recovered Metadata πŸ” (Image Nodes) β€” loads an image via core LoadImage AND recovers embedded generation parameters (seed/prompt/steps/cfg/sampler/checkpoint) from A1111-style PNG text or ComfyUI's own embedded workflow JSON as individually-wireable outputs, not a text dump.
    • Latent QC Gate 🚧 (Latent Nodes) β€” automated PASS/FAIL check on a sampled latent (NaN/Inf, near-blank, outlier saturation) with an optional fallback latent. Uses median/MAD for outlier detection specifically because an initial mean/std version failed a deliberate 20%-contamination test case during development β€” see Known Quirks for the full explanation.
  • All 6 new nodes' core logic is covered by real functional tests, and two genuine bugs were caught and fixed during that testing (the mean/std masking-effect issue above, and an A1111 parser bug that duplicated text across both positive/negative fields when no Negative prompt: marker was present) β€” both are the kind of bug that would have shipped silently without the tests catching them.

2026-08-06

  • Added 8 new nodes: 4 real DoRA/LyCORIS merge engines plus 4 workflow utility nodes.
    • LyCORIS Format Inspector πŸ”¬ β€” detects real LoRA/LoHa/LoKr format and DoRA marker presence from actual tensor key names, header-only (fast, no weight data loaded).
    • LoHa Loader (Custom) πŸŒ€ β€” real Hadamard-product merge engine.
    • LoKr Loader (Custom) 🧩 β€” real Kronecker-product merge engine, supporting both dense and factored (low-rank) forms.
    • DoRA Loader (Custom) 🎯 β€” real magnitude/direction-decomposition merge engine (not a scaled-LoRA approximation).
    • All three merge engines apply their computed delta via ComfyUI's own ModelPatcher.add_patches() API and were built specifically to avoid a documented ComfyUI core issue (#8683) where built-in LyCORIS auto-detection can silently mis-route LoHa/LoKr files through the plain-LoRA path. Conv2d/4D layer support is NOT yet implemented in any of the three β€” see Known Quirks.
    • Workflow Manifest Writer πŸ“‹ (Workflow Nodes) β€” JSON run-record alongside saved outputs.
    • Image Grid Compare πŸ†š (Image Nodes) β€” labeled comparison grid, distinct from Contact Sheet Maker's unlabeled thumbnail tiling.
    • Multi-LoRA Weight Sweep πŸ“Ά (Model Nodes) β€” first node in this pack to use ComfyUI's real OUTPUT_IS_LIST list-processing mechanism; outputs a strength sweep as a true list for automatic downstream iteration.
    • VRAM / Model Size Estimator πŸ“ (Model Nodes) β€” header-only VRAM footprint estimate for a checkpoint + up to 4 LoRAs, before queuing.
  • Corrected a factual error in this README's own description of Contact Sheet Maker (previously described as "labeled" β€” it is not; verified against its actual docstring while writing Image Grid Compare's differentiation note).
  • All 8 new nodes' core math/logic is covered by real functional tests β€” the three merge engines were verified against hand-computed reference values and, for DoRA specifically, against the defining mathematical property of the algorithm itself (post-merge weight row norms exactly equal the trained magnitude vector).

2026-08-04

  • Added 12 new nodes spread across 6 categories:
    • Model Nodes: ControlNet Preprocessor πŸ•ΉοΈ β€” canny/depth-lite/lineart extraction, filling the pack's biggest prior gap (a ControlNet Loader with nothing upstream to build its conditioning image).
    • Image Nodes: Mask Morphology 🩹 (grow/shrink/feather/invert a MASK), Resize to Multiple πŸ“ (pad/crop/stretch to a valid latent dimension), Text Overlay ✏️ (draws text onto an image β€” no prior text-rendering capability existed anywhere in the pack), 3D LUT Apply 🎞️ (loads and applies a .cube LUT via trilinear interpolation).
    • Latent Nodes: Latent Histogram πŸ“Š β€” per-channel distribution histogram + outlier-percentage stat, a distribution-shape diagnostic distinct from Latent Visualizer's point statistics.
    • Sampling Nodes: Seed Stepper 🌱 β€” persistent seed history with increment/random-no-repeat/cycle-list modes, complementing Batch Counter's simpler per-run increment.
    • Workflow Nodes: Prompt List Iterator πŸ“œ (steps through a file/folder of prompts, one per queue run), Try/Catch (Value Guard) πŸ›Ÿ (routes to a fallback when an upstream value shows a failure signal).
    • Web API Nodes: Discord Notify πŸ”” (post a message + optional image to a Discord webhook on completion), Folder Watcher πŸ‘οΈ (manifest-based "next unprocessed file" for simple queue-style batch processing).
  • Updated requirements.txt comment to include Discord Notify among the nodes needing requests.
  • All 12 new nodes are covered by real functional tests (not just syntax checks) β€” see each node's module docstring for the specific behaviors verified.

2026-07-30

  • Added 4 new Web API nodes: JSON Field Extractor πŸ”Ž, JSON Builder 🧱, Endpoint Poller ⏳, Response Saver πŸ’Ύ β€” rounding out the category into a full request β†’ poll β†’ parse β†’ save loop.
  • Recategorized the original 4 Web API nodes from CATEGORY = "WebAPI Nodes" to TensorVizion/Web API, matching every other category's naming.
  • Added requirements.txt declaring the requests dependency, previously undeclared anywhere in the pack.
  • Fixed a real syntax error in latent_mask_node.py (four lines each containing two unseparated statements) that made the file fail to import in every prior release.
  • Rewrote this README from scratch to reflect the pack's actual current contents β€” the previous version predated the Sampling, Video, and Web API categories entirely and had drifted on per-category counts elsewhere.

License

MIT β€” see LICENSE file.


OmniNodes by TensorVizion Β· github.com/TensorVizion/OmniNodes