42 Commits

Author SHA1 Message Date
Ethanfel 8490865092 Add hover tooltip to source_clip_2 input for Upscale context
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 17:53:44 +02:00
Ethanfel 265225ac96 Upscale mode: auto-splice reference images via source_clip_2
Connect reference image(s) to source_clip_2 and set keyframe_positions
to the anchored frame indices — the prep node replaces those frames
before passing to the mask generator, no manual frame swap needed.
Supports 1 frame broadcast to all positions, or one frame per position.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 17:47:37 +02:00
Ethanfel 64667ab5a8 Bump version to 1.1.3 for Upscale mode addition
Publish to Comfy Registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 17:39:38 +02:00
Ethanfel 65015257cc Add Upscale mode to VACE Mask Generator
Provides real upscaled pixels as VACE reference (not grey) with white
mask, so VACE refines existing content rather than generating blind.
Reuses keyframe_positions to anchor specific frames exactly (black mask)
— wire the same value from the original Keyframe generation, no rewiring
needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 17:38:56 +02:00
Ethanfel f8b19994a8 Fix load latent compatibility with ComfyUI-saved latent files
ComfyUI saves latents under key 'latent_tensor', remap to 'samples'
so downstream nodes get the expected LATENT dict format.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:08:40 +01:00
Ethanfel e5ca7a1224 Fix latent save node to skip non-serializable values in metadata
LATENT dicts can contain nested tensors or other non-JSON-serializable
objects. Filter them out instead of crashing on json.dumps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 00:06:10 +01:00
Ethanfel 64b6c23f61 Bump version to 1.1.2 for save node meta tensor fix
Publish to Comfy Registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:35:05 +01:00
Ethanfel ccc43f520e Fix save node meta tensor handling with multi-source weight loading
Try pipeline["sd"] first (merged base+VACE weights), then
diffusion_model state dict, then reload from checkpoint file.
Applies LoRA patches from model patcher on top.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:32:21 +01:00
Ethanfel d2c96726e5 Fix save node to force-load model weights before saving
Model weights stay on meta device (no data) until ComfyUI's model
management loads them. Use load_models_gpu with force_full_load
to materialize weights before extracting state dict.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 15:20:46 +01:00
Ethanfel 3acf57b7a1 Rename source_clip to trimmed_clip in VACE Mask Generator
Matches the output name from VACE Source Prep for clearer wiring.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:50:43 +01:00
Ethanfel 3e12030e70 Fix INT output type in Mask Generator for display node compatibility
Publish to Comfy Registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:46:10 +01:00
Ethanfel d8aa05969a Bump version to 1.1.0 for VACE Mode Select node
Publish to Comfy Registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 20:18:52 +01:00
Ethanfel ec15f2374b Add tooltips to VACE Mode Select node
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 20:09:02 +01:00
Ethanfel 508f2ec404 Add VACE Mode Select node for integer-based mode selection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 19:15:42 +01:00
Ethanfel 85acb6d326 Update example workflow: remove unused nodes, reorder, fix links
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 15:35:00 +01:00
Ethanfel bf150133c8 Add example workflow with model download links and explanatory notes
Two-pass distilled VACE extend workflow with 6 notes covering:
pipeline overview, VACE tools, sampling strategy, VRAM optimization,
model downloads (3 options), and decode/merge guidance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 15:10:52 +01:00
Ethanfel 4d3445a3a1 Add ComfyUI Registry publishing setup
Publish to Comfy Registry / Publish Custom Node to registry (push) Has been cancelled
- pyproject.toml with package metadata (v1.0.0)
- MIT license
- GitHub Actions workflow to auto-publish on pyproject.toml changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 14:42:06 +01:00
Ethanfel 7c584bd0d7 Move SVG diagrams to separate files for GitHub rendering
Inline SVGs are stripped by GitHub's markdown sanitizer. Moved all 11
diagrams to docs/diagrams/*.svg and referenced them with <img> tags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 13:25:14 +01:00
Ethanfel f71afeeae9 Replace ASCII diagrams with inline SVGs in README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 13:19:34 +01:00
Ethanfel 615599cdfd Optimize merge node RAM usage with pre-allocation and context slicing
Replace torch.cat with pre-allocated tensor + in-place copy.
Clone only small context slices for blending instead of holding
full source/vace tensors during the blend loop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 16:51:24 +01:00
Ethanfel 0f17311199 Update README for target_frames output, 4n+1 snapping, and auto-middle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:24:32 +01:00
Ethanfel 5cbe1f1d6a Snap target_frames output to 4n+1 (1, 5, 9, …, 81, …) for VACE encode
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 21:54:52 +01:00
Ethanfel b10fd0691b Replace frames_to_generate output with target_frames for direct VACE encode wiring
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 19:44:44 +01:00
Ethanfel 8b5b99a5b0 Add split_index validation, auto-middle mode, and merge bounds checks
- Middle Extend: split_index=0 now auto-splits at B//2 instead of empty first half
- Middle Extend/Replace: raise ValueError when split_index >= frame count
- Merge blend loops: add bounds checks to prevent index-out-of-bounds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 19:40:30 +01:00
Ethanfel a164fbeb87 Normalize input/output names across nodes
- SourcePrep output: source_clip → trimmed_clip (distinguish from input)
- MergeBack input: original_clip → source_clip (matches SourcePrep's
  input — same video wire from Load Video)
- MergeBack input: original_clip_2 → source_clip_2 (matches SourcePrep)
- Update README wiring diagram and tables

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 10:34:07 +01:00
Ethanfel f369c25b32 Update docs and tooltips for two-clip Join Extend
Add source_clip_2 and original_clip_2 to README input tables, update
Join Extend mode reference with two-clip diagram, update MergeBack
description and behavior section, fix mode output type label.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 10:21:44 +01:00
Ethanfel 32e28ac4b4 Add two-clip support for Join Extend mode
SourcePrep gets optional source_clip_2 input — when connected in Join
Extend mode, joins two separate clips instead of splitting one in half.
MergeBack gets optional original_clip_2 to reconstruct the full result
from both originals. Single-clip behavior is unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 10:19:45 +01:00
Ethanfel 08d6f21f18 Swap mask and control_frames output order in MaskGenerator
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:26:14 +01:00
Ethanfel 6f943bec52 Remove segment outputs and fix mode type for cross-node wiring
- Remove segment_1-4 from both MaskGenerator and SourcePrep outputs
- Define shared VACE_MODES list so SourcePrep's mode output type matches
  MaskGenerator's combo input type (fixes inability to connect mode wire)
- Remove dead helpers: _placeholder, _ensure_nonempty, ph(), safe()
- Clean up dead variables (mid_seg, part_1, part_4, image_b, segment_1)
- Remove segment tables from README mode reference sections

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:24:44 +01:00
Ethanfel 605279d88e Refactor to VACE_PIPE: bundle merge metadata into single pipe connection
Replace 3 separate forceInput wires (mode, trim_start, trim_end) plus
mask and blend_frames with a single VACE_PIPE dict carrying mode, trim
bounds, and context frame counts. SourcePrep outputs reduced from 12 to
7 (segments removed), MergeBack inputs reduced from 9 to 5. Blending
now auto-derives from context counts instead of manual blend_frames.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:08:21 +01:00
Ethanfel 89fa3405cb Add VACE Merge Back node for splicing VACE output into original video
Adds a new node that reconstructs full-length video by splicing VACE
sampler output back into the original clip at the trim positions. Supports
optical flow, alpha, and hard-cut blending at context/generated seams.
Also adds trim_start/trim_end INT outputs to VACESourcePrep.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 22:43:07 +01:00
Ethanfel 6fa235f26c Add VACE Source Prep node for trimming long source clips
New node that handles frame selection/trimming before the mask generator,
with input_left/input_right controls for per-mode windowing. Adds
B > target_frames validation to the mask generator with a helpful error
message. Includes JS extension for smart widget visibility per mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 22:14:03 +01:00
Ethanfel d2f00d1141 Add Save/Load Latent (Absolute Path) nodes from Comfyui-save-latent
Consolidates SaveLatentAbsolute and LoadLatentAbsolute into this project
as latent_node.py. Saves and loads LATENT data to absolute file paths in
safetensors format, preserving device info and non-tensor metadata.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 16:50:24 +01:00
Ethanfel 5f59ec34e9 Add WanVideo Save Merged Model node from Comfyui_WW_msave
Consolidates the WanVideoSaveMergedModel node into this project as
save_node.py. Saves WanVideo diffusion models (with merged LoRAs) as
safetensors files with metadata for traceability.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 16:48:47 +01:00
Ethanfel ad98b3d65a Add Keyframe mode for placing keyframe images at positions within output
New generation mode where source_clip keyframes are placed at specific
positions within a target_frames-length output, with everything between
them marked for generation. Supports auto-spread (even distribution) and
manual placement via optional keyframe_positions string input.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 16:24:17 +01:00
Ethanfel f5a3d047a6 Update README clone URL to actual repository
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:33:14 +01:00
Ethanfel c171a9c0cf Improve tooltips and add DESCRIPTION help guide
Fix output tooltips that incorrectly assumed target_frames length for all
modes, add per-mode detail to segment outputs, complete the unused-mode
lists on split_index and edge_frames inputs, and add a DESCRIPTION class
attribute for the ComfyUI "?" help button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:15:50 +01:00
Ethanfel c6672c480e Remove logic.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:41:03 +01:00
Ethanfel 87ec7b3938 Add Video Inpaint mode for per-pixel spatial mask regeneration
New 9th mode that works at the pixel level rather than the frame level.
Accepts an optional MASK input (B,H,W) to mark spatial regions for
regeneration, with single-frame broadcast, spatial dimension validation,
and contiguous output tensors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:37:04 +01:00
Ethanfel d8143ea889 Add Bidirectional Extend, Frame Interpolation, and Replace/Inpaint modes
Three new modes for the VACE Mask Generator node, bringing the total to 8.
Bidirectional generates before and after the clip, Frame Interpolation
inserts frames between each source pair, and Replace/Inpaint regenerates
a region in-place. All reuse existing inputs with mode-specific semantics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:23:12 +01:00
Ethanfel c44e9dd62a Add README with installation, inputs/outputs, and mode reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:09:08 +01:00
Ethanfel a49515dc33 Initial commit: VACE Mask Generator custom node
Single ComfyUI node implementing 5 VACE mask generation modes
(End/Pre/Middle/Edge/Join Extend) with zero external dependencies.
Replaces ~149 nodes from the original logic.json workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:06:42 +01:00