Same except-path as the previous commit: jobid is begun before the
try block but never ended on the error return, mirroring the
xyz_grid.py fix.
Co-Authored-By: Claude <noreply@anthropic.com>
Both options inspected pp.image (the original input, normally RGB)
instead of the background-removed RGBA result, so the checkboxes did
nothing. merge_alpha also discarded the convert('RGB') return value.
Operate on the rembg output and keep the converted image.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
hasattr() on the task_args dict checked for an attribute instead of a
key, so it was always False and images passed via task_args were
ignored. Use dict.get instead.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The invalid-upscaler warning referenced selected_upscaler, which is only
assigned when a matching upscaler was found, so an unknown name (stale
infotext, removed upscaler) crashed the resize instead of falling back
to plain resampling.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
A stale or renamed upscaler name fell through after the debug log and
dereferenced None in upscale(), raising AttributeError. Return early
like the standard upscale class does.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
draw_xyz_grid inserts one sub-grid per Z value whenever the main grid
or sub-grids are enabled, but have_subgrids only counted them when
'Include sub grids' was checked. With main grid on and sub grids off,
the Z sub-grids leaked into the results as ordinary images (shown in
the gallery, fed into video creation, misaligning infotexts) and the
removal branch was unreachable since its condition contradicted itself.
Count sub-grids based on the same condition that inserts them.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The always-on variant returned from its parse-error handler without
resetting the module-level active flag, silently disabling the XYZ grid
for every later generation until restart. The selectable variant
likewise returned without ending the job state it had begun.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
Operator precedence made 8 * w * x // 8 cancel out, so fractional scale
factors produced resolutions not divisible by 8 and broke the SDXL
latent shape requirements. Apply the same idiom as pixelsmith_ext.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The sub-1024 early return happened after init_images was nulled,
task_args were injected and the sampler overridden, so the fallback to
normal processing ran with a broken img2img setup. Check the resolution
before mutating the processing object.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
Infotext parsing produces 'Negative prompt' and 'Variation seed', but
the save-image PObject looked up 'Negative_prompt' and 'Subseed', so
images saved from restored metadata always lost their negative prompt
and variation seed. Use the keys the parser actually emits, matching
the sibling lookups like 'CFG scale'.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The guard repeated 'conjunction.prompts is None' twice; the second copy
was meant to check for an empty list, so an empty (non-None) prompts
list raised IndexError inside the guard instead of returning the empty
fallback.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
Same inversion as the slerp() near-parallel shortcut: at val=0 the
expression returned hi instead of lo, opposite to both the
near-orthogonal shortcut and the general slerp path in the same
function.
Co-Authored-By: Claude <noreply@anthropic.com>
The nearly-parallel fast path interpolated in the wrong direction:
at val=0 it returned hi instead of lo, opposite to both the general
slerp formula below and the sibling near-orthogonal shortcut. Affects
subseed/variation strength when base and subseed noise are nearly
parallel.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The truthiness filter removed valid seed 0 from p.seeds, causing an
unseeded generator for single images and a generator/batch length
mismatch for batches. Filter only None entries; 0 is a legitimate seed
per get_fixed_seed.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
torch.cat was indented into the per-item loop, so with two or more
latents the first iteration replaced the list with a tensor and the
next iteration concatenated its dim-0 slices, destroying the batch
dimension. Concatenate once after the loop.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The script concatenated each per-line result's images and infotexts INCLUDING the per-line grid, while all_seeds/all_prompts hold only real images and the final Processed gets index_of_first_image=0. With batch count > 1 the interleaved grids shift every index, so the manual save button writes neighboring images' metadata and filenames (and indexes past the end of infotexts for the last image). Slice each per-line result from proc.index_of_first_image so grids never enter the combined result and all lists stay 1:1 with the gallery. Fixes#2385.
Co-Authored-By: Claude <noreply@anthropic.com>
tile_width/tile_height and tile_col_overlap/tile_row_overlap were cross-assigned from p.height/p.width, transposing output geometry for every non-square tile size. Fixes#4902.
padding loops used insert(0) which shifts existing prompt/seed entries
to higher indices, so subsequent index lookups - including the caller's
own p.prompts[i]/p.seeds[i] reads on the same aliased lists - return
values belonging to a different image; append preserves existing
index-to-entry mapping and pads missing slots at the end
https://claude.ai/code/session_01UZT4ypkGQH5fzJ89dXPFYp
Drives txt2img/img2img with the full per-sampler scheduler-option matrix
(sigma method, prediction type, timestep spacing, beta schedule, solver
order, shift, low order, thresholding, dynamic shift, rescale betas), one
option at a time over a pinned baseline, and measures every case against
the default: applied, inert, marginal, rejected, or fallback. Detects
silent fallback via the infotext Scheduler class and annotates every saved
image with its full requested configuration. --sweep runs a reduced matrix
per sampler and emits an empirical capability report.
Sampler capability gates raised plain ValueError when schedulers_fallback is
disabled, so the API middleware and the gradio call wrapper printed a full
backtrace for an expected outcome. Add errors.ValidationError, raise it from
the gates, and report it message-only in errors.display; the UI error box and
the API error response already carry the message.
The ER-SDE FlowMatch presets carried only use_flow_sigmas, so the sigma
method selector could not drive karras/beta/exponential for the FlowMatch
variants. Add use_karras_sigmas/use_exponential_sigmas/use_beta_sigmas to
match the plain ER-SDE presets and the Euler/UniPC/Flash FlowMatch presets,
which use the same boolean-flag mechanism.
create_sampler restored the model default scheduler on a prediction-type
mismatch, on an unknown sampler config, and on any scheduler-constructor
exception regardless of schedulers_fallback; only SD_SAMPLER_DEBUG could turn
the prediction mismatch into an error. Raise like the other capability gates
when the fallback setting is disabled.
An unresolved sampler name substituted UniPC before any of those gates could
run; pass the requested name through instead, so it falls back to the model
default (or raises when fallback is disabled) and the infotext records
Default rather than the unresolved name. find_sampler now also resolves an
unspecified sampler to Default instead of UniPC, matching the platform
default used everywhere else.
In flow mode ER-SDE only ran karras/beta/exponential on the VP path and
silently dropped them, unlike FlowMatchEuler and DPM FlowMatch which
redistribute the shifted flow sigmas. Apply the same transform to the
flow sigmas in _setup_flow so the sigma method works in flow mode and
the ER-SDE FlowMatch variants gain karras/beta/exponential. Default flow
schedule is unchanged.
The sigma-method override silently fell back to the sampler's default
schedule when the selected method has no matching config key. Now warns and
uses the default schedule with schedulers_fallback enabled, or raises like
the other capability gates when it is disabled.
ERSDEScheduler now accepts use_karras_sigmas, use_exponential_sigmas,
use_beta_sigmas, and use_flow_sigmas, matching the other flow schedulers.
The VP path derives alpha/sigma/lambda from the k-diffusion sigma so the
karras/beta/exponential transforms can use fractional timesteps; the
default schedule is numerically unchanged. use_flow_sigmas triggers flow
mode and add_noise tolerates fractional timesteps.
Wire the new keys into the ER-SDE presets so the sigma method selector
drives them, and cover ER-SDE in the scheduler stability test.