
    +jk(                        d dl Z d dlZd dlmZ d dlmZmZ d dlZd dl	Z	d dl
Z
d dlZd dlZ G d dej                  Z G d dej                  Z G d d	ej                  Z G d
 dej                  Zg dZ G d dej                  Z G d dej                  ZdedefdZdededefdZdededee         fdZ G d dej                  Z G d d          Z G d dej                  Z G d d e          Zdefd!ZdS )"    N)override)ComfyExtensionioc                   N    e Zd Zed             Zedej        fd            ZeZdS )CLIPTextEncodeFluxc                 r   t          j        ddt           j                            d          t           j                            ddd          t           j                            ddd          t           j                            dd	d
dd          gt           j                                        g          S )Nr   advanced/conditioning/fluxclipclip_lT)	multilinedynamic_promptst5xxlguidance      @              Y@皙?defaultminmaxstepnode_idcategoryinputsoutputs)r   SchemaClipInputStringFloatConditioningOutputclss    7/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_flux.pydefine_schemaz CLIPTextEncodeFlux.define_schema   s    y(1f%%	D$OO	4NNz3CUQTUU	 &&((
 
 
 	
    returnc                     |                     |          }|                     |          d         |d<   t          j        |                    |d|i                    S )Nr   r   )add_dict)tokenizer   
NodeOutputencode_from_tokens_scheduled)r&   r
   r   r   r   tokenss         r'   executezCLIPTextEncodeFlux.execute   sW    v&&--..w7w}T>>vQ[]ePf>gghhhr)   N)	__name__
__module____qualname__classmethodr(   r   r.   r1   encode r)   r'   r   r      s\        
 
 [
 ir} i i i [i FFFr)   r   c                   L    e Zd Zed             Zeddej        fd            ZdS )EmptyFlux2LatentImagec                 f   t          j        dddt           j                            dddt          j        d          t           j                            dddt          j        d          t           j                            d	d
d
d          gt           j                                        g          S )Nr9   zEmpty Flux 2 Latentzmodel/latentwidth      r   height
batch_size      r   r   r   )r   display_namer   r   r   )r   r   Intr    nodesMAX_RESOLUTIONLatentr$   r%   s    r'   r(   z#EmptyFlux2LatentImage.define_schema&   s    y+.#Wd@T[]^^XtAU\^__\1!FF 	  ""
 
 
 	
r)   r@   r*   c                     t          j        |d|dz  |dz  gt          j                                                  }t          j        d|i          S )N   r=   )devicesamples)torchzeroscomfymodel_managementintermediate_devicer   r.   )r&   r;   r>   r?   latents        r'   r1   zEmptyFlux2LatentImage.execute6   sL    j#v|Ub[IRWRhR|R|R~R~}i0111r)   N)r@   r2   r3   r4   r5   r(   r   r.   r1   r7   r)   r'   r9   r9   %   s[        
 
 [
 2 2R] 2 2 2 [2 2 2r)   r9   c                   N    e Zd Zed             Zedej        fd            ZeZdS )FluxGuidancec                     t          j        ddt           j                            d          t           j                            ddddd	          gt           j                                        g
          S )NrT   r	   conditioningr   r   r   r   r   r   r   )r   r   r#   r    r"   r$   r%   s    r'   r(   zFluxGuidance.define_schema<   sm    y"1%%n55z3CUQTUU
 &&((

 

 

 
	
r)   r*   c                 X    t          j        |d|i          }t          j        |          S Nr   node_helpersconditioning_set_valuesr   r.   )r&   rV   r   cs       r'   r1   zFluxGuidance.executeJ   s)    0
H?UVV}Qr)   N	r2   r3   r4   r5   r(   r   r.   r1   appendr7   r)   r'   rT   rT   ;   sW        
 
 [
         [  FFFr)   rT   c                   N    e Zd Zed             Zedej        fd            ZeZdS )FluxDisableGuidancec                     t          j        dddt           j                            d          gt           j                                        g          S )Nr`   r	   zMThis node completely disables the guidance embed on Flux and Flux like modelsrV   r   r   descriptionr   r   )r   r   r#   r    r$   r%   s    r'   r(   z!FluxDisableGuidance.define_schemaS   sT    y)1g%%n55 &&((

 

 

 
	
r)   r*   c                 X    t          j        |dd i          }t          j        |          S rX   rY   )r&   rV   r\   s      r'   r1   zFluxDisableGuidance.executea   s)    0
D?QRR}Qr)   Nr]   r7   r)   r'   r`   r`   R   sW        
 
 [
  bm       [  FFFr)   r`   ))     )    )    )  p  )   0  )@    )p    )  P  )r<   r<   )rt   rs   )rr   rq   )rp   ro   )rn   rm   )rl   rk   )rj   ri   )rh   rg   )rf   re   c                   N    e Zd Zed             Zedej        fd            ZeZdS )FluxKontextImageScalec                     t          j        dddt           j                            d          gt           j                                        g          S )Nrv   r	   zIThis node resizes the image to one that is more optimal for flux kontext.imagerb   )r   r   Imager    r$   r%   s    r'   r(   z#FluxKontextImageScale.define_schema   sP    y+1cw'' !!

 

 

 
	
