2025-08-13 18:33:05 -07:00
from __future__ import annotations
from comfy_api . latest import ComfyExtension , io
import comfy . context_windows
import nodes
class ContextWindowsManualNode ( io . ComfyNode ) :
@classmethod
def define_schema ( cls ) - > io . Schema :
return io . Schema (
node_id = " ContextWindowsManual " ,
display_name = " Context Windows (Manual) " ,
category = " context " ,
description = " Manually set context windows. " ,
inputs = [
io . Model . Input ( " model " , tooltip = " The model to apply context windows to during sampling. " ) ,
feat: mark 429 widgets as advanced for collapsible UI (#12197)
* feat: mark 429 widgets as advanced for collapsible UI
Mark widgets as advanced across core, comfy_extras, and comfy_api_nodes
to support the new collapsible advanced inputs section in the frontend.
Changes:
- 267 advanced markers in comfy_extras/
- 162 advanced markers in comfy_api_nodes/
- All files pass python3 -m py_compile verification
Widgets marked advanced (hidden by default):
- Scheduler internals: sigma_max, sigma_min, rho, mu, beta, alpha
- Sampler internals: eta, s_noise, order, rtol, atol, h_init, pcoeff, etc.
- Memory optimization: tile_size, overlap, temporal_size, temporal_overlap
- Pipeline controls: add_noise, start_at_step, end_at_step
- Timing controls: start_percent, end_percent
- Layer selection: stop_at_clip_layer, layers, block_number
- Video encoding: codec, crf, format
- Device/dtype: device, noise_device, dtype, weight_dtype
Widgets kept basic (always visible):
- Core params: strength, steps, cfg, denoise, seed, width, height
- Model selectors: ckpt_name, lora_name, vae_name, sampler_name
- Common controls: upscale_method, crop, batch_size, fps, opacity
Related: frontend PR #11939
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: remove advanced=True from DynamicCombo.Input (unsupported)
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: address review - un-mark model merge, video, image, and training node widgets as advanced
Per comfyanonymous review:
- Model merge arguments should not be advanced (all 14 model-specific merge classes)
- SaveAnimatedWEBP lossless/quality/method should not be advanced
- SaveWEBM/SaveVideo codec/crf/format should not be advanced
- TrainLoraNode options should not be advanced (7 inputs)
Amp-Thread-ID: https://ampcode.com/threads/T-019c322b-a3a8-71b7-9962-d44573ca6352
* fix: un-mark batch_size and webcam width/height as advanced (should stay basic)
Amp-Thread-ID: https://ampcode.com/threads/T-019c3236-1417-74aa-82a3-bcb365fbe9d1
---------
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
2026-02-19 19:20:02 -08:00
io . Int . Input ( " context_length " , min = 1 , default = 16 , tooltip = " The length of the context window. " , advanced = True ) ,
io . Int . Input ( " context_overlap " , min = 0 , default = 4 , tooltip = " The overlap of the context window. " , advanced = True ) ,
2025-08-13 18:33:05 -07:00
io . Combo . Input ( " context_schedule " , options = [
comfy . context_windows . ContextSchedules . STATIC_STANDARD ,
comfy . context_windows . ContextSchedules . UNIFORM_STANDARD ,
comfy . context_windows . ContextSchedules . UNIFORM_LOOPED ,
comfy . context_windows . ContextSchedules . BATCHED ,
] , tooltip = " The stride of the context window. " ) ,
feat: mark 429 widgets as advanced for collapsible UI (#12197)
* feat: mark 429 widgets as advanced for collapsible UI
Mark widgets as advanced across core, comfy_extras, and comfy_api_nodes
to support the new collapsible advanced inputs section in the frontend.
Changes:
- 267 advanced markers in comfy_extras/
- 162 advanced markers in comfy_api_nodes/
- All files pass python3 -m py_compile verification
Widgets marked advanced (hidden by default):
- Scheduler internals: sigma_max, sigma_min, rho, mu, beta, alpha
- Sampler internals: eta, s_noise, order, rtol, atol, h_init, pcoeff, etc.
- Memory optimization: tile_size, overlap, temporal_size, temporal_overlap
- Pipeline controls: add_noise, start_at_step, end_at_step
- Timing controls: start_percent, end_percent
- Layer selection: stop_at_clip_layer, layers, block_number
- Video encoding: codec, crf, format
- Device/dtype: device, noise_device, dtype, weight_dtype
Widgets kept basic (always visible):
- Core params: strength, steps, cfg, denoise, seed, width, height
- Model selectors: ckpt_name, lora_name, vae_name, sampler_name
- Common controls: upscale_method, crop, batch_size, fps, opacity
Related: frontend PR #11939
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: remove advanced=True from DynamicCombo.Input (unsupported)
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: address review - un-mark model merge, video, image, and training node widgets as advanced
Per comfyanonymous review:
- Model merge arguments should not be advanced (all 14 model-specific merge classes)
- SaveAnimatedWEBP lossless/quality/method should not be advanced
- SaveWEBM/SaveVideo codec/crf/format should not be advanced
- TrainLoraNode options should not be advanced (7 inputs)
Amp-Thread-ID: https://ampcode.com/threads/T-019c322b-a3a8-71b7-9962-d44573ca6352
* fix: un-mark batch_size and webcam width/height as advanced (should stay basic)
Amp-Thread-ID: https://ampcode.com/threads/T-019c3236-1417-74aa-82a3-bcb365fbe9d1
---------
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
2026-02-19 19:20:02 -08:00
io . Int . Input ( " context_stride " , min = 1 , default = 1 , tooltip = " The stride of the context window; only applicable to uniform schedules. " , advanced = True ) ,
2025-08-13 18:33:05 -07:00
io . Boolean . Input ( " closed_loop " , default = False , tooltip = " Whether to close the context window loop; only applicable to looped schedules. " ) ,
io . Combo . Input ( " fuse_method " , options = comfy . context_windows . ContextFuseMethods . LIST_STATIC , default = comfy . context_windows . ContextFuseMethods . PYRAMID , tooltip = " The method to use to fuse the context windows. " ) ,
io . Int . Input ( " dim " , min = 0 , max = 5 , default = 0 , tooltip = " The dimension to apply the context windows to. " ) ,
2025-12-05 22:42:46 +02:00
io . Boolean . Input ( " freenoise " , default = False , tooltip = " Whether to apply FreeNoise noise shuffling, improves window blending. " ) ,
#io.String.Input("cond_retain_index_list", default="", tooltip="List of latent indices to retain in the conditioning tensors for each window, for example setting this to '0' will use the initial start image for each window."),
#io.Boolean.Input("split_conds_to_windows", default=False, tooltip="Whether to split multiple conditionings (created by ConditionCombine) to each window based on region index."),
2025-08-13 18:33:05 -07:00
] ,
outputs = [
io . Model . Output ( tooltip = " The model with context windows applied during sampling. " ) ,
] ,
is_experimental = True ,
)
@classmethod
2025-12-05 22:42:46 +02:00
def execute ( cls , model : io . Model . Type , context_length : int , context_overlap : int , context_schedule : str , context_stride : int , closed_loop : bool , fuse_method : str , dim : int , freenoise : bool ,
cond_retain_index_list : list [ int ] = [ ] , split_conds_to_windows : bool = False ) - > io . Model :
2025-08-13 18:33:05 -07:00
model = model . clone ( )
model . model_options [ " context_handler " ] = comfy . context_windows . IndexListContextHandler (
context_schedule = comfy . context_windows . get_matching_context_schedule ( context_schedule ) ,
fuse_method = comfy . context_windows . get_matching_fuse_method ( fuse_method ) ,
context_length = context_length ,
context_overlap = context_overlap ,
context_stride = context_stride ,
closed_loop = closed_loop ,
2025-12-05 22:42:46 +02:00
dim = dim ,
freenoise = freenoise ,
cond_retain_index_list = cond_retain_index_list ,
split_conds_to_windows = split_conds_to_windows
)
2025-08-13 18:33:05 -07:00
# make memory usage calculation only take into account the context window latents
comfy . context_windows . create_prepare_sampling_wrapper ( model )
2025-12-05 22:42:46 +02:00
if freenoise : # no other use for this wrapper at this time
comfy . context_windows . create_sampler_sample_wrapper ( model )
2025-08-13 18:33:05 -07:00
return io . NodeOutput ( model )
class WanContextWindowsManualNode ( ContextWindowsManualNode ) :
@classmethod
def define_schema ( cls ) - > io . Schema :
schema = super ( ) . define_schema ( )
schema . node_id = " WanContextWindowsManual "
schema . display_name = " WAN Context Windows (Manual) "
schema . description = " Manually set context windows for WAN-like models (dim=2). "
schema . inputs = [
io . Model . Input ( " model " , tooltip = " The model to apply context windows to during sampling. " ) ,
feat: mark 429 widgets as advanced for collapsible UI (#12197)
* feat: mark 429 widgets as advanced for collapsible UI
Mark widgets as advanced across core, comfy_extras, and comfy_api_nodes
to support the new collapsible advanced inputs section in the frontend.
Changes:
- 267 advanced markers in comfy_extras/
- 162 advanced markers in comfy_api_nodes/
- All files pass python3 -m py_compile verification
Widgets marked advanced (hidden by default):
- Scheduler internals: sigma_max, sigma_min, rho, mu, beta, alpha
- Sampler internals: eta, s_noise, order, rtol, atol, h_init, pcoeff, etc.
- Memory optimization: tile_size, overlap, temporal_size, temporal_overlap
- Pipeline controls: add_noise, start_at_step, end_at_step
- Timing controls: start_percent, end_percent
- Layer selection: stop_at_clip_layer, layers, block_number
- Video encoding: codec, crf, format
- Device/dtype: device, noise_device, dtype, weight_dtype
Widgets kept basic (always visible):
- Core params: strength, steps, cfg, denoise, seed, width, height
- Model selectors: ckpt_name, lora_name, vae_name, sampler_name
- Common controls: upscale_method, crop, batch_size, fps, opacity
Related: frontend PR #11939
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: remove advanced=True from DynamicCombo.Input (unsupported)
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: address review - un-mark model merge, video, image, and training node widgets as advanced
Per comfyanonymous review:
- Model merge arguments should not be advanced (all 14 model-specific merge classes)
- SaveAnimatedWEBP lossless/quality/method should not be advanced
- SaveWEBM/SaveVideo codec/crf/format should not be advanced
- TrainLoraNode options should not be advanced (7 inputs)
Amp-Thread-ID: https://ampcode.com/threads/T-019c322b-a3a8-71b7-9962-d44573ca6352
* fix: un-mark batch_size and webcam width/height as advanced (should stay basic)
Amp-Thread-ID: https://ampcode.com/threads/T-019c3236-1417-74aa-82a3-bcb365fbe9d1
---------
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
2026-02-19 19:20:02 -08:00
io . Int . Input ( " context_length " , min = 1 , max = nodes . MAX_RESOLUTION , step = 4 , default = 81 , tooltip = " The length of the context window. " , advanced = True ) ,
io . Int . Input ( " context_overlap " , min = 0 , default = 30 , tooltip = " The overlap of the context window. " , advanced = True ) ,
2025-08-13 18:33:05 -07:00
io . Combo . Input ( " context_schedule " , options = [
comfy . context_windows . ContextSchedules . STATIC_STANDARD ,
comfy . context_windows . ContextSchedules . UNIFORM_STANDARD ,
comfy . context_windows . ContextSchedules . UNIFORM_LOOPED ,
comfy . context_windows . ContextSchedules . BATCHED ,
] , tooltip = " The stride of the context window. " ) ,
feat: mark 429 widgets as advanced for collapsible UI (#12197)
* feat: mark 429 widgets as advanced for collapsible UI
Mark widgets as advanced across core, comfy_extras, and comfy_api_nodes
to support the new collapsible advanced inputs section in the frontend.
Changes:
- 267 advanced markers in comfy_extras/
- 162 advanced markers in comfy_api_nodes/
- All files pass python3 -m py_compile verification
Widgets marked advanced (hidden by default):
- Scheduler internals: sigma_max, sigma_min, rho, mu, beta, alpha
- Sampler internals: eta, s_noise, order, rtol, atol, h_init, pcoeff, etc.
- Memory optimization: tile_size, overlap, temporal_size, temporal_overlap
- Pipeline controls: add_noise, start_at_step, end_at_step
- Timing controls: start_percent, end_percent
- Layer selection: stop_at_clip_layer, layers, block_number
- Video encoding: codec, crf, format
- Device/dtype: device, noise_device, dtype, weight_dtype
Widgets kept basic (always visible):
- Core params: strength, steps, cfg, denoise, seed, width, height
- Model selectors: ckpt_name, lora_name, vae_name, sampler_name
- Common controls: upscale_method, crop, batch_size, fps, opacity
Related: frontend PR #11939
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: remove advanced=True from DynamicCombo.Input (unsupported)
Amp-Thread-ID: https://ampcode.com/threads/T-019c1734-6b61-702e-b333-f02c399963fc
* fix: address review - un-mark model merge, video, image, and training node widgets as advanced
Per comfyanonymous review:
- Model merge arguments should not be advanced (all 14 model-specific merge classes)
- SaveAnimatedWEBP lossless/quality/method should not be advanced
- SaveWEBM/SaveVideo codec/crf/format should not be advanced
- TrainLoraNode options should not be advanced (7 inputs)
Amp-Thread-ID: https://ampcode.com/threads/T-019c322b-a3a8-71b7-9962-d44573ca6352
* fix: un-mark batch_size and webcam width/height as advanced (should stay basic)
Amp-Thread-ID: https://ampcode.com/threads/T-019c3236-1417-74aa-82a3-bcb365fbe9d1
---------
Co-authored-by: Jedrzej Kosinski <kosinkadink1@gmail.com>
2026-02-19 19:20:02 -08:00
io . Int . Input ( " context_stride " , min = 1 , default = 1 , tooltip = " The stride of the context window; only applicable to uniform schedules. " , advanced = True ) ,
2025-08-13 18:33:05 -07:00
io . Boolean . Input ( " closed_loop " , default = False , tooltip = " Whether to close the context window loop; only applicable to looped schedules. " ) ,
io . Combo . Input ( " fuse_method " , options = comfy . context_windows . ContextFuseMethods . LIST_STATIC , default = comfy . context_windows . ContextFuseMethods . PYRAMID , tooltip = " The method to use to fuse the context windows. " ) ,
2025-12-05 22:42:46 +02:00
io . Boolean . Input ( " freenoise " , default = False , tooltip = " Whether to apply FreeNoise noise shuffling, improves window blending. " ) ,
#io.String.Input("cond_retain_index_list", default="", tooltip="List of latent indices to retain in the conditioning tensors for each window, for example setting this to '0' will use the initial start image for each window."),
#io.Boolean.Input("split_conds_to_windows", default=False, tooltip="Whether to split multiple conditionings (created by ConditionCombine) to each window based on region index."),
2025-08-13 18:33:05 -07:00
]
return schema
@classmethod
2025-12-05 22:42:46 +02:00
def execute ( cls , model : io . Model . Type , context_length : int , context_overlap : int , context_schedule : str , context_stride : int , closed_loop : bool , fuse_method : str , freenoise : bool ,
cond_retain_index_list : list [ int ] = [ ] , split_conds_to_windows : bool = False ) - > io . Model :
2025-08-13 18:33:05 -07:00
context_length = max ( ( ( context_length - 1 ) / / 4 ) + 1 , 1 ) # at least length 1
context_overlap = max ( ( ( context_overlap - 1 ) / / 4 ) + 1 , 0 ) # at least overlap 0
2025-12-05 22:42:46 +02:00
return super ( ) . execute ( model , context_length , context_overlap , context_schedule , context_stride , closed_loop , fuse_method , dim = 2 , freenoise = freenoise , cond_retain_index_list = cond_retain_index_list , split_conds_to_windows = split_conds_to_windows )
2025-08-13 18:33:05 -07:00
class ContextWindowsExtension ( ComfyExtension ) :
async def get_node_list ( self ) - > list [ type [ io . ComfyNode ] ] :
return [
ContextWindowsManualNode ,
WanContextWindowsManualNode ,
]
def comfy_entrypoint ( ) :
return ContextWindowsExtension ( )