o
    iZ\                    @  s  U d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZ d d	lmZmZ d dlZerd d
lmZ d dlmZ d dlm Z! d dl"m#Z# d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,m-Z-m.Z. d dl,m/Z0 d dl1m2Z2m3Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= d dl>m?Z? ddl@mAZAmBZBmCZDmEZE G dd deFeZGG dd deFeZHG dd dZIG dd deFeZJG d d! d!eFeZKG d"d# d#eZLed$eMd%ZNdWd(d)ZOdXd,d-ZPG d.d/ d/ZQG d0d1 d1eQZRG d2d3 d3eRZSG d4d5 d5eQZ G d6d7 d7eLZTG d8d9 d9eTZUeOd:d;G d<d= d=eUZVeOd>d;G d?d@ d@eUZWeOdAd;G dBdC dCeUZXeOdDd;G dEdF dFeUZYeOdGd;G dHdI dIeUZZeOdGd;G dJdK dKeTZ[eOdLd;G dMdN dNeUZ\eOdOd;G dPdQ dQeUZ]eOdRd;G dSdT dTeUZ^eOdUd;G dVdW dWeUZ_eOdXd;G dYdZ dZeUZ`eOd[d;G d\d] d]eUZaeOd^d;G d_d` d`eUZ+eOdad;G dbdc dceUZbeOddd;G dedf dfeUZceOdgd;G dhdi dieUZdeOdjd;G dkdl dleUZeeOdmd;G dndo doeUZ#eOdpd;G dqdr dreUZfeOdsd;G dtdu dueUZgeOdvd;G dwdx dxeUZheOdyd;G dzd{ d{eUZieOd|d;G d}d~ d~eUZ/eOdd;G dd deUZjeOdd;G dd deUZkeOdd;G dd deUZleOdd;G dd deUZmeOdd;G dd deUZneOdd;G dd deUZCeOdd;G dd deUZoeOdd;G dd deUZpeOdd;G dd deUZqeOdd;G dd deUZreOdd;G dd deUZseOdd;G dd deUZteOdd;G dd deUZueOdd;G dd deUZveOdd;G dd deUZweOdd;G dd deUZxeOdd;G dd deUZyeOdd;G dd deUZzeOdd;G dd deUZ{eOdd;G dd deUZ|eOdd;G dd deUZ}eOdd;G dd deUZ~eOdd;G dd deUZeOdd;G ddń deUZeOdd;G ddȄ deUZeOdd;G dd˄ deZeOdd;G dd΄ deUZeOdd;G ddф deUZeOdd;G ddԄ deUZeOdd;G ddՄ deUZeOdd;G ddׄ deUZeOdd;G ddۄ deUZeOdd;G ddބ deUZeOdd;G dd deUZeOdd;G dd deUZeOdd;G dd deUZeOdd;G dd dZeOdd;G dd deUZG dd deReZG dd de eZdYdZddZdYd[ddZeOdd;G dd deTZeOdd;G dd  d eTZeOdd;G dd deTZeOdd;G dd deTZeOdd;G dd	 d	eUZeOd
d;G dd deUZeOdd;G dd deUZeOdd;G dd deUZi Zded< d\ddZd]ddZdd Zeed kre  G dd deZG dd  d ZG d!d" d"eFeZeG d#d$ d$ZeG d%d& d&ZeG d'd( d(ZeG d)d* d*Zd^d_d0d1ZdYd`d6d7Zdad;d<Zdbd>d?ZG d@dA dAZdcdDdEZG dFdG dGe6ZG dHdI dIeZG dJdK dKe7ZG dLdM dMeZG dNdO dOeZG dPdQ dQeZeeB Z	 G dRdS dSeZG dTdU dUZg dVZdS (d      )annotationsN)ABCabstractmethod)Counter)Iterable)asdict	dataclassfield)Enum)AnyCallableLiteral	TypedDictTypeVarTYPE_CHECKING)NotRequiredfinal)ImageModelDescriptor)ClipVisionModel)Output)
ControlNet)	HookGroupHookKeyframeGroup)ModelPatcher)	CFGGuiderSampler)CLIPVAE)
StyleModel)
VideoInput
CurveInput)_ComfyNodeInternal_NodeOutputInternalclassproperty
copy_classfirst_real_overrideis_class
prune_dictshallow_clone_class)ExecutionBlocker   )MESHVOXELSVGFile3Dc                   @     e Zd ZdZdZdZdS )
FolderTypeinputoutputtempN)__name__
__module____qualname__r1   r2   r3    r7   r7   2/mnt/c/Users/fbmor/ComfyUI/comfy_api/latest/_io.pyr0   !       r0   c                   @     e Zd ZdZdZdZdZdS )
UploadTypeimage_uploadaudio_uploadvideo_uploadfile_uploadN)r4   r5   r6   imageaudiovideomodelr7   r7   r7   r8   r;   '   
    r;   c                   @  s$   e Zd Z		ddddZdd ZdS )RemoteOptionsfirstNroutestrrefresh_buttonboolcontrol_after_refreshLiteral['first', 'last']timeoutintmax_retriesrefreshc                 C  2   || _ 	 || _	 || _	 || _	 || _	 || _d S NrG   rI   rK   rM   rO   rP   )selfrG   rI   rK   rM   rO   rP   r7   r7   r8   __init__/   s   zRemoteOptions.__init__c                 C  s"   t | j| j| j| j| j| jdS )NrS   )r'   rG   rI   rK   rM   rO   rP   rT   r7   r7   r8   as_dict>   s   zRemoteOptions.as_dict)rF   NNN)rG   rH   rI   rJ   rK   rL   rM   rN   rO   rN   rP   rN   r4   r5   r6   rU   rW   r7   r7   r7   r8   rE   .   s
    rE   c                   @  r/   )NumberDisplaynumberslidergradientsliderN)r4   r5   r6   rZ   r[   gradient_sliderr7   r7   r7   r8   rY   I   r9   rY   c                   @  r:   )ControlAfterGeneratefixed	increment	decrement	randomizeN)r4   r5   r6   r_   r`   ra   rb   r7   r7   r7   r8   r^   O   rD   r^   c                   @  s   e Zd ZU eZdZded< dS )
_ComfyTypeNrH   io_type)r4   r5   r6   r   Typerd   __annotations__r7   r7   r7   r8   rc   U   s   
 rc   T)boundrd   rH   c                   s   d fdd}|S )z
    Decorator to mark nested classes as ComfyType; io_type will be bound to the class.

    A ComfyType may have the following attributes:
    - Type = <type hint here>
    - class Input(Input): ...
    - class Output(Output): ...
    clsrg   returnc                   s   t | ts
t| tr#| }t|drt|j|_t|dr"t|j|_ndd | j D }t	| j
| tf|}| j|_| j|_ |_t|drO|jd urO||j_t|dr]|jd ur]||j_|S )NInputr   c                 S  s   i | ]\}}|d vr||qS ))__dict____weakref__r5   __doc__r7   ).0kvr7   r7   r8   
<dictcomp>n   s
    z0comfytype.<locals>.decorator.<locals>.<dictcomp>)
isinstancerc   
issubclasshasattrr$   rk   r   rl   itemstyper4   ComfyTypeIOr5   rn   rd   Parent)ri   new_clscls_dictrd   r7   r8   	decoratord   s.   

zcomfytype.<locals>.decoratorN)ri   rg   rj   rg   r7   )rd   kwargsr}   r7   r|   r8   	comfytype[   s   	r   rj   type[ComfyTypeIO]c                 C  s   t | dG dd dt}|S )z(Create a ComfyType for a custom io_type.r|   c                   @     e Zd ZdS )zCustom.<locals>.CustomComfyTypeNr4   r5   r6   r7   r7   r7   r8   CustomComfyType       r   )r   rx   )rd   r   r7   r7   r8   Custom   s   r   c                   @  sF   e Zd ZU dZdZded< dd Zdd Zed	d
 Z	edd Z
dS )_IO_V3z/
    Base class for V3 Inputs and Outputs.
    Nrc   ry   c                 C     d S rR   r7   rV   r7   r7   r8   rU         z_IO_V3.__init__c                 C  r   rR   r7   rV   r7   r7   r8   validate   r   z_IO_V3.validatec                 C     | j jS rR   )ry   rd   rV   r7   r7   r8   rd         z_IO_V3.io_typec                 C  r   rR   )ry   re   rV   r7   r7   r8   re      r   z_IO_V3.Type)r4   r5   r6   rn   ry   rf   rU   r   propertyrd   re   r7   r7   r7   r8   r      s   
 
r   c                      s>   e Zd ZdZdd fddZdd Zdd ZdddZ  ZS )rk   z$
    Base class for a V3 Input.
    NFidrH   display_nametooltiplazyrJ   raw_linkadvancedc	           	        sJ   t    || _|| _|| _|| _|| _|d ur|ni | _|| _|| _	d S rR   )
superrU   r   r   optionalr   r   
extra_dictrawLinkr   )	rT   r   r   r   r   r   r   r   r   	__class__r7   r8   rU      s   

zInput.__init__c                 C  s,   t | j| j| j| j| j| jdt | jB S )N)r   r   r   r   r   r   )r'   r   r   r   r   r   r   r   rV   r7   r7   r8   rW      s   zInput.as_dictc                 C     | j S rR   r|   rV   r7   r7   r8   get_io_type      zInput.get_io_typerj   list[Input]c                 C  s   | gS rR   r7   rV   r7   r7   r8   get_all   r   zInput.get_allNFNNNNN)r   rH   r   rH   r   rH   r   rJ   r   rJ   r   rJ   rj   r   )	r4   r5   r6   rn   rU   rW   r   r   __classcell__r7   r7   r   r8   rk      s    
rk   c                      sB   e Zd ZdZ			dd fddZ fddZ fddZ  ZS )WidgetInputz0
    Base class for a V3 Input with widget.
    NFr   rH   r   r   r   rJ   defaultr   
socketlesswidget_typeforce_inputr   r   c              
     s6   t  ||||||
|| || _|| _|| _|	| _d S rR   )r   rU   r   r   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU      s
   
zWidgetInput.__init__c                   s$   t   t| j| j| j| jdB S )N)r   r   
widgetType
forceInput)r   rW   r'   r   r   r   r   rV   r   r7   r8   rW      s   

zWidgetInput.as_dictc                   s   | j d ur| j S t  S rR   )r   r   r   rV   r   r7   r8   r      s   zWidgetInput.get_io_type)NFNNNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   r   r   rJ   r   rH   r   rJ   r   rJ   r   rJ   )r4   r5   r6   rn   rU   rW   r   r   r7   r7   r   r8   r      s    	r   c                   @  s,   e Zd Z		ddddZd	d
 Zdd ZdS )r   NFr   rH   r   r   c                 C  s$   || _ |r|n|| _|| _|| _d S rR   )r   r   r   is_output_list)rT   r   r   r   r   r7   r7   r8   rU      s   
zOutput.__init__c                 C  s&   | j r| j n| j}t|| j| jdS )N)r   r   r   )r   r   r'   r   r   )rT   r   r7   r7   r8   rW      s   zOutput.as_dictc                 C  r   rR   r|   rV   r7   r7   r8   r      r   zOutput.get_io_typeNNNF)r   rH   r   rH   r   rH   )r4   r5   r6   rU   rW   r   r7   r7   r7   r8   r      s    r   c                   @      e Zd ZdZG dd deZdS )
ComfyTypeIzbComfyType subclass that only has a default Input class - intended for types that only have Inputs.c                   @  r   )zComfyTypeI.InputNr   r7   r7   r7   r8   rk          rk   N)r4   r5   r6   rn   rk   r7   r7   r7   r8   r          r   c                   @  r   )rx   zlComfyType subclass that has default Input and Output classes; useful for types with both Inputs and Outputs.c                   @  r   )zComfyTypeIO.OutputNr   r7   r7   r7   r8   r      r   r   N)r4   r5   r6   rn   r   r7   r7   r7   r8   rx      r   rx   BOOLEANr|   c                   @      e Zd ZeZG dd deZdS )Booleanc                      6   e Zd ZdZ			dd fddZ fddZ  ZS )zBoolean.InputzBoolean input.NFr   rH   r   r   r   rJ   r   label_on	label_offr   r   r   r   c                   s6   t  |||||||	d |
||| || _|| _|  d S rR   )r   rU   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU      s   "zBoolean.Input.__init__c                      t   t| j| jdB S )N)r   r   )r   rW   r'   r   r   rV   r   r7   r8   rW        

zBoolean.Input.as_dictNFNNNNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   rJ   r   rH   r   rH   r   rJ   r   rJ   r   rJ   r   rJ   r4   r5   r6   rn   rU   rW   r   r7   r7   r   r8   rk      s    rk   N)r4   r5   r6   rJ   re   r   rk   r7   r7   r7   r8   r          r   INTc                   @  r   )Intc                      s6   e Zd ZdZ			dd fddZ fddZ  ZS )z	Int.InputzInteger input.NFr   rH   r   r   r   rJ   r   rN   minmaxstepcontrol_after_generatebool | ControlAfterGeneratedisplay_moderY   r   r   r   r   c                   sH   t  |||||||d |||| || _|| _|	| _|
| _|| _|  d S rR   )r   rU   r   r   r   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU     s   "zInt.Input.__init__c                   s4   t   t| j| j| j| j| jr| jjnd dB S )N)r   r   r   r   display)	r   rW   r'   r   r   r   r   r   valuerV   r   r7   r8   rW     s   

zInt.Input.as_dict)NFNNNNNNNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   rN   r   rN   r   rN   r   rN   r   r   r   rY   r   rJ   r   rJ   r   rJ   r   rJ   r   r7   r7   r   r8   rk     s    rk   N)r4   r5   r6   rN   re   r   rk   r7   r7   r7   r8   r   
  r   r   FLOATc                   @  r   )Floatc                      s8   e Zd ZdZ				dd fddZ fddZ  ZS )zFloat.InputzFloat input.NFr   rH   r   r   r   rJ   r   floatr   r   r   roundr   rY   gradient_stops
list[dict]r   r   r   r   c                   sN   t  |||||||d |||| || _|| _|	| _|
| _|| _|| _|  d S rR   )r   rU   r   r   r   r   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU   *  s   "zFloat.Input.__init__c              	     s,   t   t| j| j| j| j| j| jdB S )N)r   r   r   r   r   r   )	r   rW   r'   r   r   r   r   r   r   rV   r   r7   r8   rW   7  s   

zFloat.Input.as_dict)NFNNNNNNNNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   r   r   r   r   r   r   r   r   r   r   rY   r   r   r   rJ   r   rJ   r   rJ   r   rJ   r   r7   r7   r   r8   rk   (  s    rk   N)r4   r5   r6   r   re   r   rk   r7   r7   r7   r8   r   $  r   r   STRINGc                   @  r   )Stringc                      r   )zString.InputzString input.NFr   rH   r   r   r   rJ   placeholderr   dynamic_promptsr   r   r   r   c                   s<   t  |||||||
d |||| || _|| _|	| _|  d S rR   )r   rU   	multiliner   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU   G  s
   "zString.Input.__init__c                       t   t| j| j| jdB S )N)r   r   dynamicPrompts)r   rW   r'   r   r   r   rV   r   r7   r8   rW   P  
   

zString.Input.as_dict)NFNNFNNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   rH   r   rH   r   rJ   r   rJ   r   rJ   r   rJ   r   rJ   r   r7   r7   r   r8   rk   E  s    	rk   Nr4   r5   r6   rH   re   r   rk   r7   r7   r7   r8   r   A  r   r   COMBOc                   @  s0   e Zd ZeZG dd deZG dd deZdS )Comboc                      sP   e Zd ZdZeZ														dd fddZ fddZ  ZS )zCombo.InputzCombo input (dropdown).NFr   rH   options"list[str] | list[int] | type[Enum]r   r   r   rJ   r   str | int | Enumr   r   uploadr;   image_folderr0   remoterE   r   r   r   c                   s   t |trt|trdd |D }t |tr|j}t |||||||d d ||| d| _|| _|| _	|	| _
|
| _|| _|  d S )Nc                 S     g | ]}|j qS r7   )r   )ro   rq   r7   r7   r8   
<listcomp>p      z(Combo.Input.__init__.<locals>.<listcomp>F)rs   rw   rt   r
   r   r   rU   multiselectr   r   r   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU   ]  s   
"zCombo.Input.__init__c                   sb   t   t| j| j| jd| jd ur| jjdini | jr!| jjnd | j	r*| j	 nd dB S )N)r   r   r   T)r   r   )
r   rW   r'   r   r   r   r   r   r   r   rV   r   r7   r8   rW   |  s   
zCombo.Input.as_dict)NNFNNNNNNNNNNN)r   rH   r   r   r   rH   r   rH   r   rJ   r   r   r   r   r   r;   r   r0   r   rE   r   rJ   r   rJ   r   rJ   )	r4   r5   r6   rn   rH   re   rU   rW   r   r7   r7   r   r8   rk   Z  s&    rk   c                      s    e Zd Zdd fd	d
Z  ZS )zCombo.OutputNFr   rH   r   r   	list[str]r   c                   s.   t  |||| |d ur|| _d S g | _d S rR   r   rU   r   )rT   r   r   r   r   r   r   r7   r8   rU     s   zCombo.Output.__init__)NNNNF)r   rH   r   rH   r   r   r   rH   )r4   r5   r6   rU   r   r7   r7   r   r8   r     s    r   N)r4   r5   r6   rH   re   r   rk   r   r7   r7   r7   r8   r   W  s    ,r   c                   @  s*   e Zd ZdZee ZG dd dejZdS )
MultiCombozQMultiselect Combo input (dropdown for selecting potentially more than one value).c                      s2   e Zd Z			dd fddZ fddZ  ZS )zMultiCombo.InputNFr   rH   r   r   r   r   r   rJ   r   r   chipr   r   r   r   r   c                   s>   t  j||||||||
||||d d| _|| _|	| _|  d S )N)r   r   r   r   T)r   rU   r   r   r   )rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU     s
   $zMultiCombo.Input.__init__c                   s$   t   t| j| j| jdB }|S )N)multi_selectr   r   )r   rW   r'   r   r   r   )rT   	to_returnr   r7   r8   rW     s   

zMultiCombo.Input.as_dictr   )r   rH   r   r   r   rH   r   rH   r   rJ   r   r   r   rH   r   rJ   r   r   r   rJ   r   rJ   r   rJ   r4   r5   r6   rU   rW   r   r7   r7   r   r8   rk     s    	rk   N)	r4   r5   r6   rn   listrH   re   r   rk   r7   r7   r7   r8   r     s    r   IMAGEc                   @     e Zd ZejZdS )ImageNr4   r5   r6   torchTensorre   r7   r7   r7   r8   r         
r   WAN_CAMERA_EMBEDDINGc                   @  r   )WanCameraEmbeddingNr   r7   r7   r7   r8   r     r   r   WEBCAMc                   @  r   )Webcamc                      s,   e Zd ZdZeZ		dd fddZ  ZS )zWebcam.InputzWebcam input.NFr   rH   r   r   r   rJ   r   r   r   r   c                   s&   t  |||||||d d ||	|
 d S rR   r   rU   )rT   r   r   r   r   r   r   r   r   r   r   r   r7   r8   rU     s   &zWebcam.Input.__init__)	NFNNNNNNN)r   rH   r   rH   r   rH   r   rJ   r   rH   r   rJ   r   rJ   r   rJ   )r4   r5   r6   rn   rH   re   rU   r   r7   r7   r   r8   rk     s    rk   Nr   r7   r7   r7   r8   r     r   r   MASKc                   @  r   )MaskNr   r7   r7   r7   r8   r     r   r   LATENTc                   @  $   e Zd ZdZG dd deZeZdS )Latentz#Latents are stored as a dictionary.c                   @  s0   e Zd ZU ded< 	 ded< ded< ded< d	S )
zLatent.LatentDicttorch.TensorsamplesNotRequired[torch.Tensor]
noise_maskNotRequired[list[int]]batch_indexNotRequired[str]rw   Nr4   r5   r6   rf   r7   r7   r7   r8   
LatentDict  s   
 r   N)r4   r5   r6   rn   r   r   re   r7   r7   r7   r8   r         r   CONDITIONINGc                   @  s2   e Zd ZG dd deZeeejef  Z	e	Z
dS )Conditioningc                   @  s(  e Zd ZU ded< 	 ded< 	 ded< 	 ded< 	 ded	< 	 d
ed< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded< 	 ded < 	 d!ed"< 	 ded#< 	 ded$< 	 ded%< 	 ded&< 	 d'ed(< 	 d'ed)< 	 ded*< 	 d'ed+< 	 d'ed,< 	 d'ed-< 	 d'ed.< 	 d/ed0< 	 ded1< 	 d'ed2< 	 ded3< 	 d4ed5< 	 ded6< 	 ded7< 	 d8ed9< 	 d8ed:< 	 d'ed;< 	 d'ed<< 	 ded=< 	 d>ed?< 	 ded@< 	 dedA< 	 dedB< 	 dCedD< 	 dedE< 	 dedF< dGS )HzConditioning.PooledDictr   pooled_outputzNotRequired[ControlNet]controlzNotRequired[bool]control_apply_to_uncondr   cross_attn_controlnetpooled_output_controlnetzDNotRequired[tuple[str, Gligen, list[tuple[torch.Tensor, int, ...]]]]gligenz5NotRequired[tuple[int, ...] | tuple[str, float, ...]]areazNotRequired[float]strengthmaskmask_strengthset_area_to_boundsconcat_latent_imageconcat_maskconcat_imagenoise_augmentationzNotRequired[HookGroup]hooksr   start_percentend_percentclip_start_percentclip_end_percentattention_maskzNotRequired[tuple[int, ...]]attention_mask_img_shapezNotRequired[list[dict]]unclip_conditioningconditioning_lyricsseconds_startseconds_totallyrics_strengthzNotRequired[int]widthheightaesthetic_scorecrop_wcrop_htarget_widthtarget_heightzNotRequired[list[torch.Tensor]]reference_latentsguidanceguiding_frame_index
ref_latentr   keyframe_idxs
frame_ratestable_cascade_priorzNotRequired[list[float]]	elevationazimuthmotion_bucket_idfpsaugmentation_levelzNotRequired[ClipVisionOutput_]clip_vision_outputvace_frames	vace_maskvace_strengthzNotRequired[Any]camera_conditionstime_dim_concattime_dim_replaceNr   r7   r7   r7   r8   
PooledDict  s   
 r8  N)r4   r5   r6   r   r8  r   tupler   r   CondListre   r7   r7   r7   r8   r    s    sr  SAMPLERc                   @     e Zd Zer
eZdS dS )r   N)r4   r5   r6   r   r   re   r7   r7   r7   r8   r   B      r   SIGMASc                   @  r   )SigmasNr   r7   r7   r7   r8   r?  G  r   r?  NOISEc                   @  r   )NoiseNr   r7   r7   r7   r8   rA  K  r   rA  GUIDERc                   @  r<  )GuiderN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rC  O  r=  rC  r   c                   @  r<  )ClipN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rD  T  r=  rD  CONTROL_NETc                   @  r<  )r   N)r4   r5   r6   r   r   re   r7   r7   r7   r8   r   Y  r=  r   r   c                   @  r<  )VaeN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rF  ^  r=  rF  MODELc                   @  r<  )ModelN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rH  c  r=  rH  CLIP_VISIONc                   @  r<  )
ClipVisionN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rJ  h  r=  rJ  CLIP_VISION_OUTPUTc                   @  r<  )ClipVisionOutputN)r4   r5   r6   r   ClipVisionOutput_re   r7   r7   r7   r8   rL  m  r=  rL  STYLE_MODELc                   @  r<  )r   N)r4   r5   r6   r   StyleModel_re   r7   r7   r7   r8   r   r  r=  r   GLIGENc                   @  s   e Zd ZdZereZdS dS )Gligenz0ModelPatcher that wraps around a 'Gligen' model.N)r4   r5   r6   rn   r   r   re   r7   r7   r7   r8   rQ  w  s
    rQ  UPSCALE_MODELc                   @  r<  )UpscaleModelN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rS  }  r=  rS  LATENT_UPSCALE_MODELc                   @     e Zd ZeZdS )LatentUpscaleModelNr4   r5   r6   r   re   r7   r7   r7   r8   rV        rV  AUDIOc                   @      e Zd ZG dd deZeZdS )Audioc                   @  s   e Zd ZU ded< ded< dS )zAudio.AudioDictr   waveformrN   sampler_rateNr   r7   r7   r7   r8   	AudioDict     
 r^  N)r4   r5   r6   r   r^  re   r7   r7   r7   r8   r[        r[  VIDEOc                   @  r<  )VideoN)r4   r5   r6   r   r   re   r7   r7   r7   r8   rb    r=  rb  r-   c                   @  rU  )r-   N)r4   r5   r6   _SVGre   r7   r7   r7   r8   r-     rX  
LORA_MODELc                   @  s   e Zd Zeeejf ZdS )	LoraModelN)r4   r5   r6   dictrH   r   r   re   r7   r7   r7   r8   re    s    re  LOSS_MAPc                   @  rZ  )LossMapc                   @     e Zd ZU ded< dS )zLossMap.LossMapDictzlist[torch.Tensor]lossNr   r7   r7   r7   r8   LossMapDict     
 rk  N)r4   r5   r6   r   rk  re   r7   r7   r7   r8   rh    s    rh  r,   c                   @  rU  )VoxelN)r4   r5   r6   r,   re   r7   r7   r7   r8   rm    rX  rm  r+   c                   @  rU  )MeshN)r4   r5   r6   r+   re   r7   r7   r7   r8   rn    rX  rn  FILE_3Dc                   @     e Zd ZdZeZdS )	File3DAnyz7General 3D file type - accepts any supported 3D format.Nr4   r5   r6   rn   r.   re   r7   r7   r7   r8   rq        rq  FILE_3D_GLBc                   @  rp  )	File3DGLBzBGLB format 3D file - binary glTF, best for web and cross-platform.Nrr  r7   r7   r7   r8   ru    rs  ru  FILE_3D_GLTFc                   @  rp  )
File3DGLTFz>GLTF format 3D file - JSON-based glTF with external resources.Nrr  r7   r7   r7   r8   rw    rs  rw  FILE_3D_FBXc                   @  rp  )	File3DFBXz9FBX format 3D file - best for game engines and animation.Nrr  r7   r7   r7   r8   ry    rs  ry  FILE_3D_OBJc                   @  rp  )	File3DOBJz,OBJ format 3D file - simple geometry format.Nrr  r7   r7   r7   r8   r{    rs  r{  FILE_3D_STLc                   @  rp  )	File3DSTLz*STL format 3D file - best for 3D printing.Nrr  r7   r7   r7   r8   r}    rs  r}  FILE_3D_USDZc                   @  rp  )
File3DUSDZz&USDZ format 3D file - Apple AR format.Nrr  r7   r7   r7   r8   r    rs  r  HOOKSc                   @  r<  )HooksN)r4   r5   r6   r   r   re   r7   r7   r7   r8   r    r=  r  HOOK_KEYFRAMESc                   @  r<  )HookKeyframesN)r4   r5   r6   r   r   re   r7   r7   r7   r8   r    r=  r  TIMESTEPS_RANGEc                   @  s   e Zd ZdZeeef ZdS )TimestepsRangez9Range defined by start and endpoint, between 0.0 and 1.0.N)r4   r5   r6   rn   r9  rN   re   r7   r7   r7   r8   r    s    r  LATENT_OPERATIONc                   @  s   e Zd Zeejgejf ZdS )LatentOperationN)r4   r5   r6   r   r   r   re   r7   r7   r7   r8   r    s    r  FLOW_CONTROLc                   @  s   e Zd Zeeef ZdS )FlowControlN)r4   r5   r6   r9  rH   r   re   r7   r7   r7   r8   r    s    r  ACCUMULATIONc                   @  rZ  )Accumulationc                   @  ri  )zAccumulation.AccumulationDictz	list[Any]accumNr   r7   r7   r7   r8   AccumulationDict  rl  r  N)r4   r5   r6   r   r  re   r7   r7   r7   r8   r    s    r  LOAD3D_CAMERAc                   @  rZ  )Load3DCamerac                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	Load3DCamera.CameraInfozdict[str, float | int]positiontargetrN   zoomrH   
cameraTypeNr   r7   r7   r7   r8   
CameraInfo  
   
 r  N)r4   r5   r6   r   r  re   r7   r7   r7   r8   r    s    r  LOAD_3Dc                   @  r   )Load3Dz%3D models are stored as a dictionary.c                   @  s6   e Zd ZU ded< ded< ded< ded< ded< d	S )
zLoad3D.Model3DDictrH   r@   r  normalr  camera_infor   	recordingNr   r7   r7   r7   r8   Model3DDict  s   
 r  N)r4   r5   r6   rn   r   r  re   r7   r7   r7   r8   r    r   r  LOAD_3D_ANIMATIONc                   @  r   )Load3DAnimationNr   r7   r7   r7   r8   r    r   r  
PHOTOMAKERc                   @  rU  )
PhotomakerNrW  r7   r7   r7   r8   r    rX  r  POINTc                   @  rU  )PointNrW  r7   r7   r7   r8   r    rX  r  FACE_ANALYSISc                   @  rU  )FaceAnalysisNrW  r7   r7   r7   r8   r    rX  r  BBOXc                   @  rU  )r  NrW  r7   r7   r7   r8   r    rX  SEGSc                   @  rU  )r  NrW  r7   r7   r7   r8   r  !  rX  *c                   @  rU  )AnyTypeNrW  r7   r7   r7   r8   r  %  rX  r  MODEL_PATCHc                   @  rU  )
ModelPatchNrW  r7   r7   r7   r8   r  )  rX  r  AUDIO_ENCODERc                   @  rU  )AudioEncoderNrW  r7   r7   r7   r8   r  -  rX  r  AUDIO_ENCODER_OUTPUTc                   @  rU  )AudioEncoderOutputNrW  r7   r7   r7   r8   r  1  rX  r  TRACKSc                   @  rZ  )Tracksc                   @  s   e Zd ZU ded< ded< dS )zTracks.TrackDictr   
track_pathtrack_visibilityNr   r7   r7   r7   r8   	TrackDict7  r_  r  N)r4   r5   r6   r   r  re   r7   r7   r7   r8   r  5  r`  r  COMFY_MULTITYPED_V3c                   @  s    e Zd ZeZG dd deZdS )	MultiTypec                      sF   e Zd ZdZdd fddZedddZdd Z fddZ  Z	S )zMultiType.Inputz
        Input that permits more than one input type; if `id` is an instance of `ComfyType.Input`, then that input will be used to create a widget (if applicable) with overridden values.
        NFr   str | Inputtypes#list[type[_ComfyType] | _ComfyType]r   rH   r   r   rJ   r   r   c
           
   
     s   d | _ t|trFt|| _ |jdu r|jn|}|jd ur |jn|}|jd ur*|jn|}|jd ur4|jn|}|j}t| j t	rF| j 
 | j _t ||||||||	 || _d S NT)input_overriders   rk   copyr   r   r   r   r   r   r   r   r   rU   	_io_types)
rT   r   r  r   r   r   r   r   r   r   r   r7   r8   rU   C  s   

zMultiType.Input.__init__rj   list[type[Input]]c                 C  s6   g }| j D ]}t|s|t| q|| q|S )zF
            Returns list of Input class types permitted.
            )r  r&   appendrw   )rT   io_typesxr7   r7   r8   r  S  s   
zMultiType.Input.io_typesc                 C  s@   dd | j D }| jd ur|d| j  dtt|S )Nc                 S  r   r7   r|   ro   r  r7   r7   r8   r   b  r   z/MultiType.Input.get_io_type.<locals>.<listcomp>r   ,)r  r  insertr   joinr   rf  fromkeys)rT   	str_typesr7   r7   r8   r   `  s   
zMultiType.Input.get_io_typec                   s(   | j d ur| j  t  B S t  S rR   )r  rW   r   rV   r   r7   r8   rW   g  s   

zMultiType.Input.as_dictr   )r   r  r  r  r   rH   r   rH   r   rJ   r   rJ   r   rJ   )rj   r  )
r4   r5   r6   rn   rU   r   r  r   rW   r   r7   r7   r   r8   rk   ?  s    rk   N)r4   r5   r6   r   re   rk   r7   r7   r7   r8   r  <  s    r  COMFY_MATCHTYPE_V3c                   @  s:   e Zd ZG dd dZG dd deZG dd deZdS )	MatchTypec                   @  s"   e Zd Zefd
ddZdd Zd	S )MatchType.Templatetemplate_idrH   allowed_types_ComfyType | list[_ComfyType]c                 C  sl   || _ t|ts|g}|D ]#}t|ts#t|ts"td|jj qt|ts0td|j q|| _	d S )Nz?Allowed types must be a ComfyType or a list of ComfyTypes, got )
r  rs   r   rw   rc   
ValueErrorr   r4   rt   r  )rT   r  r  tr7   r7   r8   rU   p  s   




zMatchType.Template.__init__c                 C  s   | j ddd | jD dS )Nr  c                 S  r   r7   r|   )ro   r  r7   r7   r8   r     r   z.MatchType.Template.as_dict.<locals>.<listcomp>)r  r  )r  r  r  rV   r7   r7   r8   rW   ~  s   zMatchType.Template.as_dictN)r  rH   r  r  )r4   r5   r6   r  rU   rW   r7   r7   r7   r8   Templateo  s    r  c                      s.   e Zd Z	dd fddZ fddZ  ZS )zMatchType.InputNFr   rH   templater  r   r   r   rJ   r   r   c
           
   
     s$   t  ||||||||	 || _d S rR   r   rU   r  )
rT   r   r  r   r   r   r   r   r   r   r   r7   r8   rU     s   
zMatchType.Input.__init__c                      t   td| j iB S Nr  r   rW   r'   r  rV   r   r7   r8   rW        

zMatchType.Input.as_dictr   )r   rH   r  r  r   rH   r   rH   r   rJ   r   rJ   r   rJ   r   r7   r7   r   r8   rk     s    rk   c                      s0   e Zd Z		dd fd	d
Z fddZ  ZS )zMatchType.OutputNFr  r  r   rH   r   r   c                   s(   |s|sd}t  |||| || _d S )N	MATCHTYPEr  )rT   r  r   r   r   r   r   r7   r8   rU     s   
zMatchType.Output.__init__c                   r  r  r  rV   r   r7   r8   rW     r  zMatchType.Output.as_dictr   )r  r  r   rH   r   rH   r   rH   r   r7   r7   r   r8   r     s
    r   N)r4   r5   r6   r  rk   r   r7   r7   r7   r8   r  m  s    r  c                   @     e Zd ZdZdS )DynamicInputz8
    Abstract class for dynamic input registration.
    Nr4   r5   r6   rn   r7   r7   r7   r8   r        r  c                   @  r  )DynamicOutputz9
    Abstract class for dynamic output registration.
    Nr  r7   r7   r7   r8   r    r  r  prefix_listlist[str] | Noner   
str | Noner   c                 C  s"   | d u rg } |d ur| |g } | S rR   r7   r  r   r7   r7   r8   handle_prefix  s
   
r  c                 C  s<   | d u r
|d u r
J | d u r|S |d ur| |g } d | S )N.)r  r  r7   r7   r8   finalize_prefix  s   

r  COMFY_AUTOGROW_V3c                   @  sh   e Zd Zeeef ZdZG dd dZG dd deZ	G dd deZ
G dd	 d	eZedddZdS )Autogrowd   c                   @  sB   e Zd ZdddZdddZd	d
 ZdddZdd Zdd ZdS )zAutogrow._AutogrowTemplater1   rk   c                 C  s>   t |trJ t|| _t | jtrd| j_g | _i | _d S r  )rs   r  r  r1   r   r   namescached_inputsrT   r1   r7   r7   r8   rU     s   
z#Autogrow._AutogrowTemplate.__init__namerH   c                 C  s   t  | j}||_|S rR   )r  r1   r   )rT   r1   r  	new_inputr7   r7   r8   _create_input  s   z(Autogrow._AutogrowTemplate._create_inputc                 C  s$   | j D ]}| | j|| j|< qd S rR   )r  r  r1   r  )rT   r  r7   r7   r8   _create_cached_inputs  s   
z0Autogrow._AutogrowTemplate._create_cached_inputsrj   r   c                 C  s   t | j S rR   )r   r  valuesrV   r7   r7   r8   r        z"Autogrow._AutogrowTemplate.get_allc                 C  s   t dt| jgiS )Nr1   )r'   create_input_dict_v1r1   rV   r7   r7   r8   rW     s   z"Autogrow._AutogrowTemplate.as_dictc                 C     | j   d S rR   )r1   r   rV   r7   r7   r8   r     r  z#Autogrow._AutogrowTemplate.validateN)r1   rk   )r1   rk   r  rH   r   )	r4   r5   r6   rU   r  r  r   rW   r   r7   r7   r7   r8   _AutogrowTemplate  s    

	
r  c                      s,   e Zd Zdd fd
dZ fddZ  ZS )zAutogrow.TemplatePrefixr*   
   r1   rk   prefixrH   r   rN   r   c                   sj   t  | | _|dksJ |dksJ |tjksJ | _| _ fddt jD  _ 	  d S )Nr   r*   c                   s   g | ]	} j  | qS r7   r  ro   irV   r7   r8   r     s    z4Autogrow.TemplatePrefix.__init__.<locals>.<listcomp>)
r   rU   r  r  	_MaxNamesr   r   ranger  r  )rT   r1   r  r   r   r   rV   r8   rU     s   z Autogrow.TemplatePrefix.__init__c                   r   )N)r  r   r   )r   rW   r'   r  r   r   rV   r   r7   r8   rW     r   zAutogrow.TemplatePrefix.as_dict)r*   r  )r1   rk   r  rH   r   rN   r   rN   r   r7   r7   r   r8   TemplatePrefix  s    r  c                      s,   e Zd Zdd fdd	Z fd
dZ  ZS )zAutogrow.TemplateNamesr*   r1   rk   r  r   r   rN   c                   s:   t  | |d tj | _|dksJ || _|   d S Nr   )r   rU   r  r  r  r   r  )rT   r1   r  r   r   r7   r8   rU     s
   zAutogrow.TemplateNames.__init__c                   r   )N)r  r   )r   rW   r'   r  r   rV   r   r7   r8   rW     r   zAutogrow.TemplateNames.as_dictr*   )r1   rk   r  r   r   rN   r   r7   r7   r   r8   TemplateNames  s    r  c                      s@   e Zd Z	dd fddZ fddZdddZdd Z  ZS )zAutogrow.InputNFr   rH   r  0Autogrow.TemplatePrefix | Autogrow.TemplateNamesr   r   r   rJ   c                       t  |||||| || _d S rR   r  )rT   r   r  r   r   r   r   r   r   r7   r8   rU        
zAutogrow.Input.__init__c                   r  r  r  rV   r   r7   r8   rW     r  zAutogrow.Input.as_dictrj   r   c                 C  s   | g| j   S rR   )r  r   rV   r7   r7   r8   r     s   zAutogrow.Input.get_allc                 C  r  rR   )r  r   rV   r7   r7   r8   r     r  zAutogrow.Input.validateNFNNN)
r   rH   r  r  r   rH   r   rH   r   rJ   r   )r4   r5   r6   rU   rW   r   r   r   r7   r7   r   r8   rk     s    
rk   out_dictdict[str, Any]live_inputsr   tuple[str, dict[str, Any]]
input_typerH   curr_prefixr  c                   s  d|d d v }d|d d v }|d d d }|r/|d d d }|d d d }	t |	}
n%|rT|d d d  |d d d }|d d d }
 fdd	t|
D }	d }d
}| D ]\}}t |dkrgq\t| d }|dk} |d u r|tdi }d}t|	D ]2\}}t||}||k r|r|| d |< |di }n|| d |< |di }||v r|||< d
}q|st|}|| d |< t	j
| d |< t| ||| d S )Nr  r*   r  r  r1   r   r   c                   s   g | ]}  | qS r7   r7   r  r  r7   r8   r     s    z7Autogrow._expand_schema_for_dynamic.<locals>.<listcomp>Tr   requiredz[template_input could not be determined from required or optional; this should never happen.Fr   dynamic_pathsdynamic_paths_default_value)lenr  rv   r   r  	Exception	enumerater  
setdefaultDynamicPathsDefaultValue
EMPTY_DICTparse_class_inputs)r  r  r   r  r  is_names	is_prefixr1   r   r  r   template_inputtemplate_required_input_type
dict_inputnew_dictnew_dict_added_tor  r  expected_id	type_dictfinalized_prefixr7   r  r8   _expand_schema_for_dynamic  sP   

z#Autogrow._expand_schema_for_dynamicN
r  r  r  r  r   r  r  rH   r  r  )r4   r5   r6   rf  rH   r   re   r  r  r  r  r  rk   staticmethodr  r7   r7   r7   r8   r    s    r  COMFY_DYNAMICCOMBO_V3c                   @  sD   e Zd Zeeef ZG dd dZG dd deZ	e
dddZdS )DynamicComboc                   @  s   e Zd Zd
ddZdd Zd	S )zDynamicCombo.OptionkeyrH   inputsr   c                 C  s   || _ || _d S rR   r!  r"  )rT   r!  r"  r7   r7   r8   rU   G  s   
zDynamicCombo.Option.__init__c                 C  s   | j t| jdS )Nr#  )r!  r  r"  rV   r7   r7   r8   rW   K  s   zDynamicCombo.Option.as_dictN)r!  rH   r"  r   rX   r7   r7   r7   r8   OptionF  s    
r$  c                      s@   e Zd Z	dd fddZdddZ fddZdd Z  ZS )zDynamicCombo.InputNFr   rH   r   list[DynamicCombo.Option]r   r   r   rJ   c                   r  rR   r   )rT   r   r   r   r   r   r   r   r   r7   r8   rU   R  r  zDynamicCombo.Input.__init__rj   r   c                 C  s   | gdd | j D  S )Nc                 S  s   g | ]
}|j D ]}|qqS r7   )r"  )ro   optionr1   r7   r7   r8   r   X      z.DynamicCombo.Input.get_all.<locals>.<listcomp>)r   rV   r7   r7   r8   r   W  s   zDynamicCombo.Input.get_allc                   s"   t   tddd | jD iB S )Nr   c                 S  s   g | ]}|  qS r7   )rW   ro   or7   r7   r8   r   \      z.DynamicCombo.Input.as_dict.<locals>.<listcomp>)r   rW   r'   r   rV   r   r7   r8   rW   Z  s   
zDynamicCombo.Input.as_dictc                 C  s$   | j D ]}|jD ]}|  qqd S rR   )r   r"  r   )rT   r&  r1   r7   r7   r8   r   _  s
   


zDynamicCombo.Input.validater   )
r   rH   r   r%  r   rH   r   rH   r   rJ   r   r4   r5   r6   rU   r   rW   r   r   r7   r7   r   r8   rk   Q  s    
rk   r  r  r  r   r  r  rH   r  r  c           
      C  s   t |}||v rC|| }d }|d d }|D ]}	|	d |kr"|	} nq|d urEt| ||d | || | |< t ||d | d |< d S d S d S )Nr*   r   r!  r"  r  r  r  )
r  r  r   r  r  finalized_idr!  selected_optionr   r&  r7   r7   r8   r  e  s    	z'DynamicCombo._expand_schema_for_dynamicNr  )r4   r5   r6   rf  rH   r   re   r$  r  rk   r  r  r7   r7   r7   r8   r   B  s    r   COMFY_DYNAMICSLOT_V3c                   @  s6   e Zd Zeeef ZG dd deZe	dddZ
dS )DynamicSlotc                      s@   e Zd Z	dd fddZdddZ fddZdd Z  ZS )zDynamicSlot.InputNslotrk   r"  r   r   rH   r   r   rJ   c                   s   t |trJ t|| _|jd ur|jn|| j_d}|jd ur#|jn|| j_|jd ur/|jn|| j_|jd ur;|jn|| j_t 	|j
| jj|| jj| jj| jj || _d | _t | jtrhd| _d| j_d S d S r  )rs   r  r  r2  r   r   r   r   r   rU   r   r"  r   r   )rT   r2  r"  r   r   r   r   r   r   r7   r8   rU   |  s   (zDynamicSlot.Input.__init__rj   c                 C  s   | j g| j S rR   )r2  r"  rV   r7   r7   r8   r     r  zDynamicSlot.Input.get_allc                   s,   t   tt| j t| j| jdB S )N)slotTyper"  r   )	r   rW   r'   rH   r2  r   r  r"  r   rV   r   r7   r8   rW     s
   

zDynamicSlot.Input.as_dictc                 C  s"   | j   | jD ]}|  qd S rR   )r2  r   r"  r  r7   r7   r8   r     s   


zDynamicSlot.Input.validate)NNNN)
r2  rk   r"  r   r   rH   r   rH   r   rJ   r   r+  r7   r7   r   r8   rk   {  s    
rk   r  r  r  r   r  r  rH   r  r  c                 C  sT   t |}||v r(|d d }t| ||| || | |< t ||d | d |< d S d S )Nr*   r"  r,  r  r-  )r  r  r   r  r  r.  r"  r7   r7   r8   r    s   z&DynamicSlot._expand_schema_for_dynamicNr  )r4   r5   r6   rf  rH   r   re   r  rk   r  r  r7   r7   r7   r8   r1  w  s
    !r1  IMAGECOMPAREc                   @  r   )ImageComparec                      s0   e Zd Z		dd fddZ fddZ  ZS )zImageCompare.InputNFTr   rH   r   r   r   rJ   r   c                   s&   t  ||||d d |d d d d | d S rR   r   )rT   r   r   r   r   r   r   r   r7   r8   rU     s   &zImageCompare.Input.__init__c                   
   t   S rR   r   rW   rV   r   r7   r8   rW        
zImageCompare.Input.as_dict)NFNTN)
r   rH   r   rH   r   rH   r   rJ   r   rJ   r   r7   r7   r   r8   rk     s
    rk   N)r4   r5   r6   rf  re   r   rk   r7   r7   r7   r8   r5    r   r5  COLORc                   @  r   )Colorc                      s0   e Zd Z		dd fddZ fddZ  ZS )zColor.InputNFT#ffffffr   rH   r   r   r   rJ   r   r   c                   s*   t  ||||d ||d d d d | |  d S rR   r   )rT   r   r   r   r   r   r   r   r   r7   r8   rU     s   "zColor.Input.__init__c                   r6  rR   r7  rV   r   r7   r8   rW     r8  zColor.Input.as_dict)NFNTNr;  )r   rH   r   rH   r   rH   r   rJ   r   rJ   r   rH   r   r7   r7   r   r8   rk     s
    rk   Nr   r7   r7   r7   r8   r:    r   r:  BOUNDING_BOXc                   @  s0   e Zd ZG dd deZeZG dd deZdS )BoundingBoxc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )zBoundingBox.BoundingBoxDictrN   r  yr  r  Nr   r7   r7   r7   r8   BoundingBoxDict  r  r?  c                      s0   e Zd Z		dd fddZ fddZ  ZS )zBoundingBox.InputNFTr   rH   r   r   r   rJ   r   rf  	componentr   c	           	   	     sD   t  ||||d || || _|| _|d u r ddddd| _d S d S )Nr   i   )r  r>  r  r  )r   rU   r@  r   r   )	rT   r   r   r   r   r   r   r@  r   r   r7   r8   rU     s   zBoundingBox.Input.__init__c                   s2   t   }| jr| j|d< | jd ur| j|d< |S )Nr@  r   )r   rW   r@  r   rT   dr   r7   r8   rW     s   



zBoundingBox.Input.as_dict)NFNTNNN)r   rH   r   rH   r   rH   r   rJ   r   rf  r@  rH   r   rJ   r   r7   r7   r   r8   rk     s
    rk   N)r4   r5   r6   r   r?  re   r   rk   r7   r7   r7   r8   r=    s    r=  CURVEc                   @  s0   e Zd ZddlmZ ereZG dd deZ	dS )Curver   )
CurvePointc                      s0   e Zd Z		dd fddZ fddZ  ZS )zCurve.InputNFTr   rH   r   r   r   rJ   r   list[tuple[float, float]]r   c                   s<   t  ||||d ||d d d d | |d u rddg| _d S d S )N)        rG  )      ?rH  )r   rU   r   )rT   r   r   r   r   r   r   r   r   r7   r8   rU     s   "zCurve.Input.__init__c                   s2   t   }| jd urdd | jD dd|d< |S )Nc                 S  s   g | ]}t |qS r7   )r   )ro   pr7   r7   r8   r     r*  z'Curve.Input.as_dict.<locals>.<listcomp>monotone_cubic)pointsinterpolationr   )r   rW   r   rA  r   r7   r8   rW     s   

zCurve.Input.as_dict)NFNTNN)r   rH   r   rH   r   rH   r   rJ   r   rF  r   rJ   r   r7   r7   r   r8   rk     s
    rk   N)
r4   r5   r6   comfy_api.inputrE  r   CurveInput_re   r   rk   r7   r7   r7   r8   rD    s
    rD  	HISTOGRAMc                   @  s   e Zd ZdZee ZdS )	Histogramz0A histogram represented as a list of bin counts.N)r4   r5   r6   rn   r   rN   re   r7   r7   r7   r8   rP    s    rP  zndict[str, Callable[[dict[str, Any], dict[str, Any], tuple[str, dict[str, Any]], str, list[str] | None], None]]DYNAMIC_INPUT_LOOKUPfunccCallable[[dict[str, Any], dict[str, Any], tuple[str, dict[str, Any]], str, list[str] | None], None]c                 C  s   |t | < d S rR   rQ  )rd   rR  r7   r7   r8   register_dynamic_input_func  s   rU  c                 C  s   t |  S rR   rT  r|   r7   r7   r8   get_dynamic_input_func  s   rV  c                   C  s.   t tjtj t tjtj t tjtj d S rR   )rU  r  rd   r  r   r1  r7   r7   r7   r8   setup_dynamic_input_funcs  s   rW  c                   @  s4   e Zd ZU ded< 	 ded< 	 ded< 	 ded< dS )V3Datar  hidden_inputsr  r	  rJ   create_dynamic_tupleNr   r7   r7   r7   r8   rX    s   
 rX  c                   @  s<   e Zd Zdd	d
ZdddZedddZedddZdS )HiddenHolder	unique_idrH   promptr   extra_pnginfo	dynpromptauth_token_comfy_orgapi_key_comfy_orgc                 K  rQ   rR   r\  r]  r^  r_  r`  ra  )rT   r\  r]  r^  r_  r`  ra  r~   r7   r7   r8   rU     s   zHiddenHolder.__init__r!  c                 C  s   dS )z*If hidden variable not found, return None.Nr7   )rT   r!  r7   r7   r8   __getattr__"     zHiddenHolder.__getattr__rB  dict | Nonec              
   C  s\   |d u ri }| | tjd | tjd | tjd | tjd | tjd | tjd dS )Nrb  )getHiddenr\  r]  r^  r_  r`  ra  )ri   rB  r7   r7   r8   	from_dict&  s   zHiddenHolder.from_dictv3_dataV3Data | Nonerj   c                 C  s   |  |r	|d S d S )NrY  )rh  )ri   ri  r7   r7   r8   from_v3_data3     zHiddenHolder.from_v3_dataN)r\  rH   r]  r   r^  r   r_  r   r`  rH   ra  rH   )r!  rH   )rB  re  )ri  rj  rj   r[  )r4   r5   r6   rU   rc  classmethodrh  rk  r7   r7   r7   r8   r[    s    

r[  c                   @  s2   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ	dS )	rg  z>
    Enumerator for requesting hidden variables in nodes.
    	UNIQUE_IDPROMPTEXTRA_PNGINFO	DYNPROMPTAUTH_TOKEN_COMFY_ORGAPI_KEY_COMFY_ORGN)
r4   r5   r6   rn   r\  r]  r^  r_  r`  ra  r7   r7   r7   r8   rg  7  s    rg  c                   @  s  e Zd ZU dZded< dZded< dZded< dZded	< dZd
ed< dZ	ded< dZ
ded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dZded< dS ) 
NodeInfoV1Nrf  r1   zdict[str, list[str]]input_orderrJ   is_input_listr   r2   z
list[bool]output_is_listoutput_nameoutput_tooltipsoutput_matchtypesrH   r  r   descriptionr   python_modulecategoryoutput_node
deprecatedexperimentaldev_onlyapi_nodere  price_badgesearch_aliasesessentials_categoryhas_intermediate_output)r4   r5   r6   r1   rf   ru  rv  r2   rw  rx  ry  rz  r  r   r{  r|  r}  r~  r  r  r  r  r  r  r  r  r7   r7   r7   r8   rt  I  s.   
 rt  c                   @  sX   e Zd ZU eedZded< eedZded< eedZded< ddd	Z	dddZ
dS )PriceBadgeDependsdefault_factoryr   widgetsr"  input_groupsrj   Nonec                 C  s|   t | jtrtdd | jD rtdt | jtr$tdd | jD r(tdt | jtr8tdd | jD r<tdd S )Nc                 s      | ]	}t |t V  qd S rR   rs   rH   r  r7   r7   r8   	<genexpr>j      z-PriceBadgeDepends.validate.<locals>.<genexpr>z.PriceBadgeDepends.widgets must be a list[str].c                 s  r  rR   r  r  r7   r7   r8   r  l  r  z-PriceBadgeDepends.inputs must be a list[str].c                 s  r  rR   r  r  r7   r7   r8   r  n  r  z3PriceBadgeDepends.input_groups must be a list[str].)rs   r  r   anyr  r"  r  rV   r7   r7   r8   r   i  s      zPriceBadgeDepends.validateschema_inputslist['Input']r  c           	      C  s   i }|D ]%}|  }| ||j< |dd  D ]}|j d|j }| ||< qqg }| jD ]}||vrCtd| dt|  |||| d q/|| j| j	dS )Nr*   r  z9PriceBadge depends_on.widgets references unknown widget 'z'. Available widgets: )r  rw   )r  r"  r  )
r   r   r   r  r  r   keysr  r"  r  )	rT   r  input_typesinp
all_inputs
nested_inpprefixed_idwidgets_datawr7   r7   r8   rW   q  s*   

