Compare commits
7 Commits
Author | SHA1 | Date |
---|---|---|
AUTOMATIC1111 | adadb4e3c7 | |
AUTOMATIC1111 | d282d24800 | |
AUTOMATIC1111 | a196319edf | |
AUTOMATIC1111 | 88f70ce63c | |
AUTOMATIC1111 | 7f691612ca | |
AUTOMATIC1111 | 696d6813e0 | |
AUTOMATIC1111 | 3786f3742f |
|
@ -81,6 +81,10 @@
|
|||
* minor bug fix of sd model memory management ([#15350](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15350))
|
||||
* Fix CodeFormer weight ([#15414](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15414))
|
||||
* Fix: Remove script callbacks in ordered_callbacks_map ([#15428](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15428))
|
||||
* fix limited file write (thanks, Sylwia)
|
||||
* Fix extra-single-image API not doing upscale failed ([#15465](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15465))
|
||||
* error handling paste_field callables ([#15470](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15470))
|
||||
|
||||
|
||||
### Hardware:
|
||||
* Add training support and change lspci for Ascend NPU ([#14981](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/14981))
|
||||
|
@ -112,6 +116,8 @@
|
|||
* Add Size as an XYZ Grid option ([#15354](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15354))
|
||||
* Use HF_ENDPOINT variable for HuggingFace domain with default ([#15443](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15443))
|
||||
* re-add update_file_entry ([#15446](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15446))
|
||||
* create_infotext allow index and callable, re-work Hires prompt infotext ([#15460](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15460))
|
||||
* update restricted_opts to include more options for --hide-ui-dir-config ([#15492](https://github.com/AUTOMATIC1111/stable-diffusion-webui/pull/15492))
|
||||
|
||||
|
||||
## 1.8.0
|
||||
|
|
|
@ -8,7 +8,7 @@ import sys
|
|||
|
||||
import gradio as gr
|
||||
from modules.paths import data_path
|
||||
from modules import shared, ui_tempdir, script_callbacks, processing, infotext_versions, images, prompt_parser
|
||||
from modules import shared, ui_tempdir, script_callbacks, processing, infotext_versions, images, prompt_parser, errors
|
||||
from PIL import Image
|
||||
|
||||
sys.modules['modules.generation_parameters_copypaste'] = sys.modules[__name__] # alias for old name
|
||||
|
@ -488,7 +488,11 @@ def connect_paste(button, paste_fields, input_comp, override_settings_component,
|
|||
|
||||
for output, key in paste_fields:
|
||||
if callable(key):
|
||||
v = key(params)
|
||||
try:
|
||||
v = key(params)
|
||||
except Exception:
|
||||
errors.report(f"Error executing {key}", exc_info=True)
|
||||
v = None
|
||||
else:
|
||||
v = params.get(key, None)
|
||||
|
||||
|
|
|
@ -136,6 +136,7 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
|
|||
|
||||
args = scripts.scripts_postproc.create_args_for_run({
|
||||
"Upscale": {
|
||||
"upscale_enabled": True,
|
||||
"upscale_mode": resize_mode,
|
||||
"upscale_by": upscaling_resize,
|
||||
"max_side_length": max_side_length,
|
||||
|
|
|
@ -608,7 +608,7 @@ class Processed:
|
|||
"version": self.version,
|
||||
}
|
||||
|
||||
return json.dumps(obj)
|
||||
return json.dumps(obj, default=lambda o: None)
|
||||
|
||||
def infotext(self, p: StableDiffusionProcessing, index):
|
||||
return create_infotext(p, self.all_prompts, self.all_seeds, self.all_subseeds, comments=[], position_in_batch=index % self.batch_size, iteration=index // self.batch_size)
|
||||
|
@ -703,8 +703,54 @@ def program_version():
|
|||
return res
|
||||
|
||||
|
||||
def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iteration=0, position_in_batch=0, use_main_prompt=False, index=None, all_negative_prompts=None, all_hr_prompts=None, all_hr_negative_prompts=None):
|
||||
if index is None:
|
||||
def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iteration=0, position_in_batch=0, use_main_prompt=False, index=None, all_negative_prompts=None):
|
||||
"""
|
||||
this function is used to generate the infotext that is stored in the generated images, it's contains the parameters that are required to generate the imagee
|
||||
Args:
|
||||
p: StableDiffusionProcessing
|
||||
all_prompts: list[str]
|
||||
all_seeds: list[int]
|
||||
all_subseeds: list[int]
|
||||
comments: list[str]
|
||||
iteration: int
|
||||
position_in_batch: int
|
||||
use_main_prompt: bool
|
||||
index: int
|
||||
all_negative_prompts: list[str]
|
||||
|
||||
Returns: str
|
||||
|
||||
Extra generation params
|
||||
p.extra_generation_params dictionary allows for additional parameters to be added to the infotext
|
||||
this can be use by the base webui or extensions.
|
||||
To add a new entry, add a new key value pair, the dictionary key will be used as the key of the parameter in the infotext
|
||||
the value generation_params can be defined as:
|
||||
- str | None
|
||||
- List[str|None]
|
||||
- callable func(**kwargs) -> str | None
|
||||
|
||||
When defined as a string, it will be used as without extra processing; this is this most common use case.
|
||||
|
||||
Defining as a list allows for parameter that changes across images in the job, for example, the 'Seed' parameter.
|
||||
The list should have the same length as the total number of images in the entire job.
|
||||
|
||||
Defining as a callable function allows parameter cannot be generated earlier or when extra logic is required.
|
||||
For example 'Hires prompt', due to reasons the hr_prompt might be changed by process in the pipeline or extensions
|
||||
and may vary across different images, defining as a static string or list would not work.
|
||||
|
||||
The function takes locals() as **kwargs, as such will have access to variables like 'p' and 'index'.
|
||||
the base signature of the function should be:
|
||||
func(**kwargs) -> str | None
|
||||
optionally it can have additional arguments that will be used in the function:
|
||||
func(p, index, **kwargs) -> str | None
|
||||
note: for better future compatibility even though this function will have access to all variables in the locals(),
|
||||
it is recommended to only use the arguments present in the function signature of create_infotext.
|
||||
For actual implementation examples, see StableDiffusionProcessingTxt2Img.init > get_hr_prompt.
|
||||
"""
|
||||
|
||||
if use_main_prompt:
|
||||
index = 0
|
||||
elif index is None:
|
||||
index = position_in_batch + iteration * p.batch_size
|
||||
|
||||
if all_negative_prompts is None:
|
||||
|
@ -715,6 +761,9 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iter
|
|||
token_merging_ratio = p.get_token_merging_ratio()
|
||||
token_merging_ratio_hr = p.get_token_merging_ratio(for_hr=True)
|
||||
|
||||
prompt_text = p.main_prompt if use_main_prompt else all_prompts[index]
|
||||
negative_prompt = p.main_negative_prompt if use_main_prompt else all_negative_prompts[index]
|
||||
|
||||
uses_ensd = opts.eta_noise_seed_delta != 0
|
||||
if uses_ensd:
|
||||
uses_ensd = sd_samplers_common.is_sampler_using_eta_noise_seed_delta(p)
|
||||
|
@ -747,22 +796,24 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iter
|
|||
"RNG": opts.randn_source if opts.randn_source != "GPU" else None,
|
||||
"NGMS": None if p.s_min_uncond == 0 else p.s_min_uncond,
|
||||
"Tiling": "True" if p.tiling else None,
|
||||
"Hires prompt": None, # This is set later, insert here to keep order
|
||||
"Hires negative prompt": None, # This is set later, insert here to keep order
|
||||
**p.extra_generation_params,
|
||||
"Version": program_version() if opts.add_version_to_infotext else None,
|
||||
"User": p.user if opts.add_user_name_to_info else None,
|
||||
}
|
||||
|
||||
if all_hr_prompts := all_hr_prompts or getattr(p, 'all_hr_prompts', None):
|
||||
generation_params['Hires prompt'] = all_hr_prompts[index] if all_hr_prompts[index] != all_prompts[index] else None
|
||||
if all_hr_negative_prompts := all_hr_negative_prompts or getattr(p, 'all_hr_negative_prompts', None):
|
||||
generation_params['Hires negative prompt'] = all_hr_negative_prompts[index] if all_hr_negative_prompts[index] != all_negative_prompts[index] else None
|
||||
for key, value in generation_params.items():
|
||||
try:
|
||||
if isinstance(value, list):
|
||||
generation_params[key] = value[index]
|
||||
elif callable(value):
|
||||
generation_params[key] = value(**locals())
|
||||
except Exception:
|
||||
errors.report(f'Error creating infotext for key "{key}"', exc_info=True)
|
||||
generation_params[key] = None
|
||||
|
||||
generation_params_text = ", ".join([k if k == v else f'{k}: {infotext_utils.quote(v)}' for k, v in generation_params.items() if v is not None])
|
||||
|
||||
prompt_text = p.main_prompt if use_main_prompt else all_prompts[index]
|
||||
negative_prompt_text = f"\nNegative prompt: {p.main_negative_prompt if use_main_prompt else all_negative_prompts[index]}" if all_negative_prompts[index] else ""
|
||||
negative_prompt_text = f"\nNegative prompt: {negative_prompt}" if negative_prompt else ""
|
||||
|
||||
return f"{prompt_text}{negative_prompt_text}\n{generation_params_text}".strip()
|
||||
|
||||
|
@ -1204,6 +1255,17 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
|
|||
if self.hr_sampler_name is not None and self.hr_sampler_name != self.sampler_name:
|
||||
self.extra_generation_params["Hires sampler"] = self.hr_sampler_name
|
||||
|
||||
def get_hr_prompt(p, index, prompt_text, **kwargs):
|
||||
hr_prompt = p.all_hr_prompts[index]
|
||||
return hr_prompt if hr_prompt != prompt_text else None
|
||||
|
||||
def get_hr_negative_prompt(p, index, negative_prompt, **kwargs):
|
||||
hr_negative_prompt = p.all_hr_negative_prompts[index]
|
||||
return hr_negative_prompt if hr_negative_prompt != negative_prompt else None
|
||||
|
||||
self.extra_generation_params["Hires prompt"] = get_hr_prompt
|
||||
self.extra_generation_params["Hires negative prompt"] = get_hr_negative_prompt
|
||||
|
||||
self.extra_generation_params["Hires schedule type"] = None # to be set in sd_samplers_kdiffusion.py
|
||||
|
||||
if self.hr_scheduler is None:
|
||||
|
|
|
@ -739,12 +739,17 @@ class ScriptRunner:
|
|||
def onload_script_visibility(params):
|
||||
title = params.get('Script', None)
|
||||
if title:
|
||||
title_index = self.titles.index(title)
|
||||
visibility = title_index == self.script_load_ctr
|
||||
self.script_load_ctr = (self.script_load_ctr + 1) % len(self.titles)
|
||||
return gr.update(visible=visibility)
|
||||
else:
|
||||
return gr.update(visible=False)
|
||||
try:
|
||||
title_index = self.titles.index(title)
|
||||
visibility = title_index == self.script_load_ctr
|
||||
self.script_load_ctr = (self.script_load_ctr + 1) % len(self.titles)
|
||||
return gr.update(visible=visibility)
|
||||
except ValueError:
|
||||
params['Script'] = None
|
||||
massage = f'Cannot find Script: "{title}"'
|
||||
print(massage)
|
||||
gr.Warning(massage)
|
||||
return gr.update(visible=False)
|
||||
|
||||
self.infotext_fields.append((dropdown, lambda x: gr.update(value=x.get('Script', 'None'))))
|
||||
self.infotext_fields.extend([(script.group, onload_script_visibility) for script in self.selectable_scripts])
|
||||
|
|
|
@ -19,7 +19,9 @@ restricted_opts = {
|
|||
"outdir_grids",
|
||||
"outdir_txt2img_grids",
|
||||
"outdir_save",
|
||||
"outdir_init_images"
|
||||
"outdir_init_images",
|
||||
"temp_dir",
|
||||
"clean_temp_dir_at_start",
|
||||
}
|
||||
|
||||
categories.register_category("saving", "Saving images")
|
||||
|
|
|
@ -58,8 +58,9 @@ def apply_and_restart(disable_list, update_list, disable_all):
|
|||
|
||||
def save_config_state(name):
|
||||
current_config_state = config_states.get_config()
|
||||
if not name:
|
||||
name = "Config"
|
||||
|
||||
name = os.path.basename(name or "Config")
|
||||
|
||||
current_config_state["name"] = name
|
||||
timestamp = datetime.now().strftime('%Y_%m_%d-%H_%M_%S')
|
||||
filename = os.path.join(config_states_dir, f"{timestamp}_{name}.json")
|
||||
|
|
Loading…
Reference in New Issue