
    +j                     <   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlm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 de
j                  Z G d de	          ZdefdZdS )    N)override)ComfyExtensionio)SkipLayerGuidanceDiTc                   N    e Zd Zed             Zedej        fd            ZeZdS )TripleCLIPLoaderc                    t          j        dddt           j                            dt	          j        d                    t           j                            dt	          j        d                    t           j                            dt	          j        d                    gt           j                                        g	          S )
Nr   zadvanced/loadersz"[Recipes]

sd3: clip-l, clip-g, t5
clip_name1text_encoders)options
clip_name2
clip_name3)node_id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_schemazTripleCLIPLoader.define_schema   s    y&'>|\5STc5d5dee|\5STc5d5dee|\5STc5d5dee   
 
 
 	
    returnc                    t          j        d|          }t          j        d|          }t          j        d|          }t          j                            |||gt          j        d                    }t          j        |          S )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   executezTripleCLIPLoader.execute   s    !8*UU
!8*UU
!8*UU
x!!j*j-Qgs  hE  FR  hS  hS!  T  T}T"""r   N)	__name__
__module____qualname__classmethodr   r   r*   r/   r(    r   r   r   r      sW        
 
 [
 #BM # # # [# IIIr   r   c                   P    e Zd Zed             Zeddej        fd            ZeZdS )EmptySD3LatentImagec                 d   t          j        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 )Nr6   zmodel/latent/sd3widthi      defaultminmaxstepheight
batch_size   i   )r;   r<   r=   )r   r   r   r   )r   r   Intr   nodesMAX_RESOLUTIONLatentr   r   s    r   r   z!EmptySD3LatentImage.define_schema(   s    y)'Wd@T[]^^XtAU\^__\1!FF 	  ""
 
 
 	
r   rA   r    c                     t          j        |d|dz  |dz  gt          j                                        t          j                                                  }t          j        |dd          S )Nr9      )devicedtype)samplesdownscale_ratio_spacial)torchzerosr&   model_managementintermediate_deviceintermediate_dtyper   r*   )r   r8   r?   r@   latents        r   r/   zEmptySD3LatentImage.execute7   s    j"fk5A:FuOeOyOyO{O{  DI  DZ  Dm  Dm  Do  Do  p  p  p}ANNOOOr   N)rA   )	r0   r1   r2   r3   r   r   r*   r/   generater4   r   r   r6   r6   '   sb        
 
 [
 P PR] P P P [P HHHr   r6   c                   N    e Zd Zed             Zedej        fd            ZeZdS )CLIPTextEncodeSD3c                    t          j        ddgdt           j                            d          t           j                            ddd          t           j                            ddd          t           j                            d	dd          t           j                            d
ddgd          gt           j                                        g          S )NrT   z
sd3 promptzadvanced/conditioningr.   clip_lT)	multilinedynamic_promptsclip_gt5xxlempty_paddingnoneempty_prompt)r   advanced)r   search_aliasesr   r   r   )r   r   r   r   Stringr   Conditioningr   r   s    r   r   zCLIPTextEncodeSD3.define_schema@   s    y'(>,f%%	D$OO	D$OO	4NN8P[_`` &&((
 
 
 	
r   r    c                    |dk    }|                     |          }t          |          dk    r|rg |d<   t          |          dk    r|rg |d<   n|                     |          d         |d<   t          |          dk    r|rg |d<   n|                     |          d         |d<   t          |d                   t          |d                   k    r|                     d          }t          |d                   t          |d                   k     rB|dxx         |d         z  cc<   t          |d                   t          |d                   k     Bt          |d                   t          |d                   k    rB|dxx         |d         z  cc<   t          |d                   t          |d                   k    Bt          j        |                    |                    S )Nr\   r   glrZ    )tokenizelenr   r*   encode_from_tokens_scheduled)	r   r.   rV   rY   rZ   r[   
no_paddingtokensemptys	            r   r/   zCLIPTextEncodeSD3.executeR   s   "f,
v&&v;;!
F3Kv;;!
F3KK--//4F3Ku::??z?!F7OO"mmE227;F7Ovc{s6#;////MM"%%EfSk""S%5%555suSz) fSk""S%5%555fSk""S%5%555suSz) fSk""S%5%555}T>>vFFGGGr   N)	r0   r1   r2   r3   r   r   r*   r/   encoder4   r   r   rT   rT   ?   s\        
 
 [
" HBM H H H [H0 FFFr   rT   c                   `    e Zd Zedej        fd            Zeddej        fd            ZeZ	dS )ControlNetApplySD3r    c                    t          j        dddt           j                            d          t           j                            d          t           j                            d          t           j                            d          t           j                            d          t           j                            d	d
ddd          t           j                            dddd
d          t           j                            dd
dd
d          gt           j                            d          t           j                            d          gd          S )Nrn   zApply Controlnet with VAEzmodel/conditioning/controlnetpositivenegativecontrol_netvaeimagestrength      ?              $@{Gz?r:   start_percentMbP?end_percent)display_nameT)r   r}   r   r   r   is_deprecated)	r   r   ra   r   
ControlNetVaeImageFloatr   r   s    r   r   z ControlNetApplySD3.define_schemao   s   y(44%%j11%%j11##M22U##w''z3CTPTUU#TYZZ}csRWXX	 &&J&??&&J&?? %
 
 
 	
r   Nc	           	      P   |dk    rt          j        ||          S |                    dd          }	i }
g }||fD ]}g }|D ]}|d                                         }|                    dd           }||
v r	|
|         }nH|                                                    |	|||f|g           }|                    |           ||
|<   ||d<   d|d<   |d         |g}|                    |           |                    |           t          j        |d         |d                   S )Nr   rA   control)rs   extra_concatFcontrol_apply_to_uncond)r   r*   movedimcopygetset_cond_hintset_previous_controlnetappend)r   rp   rq   rr   rt   ru   rz   r|   rs   control_hintcnetsoutconditioningctd	prev_cnetc_netns                      r   r/   zControlNetApplySD3.execute   sS   q===8444}}R++%x0 	 	LA!  aDIIKKEE)T22	%%!),EE',,..<<\8VcepUqADSU = W WE11)<<<',E)$$)/4+,qT1IJJqMMMM}SVSV,,,r   N)
r0   r1   r2   r3   r   r   r   r*   r/   apply_controlnetr4   r   r   rn   rn   n   so        
bi 
 
 
 [
, - -prp} - - - [-: r   rn   c                   R    e Zd ZdZed             Zedej        fd            ZeZ	dS )SkipLayerGuidanceSD3z
    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                    t          j        dddt           j                            d          t           j                            dddd	          t           j                            d
dddd          t           j                            dddddd          t           j                            dddddd          gt           j                                        gd          S )Nr   zadvanced/guidancezNGeneric version of SkipLayerGuidance node that can be used on every DiT model.modellayersz7, 8, 9FT)r;   rW   r^   scaleg      @rw   rx   g?r:   rz   ry   rv   r{   )r;   r<   r=   r>   r^   r|   g333333?)r   r   r   r   r   is_experimental)r   r   Modelr   r`   r   r   r   s    r   r   z"SkipLayerGuidanceSD3.define_schema   s    y*(hw''	)uW[\\w$SQQ#3UZeijj}dSXcghh !! !
 
 
 	
r   r    c                 N    t                                          |||||          S )N)r   r   rz   r|   double_layers)r   r/   )r   r   r   r   rz   r|   s         r   r/   zSkipLayerGuidanceSD3.execute   s7    #%%--EVcq|  MS-  T  T  	Tr   N)
r0   r1   r2   __doc__r3   r   r   r*   r/   skip_guidance_sd3r4   r   r   r   r      sk          
 
 [
$ T"- T T T [T  r   r   c                   L    e Zd Zedeeej                          fd            ZdS )SD3Extensionr    c                 F   K   t           t          t          t          t          gS r   )r   r6   rT   rn   r   )selfs    r   get_node_listzSD3Extension.get_node_list   s!        
 	
r   N)	r0   r1   r2   r   listtyper   	ComfyNoder   r4   r   r   r   r      sE        
T$r|*<%= 
 
 
 X
 
 
r   r   r    c                  "   K   t                      S r   )r   r4   r   r   comfy_entrypointr      s      >>r   )r   comfy.sdr&   comfy.model_managementrC   rL   typing_extensionsr   comfy_api.latestr   r   comfy_extras.nodes_slgr   r   r   r6   rT   rn   r   r   r   r4   r   r   <module>r      s              & & & & & & / / / / / / / / 7 7 7 7 7 7    r|   8    ",   0, , , , , , , ,^6 6 6 6 6 6 6 6r         2<      B	
 	
 	
 	
 	
> 	
 	
 	
      r   