feat(video): add minimax h3 joint video and audio model

First natively modular model: the pipeline is driven directly through
ModularPipeline, with components fetched per workflow (fl2va covers
text and first/last-frame conditioning).

- per-generation overrides snap the canvas to /32, align frames to
  the 17n+5 grid and duration window, and keep the bespoke scheduler
  pair
- group offload for modular pipelines applied per component in
  sd_offload; re-application is a guarded no-op
- audio checkbox pops the audio decode block so decode and muxing are
  skipped
- frames=1 renders a single still image: the duration floor lifts per
  instance and sub-floor latents pad at the vae decoder
- progress and interrupt handling via a transformer forward pre-hook
- vae scale factor override, tuple-safe patch size
This commit is contained in:
CalamitousFelicitousness
2026-08-07 02:07:54 +01:00
parent 3fbbb0f0bc
commit c9e1398c71
12 changed files with 256 additions and 9 deletions
+7 -1
View File
@@ -172,7 +172,7 @@ def task_specific_kwargs(p, model):
def get_params(model):
if hasattr(model, 'blocks') and hasattr(model.blocks, 'inputs'): # modular pipeline
possible = [input_param.name for input_param in model.blocks.inputs]
return possible
return possible + ['output'] # __call__ param selecting which state values to return, not a block input
else:
signature = inspect.signature(type(model).__call__, follow_wrapped=True)
possible = list(signature.parameters)
@@ -325,6 +325,12 @@ def set_pipeline_args(p, model, prompts:list, negative_prompts:list, prompts_2:l
args['negative_prompt'] = args['negative_prompt'][0] if len(args['negative_prompt']) > 0 else ''
if isinstance(args['generator'], list) and len(args['generator']) > 0:
args['generator'] = args['generator'][0]
if 'MiniMaxH3' in model.__class__.__name__:
if isinstance(args.get('prompt', None), list): # packs one request into one sequence, str only
args['prompt'] = args['prompt'][0] if len(args['prompt']) > 0 else ''
args.pop('negative_prompt', None) # guidance-distilled, no negative prompt
if isinstance(args.get('generator', None), list) and len(args['generator']) > 0:
args['generator'] = args['generator'][0] # >1-element list breaks the audio noise draw
# set callbacks
if 'prior_callback_steps' in possible: # Wuerstchen / Cascade