ComfyUI Node

Klein Pose Batch

Press Queue once, get your sprite in thirty poses

By Spit8·Created 3 months ago·Updated 13 days ago· 9
Klein Pose Batch
  • model
  • clip
  • vae
  • image_batch
  • guide
  • images
  • images_with_guides
  • count
◄edit_prompts[]►
◄seed42►
◄steps4►
◄cfg1.0►
◄sampler_nameeuler►
◄megapixels1.00►
◄pose_weight2►
◄filename_prefixpose_transfer_flux_klein►

What this node is for

Taking one character sprite and getting thirty poses out of it used to mean thirty queue presses: swap the guide, queue, wait, swap again. CP_KleinPoseBatch deletes that loop. Upstream, CP_PoseTransferPrep hands it a batch of pose guides plus one edit prompt per guide; the node runs a complete Flux.2 Klein sample per item and returns everything stacked as one image batch.

Context: character consistency got rerouted in 2026. Rather than encoding a character and injecting it at generation time, you generate the character once and edit that image, so the model has a reference to look at while it works. Posing went the same way.

How it works

No bundled sampler, no hidden model. In its run loop the node looks up ComfyUI's own core nodes by name and executes them once per pose: KSamplerSelect, CLIPTextEncode, ConditioningZeroOut, VAEEncode, ReferenceLatent, EmptyFlux2LatentImage, Flux2Scheduler, RandomNoise, CFGGuider, SamplerCustomAdvanced, VAEDecode.

The interesting part is how identity and pose are held. Both your sprite and the guide skeleton get attached as ReferenceLatent conditionings. The sprite goes on once. The guide goes on pose_weight times - the node literally re-attaches the same reference conditioning in a loop, 1 to 4 passes, each one leaning the generation harder toward the sticks. That is the strength dial in a graph with no ControlNet: there's no controlnet_conditioning_scale to turn down, because the pose isn't structure, it's a reference. So the lock is real but soft - the model can, and occasionally will, ignore the sticks.

The negative side is ConditioningZeroOut of your positive prompt, i.e. no meaningful negative prompt. That's why CFG 1 is the correct setting for distilled Klein rather than a stylistic choice.

The inputs you actually touch

model, clip and vae come from your Klein loaders. image_batch and guide come from Prep and must be the same length - the node raises immediately if they aren't.

edit_prompts is forceInput, so you wire it - it's the JSON list of strings Prep emits, one sentence per pose. A list shorter than the batch repeats its last prompt for the remaining frames; empty or malformed JSON errors with a message that names itself.

megapixels (default 1.0) scales sprite and guide to the same total pixel budget with Lanczos, so output resolution follows the sprite's aspect ratio at roughly a megapixel rather than a fixed 1024×1024 - and the pair costs about the same VRAM regardless of source size.

pose_weight (default 2) is the dial above. 1 is gentle, 4 means the pose wins. seed, steps, cfg, sampler_name and filename_prefix are the usual sampler furniture - 4 steps, euler, CFG 1 is what distilled Klein wants.

Outputs

images is every frame in one IMAGE batch - into SaveImage, a video node, or another pass. images_with_guides is the same frames with the stick figure composited on top: the quickest way to answer "did it follow the pose or just make something character-shaped?" count is the frame count.

It's an output node, so each frame is written to output/ and pushed over the websocket as it finishes: the panel fills pose by pose, and you can kill a 60-frame run at frame four if the style is off.

Install

ComfyUI Manager: search _ComfyUI_CharacterPose. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Spit8/_ComfyUI_CharacterPose.git
python -m pip install -r _ComfyUI_CharacterPose/requirements.txt

Then the three files the README names: flux-2-klein-4b-fp8.safetensors into models/diffusion_models/, qwen_3_4b.safetensors into models/text_encoders/, flux2-vae.safetensors into models/vae/. Restart; nodes land under CharacterPose.

Where people get burned

Missing core nodes. EmptyFlux2LatentImage, Flux2Scheduler and ReferenceLatent are resolved from ComfyUI's registry, so an old install fails with a RuntimeError telling you to update core. This pack wraps the Klein graph; it doesn't ship it.

"edit_prompts is empty." The default is [] - wire Prep's output; the node can't invent prompts.

Batch mismatch. image_batch and guide must be the same length - usually a Prep filter changed after something downstream.

Identity drift. Klein's known editing failure, worse when your prompt describes the character: the sprite latent keeps the tunic and beard, so let the prompt describe the action.

pose_weight at 4 is not free. Pose wins, identity loses pixels. Useful band is 1–2.

Klein feeling slow. A hand-rolled Klein graph can run several times slower than the official template for no visible reason - try the pack's workflows/pose_transfer_flux_klein.json before tuning anything. Doubling steps and moving CFG off 1.0 buys back some anatomy criticism at twice the wall time.

Same-view bias, from the README: a three-quarter sprite doesn't become a true front view. You'll get thirty frames of a character stubbornly facing the way the sprite faces.

CategoryCharacterPose

Inputs (13)

NameTypeDefaultDescription
modelMODEL—
clipCLIP—
vaeVAE—
image_batchIMAGE—
guideIMAGE—
edit_promptsSTRING[]—
seedINT420–18446744073709550000—
stepsINT41–50—
cfgFLOAT1.00–20—
sampler_nameCOMBOeuler44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
megapixelsFLOAT1.000.1–4—
pose_weightINT21–4—
filename_prefixSTRINGpose_transfer_flux_klein—

Outputs (3)

NameTypeDescription
imagesIMAGE—
images_with_guidesIMAGE—
countINT—