Nodes/CMK Flow/CMK Pipe Peek KSampler
ComfyUI Node

CMK Pipe Peek KSampler

Plug a Real KSampler Into a CMK Pipe

By CMKFlow·Created 3 months ago·Updated 4 days ago· 6
CMK Pipe Peek KSampler
  • pipe
  • model_patched
  • conditioning_pos
  • conditioning_neg
  • latent_image
  • seed
  • steps
  • cfg
  • sampler
  • scheduler

This is the most practically useful node in the whole Peek family, and it's worth understanding why.

CMK Flow's sampler module takes a CMK_PIPE and does its own sampling internally. That's great right up until you want to do something the module doesn't do - swap in a custom sampler node, insert a LatentUpscale mid-schedule, or feed the whole thing into some third-party node expecting plain ComfyUI types. Now you're stuck holding a dict.

CMK Pipe Peek KSampler opens the pipe and hands you the raw inputs a stock KSampler wants.

Inputs and outputs

One required input: pipe (CMK_PIPE). No widgets, nothing to configure.

Nine outputs, in order: model_patched (MODEL), conditioning_pos (CONDITIONING), conditioning_neg (CONDITIONING), latent_image (LATENT), seed (INT), steps (INT), cfg (FLOAT), sampler, scheduler.

The sampler and scheduler outputs use ComfyUI's own enum lists - all 44 samplers from comfy.samplers.KSampler.SAMPLERS and the 9 schedulers, so you get the same dropdown someone would see on a core KSampler. They're pass-throughs, not new options.

Wire all nine into a core KSampler and you've effectively replaced the CMK sampler module with stock. That's the point.

The fallbacks, which matter

The node reads with or-style fallbacks, and knowing them saves real confusion:

  • Model: pipe["model_patched"] if present, else pipe["model"]. The model_patched key is what you get after ControlNet patching, so a pipe that's been through a ControlNet module gives you the patched model.
  • Latent: pipe["latent_1st_pass"] if present, else pipe["latent_image"]. In a refiner-capable flow, latent_1st_pass is the first pass's latent, which is what a sampler slot usually wants.
  • Steps: pipe["steps_1st_pass"] if present, else pipe["steps"].

So the value you get depends on how far down the flow the pipe has travelled. If you tap the pipe early, you get the planned latent; tap it after the first pass and you get the actual one. That's not a bug, it's a peek into whatever stage you attached it to - and it's the reason the same node placed at two points in a workflow reports different numbers.

Validation

Before returning anything, it checks four things and refuses to continue if any is None: model_patched/model, conditioning_pos, conditioning_neg, and latent_image. The error names each missing one: "CMK Pipe Peek KSampler: missing sampler context: conditioning_neg, latent_image".

That's a better failure mode than the alternative - because if it returned Nones, you'd get a type error four nodes downstream with no indication which input was empty.

IS_CHANGED returns False unconditionally, so the peek never dirties the graph on its own. Reading a pipe doesn't invalidate your caches.

When to use it, honestly

  • You want a third-party sampler. Turbo samplers, custom schedulers, experimental solvers - anything living in someone else's pack - take plain MODEL/CONDITIONING/LATENT. This is the bridge.
  • You're debugging a CMK flow. Nine taps is a surprisingly fast way to see whether the pipeline's numbers are what you expected at a given point.
  • You're grafting CMK's front half onto someone else's back half. Create Image's prompting, resolution handling and LoRA bundling are genuinely nice; Peek KSampler lets you keep them and leave the sampling to whatever you prefer.

What it's not: a way to override the CMK sampler's parameters. It reads; it doesn't write. For writing back, the pack has separate Set nodes.

Install

Part of CMKFlow/cmk_nodes. ComfyUI Manager → search CMK Flow → install the CMKFlow entry → restart. Manual, ComfyUI shut down first:

git clone https://github.com/CMKFlow/cmk_nodes.git custom_nodes/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py

You want CMK dependency check: OK. No models needed for this node; the pack's heavy dependencies (ultralytics, insightface, segment-anything, onnxruntime, nudenet, opencv-python) are for other parts of it.

Traps

The sampler output is an enum string, not a sampler object. That's what core KSampler wants, so it works out - but it means you can't safely convert it into a signature expecting a callable.

It's a Developer-category node (CMK/Developer/Pipe/Peek), so it's not in the beginner's browsing path. If you found this page because a workflow threw a missing-node error, the answer is almost always that the install script never ran - restart isn't enough on its own, the install_cmk_requirements.py step is mandatory for manual installs.

CategoryCMK/Developer/Legacy Pipe

Inputs (1)

NameTypeDefaultDescription
pipeCMK_PIPE—

Outputs (9)

NameTypeDescription
model_patchedMODEL—
conditioning_posCONDITIONING—
conditioning_negCONDITIONING—
latent_imageLATENT—
seedINT—
stepsINT—
cfgFLOAT—
samplereuler,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—
schedulersimple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal—