CMK Pipe Peek Refiner
Unpack the refiner stage without running it
- refiner_pipe
- model
- conditioning_pos
- conditioning_neg
- latent_image
- vae
- seed
- steps
- cfg
- sampler
- scheduler
- start_step
- end_step
The refiner stage in CMK runs on its own bundle - CMK_REFINER_PIPE, a completely separate type from the main CMK_PIPE. You cannot plug the main pipe into the refiner and you cannot read refiner values off the main pipe. This node is how you open the refiner bundle up.
Twelve outputs: model, conditioning_pos, conditioning_neg, latent_image, vae, seed, steps, cfg, sampler, scheduler, start_step, end_step.
That list is, almost exactly, the input set of a KSamplerAdvanced. Which is the point - this node exists so that a hand-built second pass can consume the CMK refiner's configured settings instead of you retyping them into a stock sampler node and hoping they stayed in sync.
The two outputs worth understanding
start_step and end_step are the ones you can't guess at. The refiner isn't configured in absolute steps; the prepare side thinks in a start percent, and this node does the conversion: start_step = steps × start_percent / 100, integer truncated, with end_step being the full step count. So a refiner set to 25 steps starting at 80% hands you start_step = 20, end_step = 25.
That conversion is the entire mechanism of a low-denoise second pass, and it's the thing people get wrong when they build one by hand. KSamplerAdvanced with add_noise disabled, starting at step 20 of 25, means the model only gets the last fifth of the schedule to clean up a slightly noisy latent - which is what "refine, don't re-imagine" actually looks like in numbers. Skip the add_noise disable, or start at step 0, and you've built a full re-generation with a different seed, which is why your "refined" image looks like a completely different picture.
steps is the refiner's total step count, seed the refiner seed, and cfg the refiner CFG - note these are the refiner's own settings, not the first pass's. In CMK they're separate on purpose: a refiner often wants a lower CFG and fewer steps than the primary sampler.
model, conditioning_pos, conditioning_neg, latent_image and vae are the raw payloads, all standard ComfyUI types, all wireable into stock nodes.
Reading it is free, running it isn't
This node does no sampling. It reads a dictionary and returns values - that's the whole implementation. So it's the safe way to inspect a refiner configuration: put a Reroute or a preview on latent_image, check start_step and end_step, confirm model is the refiner checkpoint and not your base model. A surprising number of "the refiner destroyed my image" reports are actually "the refiner was pointed at the same model as the first pass with a start step of zero."
It won't warn you about any of that. Missing keys return None, and the arithmetic assumes sane values in the bundle. Garbage in, plausibly-shaped garbage out.
Installing the pack
Manager → search CMK Flow → install the entry by CMKFlow → restart ComfyUI. Registry package name: cmk-flow.
Manual install, run from the ComfyUI folder that holds main.py:
git clone https://github.com/CMKFlow/cmk_nodes.git custom_nodes/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
Do not skip the installer. It finds the interpreter ComfyUI is actually running - Desktop installs can have several - installs requirements.txt into it, and verifies the mandatory imports, ending on CMK dependency check: OK. Because the pack imports everything in one go, an insightface build failure or a missing onnxruntime can take unrelated nodes down with it.
Updates:
git -C custom_nodes/cmk_nodes pull --ff-only
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
No weights are packaged. If you want to know which checkpoint, ControlNet, InstantID or detector files this pack's workflows expect, ask:
python3 custom_nodes/cmk_nodes/scripts/check_cmk_resources.py --models-root "/path/to/ComfyUI-shared"
Two settings the pack depends on: Vue Nodes / Nodes 2.0 must be enabled in your ComfyUI profile, and Execution → Live preview method should be auto for previews during sampler and refiner runs. This node is CMK/Developer/ - internal infrastructure, findable by search, absent from the Flow Browser catalogue.
When it's the wrong tool
If you just want to know what the refiner is set to, CMK's own 20 Refiner SDXL module and its log output already tell you. Reach for the peek when you're rebuilding the stage outside the module and need the real values on real sockets - otherwise you're adding wires to solve a question the UI could answer.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| refiner_pipe | CMK_REFINER_PIPE | — |
Outputs (12)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| conditioning_pos | CONDITIONING | — |
| conditioning_neg | CONDITIONING | — |
| latent_image | LATENT | — |
| vae | VAE | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| start_step | INT | — |
| end_step | INT | — |