r)   r*   c                 H   |j         d         }|j         d         }||z  t          fdt          D                       \  }}}t          j                            |                    dd          ||dd                              dd          }t          j        |          S )N   r@   c              3   N   K   | ]\  }}t          ||z  z
            ||fV   d S N)abs).0whaspect_ratios      r'   	<genexpr>z0FluxKontextImageScale.execute.<locals>.<genexpr>   s?      kkTQL1q5$8 9 91a@kkkkkkr)   lanczoscenter)	shaper   PREFERRED_KONTEXT_RESOLUTIONSrN   utilscommon_upscalemovedimr   r.   )r&   rx   r;   r>   _r   s        @r'   r1   zFluxKontextImageScale.execute   s    AQv~kkkkMjkkkkk5&**5==Q+?+?PY[cddllmnprss}U###r)   N)	r2   r3   r4   r5   r(   r   r.   r1   scaler7   r)   r'   rv   rv   ~   sW        
 
 [
 $r} $ $ $ [$ EEEr)   rv   c                   N    e Zd Zed             Zedej        fd            ZeZdS )%FluxKontextMultiReferenceLatentMethodc                     t          j        dddt           j                            d          t           j                            dg dd          gt           j                                        gd	          S )
Nr   zEdit Model Reference Methodr	   rV   reference_latents_method)offsetindexzuxo/unoindex_timestep_zeroT)optionsadvanced)r   rC   r   r   r   is_experimental)r   r   r#   r    Combor$   r%   s    r'   r(   z3FluxKontextMultiReferenceLatentMethod.define_schema   s    y;61%%n55.QQQ!    &&(( !
 
 
 	
r)   r*   c                 l    d|v sd|v rd}t          j        |d|i          }t          j        |          S )Nuxousor   rY   )r&   rV   r   r\   s       r'   r1   z-FluxKontextMultiReferenceLatentMethod.execute   sH    ,,,9Q0Q0Q',$0@Z\t?uvv}Qr)   Nr]   r7   r)   r'   r   r      sW        
 
 [
&         [  FFFr)   r   musigmac                 l    t          j        |          t          j        |          d| z  dz
  |z  z   z  S )Nr@   )mathexp)tr   r   s      r'   generalized_time_snr_shiftr      s/    8B<<48B<<1q519*>>??r)   image_seq_len	num_stepsr*   c                     d\  }}d\  }}| dk    r|| z  |z   }t          |          S || z  |z   }|| z  |z   }||z
  dz  }	|d|	z  z
  }
|	|z  |
z   }t          |          S )N)gT	?gŒ_?)g w:/&?gDw:?i  g     g@g      i@)float)r   r   a1b1a2b2r   m_200m_10abs              r'   compute_empirical_mur      s    'FB#FBt-"$Ryy#E"D	A	A	
Y	B99r)   c                 z    t          ||           }t          j        dd| dz             }t          ||d          }|S )Nr@   r   g      ?)r   rL   linspacer   )r   r   r   	timestepss       r'   get_scheduler      s?    	mY	7	7Bq!Y]33I*9b#>>Ir)   c                   J    e Zd Zed             Zedej        fd            ZdS )Flux2Schedulerc                 d   t          j        ddt           j                            dddd          t           j                            dd	d
t          j        d          t           j                            dd	d
t          j        d          gt           j                                        g          S )Nr   zmodel/sampling/schedulerssteps   r@   rA   rB   r;   r<   r=   r   r>   r   )r   r   rD   r    rE   rF   Sigmasr$   r%   s    r'   r(   zFlux2Scheduler.define_schema   s    y$0WbaTBBWd@T[\]]XtAU\]^^ 	  ""
 
 
 	
