CMK Pipe Peek KSampler
Plug a Real KSampler Into a CMK Pipe
- 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, elsepipe["model"]. Themodel_patchedkey 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, elsepipe["latent_image"]. In a refiner-capable flow,latent_1st_passis the first pass's latent, which is what a sampler slot usually wants. - Steps:
pipe["steps_1st_pass"]if present, elsepipe["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.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| pipe | CMK_PIPE | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| model_patched | MODEL | — |
| conditioning_pos | CONDITIONING | — |
| conditioning_neg | CONDITIONING | — |
| latent_image | LATENT | — |
| 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 | — |