Voxta: Filter Existing Combinations
Resume a half-finished expression batch without re-rendering everything
- combination_ids
- combination_ids
- prompts
Here's the scenario that makes this node worth having: you set up a character generation workflow with eleven expressions - Neutral, Smile, Talking1 through Talking3, the works - queued it, and your GPU died six images in. Now you restart and the whole list re-renders from scratch, including the six you already have. Annoying. VoxtaFilterExistingCombinations fixes that by being the bored receptionist of your pipeline: it looks at what's already saved on disk, checks every combination against it, and only lets the un-finished ones through.
It's a filter, not a saver. You slot it between your PromptCombinator and the sampling/export chain, so it runs before any generation happens. It reads the same PROMPTCOMBINATORIDS + prompts your combinator produces, decides what actually needs doing, and passes the trimmed list onward.
How it works
The node scans the destination folder (same output_path + subfolder your export node writes to) for files matching the enumerated pattern stem_XX.ext - the exact naming scheme Voxta: Export Character produces. It then maps each incoming combination ID to the filename stem that saving it would create, and checks whether that stem already has files. Combos that already exist get dropped, and the survivors flow out the two outputs.
combination_ids(PROMPTCOMBINATORIDS) andprompts(STRING) - the outputs, both as lists. Wire them straight into your sampler chain and the Export Character node.behavior- this is the control knob, with five modes:all- pass everything through untouched.new only- drop everything already on disk.single (first)/single (last)/single (random)- collapse the whole batch to one pick, preferring a not-yet-generated combo.
The node also shows a small "Summary" widget after running - something like "Kept 5 of 11 combinations (Skipped: 6, Kept: 5)" - so you can see at a glance what was filtered.
Gotchas worth knowing
First, new only raises an error if everything is already generated. It doesn't silently do nothing - it fails the run, because feeding an empty list downstream would break things. If you rerun a finished batch, switch to all or single mode. Second, the existence check only recognizes files that match the export node's naming pattern (stem_02.webp). If you've got a folder with hand-named files, they won't be counted. Third, this isn't an output node, so don't use it as the end of your graph - it's specifically there to sit upstream of your KSampler and export chain.
Install
Part of the Voxta ComfyUI Nodes pack by Team Voxta - tiny, MIT, no model files, no heavy dependencies (just Pillow, NumPy, aiohttp). Through ComfyUI Manager, search "Voxta", or:
cd ComfyUI/custom_nodes
git clone https://github.com/voxta-ai/ComfyUI-VoxtaNodes
Restart ComfyUI and you're done. Pair it with comfyui-prompt-combinator (the workflows' PromptCombinator) to get the PROMPTCOMBINATORIDS input it needs. Given how young this pack is, treat the "exists on disk" check as the source of truth: if you've been fiddling with names or moved files around, the filter's view of "done" is exactly what's in that folder.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| output_path | STRING | — | |
| subfolder | STRING | Avatars/Default | — |
| combination_ids | PROMPTCOMBINATORIDS | — | |
| prompts | STRING | — | |
| behavior | COMBO | all | 5 options: all, new only, single (first), single (last), single (random) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| combination_ids | PROMPTCOMBINATORIDS | — |
| prompts | STRING | — |