
    3jf                      J   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
  S SKJr   " S S\
R                  5      r " S S\
R                  5      r " S	 S
\
R                  5      r " S S\
R                  5      r " S S\
R                  5      r " S S\	5      rS\4S jrg)    N)override)ComfyExtensionio)SkipLayerGuidanceDiTc                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)TripleCLIPLoader   c                    [         R                  " SSSS[         R                  R                  S[        R
                  " S5      S9[         R                  R                  S[        R
                  " S5      S9[         R                  R                  S	[        R
                  " S5      S9/[         R                  R                  5       /S
9$ )Nr   zLoad CLIP (Triple)zmodel/loadersz Recipes:
sd3: clip-l, clip-g, t5
clip_name1text_encoders)options
clip_name2
clip_name3)node_iddisplay_namecategorydescriptioninputsoutputs)r   SchemaComboInputfolder_pathsget_filename_listClipOutputclss    6/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_sd3.pydefine_schemaTripleCLIPLoader.define_schema   s    yy&-$;|\5S5STc5de|\5S5STc5de|\5S5STc5de  
 	
    returnc                     [         R                  " SU5      n[         R                  " SU5      n[         R                  " SU5      n[        R                  R	                  XEU/[         R
                  " S5      S9n[        R                  " U5      $ )Nr   
embeddings)
ckpt_pathsembedding_directory)r   get_full_path_or_raisecomfysd	load_clipget_folder_pathsr   
NodeOutput)r   r   r   r   
clip_path1
clip_path2
clip_path3clips           r   executeTripleCLIPLoader.execute   s    !88*U
!88*U
!88*U
xx!!jj-Qgs  hE  hE  FR  hS!  T}}T""r"    N)__name__
__module____qualname____firstlineno__classmethodr    r   r-   r2   r+   __static_attributes__r4   r"   r   r   r      s:    
 
  #BMM # # Ir"   r   c                   X    \ rS rSr\S 5       r\SS\R                  4S jj5       r\r	Sr
