a
    Ad@                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZ dd ZG d	d
 d
ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZedddgZeg g g g g g g g g g g g g g g g g g g g dZdd Zee e	dddZd d! Zd"d# Zd$d% Zed&d'd(Zd)d* Z ed&d+d,Z!ed&d-d.Z"ed&d/d0Z#ed&d1d2Z$ed&d3d4Z%ed&d5d6Z&d7d8 Z'd9d: Z(ed&d;d<Z)e*ee*ef d=d>d?Z+d@dA Z,dBdC Z-dDdE Z.dFdG Z/dHdI Z0dJdK Z1dLdM Z2dNdO Z3dPdQ Z4dRdS Z5dTdU Z6dVdW Z7dXdY Z8dZd[ Z9d\d] Z:d^d_ Z;d`da Z<dbdc Z=ddde Z>dfdg Z?dhdi Z@djdk ZAdldm ZBdndo ZCdpdq ZDdrds ZEdtdu ZFdS )v    N)
namedtuple)OptionalDictAny)FastAPI)Blocks)errorstimerc                 C   s    t jd| d| j dd d S )NzError executing callback z for T)exc_info)r   reportscript)cjob r   @/var/www/html/stable-diffusion-webui/modules/script_callbacks.pyreport_exception   s    r   c                   @   s   e Zd Zdd ZdS )ImageSaveParamsc                 C   s   || _ || _|| _|| _d S N)imagepfilenamepnginfo)selfr   r   r   r   r   r   r   __init__   s
    zImageSaveParams.__init__N__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )ExtraNoiseParamsc                 C   s   || _ || _|| _d S r   )noisexxi)r   r   r    r!   r   r   r   r       s    zExtraNoiseParams.__init__Nr   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd ZdS )CFGDenoiserParamsc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r   )r    
image_condsigmasampling_steptotal_sampling_steps	text_condtext_uncond)r   r    r#   r$   r%   r&   r'   r(   r   r   r   r   ,   s    zCFGDenoiserParams.__init__Nr   r   r   r   r   r"   +   s   r"   c                   @   s   e Zd Zdd ZdS )CFGDenoisedParamsc                 C   s   || _ || _|| _|| _d S r   )r    r%   r&   inner_model)r   r    r%   r&   r*   r   r   r   r   D   s
    zCFGDenoisedParams.__init__Nr   r   r   r   r   r)   C   s   r)   c                   @   s   e Zd Zdd ZdS )AfterCFGCallbackParamsc                 C   s   || _ || _|| _d S r   )r    r%   r&   )r   r    r%   r&   r   r   r   r   S   s    zAfterCFGCallbackParams.__init__Nr   r   r   r   r   r+   R   s   r+   c                   @   s   e Zd Zdd ZdS )UiTrainTabParamsc                 C   s
   || _ d S r   )txt2img_preview_params)r   r-   r   r   r   r   _   s    zUiTrainTabParams.__init__Nr   r   r   r   r   r,   ^   s   r,   c                   @   s   e Zd Zdd ZdS )ImageGridLoopParamsc                 C   s   || _ || _|| _d S r   )imgscolsrows)r   r/   r0   r1   r   r   r   r   d   s    zImageGridLoopParams.__init__Nr   r   r   r   r   r.   c   s   r.   ScriptCallbackr   callback)callbacks_app_startedcallbacks_model_loadedcallbacks_ui_tabscallbacks_ui_train_tabscallbacks_ui_settingscallbacks_before_image_savedcallbacks_image_savedcallbacks_extra_noise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_unetsc                  C   s   t  D ]} |   qd S r   )callback_mapvaluesclear)callback_listr   r   r   clear_callbacks   s    rL   )demoappc              	   C   sV   t d D ]H}z&|| | tjtj|j W q t	yN   t
