Character Shot Planner
40 varied prompts with no repeated camera angle, and no API key
- plan
- prompts
- seeds
- shot_ids
- report
The narrowest bottleneck in character dataset work isn't the model, it's you typing ten variations of "standing in a room, medium shot" and getting the same photograph forty times. Character Shot Planner [Eclipse] plans the shots instead. Give it a character description, a scene and a count, and it returns a list of prompts, the matching seed list, stable shot IDs, and a readable plan - close, mid and wide candidates per image, one selected. It runs locally. No model, no account, no key, no network call.
What "planning" means here
For each requested shot the node draws three candidates - a close, a mid and a wide - with different poses and, in expression=random, different expressions. One candidate is selected and becomes the output prompt; plan keeps all three, including the two you skipped.
Selection of the camera is the clever bit. Every prompt's camera gets a permanent key built from distance + camera height + subject orientation + lens family + composition, and all three candidates reserve their keys. In the default stop_when=poses mode, those keys are never reused, so you can't get the same angle twice by accident - the node cycles less-used combinations instead. Cooldowns handle the soft version: pose_cooldown, expression_cooldown and camera_cooldown (defaults 3/3/2) exclude poses, expressions or camera families seen in the last N selected shots, including earlier batches.
The pools are editable JSON in ComfyUI_Eclipse/prompts/shot_planner/: camera.json, poses.json, expressions.json, rules.json. Add an entry, click Reload planner files on the node, and it's available - no restart for text edits. Out of the box you get 225 close, 270 mid and 225 wide camera keys, a big everyday/seated/lying pose pool, and a sexy category with 100 pose-only entries if that's what you need.
The controls you actually set
character_lock is required and goes first in every prompt - this is where Character Reference Pack's character_lock lands. Keep identity there and pose out of it; the planner supplies poses, and conflicting text is how you end up with forty identical standers. outfit_lock is optional wardrobe, scene is the shared background and lighting, and count is up to 100 selected shots per batch.
body_mode (any/seated/standing/lying) and pose_category (all/everyday/sports/sexy) filter the pose pool; selection picks the candidate policy (balanced spreads distances using project history), and choices overrides it with an exact comma-separated list like close, wide, mid. seed drives both candidate draws and each shot's generation seed.
The two you must understand before you generate anything:
projectnames the history. Ledgers live atoutput/eclipse/shot_ledgers/<project-name-hash>.jsonand persist across restarts. Same project name = shared camera history.operation-previewplans against empty history and saves nothing;reservewrites all three candidates per shot before generation. Start withpreview, tune, then switch. Existing batches only replay inreservemode.
Outputs
prompts and seeds are parallel ComfyUI lists - keep them aligned, one image latent per list item, and use seeds for the sampler rather than reusing the planner seed. shot_ids gives you stable batch/shot/distance strings for filenames or captions. report is the human-readable plan; wire it to Show Any and read it before committing 40 renders. plan goes to Shot Plan Slice [Eclipse] when you want to split the batch across several generation branches.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/r-vage/ComfyUI_Eclipse
pip install -r ComfyUI_Eclipse/requirements.txt
Or search ComfyUI_Eclipse in ComfyUI Manager and restart. Node category is 🌒 Eclipse/ Text.
Traps
Reservations are not completed images. A crashed or cancelled generation does not release them, so a retry uses the same plan in reserve mode rather than starting over. Changing any setting after reserving auto-creates a numbered variant (batch-001-2, batch-001-3) - the report shows the resolved ID, and getting back to the original means restoring the original settings. Pool-file edits need a new batch ID, because saved batches replay their snapshots of the pools.
And in the legacy stop_when=cameras mode, 225 sets is a combinatorial ceiling, not a promise. Cooldowns and prior reservations can exhaust it sooner, and the node stops with a yellow warning instead of half-filling a batch. If you're doing repeated large runs that way, set camera_cooldown=1; the no-repeat rule still holds.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| project | STRING | my-character | Name of the persistent history under output/eclipse/shot_ledgers. All batches with this project name share camera reservations. Use Reset reservations to start fresh with the same name. Changing batch_id or reloading prompt files does not clear history. The report shows the ledger file for manual backup/removal while the queue is stopped. |
| batch_id | STRING | batch-001 | Names one plan within this project. Same ID and settings replay saved shots, useful when generation fails. Changed settings automatically use -2, -3, etc.; report shows the actual ID. A new ID requests fresh shots from the remaining pool, not a history reset. Pool-file edits need a new ID to take effect. |
| count | INT | 401–100 | Maximum selected prompts in this batch, not completed images. Each shot has three candidates recorded in reserve mode. Coverage completion can return fewer prompts. Reserve stops automatic queueing with a yellow popup; preview shows an informational capacity notice and continues. Try 3 while testing; this is not the project's lifetime limit. |
| character_lock | STRING | The same character as the reference images; preserve facial identity, hair and body proportions. | Identity and reference-role instructions included in every shot. Connect Character Reference Pack's character_lock here. Keep fixed pose/framing instructions out of this field so the planner can vary them. Changing it creates a new batch variant in reserve mode. |
| outfit_lock | STRING | Optional wardrobe instructions added to every shot. Leave empty if the connected character_lock already specifies the outfit. Keep this consistent with clothing references and the approved anchor. | |
| scene | STRING | An uninterrupted featureless white background and light floor, soft natural light. | Background and lighting for dataset shots. Applied to every planned prompt; camera, pose and expression come from the shot pools. This does not change the separate character-review scene. |
| body_mode | COMBO | any | Posture filter: any mixes seated, standing and lying poses. Seated includes benches, stools, floor cushions and supported reclining; lying keeps the body horizontal on a support. Standing + sports includes boxing and martial arts. Close portraits retain posture but cannot show full-body actions. Filters need compatible poses in your editable files; high cooldowns can exhaust small pools. |
| selection | COMBO | balanced | Which candidate becomes the output image prompt. Balanced favors the least-used distance across project history; close/mid/wide always select that distance. All three candidates are still planned and reserved. Nonempty choices overrides this setting. |
| choices | STRING | Optional manual selection, one close/mid/wide per requested shot, separated by commas or newlines. Example for count=3: close, wide, mid. Overrides selection. Choices affect later cooldowns, so preview again after editing. | |
| seed | INT | 00–18446744073709550000 | Controls new candidate draws and the per-shot generation seeds. A connected seed overrides this widget. Keep it fixed for retries; changing it requests a new batch variant in reserve mode. It does not reset reservations or control reference/anchor sampler seeds. |
| pose_cooldown | INT | 30–20 | Number of previous selected shots whose poses cannot be offered again, including earlier batches. 0 allows immediate reuse between sets; the three candidates within a set still have distinct poses. Lower this if a restricted pose pool runs out. |
| expression_cooldown | INT | 30–20 | Applies only to expression=random: number of previous selected shots whose expressions cannot be offered again, including earlier batches. 0 allows immediate reuse between sets; random candidates within a set still have distinct expressions. Fixed expressions and off ignore this cooldown. |
| camera_cooldown | INT | 20–20 | Number of previous selected shots whose camera families are excluded, including earlier batches. In cameras stop mode, exact combinations never repeat even at 0. Other stop modes cycle depleted camera pools and relax this cooldown if necessary, with a warning, so cameras do not end pose/expression coverage. |
| operation | COMBO | reserve | preview: plan from empty history using current files, ignoring all saved reservations and batches; no history is saved and downstream generation remains enabled. reserve: save all three candidates per shot before generation, including skipped ones. Later generation failure does not undo reservations; retry unchanged settings to replay. Planning failure saves none of the batch. Existing batches replay only in reserve mode. Preview and reserve match when project history is empty. |
| pose_categoryopt | COMBO | all | Activity filter, combined with body_mode. all includes everyday, sports and sexy. Everyday selects casual poses; sports selects solo boxing, martial arts, warm-ups and exercise; sexy selects suggestive solo glamour poses for standing, seated and lying subjects. Does not change wardrobe, facial expression or location. Edit category on poses in prompts/shot_planner/poses.json; omitted category means everyday. Existing reserved batches replay their saved prompts. |
| expressionopt | COMBO | random | random draws distinct expressions with cooldowns. A specific ID applies that expression to every candidate and ignores expression_cooldown. off omits planner expression wording while preserving your prompt text. Edit expressions.json and click Reload planner files to refresh choices. Removed IDs fail for new batches; reserved batches replay their snapshots. |
| stop_whenopt | COMBO | poses | poses (default): finish when every compatible pose has appeared in a selected output. expressions: cover each selected expression; fixed/off has one variant. poses_and_expressions: finish both lists, cycling the shorter one. cameras: legacy unique-camera limit. never: keep cycling. Camera pools cycle in all modes except cameras; camera cooldown may relax to continue. Reserve coverage uses project history; preview starts empty. Both use current body/category/output-distance filters. The final coverage batch can be shorter than count. Reserve shows a yellow popup and stops automatic queueing; preview shows capacity information. Reserved batches replay unchanged in reserve mode. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| plan | ECLIPSE_SHOT_PLAN | Complete plan with all three candidates, selected choices and saved settings. Connect to Shot Plan Slice to split generation into ranges. This contains reservations, not image-completion records. |
| prompts | STRING | One selected positive prompt per shot, in order. Connect to the dataset text encoder. Keep aligned with seeds and shot_ids. |
| seeds | INT | One generation seed per selected prompt. Connect to the dataset sampler's seed input; do not reuse the planner seed as a substitute. |
| shot_ids | STRING | Stable IDs for selected shots: resolved batch ID / shot number / distance. Aligned with prompts and seeds; useful for filenames or captions. |
| report | STRING | Readable plan showing the resolved batch ID, ledger path and all candidates; * marks the selected candidate. Connect to Show Any to inspect it before generating images. |