Text-Free Deterministic Image Conditioning for Stable Diffusion
CLIP encodes a vocabulary of ~1024 concepts once, offline, into a static anchor library. At runtime, a seed tuple is hashed and fed into coherent noise to produce weights over this library. The conditioning vector is a weighted sum of anchors, projected onto the unit sphere.
Top 10 anchor weights (softmax-normalized). Move sliders to see smooth transitions.
A tiny neural network (~50k parameters) learns to map 3D coordinates directly to CLIP embedding vectors. Trained offline on CLIP-encoded vocabulary, the MLP becomes the entire algorithm. At inference, the text encoder is gone.
3D coordinate mapped to MLP input. Dot shows current position in the learned latent space.
Conditioning vectors that have never been text and never will be. A seed is hashed and Box-Muller transformed into D normal samples, then L2-normalized onto the unit hypersphere. In guided mode, PCA projection keeps samples near the CLIP manifold.
Pure = full sphere. Guided = near manifold (green region). Star = region anchor.
The most radical variant: no text encoder at any stage. The diffusion model probes random conditioning vectors, measures which produce coherent images, refines them via gradient ascent, and clusters the results into a diverse anchor library. The model discovers its own semantic basis.
Random vectors scored by coherence. Brighter = higher score. Top candidates selected.
The foundations shared by all four ZeroCLIP variants.
A 4-tuple of integers: (concept_id, style_id, mood_salt, world_seed). Packed into 16 bytes. The entire identity of a conditioning vector fits in less space than a single pixel.
concept_id and style_id are u16 (0–65535). mood_salt is u16. world_seed is u64.
ComfyUI expects [(tensor[1, 77, D], dict)]. The conditioning vector [D] is repeat-padded across 77 token positions. For SDXL, the dict carries pooled_output.
D=768 for SD1.x, D=1024 for SD2.x, D=2048 for SDXL sequence embeddings.
FNV-1a is a pure function: same bytes in, same hash out, always. No Math.random(), no Date.now(), no floating-point order dependence. The entire pipeline is a composition of pure functions.
Same seed = byte-identical conditioning = identical image, on any machine, in any session, forever.
Enter seed values and see the packed bytes and FNV-1a hash output.
20 nodes across 5 categories. Drop into ComfyUI/custom_nodes/ZeroClip-nodes/ and restart. Zero pip dependencies.
| Node | Variant | Inputs | Output | Purpose |
|---|---|---|---|---|
| ZeroClip Seed Pack | Shared | concept, style, mood, world | ZEROCLIP_SEED | Pack 4-tuple seed |
| ZeroClip Seed From Random | Shared | seed (INT) | ZEROCLIP_SEED | Derive 4-tuple from single int |
| ZeroClip Empty Conditioning | Shared | dimension, sdxl | CONDITIONING | Zero vector for negative input |
| ZeroClip Conditioning Blend | Shared | cond_a, cond_b, weight | CONDITIONING | Weighted interpolation |
| ZeroClip Conditioning Info | Shared | conditioning | STRING | Debug: shape, norm, stats |
| ZeroClip-A Load Anchors | A | anchors_file | ANCHORS | Load .npy anchor library |
| ZeroClip-A Conditioning | A | anchors, seed | CONDITIONING | Anchor weighted sum |
| ZeroClip-A Conditioning (SDXL) | A | anchors_seq, anchors_pooled, seed | CONDITIONING | SDXL dual-anchor |
| ZeroClip-A Batch | A | anchors, concept range, batch | CONDITIONING | Sweep concept_id |
| ZeroClip-B Load MLP | B | model_file | MODEL | Load .pt checkpoint |
| ZeroClip-B Conditioning | B | model, seed | CONDITIONING | MLP forward pass |
| ZeroClip-B Conditioning (SDXL) | B | model_seq, model_pooled, seed | CONDITIONING | SDXL dual-MLP |
| ZeroClip-C Load Projection | C | projection_file | PROJECTION | Load .npz PCA matrix |
| ZeroClip-C Conditioning | C | seed, mode, dim, (projection) | CONDITIONING | Entropy sampling |
| ZeroClip-C Coherent Entropy | C | seed, region, blend, mode, dim | CONDITIONING | Regional coherence blend |
| ZeroClip-C Conditioning (SDXL) | C | seed, mode, dims, (projections) | CONDITIONING | SDXL entropy |
| ZeroClip-D Load Anchors | D | anchors_file | ANCHORS | Load bootstrap .npy |
| ZeroClip-D Conditioning | D | anchors, seed | CONDITIONING | Bootstrap anchor sum |
| ZeroClip-D Conditioning (SDXL) | D | anchors_seq, anchors_pooled, seed | CONDITIONING | SDXL bootstrap |
| ZeroClip-D Batch | D | anchors, concept range, batch | CONDITIONING | Sweep concept_id |
Copy ZeroClip-nodes/ into ComfyUI/custom_nodes/. Restart ComfyUI. 20 nodes appear under the ZeroClip category. No pip install needed.
Run the build scripts for your chosen variant. Place output files in ComfyUI/models/zeroclip/. Variant C pure mode needs no build at all.
Connect Seed Pack or Seed From Random to a Conditioner node. Wire the CONDITIONING output to KSampler's positive input. Use Empty Conditioning for negative.