- A selection (the shot's mask and each Colored Mark person) has key frames, each with its
own points: SAM 3 selects the subject on a key frame and tracks it up to the next one
(before the first, backward), so points added on a later frame correct the mask from there
on. Plans with one key frame (points + key) work as before; keys are saved next to them.
- The points window: after Segment the mask is shown over every frame of the shot, with a
play button, frame stepping (arrows), key-frame marks on the slider and a key-frame list
(jump / remove). Edited points mark the preview as old until Segment again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- BFS Shot H3 Conditioning and its Simple version always pass every picture of the shot: the
use_ref_2 switch is gone (the pictures are chosen in the planner). The published v1.1
character-swap workflow had it off, so only <Picture 1> reached the model. Saved
workflows are upgraded on load: their widget values are put back by name (checked with
the published v1.1 and tutorial workflows).
- 🤖 Auto prompt: Style = H3 official (six sections) or OpenJutsu captions, the short
'Replace the ... in the video with ... from <Picture n>. Keep ...' style of the training
captions (written from the request, the frames and the pictures).
- The writer samples (repetition and presence penalties) instead of greedy decoding, which
looped on long answers; repeated sentences and a cut sentence are removed, missing sound
sections completed; an answer with problems (missing <Subject n> in detailed_description,
a loop, H3 sections in a caption) is written once more, told what was wrong; labels still
missing are tied after [Shot 1]. A subject acts with its own body (hands, not paws).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- With Auto prompt on, the planner's prompt input is the template (e.g. a LoRA's body_swap
prompt) and the panel's text is the request applied to it; the run tells the panel the
template so 🤖 Write uses the same one (shown in the card). Without a VLM the template is the
prompt. The template is part of a written prompt's 'made from'.
- The writer gets the shot's real cut times from the cut detector and at least one key frame
per piece between cuts; a shot without cuts gets no timestamps (the ones the VLM writes from
the frame times are removed), and [Shot 1] never has one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 🤖 Auto prompt (Prompts & refs): the prompt boxes become requests and the VLM writes each
shot's MiniMax H3 prompt in the full-reference format of MiniMax-H3's
VIDEO_PROMPT_WRITING_GUIDE_ref_en (six sections, task types, retention markers, [Shot N],
official camera terms) from key frames of the shot (auto: ~1.5/s, 3-8), the shot's
pictures and their descriptions, the request, Colored Marks, selection and mode, citing
the source as the guide video or <Video 1>. Write all / missing in the panel, per shot
Write again and edit; shots without one are written at run time (before SAM 3) and the
panel stores them; out-of-date prompts are flagged. A written prompt is part of the
stored shot's signature.
- Duet removed from the planner (its split-screen prompt writer, /bfs/shotloop/write) and
from BFS Shot H3 Conditioning (Advanced): duet, panel_*, rope_gap, task, instruction.
The model input stays as a pass-through so workflows that routed the model keep working.
BFS Shot H3 Duet and the Side Panel nodes keep the duet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Colored Mark: every picture has a mark color (12-color palette, editable under each
global picture); a shot's selection and each extra person ("+ Mark another person",
text or points) pick the picture they become ("Picture 3 · red", with its
thumbnail) and are drawn in its color. The prompt gets a model-agnostic mapping
("the person marked in red becomes the character from <Picture 3>"). The
conditioning node checks each marked picture is passed and colors are not shared.
Plans with the old second region open with it as <Picture 2>.
- Points window: fixed size; the frame fits a fixed stage (points are stored relative to
the frame); one point set per marked person.
- BFS Shot Planner outputs refs (every picture the shots use, as a list) and ref_count
where ref_image / ref_image_2 were.
- Saved workflows are upgraded on load: the planner's ref_image / ref_image_2 inputs are
removed, old ref outputs become refs / ref_count, and what fed Repack's ref_image
feeds refs.
- New describe preset "object" (a noun phrase: what it is, shape, materials, colors,
text), written for the prompt sentence like "short".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Describe references is per picture now: one row per picture the plan uses, each with
its own preset (default = the card's; custom with its own instruction) and 🔄 to
describe only that one. {details} = picture 1, {details2} = picture 2,
{details@Picture n} = picture n. Descriptions saved per reference set by older plans
are read as those pictures'. The separate "Describe each picture" section is gone.
- BFS Shot Unpack: refs (every picture of the shot, as a list: the next node runs once
per picture) and ref_count replace ref_image / ref_image_2 in the same output slots.
BFS Shot Repack's refs input takes the list back and splits it per shot; ref_image
links from older workflows still work.
- Prompt chips read PictureN (they insert <Picture N>).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Plans keep a list of pictures (global_refs, per-shot refs) instead of ref / ref2; older
plans are converted on load and ref / ref2 stay in the JSON as pictures 1 and 2. A
shot's empty slot uses the global picture at the same position.
- Panel: the global list starts with one slot and + adds more (several files at once);
drop image files on a slot to replace it or on the box to add them; recent thumbnails
can be dragged onto any slot. Chips under every prompt insert <Picture N> at the cursor
(@PictureN) or {details@Picture N} (📝).
- {details@Picture n}: the description of the shot's n-th picture alone. 📝 Describe each
picture writes one per image (editable, saved as picture_details); without one, the
planner's VLM, then the conditioning node's VLM, describes it at run time.
- The planner's ref_image / ref_image_2 inputs are gone (a workflow saved with them
connected still runs and the log says they are ignored). Conditioning and Duet pass
every picture of the shot (use_ref_2 off: only the first) and log when there are
more than 9.
- Stored shots keep their signature when a shot has at most 2 pictures and no
per-picture descriptions are set.
- A two-picture shot no longer gets the automatic <Subject 2> {details2} line when the
prompt already names <Picture 2> or uses {details@Picture n}.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The stored-shot signature now includes what renders the shots: the planner reads the
queued workflow (hidden PROMPT input) and fingerprints every node upstream of BFS Shot
Join's images (loaders, LoRAs and strengths, sampler, seed, conditioning settings).
Changing any of them runs every shot again on the next Run, instead of only
re-assembling the stored ones. The join's own settings (crossfade, comparison) and
display nodes don't count. A seed on "randomize" changes every Run, so fix it to keep
the stored shots.
- BFS Shot Join no longer shows a video preview on the node; the video still goes out
through images and the file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Every shot stored and up to date: the planner hands out an assemble-only placeholder
(no VLM, SAM 3 or history) and BFS Shot Join assembles the stored shots. Its images
input is lazy, so conditioning, sampler and decode are not executed again (before,
the last shot was generated again just so the join had something to join).
- Run tab: "Unload models before the join" (on by default): once every shot is
rendered, unload the models so the join and the nodes after it get the memory.
Not part of the shot signature, so toggling it keeps the stored shots.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Run tab gets a 'Second pass (upscale)' section: on/off, and the upscaled
size by multiplier, target dimensions or megapixels with an alignment, the
same arithmetic as Minimax H3 Latent Upscaler (3D). The planner outputs
second_pass (BOOLEAN), upscale_width and upscale_height (INT); the graph does
the latent upscale and the second sampling with its own nodes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Issue #12: on installs with no ffmpeg on PATH (Windows portable), Shot Join's
mp4 mode - also picked automatically for long videos when the RAM is short -
failed with WinError 2. Video files now go through bfs_video_io: ffmpeg from
PATH, else imageio-ffmpeg's, else PyAV (what ComfyUI's Save Video uses), for
writing and for reading the MP4 back. BFS Video Compare uses the same writer.
Issue #13: a workflow saved with Max shots = 1 silently dropped every shot
after the first, so double-click splits did nothing. A split made by hand now
raises Max shots to keep it, and the Video tab says when detected shots are
left out by the limit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Stored shots move from ComfyUI's temp folder (emptied at every start) to
output/bfs_shotloop (Shot cache = keep; temp still available).
- Each shot is saved as a lossless FFV1 video next to a small .pt (~12x
smaller than raw frames, exact); Smaller / Smallest (H.264 RGB) and Raw
are selectable.
- One run folder per source video; each shot carries a signature of its
settings, so a Queue runs only the shots that changed, plus the ones that
continue from a new take. Redo (with or without cascade) from the panel.
- The final join reads one stored shot at a time into the output (measured
+15.8 GB -> +8.2 GB on 11 shots at 960x544); save to = mp4 file streams
the video and the comparison to ffmpeg (+2.1 GB). New video_path output.
- Combine stored shots: an MP4 of what is stored now, without generating.
- tools/bfs_assemble_shots.py reads the new format; docs updated.
Bump BFSNodes version to 1.104.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BFS Shot Join records every shot it receives (latent tokens = generated
frames x resolution, with the continuity head) and the peak VRAM of its
run, per GPU. The panel compares each planned shot with the biggest one
that already ran on this GPU: a status at the top, a Memory card and a
warning in Checks when a shot is much bigger (possible out of memory).
No fixed GB guess, since ComfyUI offloads weights as needed.
New Run option 'Between shots': keep models loaded (default) or free
memory (unload every model between shots, for low VRAM).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tested on real H3 runs: continuity holds and memory stays as in the other
modes. It needs no open browser tab, unlike the queue loop. Saved plans
keep their own run mode. Bump BFSNodes version to 1.102.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One Queue renders every shot in order inside the same prompt: after a shot
is stored, BFS Shot Join expands the planner-to-join body (ComfyUI node
expansion) for the next one, so continuity head/history works without the
browser re-queueing. Graph walk adapted from Ethanfel's MiniMax H3
Context Loop. Queue loop and auto loop are unchanged; new plans default to
the recursive run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Continuity head/history needs each shot to read the previous result, which
only exists in the queue loop (the auto loop conditions every shot before
sampling any). New plans start in the queue loop with auto-queue on, and
the Run checks warn when a shot asks for head/history in the auto loop.
Bump BFSNodes version to 1.101.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
H3's VAE encodes 17-frame clips into 5 latent steps and drops the last 3
steps of the whole video, so a 17/34/51-frame history came back as only
its first 5/22/39 frames: a 12-frame hole between the history and the
shot, seen as a jump/drift at every join. History now uses 5/22/39/56
(17k+5); old plans with 17/34/51 read as 22/39/56.
New continuity mode "head" (now the default, 22 frames): the shot is
generated from N frames earlier, the previous shot's result is encoded
into the first latent steps with noise mask 0 (kept, not swapped again),
and BFS Shot Join cuts those frames. Queue loop only; skipped at cuts,
after a skipped shot and off the H3 grid.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Planner: Mode "One shot (whole range)" (the range as a single shot, Max seconds / shot not applied) and
"Range length, seconds" next to it, so a whole shot or pieces of at most X are set in the Video tab alone.
- BFS Shot Seed: one seed per shot from a base seed (same / increment / random per shot) with per-shot overrides.
- BFS Shot Noise (experimental, optional): starting noise for SamplerCustomAdvanced on H3's video + audio latent;
every amount at 0 is exactly RandomNoise. shared_base (the coarse pattern from a base seed, the same across shots,
resolutions and lengths), static_share, distribution, spectrum_tilt, pyramid, guide_structure, ref_tint.
- BFS Sigmas Preview: chart of a sigma schedule (steps on layout / shapes / detail), pass-through.
Tested: split logic, seed logic, noise statistics (unit variance, identity at 0) and the chart, in Python.
Not tested yet inside ComfyUI / the panel in a browser.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>