zPriceBadgeDepends.as_dictNrj   r  r  r  rj   r  )r4   r5   r6   r	   r   r  rf   r"  r  r   rW   r7   r7   r7   r8   r  c  s   
 
r  c                   @  sN   e Zd ZU ded< eedZded< eddZded< dddZdddZ	dS )
PriceBadgerH   exprr  r  
depends_onjsonata)r   enginerj   r  c                 C  sH   | j dkrtd| j  dt| jtr| j std| j  d S )Nr  zUnsupported PriceBadge.engine 'z'. Only 'jsonata' is supported.z+PriceBadge.expr must be a non-empty string.)r  r  rs   r  rH   stripr  r   rV   r7   r7   r8   r     s
   
zPriceBadge.validater  r  r  c                 C  s   | j | j|| jdS )N)r  r  r  )r  r  rW   r  )rT   r  r7   r7   r8   rW     s   
zPriceBadge.as_dictNr  r  )
r4   r5   r6   rf   r	   r  r  r  r   rW   r7   r7   r7   r8   r    s   
 
r  c                   @  sR  e Zd ZU dZded< 	 dZded< 	 dZded< 	 eedZ	d	ed
< eedZ
ded< eedZded< dZded< 	 eedZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZded< 	 dZd ed!< 	 dZded"< 	 d#d$ Zd%d& Zd+d)d*ZdS ),Schemaz!Definition of V3 node properties.rH   node_idNr   sdr}  r  r   r"  zlist[Output]outputszlist[Hidden]hidden r{  r   r  FrJ   rv  is_output_nodeis_deprecatedis_experimentalis_dev_onlyis_api_nodezPriceBadge | Noner  not_idempotentenable_expandaccept_all_inputsr  r  r  c           	      C  s   g }| j D ]}t|ts||  qdd |D }dd | jD }t|}t|}g }t|t|krG|ddd t	|
 D  d t|t|kra|ddd t	|
 D  d t|d	krntd
