| 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)) | |