
    3j)                     ,   S SK r S SKrS SKJr  S SKJrJr  S SKrS SK	r	S SK
r
S SKrS SKr " S S\R                  5      r " S S\R                  5      r " S S	\R                  5      r " S
 S\R                  5      r/ SQr " S S\R                  5      r " S S\R                  5      rS\S\4S jrS\S\S\4S jrS\S\S\\   4S jr " S S\R                  5      r " S S5      r " S S\R                  5      r " S S \5      rS\4S! jrg)"    N)override)ComfyExtensionioc                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)CLIPTextEncodeFlux   c                 ^   [         R                  " SS[         R                  R                  S5      [         R                  R                  SSSS9[         R                  R                  SSSS9[         R
                  R                  SS	S
SSS9/[         R                  R                  5       /S9$ )Nr   model/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_schema CLIPTextEncodeFlux.define_schema   s    yy(.f%		D$O		4Nz3CUQTU	 &&(
 	
    returnc                     UR                  U5      nUR                  U5      S   US'   [        R                  " UR                  USU0S95      $ )Nr   r   )add_dict)tokenizer   
NodeOutputencode_from_tokens_scheduled)r'   r   r   r   r   tokenss         r(   executeCLIPTextEncodeFlux.execute   sM    v&--.w7w}}T>>vQ[]ePf>ghhr+    N)__name__
__module____qualname____firstlineno__classmethodr)   r   r0   r3   encode__static_attributes__r5   r+   r(   r   r      s=    
 
 ir}} i i Fr+   r   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)EmptyFlux2LatentImage%   c                 b   [         R                  " SSS[         R                  R                  SSS[        R
                  SS9[         R                  R                  SSS[        R
                  SS9[         R                  R                  S	S
S
SS9/[         R                  R                  5       /S9$ )Nr>   zEmpty Flux 2 Latentzmodel/latent/fluxwidth      r   height
batch_size      r   r   r   )r   display_namer   r   r   )r   r   Intr!   nodesMAX_RESOLUTIONLatentr%   r&   s    r(   r)   #EmptyFlux2LatentImage.define_schema&   s    yy+.(Wd@T@T[]^XtAUAU\^_\1!F 		  "
 	
r+   r,   c                     [         R                  " USUS-  US-  /[        R                  R	                  5       S9n[
        R                  " SU05      $ )N   rC   )devicesamples)torchzeroscomfymodel_managementintermediate_devicer   r0   )r'   rA   rD   rE   latents        r(   r3   EmptyFlux2LatentImage.execute6   sG    j#v|Ub[IRWRhRhR|R|R~}}i011r+   r5   N)rF   
r6   r7   r8   r9   r:   r)   r   r0   r3   r<   r5   r+   r(   r>   r>   %   s3    
 
 2R]] 2 2r+   r>   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)FluxGuidance;   c                     [         R                  " SS[         R                  R                  S5      [         R                  R                  SSSSSS	9/[         R                  R                  5       /S
9$ )Nr\   r
   conditioningr   r   r   r   r   r   r   )r   r   r$   r!   r#   r%   r&   s    r(   r)   FluxGuidance.define_schema<   sb    yy".%%n5z3CUQTU
 &&(

 
	
r+   r,   c                 `    [         R                  " USU05      n[        R                  " U5      $ Nr   node_helpersconditioning_set_valuesr   r0   )r'   r_   r   cs       r(   r3   FluxGuidance.executeJ   s(    00
H?UV}}Qr+   r5   Nr6   r7   r8   r9   r:   r)   r   r0   r3   appendr<   r5   r+   r(   r\   r\   ;   s:    
 
       Fr+   r\   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)FluxDisableGuidanceR   c                     [         R                  " SSS[         R                  R                  S5      /[         R                  R	                  5       /S9$ )Nrk   r
   zMThis node completely disables the guidance embed on Flux and Flux like modelsr_   r   r   descriptionr   r   )r   r   r$   r!   r%   r&   s    r(   r)   !FluxDisableGuidance.define_schemaS   sJ    yy).g%%n5 &&(

 
	
r+   r,   c                 `    [         R                  " USS 05      n[        R                  " U5      $ rb   rc   )r'   r_   rf   s      r(   r3   FluxDisableGuidance.executea   s(    00
D?QR}}Qr+   r5   Nrh   r5   r+   r(   rk   rk   R   s:    
 
  bmm     Fr+   rk   ))     )    )    )  p  )   0  )@    )p    )  P  )rB   rB   )r   r   )r   r   )r~   r}   )r|   r{   )rz   ry   )rx   rw   )rv   ru   )rt   rs   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)FluxKontextImageScale~   c                     [         R                  " SSS[         R                  R                  S5      /[         R                  R	                  5       /S9$ )Nr   r
   zIThis node resizes the image to one that is more optimal for flux kontext.imagern   )r   r   Imager!   r%   r&   s    r(   r)   #FluxKontextImageScale.define_schema   sF    yy+.cw' !

 
	