|| j D ]}|  qq| jD ]}|  q{| jdur| j  dS dS )zValidate the schema:
        - verify ids on inputs and outputs are unique - both internally and in relation to each other
        c                 S  r   r7   r   r  r7   r7   r8   r     r   z#Schema.validate.<locals>.<listcomp>c                 S  r   r7   r  r(  r7   r7   r8   r     r   zInput ids must be unique, but c                 S     g | ]
\}}|d kr|qS r  r7   ro   itemcountr7   r7   r8   r     r'  z	 are not.zOutput ids must be unique, but c                 S  r  r  r7   r  r7   r7   r8   r     r'  r   
N)r"  rs   r  extendr   r  setr
  r  r   rv   r  r  r   r  )	rT   nested_inputsr1   	input_ids
output_ids	input_set
output_setissuesr2   r7   r7   r8   r     s.   

$$




zSchema.validatec                 C  s   | j du rg | _ | jdu rg | _| jdu rg | _| jr5tj| jvr(| jtj tj| jvr5| jtj | jrRtj	| jvrE| jtj	 tj
| jvrR| jtj
 t| jD ]\}}|jdu rkd| d|j d|_qWdS )zVAdd hidden based on selected schema options, and give outputs without ids default ids.N_)r"  r  r  r  rg  r`  r  ra  r  r]  r^  r  r   rd   )rT   r  r2   r7   r7   r8   finalize  s*   



