⚗ Alchemica Face Blend (2-6 photos, per-trait guide)
Blending 2–6 photos trait by trait instead of averaging them
- clip
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- subject
- report
Blending faces in latent space gives you a ghost - a double exposure where two people's features overlap and neither is really there. Blending them in words gives you a person. That's what this node does: it reads each photo, blends the traits the way a child inherits them, and hands you a written description you can then prompt Krea 2 with.
Deep brown skin + fair skin → caramel. Brown eyes + blue eyes → amber with a blue outer ring. Square jaw + round jaw → softly squared. These are the examples in the pack's own notes because they're the ones that work.
How it works, step by step
- LOOK. Krea 2's text encoder (Qwen3-VL-4B) is a vision model, so the node sends each photo to it and gets back a sheet of traits - 17 of them for a person: heritage, face shape, eyes, nose, lips, jaw, cheekbones, eyebrows, hair, skin, marks, forehead, age, build. The face is read from a close crop found by an insightface detector if you have one installed; on a full-body photo the face is far too small to describe otherwise.
- SHARE. Code - not the model - decides the allocation. Your per-photo weights are normalised, so 2 and 1 means two thirds / one third, and the per-trait guide overrides the weights for individual traits.
- WRITE. The text encoder writes the final description from the blended sheet, plus your
ideafor pose, body, clothing and mood.
The colours aren't left to the language model, and that's deliberate. On the real photos the encoder read a brown skin (ITA −17°) as "warm brown" and the blend came out olive; so skin, eye and hair colours are computed in code from CIELAB, with skin measured as ITA° inside the detected face (between the eyes and the mouth, so framing doesn't change it). And because Krea 2 paints skin lighter than the words say, skin_compensation picks the word from a table measured on what a fine-tuned NVFP4 checkpoint actually paints - ±3° across seeds, checked against three seeds per target.
The inputs
Two photos are required; image_3 … image_6 are optional.
clip- Krea 2's text encoder, and the tooltip says it plainly: straight from the loader, without LoRAs.weight_1…weight_6- how much each photo pulls overall. Normalised, so raw values don't matter, only ratios. 0 = ignore that photo.trait_guide- the good part. One line per trait, in Italian or English:eyes = 2takes eyes whole from photo 2,jaw = 1:70 2:30makes the jaw 70/30 between them,skin, hair = 1pins both to photo 1. Traits you don't mention use the overall weights.idea- pose, body, clothes, mood. It never changes the face or hair. That separation is the whole reason this beats a blended latent.words- length of the description; 110–140 for a person's 17 traits.body_from_photos- also blend build and body shape; off means the body comes only from the idea.reread_photos- the photo readings are cached (in memory, and on disk underComfyUI/user/alchemica/schede_foto.json, so they survive a restart). Turn this on to re-read them, e.g. after swapping the text encoder.skin_compensation- keep it on. Off is for other checkpoints, where the measured table doesn't apply.
Outputs: subject (a STRING - the prompt) and report. Wire subject into the prompt side of your encoding chain; the pack's Text Encode and Prompt nodes take a text input for exactly this.
Honest expectations
This is text-level identity. There's no embedding injected, no reference conditioning, no face LoRA - which is also why it doesn't fight your LoRAs and works on a 2026 base, unlike the IP-Adapter/PuILID/InstantID stack that stopped at SDXL. What you get is a described new person, consistent across prompts and seeds because the description is fixed. What you don't get is photographic likeness to either parent. If you need that, you need ⚗ Face Match to score it or an edit model - different tool, different job.
Installing
# ComfyUI Manager: search "AlchemicaSampler"
cd ComfyUI/custom_nodes && git clone https://github.com/Nessuno76/ComfyUI-AlchemicaSampler
ComfyUI 0.36+ (it needs CLIP.generate), no pip dependencies. Restart the server. insightface is optional - install it and the face crop gets much better, skip it and the node falls back to reading the whole photo. On Windows, insightface wants a C++ compiler; if that sentence just made you sigh, the fallback exists for you.
Where people get burned
Feeding the encoder LoRAs. The tooltip asks for the plain encoder, and there's a reason: the vision reading and the LoRA-adapted text space don't have to agree.
A tiny face in a full-body shot. Crop tighter on the face before feeding it. The detector will find something, but "the subject has a face" is not a useful trait.
Expecting a different person each run. You won't get one: the trait sheet is cached and the allocation is computed, not sampled. A feature when you're building a character, confusing when you'd assumed randomness.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | Krea 2's text encoder, best straight from the loader (without LoRAs) | |
| image_1 | IMAGE | — | |
| image_2 | IMAGE | — | |
| weight_1 | FLOAT | 1.000–4 | How much photo 1 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| weight_2 | FLOAT | 1.000–4 | How much photo 2 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| weight_3 | FLOAT | 1.000–4 | How much photo 3 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| weight_4 | FLOAT | 1.000–4 | How much photo 4 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| weight_5 | FLOAT | 1.000–4 | How much photo 5 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| weight_6 | FLOAT | 1.000–4 | How much photo 6 pulls overall. Normalised (2 and 1 = two thirds and one third). 0 = ignore the photo |
| trait_guide | STRING | One line per trait, overrides the weights for that trait: occhi = 2 (eyes from photo 2) mascella = 1:70 2:30 pelle, capelli = 1 Traits: origine, viso, occhi, forma occhi, colore occhi, naso, labbra, mascella, zigomi, sopracciglia, capelli, colore capelli, pettinatura, pelle, segni, fronte, eta, corporatura, corpo | |
| idea | STRING | Pose, body, clothing, mood. It never changes the face and hair from the photos | |
| words | INT | 12050–220 | Length of the description (17 traits: 110-140) |
| body_from_photos | BOOLEAN | true | Also blend build and body shape from the photos. Off = the body comes only from the idea |
| reread_photos | BOOLEAN | false | Photos already read are remembered on disk (fast). On = read them again (e.g. after changing the text encoder) |
| skin_compensation | BOOLEAN | true | Krea 2 paints skin lighter than the words say. On = picks the word by a table MEASURED on a fine-tuned NVFP4 checkpoint (ITA of the painted skin), so the image matches the blend of the photos. Off = plain words (other checkpoints) |
| image_3opt | IMAGE | — | |
| image_4opt | IMAGE | — | |
| image_5opt | IMAGE | — | |
| image_6opt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| subject | STRING | — |
| report | STRING | — |