|
|
|
import inspect |
|
from . import errors |
|
from collections import namedtuple |
|
|
|
def report_exception(c, job): |
|
errors.report(f"Error executing callback {job} for {c.script}", exc_info=True) |
|
|
|
ScriptCallback = namedtuple("ScriptCallback", ["script", "callback"]) |
|
callback_map = dict( |
|
callbacks_app_started=[], |
|
callbacks_model_loaded=[], |
|
callbacks_ui_tabs=[], |
|
callbacks_ui_train_tabs=[], |
|
callbacks_ui_settings=[], |
|
callbacks_before_image_saved=[], |
|
callbacks_image_saved=[], |
|
callbacks_cfg_denoiser=[], |
|
callbacks_cfg_denoised=[], |
|
callbacks_cfg_after_cfg=[], |
|
callbacks_before_component=[], |
|
callbacks_after_component=[], |
|
callbacks_image_grid=[], |
|
callbacks_infotext_pasted=[], |
|
callbacks_script_unloaded=[], |
|
callbacks_before_ui=[], |
|
callbacks_on_reload=[], |
|
callbacks_list_optimizers=[], |
|
callbacks_list_unets=[], |
|
) |
|
|
|
def list_optimizers_callback(): |
|
res = [] |
|
|
|
for c in callback_map['callbacks_list_optimizers']: |
|
try: |
|
c.callback(res) |
|
except Exception: |
|
report_exception(c, 'list_optimizers') |
|
|
|
return res |
|
|
|
|
|
def on_list_optimizers(callback): |
|
"""register a function to be called when UI is making a list of cross attention optimization options. |
|
The function will be called with one argument, a list, and shall add objects of type modules.sd_hijack_optimizations.SdOptimization |
|
to it.""" |
|
|
|
add_callback(callback_map['callbacks_list_optimizers'], callback) |
|
|
|
def add_callback(callbacks, fun): |
|
stack = [x for x in inspect.stack() if x.filename != __file__] |
|
filename = stack[0].filename if stack else 'unknown file' |
|
|
|
callbacks.append(ScriptCallback(filename, fun)) |
|
|