CWB Merge Embeddings (2 Models)
Merge two embeddings into one vector file
- cwb_config
- output_filename
- documentation
- cwb_report
Embeddings - the small textual-inversion vector files - don't get merged much, and when they do, most people just average the files blindly. This is the CWB version, which means the blend adapts per token instead of being a flat mean. It's niche, but if you've ever wanted the concept understanding of two embeddings in one file, this is the node.
How it works
Model A is the anchor (metadata and preservation reference); Model B is the second equal-prior contributor. For each token vector, CWB computes a consensus, measures each embedding's similarity to it, and weights contributions by that similarity. Embeddings are a special case in the CWB family for a real reason: their token rows don't have a guaranteed semantic order, so the merge uses the longest compatible first dimension as its alignment reference, and the preset defaults to index alignment (balanced_idx_mean) with a similarity-alignment alternative (balanced_sim_mean) available if you believe the two files' tokens don't line up by position.
The output is an embedding file written to models/embeddings. You load it the way you load any embedding - reference embedding:your_filename in a prompt (or wire it through an embedding-aware text encoder). Missing or shape-incompatible tokens are handled by mismatch_mode: skip preserves the anchor, zeros inserts a zero contribution, error aborts.
Inputs that matter
- execution_mode -
MERGEwrites the file;DOCUMENTATION ONLYreturns the CWB reference without loading. - model_a / model_b - the two embeddings.
- cwb_preset (default
balanced_idx_mean) - the embedding preset registry.balanced_sim_meanandrobust_sim_mednswitch to cosine-similarity alignment for files whose tokens may be in different orders; the_mednvariants use median consensus. - output_filename (default
cwb_merged_2_embedding) - written tomodels/embeddings. - save_dtype / override_dtype - dtype for generated tensors.
- exclude_patterns / discard_patterns / glob_patterns - regex (or glob) lists.
- lazy_load (default on), force_clear_cache (default on), process_device - the usual.
Outputs
output_filename (the written file), documentation (the CWB reference), and cwb_report (per-token merge detail).
Why you'd reach for it
Two embeddings trained on the same concept by different people, and you want the combined understanding. Or you've been using two related embeddings (say, a broad style and a narrow refinement) and want one file to reference. It's a batch node - merge, then test by prompting with embedding: and eyeballing.
Install
Part of Model Utility Toolkit (silveroxides/ComfyUI-ModelUtils). ComfyUI Manager → search "Model Utility Toolkit", or:
cd ComfyUI/custom_nodes
git clone https://github.com/silveroxides/ComfyUI-ModelUtils
Restart ComfyUI. Real dependency: unifiedefficientloader (UEL). Keep ComfyUI current - newer extension API, experimental CWB nodes.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| execution_mode | COMBO | MERGE writes a new safetensors file. DOCUMENTATION ONLY returns the CWB reference without loading or merging inputs. | |
| model_a | COMBO | Primary contributor and preservation anchor. Supplies output metadata and anchors shared tensor names and shapes. | |
| model_b | COMBO | Second equal-prior contributor. CWB derives its effective per-vector influence from consensus similarity. | |
| cwb_preset | COMBO | balanced_idx_mean | Use-case preset. Name suffixes expose alignment, consensus, norm rescaling, DSC, soft comfort bandpass, and prefix preservation. A connected CWB Config overrides it completely. |
| mismatch_mode | COMBO | skip | For missing or incompatible anchored inputs: skip preserves the anchor, zeros inserts a zero contribution where possible, and error aborts. A lone secondary-only tensor is copied unchanged. |
| output_filename | STRING | cwb_merged_2_embedding | Filename without extension. The result is atomically written to this model category under ComfyUI's models directory. |
| save_dtype | COMBO | Requested dtype for generated floating tensors. Participating FP32 inputs keep a result FP32 unless Override Dtype is enabled. | |
| process_device | COMBO | Device used for per-layer FP32 CWB arithmetic. A CUDA out-of-memory error retries only the affected layer on CPU. | |
| exclude_patterns | STRING | One pattern per line. Matching layers are preserved from the anchor instead of merged. Uses regex unless Glob Patterns is enabled. | |
| discard_patterns | STRING | One pattern per line. Matching tensors or logical LoRA groups are omitted from the output. Uses regex unless Glob Patterns is enabled. | |
| glob_patterns | BOOLEAN | false | Interpret exclude and discard entries as shell-style glob patterns instead of regular expressions. |
| lazy_load | BOOLEAN | true | Use UEL low-memory loading so tensors are read and released per work unit instead of retaining the complete inputs in RAM. |
| force_clear_cache | BOOLEAN | true | Run Python garbage collection and clear the CUDA allocator cache before each layer. Reduces retained memory but can substantially slow merging. |
| override_dtype | BOOLEAN | false | Force generated tensors to save_dtype; guarded tensors and enabled 1D direct diffs are exempt. |
| cwb_configopt | CWB_CONFIG | Optional settings from CWB Custom Configuration. When connected, it completely overrides the selected preset. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| output_filename | * | — |
| documentation | STRING | — |
| cwb_report | STRING | — |