- Record session_settings + has_optional_inputs in manifest meta (run_meta_extras) so the
Dashboard "Full pass for survivors" can queue POST /config_tester/run headless; the iframe
falls through to it when the parent has no Builder / no queuePrompt.
- Exclude the deliberately omitted "vae" key from _EXPECTED_CONFIG_KEYS; test_examples asserts zero drift.
- minimize_reloads: log VAE switches + a "changed nothing" note, accurate tooltip/README wording.
- examples/README: Klein base-variant note; fix stale LTX stub comment.
- Tests: run_meta_extras, job order, state_to_configs_json, e2e full pass (new file).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
add_random_seeds_to_gens now uses config_utils.derive_extra_seeds (base seed 0, like the Generator),
so a re-queue attaches to the running sweep and a resume skips finished jobs.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Load Session restores Workflow Sweep arrays from meta.configs_json (workflowConfigToArray) and
tells the user when an older sweep session has no saved configs. Builder Start shows 'attached'.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Quick Filter / Logic Filter (wf:<key>) / label overlay use item.wf_params. Sweep items get a
JOB button opening a read-only Workflow job panel with download/copy of the job's API prompt.
Standalone progress bar shows paused/cancelled.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Identity = session + ordered job fingerprints + start_at_job + overwrite_existing; anything
else gets a clear 409. GET /config_tester/sweep/job_prompt returns one job's API prompt.
Sweep manifests now save their workflow configs in meta.configs_json.
pause/resume emit a progress event.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
decode_latent_with_vae(vae, samples) returns a PIL image; the step passed
(pipe_latent, vae) and then treated it as a tensor. Also: undefined `meta`
(use create_image_metadata like the Florence2 branch), manifest insert(0) +
upscale_produced (no duplicate base image), and chained re-encode no longer
movedims (VAE.encode takes BHWC).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
New ES module conf-builder-workflow-sweep.js (load API workflow, output picker,
suggested bindings, node table, axis editors, dry run modal, start/pause/resume/cancel
with status polling), wired additively into the config-array list, default state and
migrations. Dashboard ETA bar shows 'Sweep job' with an error count and hides REVISE
for workflow items. README, ProjectStructure and Roadmap updated.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
metrics_runner computes metrics for an existing session straight to disk; a
generation run's in-memory copy of those items had no metrics and would have
wiped them on its next save. Disk wins for an item's metrics when the memory
item has none (merge_manifest_user_changes, flush_batch_with_vae's disk sync,
the remote VAE worker's disk sync). Fresh in-memory metrics are kept.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
workflow_sweep_runner feeds jobs through ComfyUI's own queue (windowed feeder that
mirrors server.py post_prompt in-process via ComfyBridge), tracks them in history,
pauses on interrupt/queue-clear/3 errors and resumes by fingerprint. USCGSweepCollect
saves each job's image into the USCG session and appends manifest items. Routes
/config_tester/sweep/{parse,dry_run,start,status,pause,resume,cancel}; the Generator
node starts a sweep for workflow configs and returns the dashboard without waiting.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Metric sorts (primary + secondary, missing last), Logic Filter Metrics group
with a min/max range row, Metrics label checkbox. Everything degrades to
nothing on sessions without metrics.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PREVIEW badge on cards and a modal note, a Pass filter row (hidden until previews exist),
previews superseded by a full image (config_fp/base_fp match) hidden by default, a preview bar
with 'Full pass for survivors (N)'. The button asks web/dashboard.js (postMessage) to switch
Preview pass off in the matching Config Builder and call app.queuePrompt; a marked stub
covers a future run API; fallback is an instructions toast.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Session-level setting (not a per-config key). state_to_configs_json emits
_session_settings.metrics only when enabled and non-empty; GET
/configbuilder/metrics_info reports built-ins and scorer-pack install status.
Faster numpy fallback; README and ProjectStructure updated.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pure-Python core of Workflow Sweep: parse an API-format workflow, suggest bindings,
expand them into jobs (cache-friendly axis order, resume fingerprints), substitute
into the template and append the collector node. Builder state emits kind=workflow
arrays, config_utils.expand_configs dispatches model_type=workflow, and
manifest_utils.append_items adds disk-fresh manifest appends.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A cp312 CPU wheel for the exact minor on the GPU box is not guaranteed; the
tests only need the torch API.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hooks: decode_latent_with_vae metrics_sink, flush_batch_with_vae, remote VAE
worker, orchestrator upscale/Florence2/SeedVR2 inserts, dashboard upscale
thread (explicit spec, never inherits), florence2 builders drop metrics.
sampler_node wraps the run in a token-based begin_run/end_run context.
Adapters mechanism is tested with fake nodes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
State keys job_order, preview_pass{enabled,steps,scale,cfg_override}, skip_rejected_previews,
only_favorited_previews: new-state defaults + migration, Run Settings controls, emission with
coercion in state_to_configs_json, tests, README/ProjectStructure.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
batch_encode_with_cache/batch_encode_prompts take te_batch_size (default 1 =
off, DEFAULT_TE_BATCH_SIZE) and a hidden te_batch_verify; batched prompts are
cached, leftovers take the unchanged per-prompt loop, and the summary line
reports batched prompts/forwards. Builder state default + migration, Run
Settings control, state_to_configs_json emission, orchestrator read, README.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- run_generation_loop walks a flat job plan (config_utils.build_job_plan) instead of the
nested resolution x config loops; job_order=minimize_reloads reorders it to cut model
and LoRA reloads. as_written reproduces the old order exactly.
- Preview pass (fewer steps, smaller snapped latent, no upscales); items carry config_fp,
preview_of, full_* keys. A full run skips cells whose preview was rejected (tombstoned
in meta.rejected_preview_fps by delete_rejected); a preview run skips cells that already
have a full image.
- check_if_job_completed gets a keyword-only preview flag (positional API unchanged).
- Distributed mode is untouched apart from an 'ignored' warning.
fix: a per-config resolution no longer leaks its w/h/batch_idx into later configs of the
same pass (the old loop set them once per input job; the pre-flight scan already did this
correctly, so pre-flight and the main loop disagreed).
fix: the async look-ahead picked the next config via job_idx*len(expanded)+conf_idx, which
was wrong whenever per-config-resolution configs were skipped after the first pass; it now
reads the next plan entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pure numpy + torch implementations of sharpness, entropy, colorfulness,
contrast, luma, saturation on a 1024-capped analysis image, a run-scoped
context (token based), and an adapter mechanism for optional scorer packs
(registry entries disabled until verified).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
examples/ ships one workflow per family (SDXL/Illustrious, Anima, Z-Image
Turbo, Krea 2 Turbo, Flux.2 Klein 9B, MOSS-Image), each a Builder -> Sampler
Grid -> Dashboard graph with the Builder state pre-filled (model, text
encoder, CLIP type, VAE, sampling axes, prompt). examples/README.md lists
the files and folders each needs and what the grid tests.
tests/test_examples.py validates graph wiring, Builder state, emitted
configs and the image counts promised in the README.
Closes#6
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
encode_prompts_batched right-pads eligible prompts, runs ONE real encode on the
batch via a replay shadow on the inner encoder, and replays per-prompt slices
through the unmodified _encode_single (template strip, mask pop, clip_skip).
Allowlisted LLM-style encoders only (MOSS-Image, Krea 2, Qwen-Image); weighted,
AND/CAT/AVG/BREAK prompts fall back. Token cap, OOM halving, first-batch
self-check and an optional per-prompt verify mode. The shadow is always removed
in a finally. _encode_single gains tokens=None and restores clip_layer on error.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pure logic (no DOM): axis normalisers, attribution, Bradley-Terry with a ghost
prior, pair selection, scoreboard/CSV. node:test coverage.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Touch-sized card/lightbox/header buttons under a coarse-pointer media query,
a sticky Prev/Favorite/Reject/Revise/Next bar in the lightbox, and a 2-column
session landing on the standalone page at phone width (all scoped so the node
iframe is unchanged). README documents the standalone dashboard and the run
API with curl examples; ProjectStructure lists the routes and new files.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
From #21: _expand_ltx_entry ran positive/negative through to_list, so the
Builder's [["p1","p2"]] reached the LTX encoder as a list; it now uses
parse_prompt_input_nested like expand_configs. The text-encoder dropdown
falls back to ["None"] when the list is empty. convertConfigsToConfigArrays
keeps the per-entry model type for builder-schema models[].
Refs #21
Co-authored-by: DRuggeri <DRuggeri@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Builder Run Settings already emitted add_random_seeds_to_gens through
_session_settings; this adds the missing new-state default and the
saved-config migration, tests for the emit -> sampler_node unwrap ->
expand_configs path, and a README Run Settings entry.
The extra seeds are now derived from the base seed
(config_utils.derive_extra_seeds) instead of unseeded random.randint, as the
README always promised. Besides reproducibility this makes stop/resume work:
the skip check matches on seed, so an interrupted run can now skip the
extra-seed images it already rendered.
Ported from #21 (it conflicts after the repo restructure). Closes#21.
Co-authored-by: DRuggeri <DRuggeri@users.noreply.github.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pure helpers in config_utils (build_job_plan, order_job_plan, count_switches,
config_fingerprint, item_fingerprint, preview_dims, build_preview_index,
should_skip_for_previews, build_full_fp_set) with tests. Not wired in yet.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
html_generator gains a standalone flag (USCG_STANDALONE) and escapes "</" in
the inlined manifest. New logic_standalone.js (loaded last) replaces every
parent-frame dependency: own ComfyUI websocket re-dispatching the bridge's
message shapes (session filter, id dedupe, backoff, resync on resume),
Fullscreen API, URL kept on the shown session, GENERATE NEW via
POST /config_tester/run, and an openStandalone() header button for the node
iframe. Lightbox gets modalNav/toggleModalFavorite/rejectModalItem helpers
and an action bar element (styled in the next commit).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Adds GET /config_tester/dashboard (SPA as a top-level page, optional
?session=), POST /config_tester/run (builds the Generator -> Dashboard prompt
and enqueues it in-process exactly like PromptServer.post_prompt; force
defaults to true) and GET /config_tester/run_status. Pure helpers live in
run_api.py (no server imports) with unit tests.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>