r)   r*   c                 t    ||z  dz  }t          |t          |                    }t          j        |          S )N   )r   roundr   r.   )r&   r   r;   r>   seq_lensigmass         r'   r1   zFlux2Scheduler.execute   s5    6>W-eU7^^44}V$$$r)   NrR   r7   r)   r'   r   r      sV        
 
 [
 %bm % % % [% % %r)   r   c                        e Zd Zd Zd Zd ZdS )KV_Attn_Inputc                     i | _         d S r}   cacheselfs    r'   __init__zKV_Attn_Input.__init__       


r)   c                    |                     dg           }t          |          dk    ri S t          |          }d                    |d         |d                   }|| j        v rI| j        |         \  }	}
d| _        |t          j        ||	fd          t          j        ||
fd          d	S |d d d d | d f                                         |d d d d | d f                                         f| j        |<   d
| _        |||d	S )Nreference_image_num_tokensr   z{}_{}
block_typeblock_indexFr{   )dim)qkvT)	getlensumformatr   	set_cacherL   catclone)r   r   r   r   extra_optionskwargsr   ref_toks	cache_keykkvvs              r'   __call__zKV_Attn_Input.__call__   s-   %2%6%67SUW%X%X")**a//I122NN=#>m@\]]	
""Z	*FB"DNAr7!:!:!:Ar7XYAZAZAZ[[[!"111aaa(#3!4!:!:!<!<a111xijj@P>Q>W>W>Y>Y Z
9QQ'''r)   c                     i | _         d S r}   r   r   s    r'   cleanupzKV_Attn_Input.cleanup   r   r)   N)r2   r3   r4   r   r   r   r7   r)   r'   r   r      sA          ( ( (     r)   r   c                   r    e Zd Zedej        fd            Zedej        j        dej	        fd            Z
dS )FluxKVCacher*   c                     t          j        dddddt           j                            dd          gt           j                            d	          g
          S )Nr   zFlux KV CachezIEnables KV Cache optimization for reference images on Flux family models.experimentalTmodelzThe model to use KV Cache on.)tooltipz(The patched model with KV Cache enabled.)r   rC   rc   r   r   r   r   )r   r   Modelr    r$   r%   s    r'   r(   zFluxKVCache.define_schema  s`    y!(c# w0OPP (RSS
 
 
 	
r)   r   c                 \   |                                 }t                      fd}|                               |                    |           t	          |j        j        d          r|                    dd           n|                    dd           t          j	        |          S )Nc                     t          j                  dk    rIt          | d                             dg                     }|dk    r| d         }|d d d | f         | d<   | S )Nr   transformer_optionsr   img)r   r   r   r   )r   ref_image_tokensr   input_patch_objs      r'   model_input_patchz.FluxKVCache.execute.<locals>.model_input_patch  sy    ?())A--#&v.C'D'H'HIegi'j'j#k#k #a'' -C$'+=-=,=+=(=$>F5MMr)   paramsz)diffusion_model.params.default_ref_methodr   z"diffusion_model.default_ref_method)
r   r   set_model_attn1_patchset_model_post_input_patchhasattrr   diffusion_modeladd_object_patchr   r.   )r&   r   mr   r   s       @r'   r1   zFluxKVCache.execute  s    KKMM'//	 	 	 	 	 	
000	$$%67775;.99 	\JLabbbbCEZ[[[}Qr)   N)r2   r3   r4   r5   r   r   r(   r   Typer.   r1   r7   r)   r'   r   r     so        
bi 
 
 
 [
  BHM  bm       [     r)   r   c                   L    e Zd Zedeeej                          fd            ZdS )FluxExtensionr*   c                 j   K   t           t          t          t          t          t
          t          t          gS r}   )r   rT   r`   rv   r   r9   r   r   r   s    r'   get_node_listzFluxExtension.get_node_list+  s*       !1!	
 		
r)   N)	r2   r3   r4   r   listtyper   	ComfyNoder   r7   r)   r'   r   r   *  sE        

T$r|*<%= 

 

 

 X

 

 

r)   r   c                  "   K   t                      S r}   )r   r7   r)   r'   comfy_entrypointr   9  s      ??r)   ) rZ   comfy.utilsrN   typing_extensionsr   comfy_api.latestr   r   comfy.model_managementrL   r   rE   comfy.ldm.flux.mathr   r   r9   rT   r`   r   rv   r   r   r   intr   r   r   r   r   r   r   r   r7   r)   r'   <module>r     s           & & & & & & / / / / / / / /                  42 2 2 2 2BL 2 2 2,    2<   .    ",   .! ! ! *    BL   6    BL   >@e @E @ @ @ @      $C  U    % % % % %R\ % % %,       0%  %  %  %  % ", %  %  % N
 
 
 
 
N 
 
 
      r)   