PIL Image.resize returns a new image; the result was discarded, so the
final output stayed at the snapped aspect-ratio bucket size instead of
being restored to the original input size.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
Enabling FreeU called len() on the checkbox bool instead of the parsed
preset list, raising TypeError and aborting the run. Even without the
crash, all four FreeU parameters were passed the same value. Use the
parsed freeu_preset values, and log the invalid input before clearing it.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
When negative_prompt arrived as a list, the unwrap assigned it to
p.prompt instead of p.negative_prompt, replacing the user's prompt with
the negative prompt text and passing an unsupported list to the
pipeline.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The framework passes the script's ui values positionally, but after()
only accepted keyword args, so every run raised TypeError after
processing and the original pipeline was never restored. Accept *args
like sibling scripts.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
Co-Authored-By: Claude <noreply@anthropic.com>
The unsupported-model warning fell through and switched non-SDXL models
into PixelSmithXLPipeline with an SDXL VAE, corrupting the pipeline.
Return early like every sibling script does after this check.
https: //claude.ai/code/session_014QWKWgKvMevcuvfCnsYoT2
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.
Surface YoloRestorer.restore() as a standalone operation: a Detailer
postprocessing script in the Process tab and a thin /sdapi/v1/detail
endpoint, neither requiring a base generation pass.
- modules/postprocess/yolo.py: YoloRestorer.make_processing() builds the
synthetic Img2Img processing object both entry points feed to restore(),
resolving the seed so the inpaint passes are reproducible
- modules/api/process.py: post_detail handler exposes the full detailer
parameter set and returns the detailed image plus optional annotations
as base64
- scripts/postprocessing_detailer.py: reuses shared.yolo.ui('extras') and
runs through make_processing()
- modules/postprocessing.py: run_extras takes a per-script script_args
dict, also letting the extras API drive other scripts such as Remove
background; omitting it leaves existing callers unchanged
- modules/api/models.py: ReqDetail / ResDetail
- modules/processing_info.py: guard create_infotext's Image/Hires CFG
reporting against an unset (None) cfg_image, matching the is-not-None
checks the other cfg_image readers use; the detailer inpaint pass runs
with it unset
- test/test-detailer-api.py: covers both paths; effect tests measure the
diff inside the detected region with extreme isolated parameter values,
and the suite disables model quantization for the run and restores the
original settings afterward
Rename `autocomplete_replace_underscores` to `autocomplete_keep_underscores`
(default false) so both autocomplete toggles read as "keep" semantics.
`insertTag` now honors the setting for both tag and artist modes, matching
the dropdown display. Embedding insertion always preserves underscores
because the names are filesystem identifiers.
- ui_definitions: rename option, flip default, update label
- scripts/autocomplete: rename handler, checkbox, and config-bridge keys
- javascript/autocomplete: invert render polarity; insertTag takes a `kind`
parameter; drop the artist-mode hardcoded underscore replacement so the
setting controls tags and artists uniformly
Closes#4827
When a video script (animatediff, text2video, image2video, stablevideodiffusion)
runs via Control tab, both the script's save and control_run's end-of-run save
fired. The latter crashed silently because the local `video` cv2 capture name at
control_run:584 shadowed the modules.video import, so the duplicate was hidden
and the gallery video link never propagated.
- alias import as video_module to bypass the shadow
- p.video_saved marker set by each script
- control_run skips its end-of-run save when the marker is set
Set p.video_interpolate at run() entry so process_images_inner picks up
the helper. Save calls keep their existing kwargs; the sentinel guard
skips re-interpolation when the helper already ran.
- animatediff, text2video, image2video, stablevideodiffusion route
mp4_interpolate into p.video_interpolate
- modules/control/run.py routes the request video_interpolate arg
- xyz_grid intentionally untouched: its end-of-axis save_video stitches
the cell slideshow, not per-cell videos; a future video_interpolate
axis would set p.video_interpolate per cell via axis_options
Color grading mutated pp.image but never wrote to pp.info, so the
chosen brightness/contrast/gamma/LUT/etc. were invisible in the
saved file's postprocessing/extras chunks and in the live Output
panel — unlike every other postprocessor (Upscale, Rembg, NudeNet,
PixelArt) which all stamp their settings.
Stamp every non-default GradingParams field as 'Grading <name>' so
the trail is consistent with the rest of the Process tab. LUT file
is recorded by basename rather than full path to keep the metadata
string compact.
- new autocomplete_translations setting (default off); checkbox in script accordion + locale hint
- get_cached gates companion load on the opt; toggle-flip auto-syncs missing files in a background thread
- list_all_sync, local_names and config_json filter out *.translations.json so companion files never surface as selectable dicts
- one-time per-name warning when opt is on but companion is missing locally