|d Y q0 qd S )Nr4   app_started_callback)rH   r3   r	   startup_timerrecordospathbasenamer   	Exceptionr   )rM   rN   r   r   r   r   rO      s    rO   c               	   C   s<   t d D ].} z|   W q ty4   t| d Y q0 qd S )NrE   rH   r3   rU   r   r   r   r   r   app_reload_callback   s
    rX   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr5   model_loaded_callbackrV   )sd_modelr   r   r   r   rY      s
    rY   c               	   C   sH   g } t d D ]6}z| | pg 7 } W q ty@   t|d Y q0 q| S )Nr6   ui_tabs_callbackrV   resr   r   r   r   r[      s    r[   )paramsc              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr7   rV   r^   r   r   r   r   ui_train_tabs_callback   s
    r`   c               	   C   s<   t d D ].} z|   W q ty4   t| d Y q0 qd S )Nr8   ui_settings_callbackrV   rW   r   r   r   ra      s
    ra   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr9   before_image_saved_callbackrV   r_   r   r   r   rb      s
    rb   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr:   image_saved_callbackrV   r_   r   r   r   rc      s
    rc   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr;   rV   r_   r   r   r   extra_noise_callback   s
    rd   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr<   cfg_denoiser_callbackrV   r_   r   r   r   re      s
    re   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr=   cfg_denoised_callbackrV   r_   r   r   r   rf      s
    rf   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )Nr>   cfg_after_cfg_callbackrV   r_   r   r   r   rg      s
    rg   c              	   K   sF   t d D ]8}z|j| fi | W q ty>   t|d Y q0 qd S )Nr?   before_component_callbackrV   	componentkwargsr   r   r   r   rh      s
    rh   c              	   K   sF   t d D ]8}z|j| fi | W q ty>   t|d Y q0 qd S )Nr@   after_component_callbackrV   ri   r   r   r   rl      s
    rl   c              	   C   s>   t d D ]0}z||  W q ty6   t|d Y q0 qd S )NrA   Z
image_gridrV   r_   r   r   r   image_grid_callback   s
    rm   )infotextr^   c              	   C   s@   t d D ]2}z|| | W q ty8   t|d Y q0 qd S )NrB   Zinfotext_pastedrV   )rn   r^   r   r   r   r   infotext_pasted_callback  s
    ro   c               	   C   s@   t td D ].} z|   W q ty8   t| d Y q0 qd S )NrC   Zscript_unloadedreversedrH   r3   rU   r   rW   r   r   r   script_unloaded_callback  s
    rr   c               	   C   s@   t td D ].} z|   W q ty8   t| d Y q0 qd S )NrD   Z	before_uirp   rW   r   r   r   before_ui_callback  s
    rs   c               	   C   sB   g } t d D ]0}z||  W q ty:   t|d Y q0 q| S )NrF   list_optimizersrV   r\   r   r   r   list_optimizers_callback  s    ru   c               	   C   sB   g } t d D ]0}z||  W q ty:   t|d Y q0 q| S )NrG   
list_unetsrV   r\   r   r   r   list_unets_callback)  s    rw   c                 C   s8   dd t  D }|r |d jnd}| t|| d S )Nc                 S   s   g | ]}|j tkr|qS r   r   __file__.0r    r   r   r   
<listcomp>6      z add_callback.<locals>.<listcomp>r   unknown file)inspectstackr   appendr2   )	callbacksfunr   r   r   r   r   add_callback5  s    r   c                     sd   dd t  D } | r | d jnd  dkr0d S t D ]&} fdd|D D ]}|| qNq8d S )Nc                 S   s   g | ]}|j tkr|qS r   rx   rz   r   r   r   r|   =  r}   z3remove_current_script_callbacks.<locals>.<listcomp>r   r~   c                    s   g | ]}|j  kr|qS r   )r   r{   cbr   r   r   r|   B  r}   )r   r   r   rH   rI   remove)r   rK   callback_to_remover   r   r   remove_current_script_callbacks<  s    r   c                    s4   t  D ]&} fdd|D D ]}|| qqd S )Nc                    s   g | ]}|j  kr|qS r   r3   r   callback_funcr   r   r|   H  r}   z1remove_callbacks_for_function.<locals>.<listcomp>)rH   rI   r   )r   rK   r   r   r   r   remove_callbacks_for_functionF  s    r   c                 C   s   t td |  dS )zregister a function to be called when the webui started, the gradio `Block` component and
    fastapi `FastAPI` object are passed as the argumentsr4   Nr   rH   r   r   r   r   on_app_startedL  s    r   c                 C   s   t td |  dS )z@register a function to be called just before the server reloads.rE   Nr   r   r   r   r   on_before_reloadR  s    r   c                 C   s   t td |  dS )zregister a function to be called when the stable diffusion model is created; the model is
    passed as an argument; this function is also called when the script is reloaded. r5   Nr   r   r   r   r   on_model_loadedW  s    r   c                 C   s   t td |  dS )a  register a function to be called when the UI is creating new tabs.
    The function must either return a None, which means no new tabs to be added, or a list, where
    each element is a tuple:
        (gradio_component, title, elem_id)

    gradio_component is a gradio component to be used for contents of the tab (usually gr.Blocks)
    title is tab text displayed to user in the UI
    elem_id is HTML id for the tab
    r6   Nr   r   r   r   r   
on_ui_tabs]  s    
r   c                 C   s   t td |  dS )zregister a function to be called when the UI is creating new tabs for the train tab.
    Create your new tabs with gr.Tab.
    r7   Nr   r   r   r   r   on_ui_train_tabsj  s    r   c                 C   s   t td |  dS )zregister a function to be called before UI settings are populated; add your settings
    by using shared.opts.add_option(shared.OptionInfo(...)) r8   Nr   r   r   r   r   on_ui_settingsq  s    r   c                 C   s   t td |  dS )zregister a function to be called before an image is saved to a file.
    The callback is called with one argument:
        - params: ImageSaveParams - parameters the image is to be saved with. You can change fields in this object.
    r9   Nr   r   r   r   r   on_before_image_savedw  s    r   c                 C   s   t td |  dS )zregister a function to be called after an image is saved to a file.
    The callback is called with one argument:
        - params: ImageSaveParams - parameters the image was saved with. Changing fields in this object does nothing.
    r:   Nr   r   r   r   r   on_image_saved  s    r   c                 C   s   t td |  dS )zregister a function to be called before adding extra noise in img2img or hires fix;
    The callback is called with one argument:
        - params: ExtraNoiseParams - contains noise determined by seed and latent representation of image
    r;   Nr   r   r   r   r   on_extra_noise  s    r   c                 C   s   t td |  dS )a  register a function to be called in the kdiffussion cfg_denoiser method after building the inner model inputs.
    The callback is called with one argument:
        - params: CFGDenoiserParams - parameters to be passed to the inner model and sampling state details.
    r<   Nr   r   r   r   r   on_cfg_denoiser  s    r   c                 C   s   t td |  dS )a  register a function to be called in the kdiffussion cfg_denoiser method after building the inner model inputs.
    The callback is called with one argument:
        - params: CFGDenoisedParams - parameters to be passed to the inner model and sampling state details.
    r=   Nr   r   r   r   r   on_cfg_denoised  s    r   c                 C   s   t td |  dS )a  register a function to be called in the kdiffussion cfg_denoiser method after cfg calculations are completed.
    The callback is called with one argument:
        - params: AfterCFGCallbackParams - parameters to be passed to the script for post-processing after cfg calculation.
    r>   Nr   r   r   r   r   on_cfg_after_cfg  s    r   c                 C   s   t td |  dS )a  register a function to be called before a component is created.
    The callback is called with arguments:
        - component - gradio component that is about to be created.
        - **kwargs - args to gradio.components.IOComponent.__init__ function

    Use elem_id/label fields of kwargs to figure out which component it is.
    This can be useful to inject your own components somewhere in the middle of vanilla UI.
    r?   Nr   r   r   r   r   on_before_component  s    	r   c                 C   s   t td |  dS )z`register a function to be called after a component is created. See on_before_component for more.r@   Nr   r   r   r   r   on_after_component  s    r   c                 C   s   t td |  dS )zregister a function to be called before making an image grid.
    The callback is called with one argument:
       - params: ImageGridLoopParams - parameters to be used for grid creation. Can be modified.
    rA   Nr   r   r   r   r   on_image_grid  s    r   c                 C   s   t td |  dS )zregister a function to be called before applying an infotext.
    The callback is called with two arguments:
       - infotext: str - raw infotext.
       - result: Dict[str, any] - parsed infotext parameters.
    rB   Nr   r   r   r   r   on_infotext_pasted  s    r   c                 C   s   t td |  dS )zregister a function to be called before the script is unloaded. Any hooks/hijacks/monkeying about that
    the script did should be reverted hererC   Nr   r   r   r   r   on_script_unloaded  s    r   c                 C   s   t td |  dS )z:register a function to be called before the UI is created.rD   Nr   r   r   r   r   on_before_ui  s    r   c                 C   s   t td |  dS )zregister 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.rF   Nr   r   r   r   r   on_list_optimizers  s    r   c                 C   s   t td |  dS )zregister a function to be called when UI is making a list of alternative options for unet.
    The function will be called with one argument, a list, and shall add objects of type modules.sd_unet.SdUnetOption to it.rG   Nr   r   r   r   r   on_list_unets  s    r   )Gr   rR   collectionsr   typingr   r   r   fastapir   gradior   modulesr   r	   r   r   r   r"   r)   r+   r,   r.   r2   dictrH   rL   rO   rX   rY   r[   r`   ra   rb   rc   rd   re   rf   rg   rh   rl   rm   strro   rr   rs   ru   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   	
	