
    3j6                     b   S SK rS SKrS SKrS SKr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5      r " S S5      r " S S5      r " S	 S
5      r " S S5      r " S S5      r " S S5      rSS jr " S S5      r " S S5      r " S S5      r " S S5      r\\\\\\\\\\\S.rSS0rg)    N)argsc                   6    \ rS rSr\S 5       rSrSrSrS r	Sr
g)	ModelMergeSimple   c           	           SSSSSSSSS.4S.0$ )	NrequiredMODELFLOAT      ?        {Gz?defaultminmaxstep)model1model2ratio ss    @/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_model_merging.pyINPUT_TYPESModelMergeSimple.INPUT_TYPES   s,    
(2(/SUXbf1g'h  ! 	!    r	   mergemodel/mergingc                     UR                  5       nUR                  S5      nU H  nUR                  XeU   0SU-
  U5        M     U4$ Ndiffusion_model.r   cloneget_key_patchesadd_patches)selfr   r   r   mkpks          r   r   ModelMergeSimple.merge   sI    LLN##$67AMM1e*cEk59 ur   r   N__name__
__module____qualname____firstlineno__classmethodr   RETURN_TYPESFUNCTIONCATEGORYr   __static_attributes__r   r   r   r   r      *    ! !
 LHHr   r   c                   6    \ rS rSr\S 5       rSrSrSrS r	Sr
g)	ModelSubtract!   c           	           SSSSSSSSS.4S	.0$ )
Nr   r	   r   r         $      $@r   r   )r   r   
multiplierr   r   s    r   r   ModelSubtract.INPUT_TYPES"   s,    
(2-4#e\`jn6o,p  ! 	!r   r	   r   r   c                     UR                  5       nUR                  S5      nU H  nUR                  XeU   0U* U5        M     U4$ )Nr"   r#   )r'   r   r   r=   r(   r)   r*   s          r   r   ModelSubtract.merge-   sG    LLN##$67AMM1e*
lJ? ur   r   Nr,   r   r   r   r8   r8   !   r6   r   r8   c                   6    \ rS rSr\S 5       rSrSrSrS r	Sr
g)	ModelAdd4   c                     SSSS.0$ )Nr   r	   )r   r   r   r   s    r   r   ModelAdd.INPUT_TYPES5   s    
(2  ! 	!r   r	   r   r   c                     UR                  5       nUR                  S5      nU H  nUR                  XTU   0SS5        M     U4$ r!   r#   )r'   r   r   r(   r)   r*   s         r   r   ModelAdd.merge?   sE    LLN##$67AMM1e*c3/ ur   r   Nr,   r   r   r   rB   rB   4   s*    ! ! LHHr   rB   c                   6    \ rS rSr\S 5       rSrSrSrS r	Sr
g)	CLIPMergeSimpleG   c           	           SSSSSSSSS.4S.0$ )	Nr   CLIPr   r   r   r   r   )clip1clip2r   r   r   s    r   r   CLIPMergeSimple.INPUT_TYPESH   s,    y'0(/SUXbf1g'h  ! 	!r   rL   r   r   c                     UR                  5       nUR                  5       nU HK  nUR                  S5      (       d  UR                  S5      (       a  M1  UR                  XeU   0SU-
  U5        MM     U4$ N.position_ids.logit_scaler   r$   r%   endswithr&   )r'   rN   rO   r   r(   r)   r*   s          r   r   CLIPMergeSimple.mergeS   sh    KKM""$Azz/**ajj.H.HMM1e*cEk59  ur   r   Nr,   r   r   r   rI   rI   G   s*    ! !
 LHHr   rI   c                   >    \ rS rSrSS/r\S 5       rSrSrSr	S r
S	rg
)CLIPSubtract]   zclip differenceztext encoder subtractc           	           SSSSSSSSS.4S	.0$ )
Nr   rL   r   r   r;   r<   r   r   )rN   rO   r=   r   r   s    r   r   CLIPSubtract.INPUT_TYPES_   s,    y'0-4#e\`jn6o,p  ! 	!r   rL   r   r   c                     UR                  5       nUR                  5       nU HI  nUR                  S5      (       d  UR                  S5      (       a  M1  UR                  XeU   0U* U5        MK     U4$ )NrS   rT   rU   )r'   rN   rO   r=   r(   r)   r*   s          r   r   CLIPSubtract.mergej   sf    KKM""$Azz/**ajj.H.HMM1e*
lJ?  ur   r   Nr-   r.   r/   r0   SEARCH_ALIASESr1   r   r2   r3   r4   r   r5   r   r   r   rY   rY   ]   s5    ')@AN! !
 LHHr   rY   c                   <    \ rS rSrS/r\S 5       rSrSrSr	S r
Srg	)
CLIPAddt   zcombine clipc                     SSSS.0$ )Nr   rL   )rN   rO   r   r   s    r   r   CLIPAdd.INPUT_TYPESv   s    y'0  ! 	!r   rL   r   r   c                     UR                  5       nUR                  5       nU HH  nUR                  S5      (       d  UR                  S5      (       a  M1  UR                  XTU   0SS5        MJ     U4$ rR   rU   )r'   rN   rO   r(   r)   r*   s         r   r   CLIPAdd.merge   sd    KKM""$Azz/**ajj.H.HMM1e*c3/  ur   r   Nr_   r   r   r   rb   rb   t   s2    $%N! ! LHHr   rb   c                   6    \ rS rSr\S 5       rSrSrSrS r	Sr
g)	ModelMergeBlocks   c                 @    SSSSSSSSS.4SSSSSS.4SSSSSS.4S.0$ )	Nr   r	   r   r   r   r   r   )r   r   inputmiddleoutr   r   s    r   r   ModelMergeBlocks.INPUT_TYPES   sR    
(2(/SUXbf1g'h)0c#VYcg2h(i&-3sSV`d/e%f	  ! 	!r   r	   r   r   c                 z   UR                  5       nUR                  S5      n[        [        UR	                  5       5      5      nU Hp  nUnU[        S5      S  n	Sn
U H;  nU	R                  U5      (       d  M  U
[        U5      :  d  M,  X;   n[        U5      n
M=     UR                  XuU   0SU-
  U5        Mr     U4$ )Nr"   r   r   )r$   r%   nextitervalueslen
startswithr&   )r'   r   r   kwargsr(   r)   default_ratior*   r   k_unetlast_arg_sizeargs               r   r   ModelMergeBlocks.merge   s    LLN##$67T&--/23A!Es-./0FM$$S))mc#h.F"KE$'HM 
 MM1e*cEk59  ur   r   Nr,   r   r   r   ri   ri      s*    ! ! LHHr   ri   c           
      .   [         R                  " XE5      u  ppnSnUb  [        R                  " U5      n0 nSn[	        U R
                  [        R                  R                  5      (       a?  [	        U R
                  [        R                  R                  5      (       a  SUS'   OSUS'   O[	        U R
                  [        R                  R                  5      (       a  SUS'   Ot[	        U R
                  [        R                  R                  5      (       a  SUS'   O;[	        U R
                  [        R                  R                  5      (       a  SUS'   OS	nU(       a  S
US'   SUS'   SR                  X5      US'   0 nU R                  S5      n[	        U[        R                  R                   5      (       a  [	        U[        R                  R"                  5      (       ab  [$        R&                  " UR(                  5      R+                  5       US'   [$        R&                  " UR,                  5      R+                  5       US'   U R
                  R.                  [        R                  R0                  R2                  :X  a  SUS'   OU R
                  R.                  [        R                  R0                  R"                  :X  aI  SUS'   [$        R&                  " / 5      US'   [5        USS	5      (       a  [$        R&                  " / 5      US'   [6        R8                  (       d,  XS'   Ub%  U H  n[        R                  " UU   5      UU'   M!     U	 SU
S S3n[:        R<                  R?                  UU5      n[        R@                  RC                  UXX#XS9  g )N Tzstable-diffusion-xl-v1-editzmodelspec.architecturezstable-diffusion-xl-v1-basezstable-diffusion-xl-v1-refinerz!stable-video-diffusion-img2vid-v1zstable-diffusion-v3-mediumFz1.0.0zmodelspec.sai_model_specsgmzmodelspec.implementationz{} {}zmodelspec.titlemodel_samplingzedm_vpred.sigma_maxzedm_vpred.sigma_minepsilonzmodelspec.predict_keyvv_predzsnrztsnrprompt_05_.safetensors)metadata
extra_keys)"folder_pathsget_save_image_pathjsondumps
isinstancemodelcomfy
model_baseSDXLSDXL_instructpix2pixSDXLRefinerSVD_img2vidSD3formatget_model_objectr   ModelSamplingContinuousEDMV_PREDICTIONtorchtensor	sigma_maxfloat	sigma_min
model_type	ModelTypeEPSgetattrr   disable_metadataospathjoinsdsave_checkpoint)r   clipvaeclip_visionfilename_prefix
output_dirr   extra_pnginfofull_output_folderfilenamecounter	subfolderprompt_infor   enable_modelspecr   r   xoutput_checkpoints                      r   r   r      s   HTHhHhix  IFE'oKjj(H%++u//4455ekk5#3#3#H#HII1NH-.1NH-.	EKK!1!1!=!=	>	>-M)*	EKK!1!1!=!=	>	>-P)*	EKK!1!1!5!5	6	6-I)* /6+,/4+,&-nnX&G"# J++,<=N.%"6"6"Q"QRRne&:&:&G&GHH05^=U=U0V0\0\0^J,-05^=U=U0V0\0\0^J,-{{!1!1!;!;!?!??,5()			5#3#3#=#=#J#J	J,/()$||B/
8>6511"',,r"2Jw  ($""jjq)9: # $*Agb\?%79JK	HH.SX`xr   c                   L    \ rS rSr/ SQrS r\S 5       rSrSr	Sr
SrSS
 jrSrg	)CheckpointSave   )z
save modelzexport checkpointz
merge savec                 8    [         R                  " 5       U l        g Nr   get_output_directoryr   r'   s    r   __init__CheckpointSave.__init__       &;;=r   c                 $    SSSSSS04S.SS	S
.S.$ )Nr	   rL   VAESTRINGr   zcheckpoints/ComfyUI)r   r   r   r   PROMPTEXTRA_PNGINFOr   r   r   hiddenr   r   s    r   r   CheckpointSave.INPUT_TYPES   s5    '1&/%-2:YH]<^1_b &.P	S 	Sr   r   saveTr   Nc           
      2    [        XX4U R                  XVS9  0 $ )N)r   r   r   r   r   r   r   r   )r'   r   r   r   r   r   r   s          r   r   CheckpointSave.save   s     c_c_n_nw}  	\	r   r   NNr-   r.   r/   r0   r`   r   r1   r   r2   r3   OUTPUT_NODEr4   r   r5   r   r   r   r   r      s=    FN> S S LHKHr   r   c                   D    \ rS rSrS r\S 5       rSrSrSr	Sr
SS	 jrS
rg)CLIPSave   c                 8    [         R                  " 5       U l        g r   r   r   s    r   r   CLIPSave.__init__   r   r   c                      SSSS04S.SSS.S	.$ )
NrL   r   r   zclip/ComfyUI)r   r   r   r   r   r   r   r   s    r   r   CLIPSave.INPUT_TYPES   s,    &/2:Y<W1X[%-PS 	Sr   r   r   Tr   Nc                 J  ^ SnUb  [         R                  " U5      n0 n[        R                  (       d/  SUS'   XVS'   Ub#  U H  n[         R                  " XG   5      Xg'   M     UR	                  5         UR                  5       nS GH  m[        [        U4S jUR                  5       5      5      n	0 n
U	 H  nUR                  U5      X'   M     [        U
5      S:X  a  MZ  TS S n0 nUn[        U5      S:  a  S	R                  X5      nSUT'   SUS
'   [        R                  " XR                  5      u  pnnnU SUS S3n[        R                   R#                  UU5      n[$        R&                  R)                  X5      n
[$        R&                  R+                  U
UUS9  GM     0 $ )Nr}   ptr   r   )zclip_l.zclip_g.zclip_h.zt5xxl.z
pile_t5xl.zmt5xl.zumt5xxl.zt5base.z
gemma2_2b.zllama.zhydit_clip.r}   c                 &   > U R                  T5      $ r   )ru   )aprefixs    r   <lambda>CLIPSave.save.<locals>.<lambda>  s    all6&:r   r   z{}_{}ztransformer.r   r   r   r   )r   r   r   r   
load_modelstate_dict_for_savinglistfilterkeyspoprt   r   r   r   r   r   r   r   r   utilsstate_dict_prefix_replacesave_torch_file)r'   r   r   r   r   r   r   r   clip_sdr*   current_clip_sdpreplace_prefixfilename_prefix_r   r   r   r   r   r   s                      @r   r   CLIPSave.save
  s   **V,K$$!%HX!,X(&A"&**]-=">HK ' 	,,. \FV:GLLNKLA O%,[[^" ?#q(sAN.1vz#*>>2B#F )+v&-/N>*Q]QqQq  sC  ET  ET  RUN'9>N#+*Agb\ G "-?AR S#kkCCOdOKK''9JU]'^/ \0 	r   r   r   r-   r.   r/   r0   r   r1   r   r2   r3   r   r4   r   r5   r   r   r   r   r      s8    > S S LHKH(r   r   c                   D    \ rS rSrS r\S 5       rSrSrSr	Sr
SS	 jrS
rg)VAESavei4  c                 8    [         R                  " 5       U l        g r   r   r   s    r   r   VAESave.__init__5  r   r   c                      SSSS04S.SSS.S	.$ )
Nr   r   r   zvae/ComfyUI_vae)r   r   r   r   r   r   r   r   s    r   r   VAESave.INPUT_TYPES8  s-    %-2:YHY<Z1[^%-PS 	Sr   r   r   Tr   Nc                    [         R                  " X R                  5      u  pVpxnSn	Ub  [        R                  " U5      n	0 n
[
        R                  (       d*  XS'   Ub#  U H  n[        R                  " XK   5      X'   M     U SUS S3n[        R                  R                  X\5      n[        R                  R                  UR                  5       XS9  0 $ )Nr}   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   get_sd)r'   r   r   r   r   r   r   r   r   r   r   r   r   s                r   r   VAESave.saveC  s    LXLlLlm|  N  N  MOIg/**V,K$$!,X(&A"&**]-=">HK '  (j'"]CGGLL);O##CJJL2C#W	r   r   r   r   r   r   r   r   r   4  s8    > S S LHKHr   r   c                   L    \ rS rSrSS/rS r\S 5       rSrSr	Sr
S	rSS jrSrg
)	ModelSaveiV  zexport modelzcheckpoint savec                 8    [         R                  " 5       U l        g r   r   r   s    r   r   ModelSave.__init__X  r   r   c                      SSSS04S.SSS.S	.$ )
Nr	   r   r   zdiffusion_models/ComfyUI)r   r   r   r   r   r   r   r   s    r   r   ModelSave.INPUT_TYPES[  s-    '12:YHb<c1dg%-PS 	Sr   r   r   Tr   Nc                 0    [        XU R                  X4S9  0 $ )N)r   r   r   r   r   )r'   r   r   r   r   s        r   r   ModelSave.savef  s    4??ci  	H	r   r   r   r   r   r   r   r   r   V  sC    $&78N> S S LHKHr   r   )r   ri   ModelMergeSubtractModelMergeAddr   rI   CLIPMergeSubtractCLIPMergeAddr   r   r   zSave Checkpoint)NNNNNNN)comfy.sdr   comfy.utilscomfy.model_basecomfy.model_managementcomfy.model_samplingr   r   r   r   comfy.cli_argsr   r   r8   rB   rI   rY   rb   ri   r   r   r   r   r   NODE_CLASS_MAPPINGSNODE_DISPLAY_NAME_MAPPINGSr   r   r   <module>r     s            	  & & & , . , @9yv ,7 7r   D * )('$&%  ' r   