g)EmptySD3LatentImage(   c                 `   [         R                  " 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model/latent/stable diffusionwidthi      defaultminmaxstepheight
batch_size   i   )rB   rC   rD   )r   r   r   r   )r   r   Intr   nodesMAX_RESOLUTIONLatentr   r   s    r   r    !EmptySD3LatentImage.define_schema)   s    yy)4Wd@T@T[]^XtAUAU\^_\1!F 		  "
 	
r"   r#   c                     [         R                  " USUS-  US-  /[        R                  R	                  5       [        R                  R                  5       S9n[        R                  " USS.5      $ )Nr@      )devicedtype)samplesdownscale_ratio_spacial)torchzerosr)   model_managementintermediate_deviceintermediate_dtyper   r-   )r   r?   rF   rG   latents        r   r2   EmptySD3LatentImage.execute8   ss    j"fk5A:FuOeOeOyOyO{  DI  DZ  DZ  Dm  Dm  Do  p}}ANOOr"   r4   N)rH   )r5   r6   r7   r8   r9   r    r   r-   r2   generater:   r4   r"   r   r<   r<   (   s=    
 
 PR]] P P Hr"   r<   c                   T    \ rS rSr\S 5       r\S\R                  4S j5       r\r	Sr
g)CLIPTextEncodeSD3@   c                    [         R                  " SS/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9[         R
                  R                  SSS/SS9/[         R                  R                  5       /S9$ )Nr]   z
sd3 promptzCLIP Text Encode (SD3)z#model/conditioning/stable diffusionr1   clip_lT)	multilinedynamic_promptsclip_gt5xxlempty_paddingnoneempty_prompt)r   advanced)r   search_aliasesr   r   r   r   )r   r   r   r   Stringr   Conditioningr   r   s    r   r    CLIPTextEncodeSD3.define_schemaA   s    yy'(>1:f%		D$O		D$O		4N8P[_` &&(
 	
r"   r#   c                    US:H  nUR                  U5      n[        U5      S:X  a  U(       a  / US'   [        U5      S:X  a  U(       a  / US'   OUR                  U5      S   US'   [        U5      S:X  a  U(       a  / US'   OUR                  U5      S   US'   [        US   5      [        US   5      :w  a  UR                  S5      n[        US   5      [        US   5      :  a0  US==   US   -  ss'   [        US   5      [        US   5      :  a  M0  [        US   5      [        US   5      :  a0  US==   US   -  ss'   [        US   5      [        US   5      :  a  M0  [        R                  " UR	                  U5      5      $ )Nrf   r   glrd    )tokenizelenr   r-   encode_from_tokens_scheduled)	r   r1   r`   rc   rd   re   
no_paddingtokensemptys	            r   r2   CLIPTextEncodeSD3.executeT   s^   "f,
v&v;!
F3Kv;!
F3K--/4F3Ku:?z!F7O"mmE27;F7Ovc{s6#;//MM"%EfSk"S%55suSz) fSk"S%55fSk"S%55suSz) fSk"S%55}}T>>vFGGr"   r4   N)r5   r6   r7   r8   r9   r    r   r-   r2   encoder:   r4   r"   r   r]   r]   @   s=    
 
$ HBMM H H0 Fr"   r]   c                   t    \ rS rSr\S\R                  4S j5       r\SS\R                  4S jj5       r	\	r
Srg)ControlNetApplySD3p   r#   c                    [         R                  " SSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S5      [         R
                  R                  S5      [         R                  R                  S5      [         R                  R                  S	S
SSSS9[         R                  R                  SSSS
SS9[         R                  R                  SS
SS
SS9/[         R                  R                  SS9[         R                  R                  SS9/SS9$ )Nrz   zApply Controlnet with VAEzmodel/conditioning/controlnetpositivenegativecontrol_netvaeimagestrength      ?              $@{Gz?rA   start_percentMbP?end_percent)r   T)r   r   r   r   r   is_deprecated)	r   r   rk   r   
ControlNetVaeImageFloatr   r   s    r   r     ControlNetApplySD3.define_schemaq   s    yy(44%%j1%%j1##M2U#w'z3CTPTU#TYZ}csRWX	 &&J&?&&J&? %
 	
r"   Nc	           
          US:X  a  [         R                  " X5      $ UR                  SS5      n	0 n
/ nX4 H  n/ nU H  nUS   R                  5       nUR	                  SS 5      nUU
;   a  U
U   nO7UR                  5       R                  XXg4U/ S9nUR                  U5        UU
U'   UUS'   SUS'   US   U/nUR                  U5        M     UR                  U5        M     [         R                  " US   US   5      $ )Nr   rH   control)r   extra_concatFcontrol_apply_to_uncond)r   r-   movedimcopygetset_cond_hintset_previous_controlnetappend)r   r}   r~   r   r   r   r   r   r   control_hintcnetsoutconditioningctd	prev_cnetc_netns                      r   r2   ControlNetApplySD3.execute   s   q===44}}R+%0LA!aDIIKEE)T2	%!),E',,.<<\VcUqADSU = WE11)<',E)$$)/4+,qT1I "  JJqM% 1& }}SVSV,,r"   r4   N)r5   r6   r7   r8   r9   r   r   r    r-   r2   apply_controlnetr:   r4   r"   r   rz   rz   p   sI    
bii 
 
, -prp}p} - -: r"   rz   c                   X    \ rS rSrSr\S 5       r\S\R                  4S j5       r	\	r
Srg)SkipLayerGuidanceSD3   z
Enhance guidance towards detailed dtructure by having another set of CFG negative with skipped layers.
Inspired by Perturbed Attention Guidance (https://arxiv.org/abs/2403.17377)
Experimental implementation by Dango233@StabilityAI.
c                    [         R                  " SSS[         R                  R                  S5      [         R                  R                  SSSSS	9[         R
                  R                  S
SSSSS9[         R
                  R                  SSSSSSS9[         R
                  R                  SSSSSSS9/[         R                  R                  5       /SS9$ )Nr   zadvanced/guidancezNGeneric version of SkipLayerGuidance node that can be used on every DiT model.modellayersz7, 8, 9FT)rB   ra   rh   scaleg      @r   r   g?rA   r   r   r   r   )rB   rC   rD   rE   rh   r   g333333?)r   r   r   r   r   is_experimental)r   r   Modelr   rj   r   r   r   s    r   r    "SkipLayerGuidanceSD3.define_schema   s    yy*(hw'		)uW[\w$SQ#3UZeij}dSXcgh ! !
 	
r"   r#   c                 4    [        5       R                  XXEUS9$ )N)r   r   r   r   double_layers)r   r2   )r   r   r   r   r   r   s         r   r2   SkipLayerGuidanceSD3.execute   s)    #%--EVc  MS-  T  	Tr"   r4   N)r5   r6   r7   r8   __doc__r9   r    r   r-   r2   skip_guidance_sd3r:   r4   r"   r   r   r      sE     
 
$ T"-- T T  r"   r   c                   L    \ rS rSr\S\\\R                        4S j5       r	Sr
g)SD3Extension   r#   c                 @   #    [         [        [        [        [        /$ 7fr   )r   r<   r]   rz   r   )selfs    r   get_node_listSD3Extension.get_node_list   s        
 	
s   r4   N)r5   r6   r7   r8   r   listtyper   	ComfyNoder   r:   r4   r"   r   r   r      s)    
T$r||*<%= 
 
r"   r   r#   c                     #    [        5       $ 7fr   )r   r4   r"   r   comfy_entrypointr      s     >s   )r   comfy.sdr)   comfy.model_managementrJ   rT   typing_extensionsr   comfy_api.latestr   r   comfy_extras.nodes_slgr   r   r   r<   r]   rz   r   r   r   r4   r"   r   <module>r      s         & / 7r|| :",, 0- -`6 6r 2<<  B	
> 	
 r"   