diff --git a/CHANGELOG.md b/CHANGELOG.md index 323d996e5..e3416144b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Highlights for 2026-08-22 +## Highlights for 2026-08-23 Time for a new release, this is a larger one! Main focus is improving video workflows which also brings full support for new [MiniMax H3](https://vladmandic.github.io/sdnext-docs/MiniMax) and [LTXVideo-2.5](https://vladmandic.github.io/sdnext-docs/LTX) @@ -17,7 +17,7 @@ Plus quite a lot more, see full [changelog](https://github.com/vladmandic/automa [Home](https://vladmandic.github.io/sdnext/) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) | [Sponsor](https://github.com/sponsors/vladmandic) -## Details for 2026-08-22 +## Details for 2026-08-23 - **Models** - [MiniMax H3](https://huggingface.co/MiniMaxAI/MiniMax-H3) available in *base* and *ref* variants @@ -83,7 +83,7 @@ Plus quite a lot more, see full [changelog](https://github.com/vladmandic/automa may provide significant speed-up on some gpus, disabled by default - AR display ratio on manual resolution change - **Wiki** - - major updates: *Offload, Detailer, Video, MiniMax, LTX* + - major updates: *Offload, Detailer, Video, MiniMax, LTX, Debug* - minor updates: *Intel-ARC, FramePack, Parameters, API, Installation, SDNQ-Quantization, CLI-Arguments* - **Removed** - remove DirectML support @@ -114,6 +114,7 @@ Plus quite a lot more, see full [changelog](https://github.com/vladmandic/automa - scripts: mixture-of-diffusers and mixture-tiling update to use igwn-segments - api: process - api: auth via remote-ip + - api: improve response models - krea2: fallback to base pipeline/transformer for nunchaku-lite - torchsde: handle obsolete dependency - upscaler: avoid unnecessary multi-pass diff --git a/TODO.md b/TODO.md index fa8284d50..29e7d692b 100644 --- a/TODO.md +++ b/TODO.md @@ -3,9 +3,9 @@ ## Short-term - Update LTX wiki, @CalamitousFelicitousness +- Lora: new handler, @CalamitousFelicitousness - Productize benchmark tool, @CalamitousFelicitousness - Inpaint: https://discord.com/channels/1101998836328697867/1130536562422186044/1506850651035144322, @vladmandic -- Lora: new handler, @CalamitousFelicitousness - Control tab verify overrides handling, @vladmandic - Create pre-quant for LTX-2.5 - Create pre-quant for MiniMax-H3-Turbo diff --git a/extensions-builtin/sdnq b/extensions-builtin/sdnq index 21d60c8c3..738613a62 160000 --- a/extensions-builtin/sdnq +++ b/extensions-builtin/sdnq @@ -1 +1 @@ -Subproject commit 21d60c8c3fbd66501adfc8b8129f0b254cedfbac +Subproject commit 738613a62cfa278b9b6312dd3755879c3671ee62 diff --git a/installer.py b/installer.py index e61165a1a..8338b88af 100644 --- a/installer.py +++ b/installer.py @@ -109,7 +109,9 @@ def custom_excepthook(exc_type, exc_value, exc_traceback): if exc_traceback: format_exception = traceback.format_tb(exc_traceback) for line in format_exception: - log.error(repr(line)) + subline = line.split('\n') + for sub in subline: + log.error(repr(sub)) def print_dict(d): diff --git a/modules/api/api.py b/modules/api/api.py index 1410481df..ee32648d3 100644 --- a/modules/api/api.py +++ b/modules/api/api.py @@ -76,9 +76,9 @@ class Api: self.add_api_route("/sdapi/v1/extra-single-image", self.process.extras_single_image_api, methods=["POST"], response_model=models.ResProcessImage, tags=["Processing"]) self.add_api_route("/sdapi/v1/process-batch", self.process.extras_batch_images_api, methods=["POST"], response_model=models.ResProcessBatch, tags=["Processing"]) self.add_api_route("/sdapi/v1/extra-batch-images", self.process.extras_batch_images_api, methods=["POST"], response_model=models.ResProcessBatch, tags=["Processing"]) - self.add_api_route("/sdapi/v1/preprocess", self.process.post_preprocess, methods=["POST"], tags=["Processing"]) - self.add_api_route("/sdapi/v1/mask", self.process.post_mask, methods=["POST"], tags=["Processing"]) - self.add_api_route("/sdapi/v1/detect", self.process.post_detect, methods=["POST"], tags=["Processing"]) + self.add_api_route("/sdapi/v1/preprocess", self.process.post_preprocess, methods=["POST"], response_model=models.ResPreprocess, tags=["Processing"]) + self.add_api_route("/sdapi/v1/mask", self.process.post_mask, methods=["POST"], response_model=process.ResMask, tags=["Processing"]) + self.add_api_route("/sdapi/v1/detect", self.process.post_detect, methods=["POST"], response_model=process.ResFace, tags=["Processing"]) self.add_api_route("/sdapi/v1/detail", self.process.post_detail, methods=["POST"], response_model=models.ResDetail, tags=["Processing"]) self.add_api_route("/sdapi/v1/prompt-enhance", self.process.post_prompt_enhance, methods=["POST"], response_model=models.ResPromptEnhance, tags=["Generation"]) diff --git a/modules/api/gallery.py b/modules/api/gallery.py index f6f363f49..d3b2d7d32 100644 --- a/modules/api/gallery.py +++ b/modules/api/gallery.py @@ -36,6 +36,10 @@ OPTS_FOLDERS = [ class ReqFiles(BaseModel): folder: str = Field(title="Folder") +class ItemFolder(BaseModel): + path: str = Field(title="Path", description="Folder path") + label: str = Field(title="Label", description="Folder display label") + ### ws connection manager class ConnectionManager: @@ -206,7 +210,7 @@ def register_api(api): # register api debug(f'Browser folders allow: {path}') shared.demo.allowed_paths.append(path) debug(f'Browser folders: {unique_folders}') - return JSONResponse(content=unique_folders) + return unique_folders # @app.get("/sdapi/v1/browser/thumb", response_model=dict) async def get_thumb(file: str, exif: bool = False): @@ -245,7 +249,7 @@ def register_api(api): # register api log.error(f'Gallery: {folder} {e}') return [] - api.add_api_route("/sdapi/v1/browser/folders", get_folders, methods=["GET"], response_model=list[str]) + api.add_api_route("/sdapi/v1/browser/folders", get_folders, methods=["GET"], response_model=list[ItemFolder]) api.add_api_route("/sdapi/v1/browser/thumb", get_thumb, methods=["GET"], response_model=dict) api.add_api_route("/sdapi/v1/browser/files", ht_files, methods=["GET"], response_model=list) diff --git a/modules/img2img.py b/modules/img2img.py index c6210cd16..70d7e48cc 100644 --- a/modules/img2img.py +++ b/modules/img2img.py @@ -338,6 +338,7 @@ def img2img(id_task: str, state: str, mode: int, if p.is_batch: process_batch(p, img2img_batch_files, img2img_batch_input_dir, img2img_batch_output_dir, img2img_batch_inpaint_mask_dir, args) processed = processing.get_processed(p, [], p.seed, "") + processed = scripts_manager.scripts_img2img.after(p, processed, *args) else: processed = scripts_manager.scripts_img2img.run(p, *args) if processed is None: diff --git a/modules/logger.py b/modules/logger.py index 544607a42..a1826b571 100644 --- a/modules/logger.py +++ b/modules/logger.py @@ -148,6 +148,7 @@ def setup_logging(debug=None, trace=None, filename=None): class FileBuffer(RotatingFileHandler): def __init__(self, filename, maxBytes=32*1024*1024, backupCount=9, encoding='utf-8', delay=True): super().__init__(filename, maxBytes=maxBytes, backupCount=backupCount, encoding=encoding, delay=delay) + self.ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]') if trace: self.formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s | %(module)s:%(pathname)s:%(lineno)d:%(message)s') else: @@ -156,8 +157,7 @@ def setup_logging(debug=None, trace=None, filename=None): def strip(self, line): if line is None: return "" - ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]') - return ansi_escape.sub('', str(line)) + return self.ansi_escape.sub('', str(line)) def emit(self, record): record.msg = self.strip(record.msg) diff --git a/pipelines/sefi/convert_sefi_to_diffusers.py b/pipelines/sefi/convert_sefi_to_diffusers.py index fca38a5a5..08d88cc61 100644 --- a/pipelines/sefi/convert_sefi_to_diffusers.py +++ b/pipelines/sefi/convert_sefi_to_diffusers.py @@ -317,7 +317,7 @@ def convert_scheduler(root: Path, output: Path): torch.testing.assert_close(scheduler.sigmas, source_scheduler.sigmas, rtol=0.0, atol=0.0) torch.testing.assert_close(scheduler.timesteps, source_scheduler.timesteps, rtol=0.0, atol=0.0) - num_train_timesteps = int(scheduler.config.num_train_timesteps) + num_train_timesteps = int(scheduler.config.num_train_timesteps) # pylint: disable=no-member expected_sigmas = torch.linspace(1.0, 1.0 / num_train_timesteps, num_train_timesteps) torch.testing.assert_close(scheduler.sigmas, expected_sigmas, rtol=0.0, atol=1e-7) torch.testing.assert_close(scheduler.timesteps, expected_sigmas * num_train_timesteps, rtol=0.0, atol=1e-4) diff --git a/wiki b/wiki index f2c955021..b974e5084 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit f2c955021cfafca9efb8c73154dd5a0e8c4fc7df +Subproject commit b974e50847dccceb55154d1834ac0b40e18c5487