r+   r,   c                 0  ^ UR                   S   nUR                   S   nX#-  m[        U4S j[         5       5      u  pBn[        R                  R                  UR                  SS5      X#SS5      R                  SS5      n[        R                  " U5      $ )N   rF   c              3   L   >#    U  H  u  p[        TX-  -
  5      X4v   M     g 7fN)abs).0whaspect_ratios      r(   	<genexpr>0FluxKontextImageScale.execute.<locals>.<genexpr>   s&     kMjTQL15$8 91@Mjs   !$lanczoscenter)	shaper   PREFERRED_KONTEXT_RESOLUTIONSrU   utilscommon_upscalemovedimr   r0   )r'   r   rA   rD   _r   s        @r(   r3   FluxKontextImageScale.execute   s    AQ~kMjkk&**5==Q+?PY[cdllmnprs}}U##r+   r5   N)r6   r7   r8   r9   r:   r)   r   r0   r3   scaler<   r5   r+   r(   r   r   ~   s:    
 
 $r}} $ $ Er+   r   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)%FluxKontextMultiReferenceLatentMethod   c                     [         R                  " SSS[         R                  R                  S5      [         R                  R                  S/ SQSS9/[         R                  R                  5       /SS	9$ )
Nr   zEdit Model Reference Methodr
   r_   reference_latents_method)offsetindexzuxo/unoindex_timestep_zeroT)optionsadvanced)r   rI   r   r   r   is_experimental)r   r   r$   r!   Combor%   r&   s    r(   r)   3FluxKontextMultiReferenceLatentMethod.define_schema   sm    yy;6.%%n5.Q!   &&( !
 	
r+   r,   c                 |    SU;   d  SU;   a  Sn[         R                  " USU05      n[        R                  " U5      $ )Nuxousor   rc   )r'   r_   r   rf   s       r(   r3   -FluxKontextMultiReferenceLatentMethod.execute   sA    ,,9Q0Q',$00@Z\t?uv}}Qr+   r5   Nrh   r5   r+   r(   r   r      s:    
 
&       Fr+   r   musigmac                 t    [         R                  " U5      [         R                  " U5      SU -  S-
  U-  -   -  $ )NrF   )mathexp)tr   r   s      r(   generalized_time_snr_shiftr      s/    88B<488B<1q519*>>??r+   image_seq_len	num_stepsr,   c                     Su  p#Su  pEU S:  a  X@-  U-   n[        U5      $ X@-  U-   nX -  U-   nXx-
  S-  n	USU	-  -
  n
X-  U
-   n[        U5      $ )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      sy    'FB#FBt"$Ry#E"D	A	A	
	B9r+   c                 j    [        X5      n[        R                  " SSU S-   5      n[        X2S5      nU$ )NrF   r   g      ?)r   rS   linspacer   )r   r   r   	timestepss       r(   get_scheduler      s4    	m	7Bq!Y]3I*9#>Ir+   c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)Flux2Scheduler   c                 `   [         R                  " SS[         R                  R                  SSSSS9[         R                  R                  SS	S
[        R
                  SS9[         R                  R                  SS	S
[        R
                  SS9/[         R                  R                  5       /S9$ )Nr   zmodel/sampling/schedulerssteps   rF   rG   rH   rA   rB   rC   r   rD   r   )r   r   rJ   r!   rK   rL   Sigmasr%   r&   s    r(   r)   Flux2Scheduler.define_schema   s    yy$0WbaTBWd@T@T[\]XtAUAU\]^ 		  "
 	
r+   r,   c                 f    X#-  S-  n[        U[        U5      5      n[        R                  " U5      $ )N   )r   roundr   r0   )r'   r   rA   rD   seq_lensigmass         r(   r3   Flux2Scheduler.execute   s-    >W-eU7^4}}V$$r+   r5   NrZ   r5   r+   r(   r   r      s3    
 
 %bmm % %r+   r   c                   &    \ rS rSrS rS rS rSrg)KV_Attn_Input   c                     0 U l         g r   cacheselfs    r(   __init__KV_Attn_Input.__init__   	    
r+   c                    UR                  S/ 5      n[        U5      S:X  a  0 $ [        U5      nSR                  US   US   5      nXR                  ;   a  U R                  U   u  p[
        R                  R                  XR                  S   5      n	[
        R                  R                  XR                  S   5      n
SU l	        U[        R                  " X)4SS9[        R                  " X:4SS9S	.$ US S 2S S 2U* S 24   R                  5       US S 2S S 2U* S 24   R                  5       4U R                  U'   S
U l	        XUS	.$ )Nreference_image_num_tokensr   z{}_{}
block_typeblock_indexFr   )dim)qkvT)getlensumformatr   rU   r   repeat_to_batch_sizer   	set_cacherS   catclone)r   r   r   r   extra_optionskwargsr   ref_toks	cache_keykkvvs              r(   __call__KV_Attn_Input.__call__   s)   %2%6%67SUW%X")*a/I12NN=#>m@\]	

"ZZ	*FB 11"ggajAB11"ggajAB"DNA7!:A7XYAZ[[!"1a(#3!4!:!:!<a1xij@P>Q>W>W>Y Z

9Q''r+   c                     0 U l         g r   r   r   s    r(   cleanupKV_Attn_Input.cleanup  r   r+   )r   r   N)r6   r7   r8   r9   r   r   r   r<   r5   r+   r(   r   r      s    (*r+   r   c                       \ rS rSr\S\R                  4S j5       r\S\R                  R                  S\R                  4S j5       rSrg)FluxKVCachei  r,   c                     [         R                  " SSSSS[         R                  R                  SSS9/[         R                  R	                  S	S9/S
9$ )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   rI   ro   r   r   r   r   )r   r   Modelr!   r%   r&   s    r(   r)   FluxKVCache.define_schema	  sV    yy!(c# w0OP (RS
 	
r+   r  c                 H  ^ UR                  5       n[        5       mU4S jnUR                  T5        UR                  U5        [	        UR
                  R                  S5      (       a  UR                  SS5        OUR                  SS5        [        R                  " U5      $ )Nc                    > [        TR                  5      S:  a8  [        U S   R                  S/ 5      5      nUS:  a  U S   nUS S 2S U* 24   U S'   U $ )Nr   transformer_optionsr   img)r   r   r   r   )r   ref_image_tokensr  input_patch_objs      r(   model_input_patch.FluxKVCache.execute.<locals>.model_input_patch  si    ?(()A-#&v.C'D'H'HIegi'j#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   r0   )r'   r  mr  r
  s       @r(   r3   FluxKVCache.execute  s    KKM'/	 	
0	$$%675;;..99JLabCEZ[}}Qr+   r5   N)r6   r7   r8   r9   r:   r   r   r)   r  Typer0   r3   r<   r5   r+   r(   r   r     sM    
bii 
 
  BHHMM  bmm    r+   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)FluxExtensioni/  r,   c                 ^   #    [         [        [        [        [        [
        [        [        /$ 7fr   )r   r\   rk   r   r   r>   r   r   r   s    r(   get_node_listFluxExtension.get_node_list0  s)      !1!	
 		
s   +-r5   N)r6   r7   r8   r9   r   listtyper   	ComfyNoder  r<   r5   r+   r(   r  r  /  s)    

T$r||*<%= 

 

r+   r  c                     #    [        5       $ 7fr   )r  r5   r+   r(   comfy_entrypointr  >  s     ?s   ) rd   comfy.utilsrU   typing_extensionsr   comfy_api.latestr   r   comfy.model_managementrS   r   rK   comfy.ldm.flux.mathr  r   r>   r\   rk   r   r   r   r   r   intr   r  r   r   r   r   r  r  r5   r+   r(   <module>r&     s     & /      42BLL 2,2<< .",, .! *BLL 6BLL >@e @E @   $C  U %R\\ %, :% ",, % N
N 
 r+   