zSchema.finalizerj   rt  c                 C  s  t | j}| jr| jD ]}|jf|di |j< qg }g }g }g }g }d}	| jrf| jD ]:}
||
j ||
j	 ||
j
rA|
j
n|
j ||
jrM|
jnd  t|
tjr`||
jj d}	q+|d  q+|	sjd }tdi d|ddd | D d| jd	|d
|d|d|d|d| jd| j
d| jd| jd| jd| jd| jd| jd| jd| jdt|ddd| jd ur| j| jnd d| j r| j n
d d| j!}|S d| j!}|S )Nr  FTr1   ru  c                 S  s   i | ]\}}|t | qS r7   )r   r  )ro   r!  r   r7   r7   r8   rr   =  s    z&Schema.get_v1_info.<locals>.<dictcomp>rv  r2   rw  rx  ry  rz  r  r   r}  r{  r~  r  r  r  r  r  r|  RELATIVE_PYTHON_MODULEnodesr  r  r  r7   )"r  r"  r  r   r  r  r  r  rd   r   r   r   rs   r  r   r  r  rt  rv   rv  r  r}  r{  r  r  r  r  r  r  getattrr  rW   r  r  )rT   ri   r1   r  r2   rw  rx  ry  rz  any_matchtypesr)  infor7   r7   r8   get_v1_info  s   


	
zSchema.get_v1_info)rj   rt  )r4   r5   r6   rn   rf   r   r}  r	   r   r"  r  r  r{  r  rv  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r7   r7   r7   r8   r    sT   
 


r  FrB  r  r  tuple[dict[str, Any], V3Data]c                 C  s   i i i i d}|   } | dd }t|||  |d ur!|r!||d< i }|dd }|d ur7t|dkr7||d< |dd }|d urKt|dkrK||d< |||fS )N)r  r   r  r	  r  r  r   r	  )r  popr  r
  )rB  r  include_hiddenr  r  ri  r  r	  r7   r7   r8   get_finalized_class_inputsU  s$   
r  r  	curr_dictr  r  c                 C  s   |  D ]:\}}|  D ]1\}}|d }|tv r*t|}	t||}
|	| ||||
 qt||}|| | |< |r=|| d |< qqd S )Nr   r  )rv   rQ  rV  r  r  )r  r  r  r  r  inner_dr   r   rd   dynamic_input_func
new_prefixr.  r7   r7   r8   r  l  s   

r  r"  r   rf  c                 C  s    di i}| D ]}t || q|S )Nr  )add_to_dict_v1)r"  r1   r  r7   r7   r8   r  |  s
   r  r  c                 C  s@   | j rdnd}|  }|dd  |  |f||i | j< d S )Nr   r  )r   rW   r  r   r  r   )r  rB  r!  rW   r7   r7   r8   r    s   r  c                   @  r  )r  
empty_dictN)r4   r5   r6   r  r7   r7   r7   r8   r    s    r  r  ri  c                 C  s   | dd }| di }|d u r| S |  } i }| dd}| D ]F\}}|d}|}	t|D ]6\}
}|
t|d k}|ra| |d }|d u rV| |d }|tjkrVi }|r\||f}||	|< q1|		|i }	q1q"| 
| | S )Nr  r	  rZ  Fr  r*   )rf  r  rv   splitr  r
  r  r  r  r  update)r  ri  pathsdefault_value_dictresultcreate_tupler!  pathpartscurrentr  rI  is_lastr   default_optionr7   r7   r8   build_nested_inputs  s2   



r  c                   @  sL  e Zd ZU dZdZdZdZded< ee	dNddZ
ee	dOd
dZedPddZedQddZedRddZdd Zedd Zeedd Zedd ZeedOddZeedOdd ZeedSd$d%ZeedTd'd(ZdZeed)d* ZdZeed+d, ZdZeed-d. ZdZeed/d0 Z dZ!eed1d2 Z"dZ#eed3d4 Z$dZ%eed5d6 Z&dZ'eed7d8 Z(dZ)eed9d: Z*dZ+eed;d< Z,dZ-eed=d> Z.dZ/eed?d@ Z0dZ1eedAdB Z2dZ3eedCdD Z4dZ5eedEdF Z6eedUdHdIZ7eedJdK Z8eedNdLdMZ9dS )V_ComfyNodeBaseInternalz]Common base class for storing internal methods and properties; DO NOT USE for defining nodes.Nr[  r  rj   r  c                 C     t z?Override this function with one that returns a Schema instance.NotImplementedErrorri   r7   r7   r8   define_schema     z$_ComfyNodeBaseInternal.define_schema
NodeOutputc                 K  r  z=Override this function with one that performs node's actions.r  ri   r~   r7   r7   r8   execute  r  z_ComfyNodeBaseInternal.execute
bool | strc                 K  r  )zOptionally, define this function to validate inputs; equivalent to V1's VALIDATE_INPUTS.

        If the function returns a string, it will be used as the validation error message for the node.
        r  r  r7   r7   r8   validate_inputs  s   z&_ComfyNodeBaseInternal.validate_inputsr   c                 K  r  )zOptionally, define this function to fingerprint inputs; equivalent to V1's IS_CHANGED.

        If this function returns the same value as last run, the node will not be executed.r  r  r7   r7   r8   fingerprint_inputs  s   z)_ComfyNodeBaseInternal.fingerprint_inputsr   c                       fdd D S )  Optionally, define this function to return a list of input names that should be evaluated.

        This basic mixin impl. requires all inputs.

        :kwargs: All node inputs will be included here.  If the input is ``None``, it should be assumed that it has not yet been evaluated.              When using ``INPUT_IS_LIST = True``, unevaluated will instead be ``(None,)``.

        Params should match the nodes execution ``FUNCTION`` (self, and all inputs by name).
        Will be executed repeatedly until it returns an empty list, or all requested items were already evaluated (and sent as params).

        Comfy Docs: https://docs.comfy.org/custom-nodes/backend/lazy_evaluation#defining-check-lazy-status
        c                      g | ]
} | d u r|qS rR   r7   ro   r  r~   r7   r8   r     r'  z<_ComfyNodeBaseInternal.check_lazy_status.<locals>.<listcomp>r7   r  r7   r  r8   check_lazy_status     z(_ComfyNodeBaseInternal.check_lazy_statusc                 C  r  rR   )r   VALIDATE_CLASSrV   r7   r7   r8   rU     r  z_ComfyNodeBaseInternal.__init__c                 C     t S rR   )r  r  r7   r7   r8   GET_BASE_CLASS  rd  z%_ComfyNodeBaseInternal.GET_BASE_CLASSc                 C  sD   t | dd u rtd| j dt | dd u r td| j dd S )Nr  z5No define_schema function was defined for node class r  r  z/No execute function was defined for node class )r%   r  r4   r  r7   r7   r8   r    s
   z%_ComfyNodeBaseInternal.VALIDATE_CLASSc                 C  s   t | jrdS dS )NEXECUTE_NORMALIZED_ASYNCEXECUTE_NORMALIZED)inspectiscoroutinefunctionr  r  r7   r7   r8   FUNCTION  s   z_ComfyNodeBaseInternal.FUNCTIONc                 O  s   | j |i |}|d u rt }n0t|trn*t|tr t| }n t|tr+t|}nt|tr7t|jd}n	tdt	| |j
d urR| jjsRtd| j d|S Nblock_executionzInvalid return type from node: zNode z~ is not expandable, but expand included in NodeOutput; developer should set enable_expand=True on node's Schema to allow this.r  r  rs   r9  rf  rh  r)   messager  rw   expandSCHEMAr  r4   ri   argsr~   r   r7   r7   r8   r    s   




z)_ComfyNodeBaseInternal.EXECUTE_NORMALIZEDc                   s   | j |i |I d H }|d u rt }n0t|trn*t|tr$t| }n t|tr/t|}nt|tr;t|jd}n	tdt	| |j
d urV| jjsVtd| j d|S r  r  r  r7   r7   r8   r    s    




z/_ComfyNodeBaseInternal.EXECUTE_NORMALIZED_ASYNCri  rj  type[ComfyNode]c                 C  s,   t | r| nt| }t|}t||_|S )z<Creates clone of real node class to prevent monkey-patching.)r&   rw   r(   r[  rk  r  )ri   ri  c_type
type_cloner7   r7   r8   PREPARE_CLASS_CLONE"  s   z*_ComfyNodeBaseInternal.PREPARE_CLASS_CLONEr  c                 C  s   |   }|| }t|S rR   )
GET_SCHEMAr  r   ri   schemar  r7   r7   r8   GET_NODE_INFO_V1.  s   
z'_ComfyNodeBaseInternal.GET_NODE_INFO_V1c                 C     | j d u r	|   | j S rR   )_DESCRIPTIONr	  r  r7   r7   r8   DESCRIPTION6     
z"_ComfyNodeBaseInternal.DESCRIPTIONc                 C  r  rR   )	_CATEGORYr	  r  r7   r7   r8   CATEGORY>  r  z_ComfyNodeBaseInternal.CATEGORYc                 C  r  rR   )_EXPERIMENTALr	  r  r7   r7   r8   EXPERIMENTALF  r  z#_ComfyNodeBaseInternal.EXPERIMENTALc                 C  r  rR   )_DEPRECATEDr	  r  r7   r7   r8   
DEPRECATEDN  r  z!_ComfyNodeBaseInternal.DEPRECATEDc                 C  r  rR   )	_DEV_ONLYr	  r  r7   r7   r8   DEV_ONLYV  r  z_ComfyNodeBaseInternal.DEV_ONLYc                 C  r  rR   )	_API_NODEr	  r  r7   r7   r8   API_NODE^  r  z_ComfyNodeBaseInternal.API_NODEc                 C  r  rR   )_OUTPUT_NODEr	  r  r7   r7   r8   OUTPUT_NODEf  r  z"_ComfyNodeBaseInternal.OUTPUT_NODEc                 C  r  rR   )_HAS_INTERMEDIATE_OUTPUTr	  r  r7   r7   r8   HAS_INTERMEDIATE_OUTPUTn  r  z._ComfyNodeBaseInternal.HAS_INTERMEDIATE_OUTPUTc                 C  r  rR   )_INPUT_IS_LISTr	  r  r7   r7   r8   INPUT_IS_LISTv  r  z$_ComfyNodeBaseInternal.INPUT_IS_LISTc                 C  r  rR   )_OUTPUT_IS_LISTr	  r  r7   r7   r8   OUTPUT_IS_LIST~  r  z%_ComfyNodeBaseInternal.OUTPUT_IS_LISTc                 C  r  rR   )_RETURN_TYPESr	  r  r7   r7   r8   RETURN_TYPES  r  z#_ComfyNodeBaseInternal.RETURN_TYPESc                 C  r  rR   )_RETURN_NAMESr	  r  r7   r7   r8   RETURN_NAMES  r  z#_ComfyNodeBaseInternal.RETURN_NAMESc                 C  r  rR   )_OUTPUT_TOOLTIPSr	  r  r7   r7   r8   OUTPUT_TOOLTIPS  r  z&_ComfyNodeBaseInternal.OUTPUT_TOOLTIPSc                 C  r  rR   )_NOT_IDEMPOTENTr	  r  r7   r7   r8   NOT_IDEMPOTENT  r  z%_ComfyNodeBaseInternal.NOT_IDEMPOTENTc                 C  r  rR   )_ACCEPT_ALL_INPUTSr	  r  r7   r7   r8   ACCEPT_ALL_INPUTS  r  z(_ComfyNodeBaseInternal.ACCEPT_ALL_INPUTSdict[str, dict]c                 C  s   |   }|| }|jS rR   )FINALIZE_SCHEMAr  r1   r
  r7   r7   r8   INPUT_TYPES  s   
z"_ComfyNodeBaseInternal.INPUT_TYPESc                 C  s   |   }|  |S )z#Call define_schema and finalize it.)r  r  )ri   r  r7   r7   r8   r.    s   z&_ComfyNodeBaseInternal.FINALIZE_SCHEMAc                 C  sr  |    |  }|  | jdu r|j| _| jdu r|j| _| jdu r'|j| _| j	du r0|j
| _	| jdu r9|j| _| jdu rB|j| _| jdu rK|j| _| jdu rT|j| _| jdu r]|j| _| jdu rf|j| _| jdu ro|j| _| jdu rg }g }g }g }|jr|jD ]%}||j ||jr|jn|j ||j ||jr|jnd q|| _|| _ || _!|| _"|| _#|S )zYValidate node class, finalize schema, validate schema, and set expected class properties.N)$r  r.  r   r  r{  r  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  rv  r)  r  r+  r  r#  r  r  rd   r   r   r   r%  r!  r'  r  )ri   r  r2   rx  rw  ry  r)  r7   r7   r8   r	    sT   












z!_ComfyNodeBaseInternal.GET_SCHEMArj   r  rj   r  rj   r  rj   r   rj   r   )ri  rj  rj   r  )rj   r  )rj   r-  ):r4   r5   r6   rn   r  r  r  rf   rm  r   r  r  r  r  r  rU   r  r   r  r#   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r/  r.  r	  r7   r7   r7   r8   r    s   
 


r  c                   @  sn   e Zd ZdZeedddZeedddZedd
dZedddZ	edddZ
eedd ZdS )	ComfyNodez#Common base class for all V3 nodes.rj   r  c                 C  r  r  r  r  r7   r7   r8   r    r  zComfyNode.define_schemar  c                 K  r  r  r  r  r7   r7   r8   r    r  zComfyNode.executer  c                 K  r  )zXOptionally, define this function to validate inputs; equivalent to V1's VALIDATE_INPUTS.r  r  r7   r7   r8   r       zComfyNode.validate_inputsr   c                 K  r  )zVOptionally, define this function to fingerprint inputs; equivalent to V1's IS_CHANGED.r  r  r7   r7   r8   r    r6  zComfyNode.fingerprint_inputsr   c                   r  )r  c                   r  rR   r7   r  r  r7   r8   r     r'  z/ComfyNode.check_lazy_status.<locals>.<listcomp>r7   r  r7   r  r8   r  	  r  zComfyNode.check_lazy_statusc                 C  r  )z>DO NOT override this class. Will break things in execution.py.)r5  r  r7   r7   r8   r    r  zComfyNode.GET_BASE_CLASSNr0  r1  r2  r3  r4  )r4   r5   r6   rn   rm  r   r  r  r  r  r  r   r  r7   r7   r7   r8   r5    s"    r5  c                   @  sH   e Zd ZdZdddddddZedd ZedddZdddZ	dS )r  zj
    Standardized output of a node; can pass in any number of args and/or a UIOutput into 'ui' kwarg.
    N)uir  r  r  r   r7  _UIOutput | dictr  rf  r  rH   c                G  s   || _ || _|| _|| _d S rR   )r  r7  r  r  )rT   r7  r  r  r  r7   r7   r8   rU   $  s   
zNodeOutput.__init__c                 C  s   t | jdkr
| jS d S r  )r
  r  rV   r7   r7   r8   r  *  rl  zNodeOutput.resultdatar  rj   c                 C  sf   d}d }d }d|v r|d }t |tr| |jdS |}d|v r#|d }d|v r+|d }| |||dS )Nr7   r  r  r7  r  )r7  r  )rs   r)   r   )ri   r9  r  r7  r  r  r7   r7   r8   rh  .  s   
zNodeOutput.from_dictc                 C  s
   | j | S rR   )r  )rT   indexr7   r7   r8   __getitem__>  r8  zNodeOutput.__getitem__)r  r   r7  r8  r  rf  r  rH   )r9  r  rj   r  r3  )
r4   r5   r6   rn   rU   r   r  rm  rh  r;  r7   r7   r7   r8   r     s    
r  c                   @  s"   e Zd Zdd ZedddZdS )		_UIOutputc                 C  r   rR   r7   rV   r7   r7   r8   rU   B  r   z_UIOutput.__init__rj   rf  c                 C  r   rR   r7   rV   r7   r7   r8   rW   E  rd  z_UIOutput.as_dictN)rj   rf  )r4   r5   r6   rU   r   rW   r7   r7   r7   r8   r<  A  s    r<  c                   @  "   e Zd ZU dZded< ded< dS )InputMapOldIdz0Map an old node input to a new node input by ID.rH   new_idold_idNr4   r5   r6   rn   rf   r7   r7   r7   r8   r>  J     
 r>  c                   @  s"   e Zd ZU dZded< ded< dS )InputMapSetValuez*Set a specific value for a new node input.rH   r?  r   	set_valueNrA  r7   r7   r7   r8   rC  O  rB  rC  c                   @  r=  )	OutputMapz,Map outputs of node replacement via indexes.rN   new_idxold_idxNrA  r7   r7   r7   r8   rE  [  rB  rE  c                   @  s*   e Zd ZdZ			ddddZdd ZdS )NodeReplaceaK  
    Defines a possible node replacement, mapping inputs and outputs of the old node to the new node.

    Also supports assigning specific values to the input widgets of the new node.

    Args:
        new_node_id: The class name of the new replacement node.
        old_node_id: The class name of the deprecated node.
        old_widget_ids: Ordered list of input IDs for widgets that may not have an input slot
            connected. The workflow JSON stores widget values by their relative position index,
            not by ID. This list maps those positional indexes to input IDs, enabling the
            replacement system to correctly identify widget values during node migration.
        input_mapping: List of input mappings from old node to new node.
        output_mapping: List of output mappings from old node to new node.
    Nnew_node_idrH   old_node_idold_widget_idsr  input_mappinglist[InputMap] | Noneoutput_mappinglist[OutputMap] | Nonec                 C  s"   || _ || _|| _|| _|| _d S rR   rI  rJ  rK  rL  rN  )rT   rI  rJ  rK  rL  rN  r7   r7   r8   rU   p  s
   
zNodeReplace.__init__c                 C  s:   | j | j| j| jrt| jnd| jrt| jdS ddS )z;Create serializable representation of the node replacement.NrP  )rI  rJ  rK  rL  r   rN  rV   r7   r7   r8   rW   }  s   zNodeReplace.as_dict)NNN)
rI  rH   rJ  rH   rK  r  rL  rM  rN  rO  )r4   r5   r6   rn   rU   rW   r7   r7   r7   r8   rH  `  s    rH  )[r0   r;   rE   rY   r^   r   r   rk   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r  r   r?  rA  rC  rD  r   rF  rH  r  rJ  rL  r  r  r   rQ  rS  rV  r[  rb  r-   re  rh  rm  rn  rq  ru  rw  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r:  r  r   r  r[  rg  rt  r  r5  r  r  rX  r5  r  r  r=  rD  rP  rH  )rd   rH   )rd   rH   rj   r   rR   )r  r  r   r  rj   r   )r  r  r   r  rj   rH   )rd   rH   rR  rS  )rd   rH   rj   rS  )F)rB  r  r  r  rj   r  )
r  r  r  r  r  r  r  r  rj   r  )r"  r   rj   rf  )r  rk   rB  rf  )r  r  ri  rX  )
__future__r   r  r  abcr   r   collectionsr   collections.abcr   dataclassesr   r   r	   enumr
   typingr   r   r   r   r   r   typing_extensionsr   r   r   spandrelr   comfy.clip_visionr   r   rM  comfy.controlnetr   comfy.hooksr   r   comfy.model_patcherr   comfy.samplersr   r   comfy.sdr   r   r   rO  rM  r   r    rN  comfy_api.internalr!   r"   r#   r$   r%   r&   r'   r(   comfy_execution.graph_utilsr)   _utilr+   r,   r-   rc  r.   rH   r0   r;   rE   rY   r^   rc   rw   rg   r   r   r   rk   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r  r?  rA  rC  rD  rF  rH  rJ  rL  rQ  rS  rV  r[  rb  re  rh  rm  rn  rq  ru  rw  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r1  r5  r:  r=  rD  rP  rQ  rf   rU  rV  rW  r
  rX  r[  rg  rt  r  r  r  r  r  r  r  r  r  r  r5  r  r<  r>  rC  InputMaprE  rH  __all__r7   r7   r7   r8   <module>   s    ()3w
0. 	
4
.




&* 2#  A0!	(