Merge pull request #5053 from vladmandic/dev

refresh master
This commit is contained in:
Vladimir Mandic
2026-08-23 12:02:09 +02:00
committed by GitHub
10 changed files with 23 additions and 15 deletions
+4 -3
View File
@@ -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
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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):
+3 -3
View File
@@ -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"])
+6 -2
View File
@@ -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)
+1
View File
@@ -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:
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
Submodule wiki updated: f2c955021c...b974e50847