o
    i                     @   sz  d dl Z d dlZd dlZ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mZmZmZ d dlZd dlZd dlmZ d dlZd dlZd dlZd dlmZ d dlZd dlmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+ d d	l,m-Z- d d
l.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@mAZB G dd de	ZCG dd deDZEG dd dZFG dd deZGG dd de	ZHG dd dZIdZJddi fddZKdZLdd ZMd=d!d"ZNd#d$ ZOd>d%d&ZPd'd( ZQd)d* ZRd+d, ZSd-d. ZTd/d0 ZUG d1d2 d2ZVd3d4 ZWd5d6 ZXd7eeYeZ df fd8d9Z[d:Z\G d;d< d<Z]dS )?    N)Enum)ListLiteral
NamedTupleOptionalUnionargs)set_preview_method)
BasicCacheCacheKeySetIDCacheKeySetInputSignature	NullCacheHierarchicalCacheLRUCacheRAMPressureCache)DynamicPromptExecutionBlockerExecutionListget_input_info)GraphBuilderis_link)validate_node_input)get_progress_statereset_progress_stateadd_progress_handlerWebUIProgressHandlerCurrentNodeContext)_ComfyNodeInternal_NodeOutputInternalfirst_real_overrideis_classmake_locked_method_func)io_io)_has_cache_providers_get_cache_providers_loggerc                   @   s   e Zd ZdZdZdZdS )ExecutionResultr         N)__name__
__module____qualname__SUCCESSFAILUREPENDING r2   r2   '/mnt/c/Users/fbmor/ComfyUI/execution.pyr)   .   s    r)   c                   @   s   e Zd ZdS )DuplicateNodeErrorN)r,   r-   r.   r2   r2   r2   r3   r4   3   s    r4   c                   @   s*   e Zd ZdededefddZdd ZdS )	IsChangedCache	prompt_id	dynpromptoutputs_cachec                 C   s   || _ || _|| _i | _d S N)r6   r7   r8   
is_changed)selfr6   r7   r8   r2   r2   r3   __init__7   s   
zIsChangedCache.__init__c              
      sp  || j v r| j | S | j|}|d }tj| }d}d }t|tr/t|dd ur/d}d}n	t|dr8d}d}|sDd| j |< | j | S d|v rT|d | j |< | j | S t	|d ||d \}}}	zJz t
| j|||||	dI d H }
t|
I d H }
d	d
 |
D |d< W n  ty } ztd| td|d< W Y d }~nd }~ww W |d | j |< n|d | j |< w | j | S )N
class_typeFfingerprint_inputsT
IS_CHANGEDr:   inputsv3_datac                 S   s   g | ]}t |trd n|qS r9   )
isinstancer   .0xr2   r2   r3   
<listcomp>Y       z&IsChangedCache.get.<locals>.<listcomp>zWARNING: {}NaN)r:   r7   get_nodenodesNODE_CLASS_MAPPINGS
issubclassr   r!   hasattrget_input_data_async_map_node_over_listr6   "resolve_map_node_over_list_results	Exceptionloggingwarningformatfloat)r;   node_idnoder=   	class_defhas_is_changedis_changed_nameinput_data_all_rB   r:   er2   r2   r3   get=   sB   






 
zIsChangedCache.getN)r,   r-   r.   strr   r   r<   r_   r2   r2   r2   r3   r5   6   s    r5   c                   @   s   e Zd ZU eed< eed< dS )
CacheEntryuioutputsN)r,   r-   r.   dict__annotations__listr2   r2   r2   r3   ra   b   s   
 ra   c                   @   s   e Zd ZdZdZdZdZdS )	CacheTyper   r*   r+      N)r,   r-   r.   CLASSICLRUNONERAM_PRESSUREr2   r2   r2   r3   rg   g   s
    rg   c                   @   sB   e Zd Zdi fddZdd Zdd Zdd	 Zd
d Zdd ZdS )CacheSetNc                 C   s   |t jkr|   td n0|t jkr%|dd}| | td n|t jkr;|dd}| 	| td n| 
  | j| jg| _d S )Nz"Disabling intermediate node cache.ramg      0@zUsing RAM pressure cache.lrur   zUsing LRU cache)rg   rk   init_null_cacherS   inforl   r_   init_ram_cacherj   init_lru_cacheinit_classic_cacherc   objectsall)r;   
cache_type
cache_args	cache_ram
cache_sizer2   r2   r3   r<   o   s   




zCacheSet.__init__c                 C   s   t tdd| _t t| _d S NT)enable_providers)r   r   rc   r   ru   r;   r2   r2   r3   rt         zCacheSet.init_classic_cachec                 C   s   t t|dd| _tt| _d S )NT)max_sizer|   )r   r   rc   r   r   ru   )r;   rz   r2   r2   r3   rs      s   zCacheSet.init_lru_cachec                 C   s   t tdd| _tt| _d S r{   )r   r   rc   r   r   ru   )r;   min_headroomr2   r2   r3   rr      r~   zCacheSet.init_ram_cachec                 C   s   t  | _t  | _d S r9   )r   rc   ru   r}   r2   r2   r3   rp         zCacheSet.init_null_cachec                 C   s   d| j  i}|S )Nrc   )rc   recursive_debug_dump)r;   resultr2   r2   r3   r      s   
zCacheSet.recursive_debug_dump)	r,   r-   r.   r<   rt   rs   rr   rp   r   r2   r2   r2   r3   rm   n   s    rm   )auth_token_comfy_orgapi_key_comfy_orgc                    s  t |t}i }i }| }	|rt|	| \}	}
}i  i | D ]i|  }t||	\}}} fdd}t|ry|rA|ddsy|d }|d }|d u rQ|  q|||}|d u s`|j	d u rd|  q|t
|j	kro|  q|j	| }| < q|d us|r|jr|g < q|r|
d urtjjj|
v r|d ur| ni |tjj< tjjj|
v r||tjj< tjjj|
v r|dd |tjj< tjjj|
v r||tjj< tjjj|
v r|dd |tjj< tjjj|
v r|d	d |tjj< nkd
|	v r\|	d
 }|D ]_| dkr|d ur| ni g < | dkr|g < | dkr/|dd g < | dkr;|g < | dkrK|dd g < | dkr[|d	d g < q||d<  |fS )Nc                      s   d< d < d S )NTr9   r2   r2   r\   missing_keysrF   r2   r3   mark_missing   r   z$get_input_data.<locals>.mark_missingrawLinkFr   r*   extra_pnginfor   r   hiddenPROMPT	DYNPROMPTEXTRA_PNGINFO	UNIQUE_IDAUTH_TOKEN_COMFY_ORGAPI_KEY_COMFY_ORGhidden_inputs)rM   r   INPUT_TYPESr%   get_finalized_class_inputsr   r   r_   	get_cacherc   lenACCEPT_ALL_INPUTSr$   Hiddenpromptnameget_original_promptr7   r   	unique_idr   r   )r@   rY   r   execution_listr7   
extra_datais_v3rB   hidden_inputs_v3valid_inputsr   
input_datar]   input_category
input_infor   input_unique_idoutput_indexcachedobjhr2   r   r3   rO      s~   







rO   c                    sj   dd | D }t |dkrdd | D S t|I d H \}}|D ]}| }|d ur-|q!dd | D S )Nc                 S   s$   g | ]}t |tjr| s|qS r2   rC   asyncioTaskdonerD   r2   r2   r3   rG         $ z6resolve_map_node_over_list_results.<locals>.<listcomp>r   c                 S   $   g | ]}t |tjr| n|qS r2   rC   r   r   r   rD   r2   r2   r3   rG      r   c                 S   r   r2   r   rD   r2   r2   r3   rG      r   )r   r   wait	exception)results	remainingr   pendingtaskexcr2   r2   r3   rQ      s   rQ   Fc	              
      s   t dd}	t|dkrd}
ntdd | D }
dd }g d f	dd		}|	r>||d|	d
I d H  S |
dkrK|i I d H  S t|
D ]}|||}|||I d H  qOS )NINPUT_IS_LISTFr   c                 s   s    | ]}t |V  qd S r9   r   rD   r2   r2   r3   	<genexpr>   s    z,_async_map_node_over_list.<locals>.<genexpr>c                    s    fdd|   D S )Nc                    s*   i | ]\}}||t | kr nd  qS )r   )rE   kvir2   r3   
<dictcomp>   s   * zA_async_map_node_over_list.<locals>.slice_dict.<locals>.<dictcomp>)items)dr   r2   r   r3   
slice_dict   s   z-_async_map_node_over_list.<locals>.slice_dictc              	      s   rt   d }|  D ]#\}}|r!|D ]}t|tr |} nqt|tr0r,|n|} nq|d u rوd urA|d urA| ttsOtr}ttr}tr_}  	}nt
}|  |	}t||}	d ur|t| } nt}	t|	rdd }
t|
|	|| d}tdI d H  | r| }| d S | d S t| |	di | }W d    n1 sw   Y  | d S | d S )Nc                    sF   t ||| | di |I d H W  d    S 1 sw   Y  d S )Nr2   r   )fr6   r   
list_indexr	   r2   r2   r3   async_wrapper  s   $zH_async_map_node_over_list.<locals>.process_inputs.<locals>.async_wrapperr   r   r2   )rK   before_node_executionr   rC   r   r   r"   rM   VALIDATE_CLASSPREPARE_CLASS_CLONEtyper#   r%   build_nested_inputsgetattrinspectiscoroutinefunctionr   create_tasksleepr   r   appendr   )r@   indexinput_is_listexecution_blockr   r   r^   type_objclass_cloner   r   r   r   	allow_interruptexecution_block_cbfuncr   pre_execute_cbr6   r   r   rB   r2   r3   process_inputs   sX   




z1_async_map_node_over_list.<locals>.process_inputs)r   )NF)r   r   maxvaluesrange)r6   r   r   r\   r   r   r   r   rB   r   max_len_inputr   r   r   
input_dictr2   r   r3   rP      s$   6
rP   c                    s   g }dgt | d  }t|dr|j}ttt | d |D ]5\ }|rGg }| D ]}t|  tr9||   q(||   q(|| q| fdd| D  q|S )NFr   OUTPUT_IS_LISTc                    s   g | ]}|  qS r2   r2   )rE   or   r2   r3   rG   J      z%merge_result_data.<locals>.<listcomp>)	r   rN   r   zipr   rC   r   r   extend)r   r   outputoutput_is_listis_listvaluer   r2   r   r3   merge_result_data8  s   
r   c                    sb   t | ||||jd|||d	I d H }tdd |D }|r#|i d|fS t||\}	}
}|	|
|dfS )NT)r   r   r   rB   c                 s   s&    | ]}t |tjo|  V  qd S r9   r   rE   rr2   r2   r3   r   O  s   $ z"get_output_data.<locals>.<genexpr>F)rP   FUNCTIONanyget_output_from_returns)r6   r   r   r\   r   r   rB   return_valueshas_pending_taskr   rb   has_subgraphr2   r2   r3   get_output_dataM  s   "r   c                    sT  g }g  g }d}t t| D ]}| | }t|trqd|v r$ |d  d|v rKd}|d }|dd }t|trCt|gt|j }|||f qd|v rp|dd }t|trdt|gt|j }|| |d |f qt|t	r|j
d urt|j
tr |j
 n |j
  |jd urd}|j}|j}|jd urtt|jgt|j }|||f q|jd ur|j}|jd urtt|jgt|j }|| |d |f qt|trt|gt|j }|| |d |f q|r|}	nt|dkrt||}	ng }	t }
t dkr% fdd d  D }
|	|
|fS )	NFrb   expandTr   r   c                    s    i | ]   fd dD qS )c                    s   g | ]}|  D ]}|qqS r2   r2   )rE   rF   yr   r2   r3   rG     rH   z6get_output_from_returns.<locals>.<dictcomp>.<listcomp>r2   )rE   uisr   r3   r     s     z+get_output_from_returns.<locals>.<dictcomp>)r   r   rC   rd   r   r_   r   tupleRETURN_TYPESr    rb   as_dictr   r   block_executionr   keys)r   r   r   subgraph_resultsr   r   r   	new_graphr   r   rb   r2   r   r3   r   U  sn   













r   c                 C   s*   | d u rd S t | ttttfr| S t| S r9   )rC   intrV   boolr`   )rF   r2   r2   r3   format_value  s
   r  c                 C   s$   |  |d }tj| }t|ddS )Nr=   HAS_INTERMEDIATE_OUTPUTF)rJ   rK   rL   r   )r7   rW   r=   rY   r2   r2   r3   _is_intermediate_output  s   
r  c              	   C   sV   | j d u rd S |jpi }| d|||dd |d| j  |jd ur)|j||< d S d S )Nexecutedr   rX   display_noder   r6   )	client_idrb   	send_syncr_   )serverrW   display_node_idr   r6   
ui_outputs	cached_uir2   r2   r3   _send_cached_ui  s   

"
r  c           A         s  || }|}|}|d }|d  tj  }|jI d H }|d urMt|||
 t	 
 || tjd d fS d zЈ|	v rg }|	 D ](}t|tjr~z	||  W q[ ty} } z|	= |d }~ww || q[|	= t||\}}n~|v r| }g }|D ]@\}}|s|| qg }|D ](}t|r|d |d }}||}|j| D ]}|| qq|| q|t| qt||g }|= d}n#t	  t|||||\}jd ur|_d|dj |jI d H } | d u r.| } |j| I d H  t |t!r<t"|dd u}!nt#| dd d u}!|!r|$ }"d	|"d
< t%| dd	|"dI d H }#t&|#I d H }#tt'dd |#D g }#fdd|#D }#t(|#dkr|#D ]	}$|)|$ qtj*d d fW S  fdd}%fdd}&z.t+| |%|&|dI d H \}}}'W t,j-j.rt/j0dkrt1j23  t,j45  t1j67  nt,j-j.rt/j0dkrt1j23  t,j45  t1j67  w w |'r|	< |8fdd}(t9|(  tj*d d fW S t(|dkr5|||d|d|
< jd ur5d||dj |rg })g }*g }+g },t:t(D ]z}$|$ \}-}.|-d u r\|)d|.f qF|-; D ]2\}/}0|*|/ |0d}1|<|/|0|1 |0d  tj  }t=|dr|j>d	kr|+|/ q`t:t(|.D ]}$t|.|$ r|.|$ d |.|$ d }2}3|,|2|3f q|)d	|.f qFt|*}*|j?D ]}4|4@|*I d H }5|5A  q|+D ]}/|B|/ |C|/ q|,D ]}6|D|6d |6d  q|)|< tj*d d fW S tE|
d}7||7 |j|7I d H  W n t,j4jFyD }8 ztGHd d|i}9tjI|9|8fW  Y d }8~8S d }8~8w ty } ztJK \}:};}<tL|:}=i }>d ursi }>; D ]\}?}d d |D |>|?< qdtGMd!|  tGMtNO  d"}@t,j4P|rd#}@tGHd$Qt,j4R  tGMd% t,j4S  nt|tTrd&tU|v rd' v rd(}@|d)Q||@|=tNV|<|>d*}9tjI|9|fW  Y d }~S d }~ww t	 
 W tjd d fS )+Nr@   r=   r   r*   F	executing)rX   r  r6   check_lazy_statusTcreate_dynamic_tuple)r   rB   c                 S   s   g | ]	}t |tr|qS r2   )rC   rf   r   r2   r2   r3   rG     s    zexecute.<locals>.<listcomp>c                    s*   g | ]}t |tr| vs|v r|qS r2   )rC   r`   rD   )r\   r   r2   r3   rG     s    c              
      sJ   | j d ur# td| j  dg g g d	}d|j td S | S )NzExecution Blocked: ExecutionBlocked	r6   rW   	node_typer  exception_messageexception_type	tracebackcurrent_inputscurrent_outputsexecution_error)messagerf   r
  r	  r   )blockmes)r=   r  r6   r  r   r2   r3   r     s   

z#execute.<locals>.execution_block_cbc                    s   t  | d d S Nr   )r   set_default_prefix)
call_index)r   r2   r3   r     s   zexecute.<locals>.pre_execute_cb)r   r   rB   DEBUGc                     s0   dd  D } t j| ddiI d H    d S )Nc                 S   s   g | ]
}t |tjr|qS r2   )rC   r   r   rD   r2   r2   r3   rG   "  s    z5execute.<locals>.await_completion.<locals>.<listcomp>return_exceptionsT)r   gather)tasks)output_dataunblockr2   r3   await_completion!  s   
z!execute.<locals>.await_completion)rW   r  parent_nodereal_node_id)metar   r  r  override_display_idOUTPUT_NODE)rb   rc   zProcessing interruptedrW   c                 S   s   g | ]}t |qS r2   )r  rD   r2   r2   r3   rG   k  r   z$!!! Exception during processing !!!  zThis error means you ran out of memory on your GPU.

TIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.zMemory summary: {}z(Got an OOM, unloading all loaded models.zmat1 and mat2 shapesSamplerz

TIPS: If you have any "Load CLIP" or "*CLIP Loader" nodes in your workflow connected to this sampler node make sure the correct file(s) and type is selected.z{}
{})rW   r  r  r  r  )Xget_real_node_idget_display_node_idget_parent_node_idrJ   rK   rL   rc   r_   r  r   finish_progresscache_updater)   r/   rC   r   r   r   r   rR   r   r   r   r   r   start_progressrO   r	  last_node_idr
  ru   setrM   r   r!   r   copyrP   rQ   sumr   make_input_strong_linkr1   r   comfymemory_managementaimdo_enabledr	   verbosecomfy_aimdocontrolanalyzemodel_managementreset_cast_buffers
model_vbarvbars_reset_watermark_limitsadd_external_blockr   r   r   add_ephemeral_noderN   r-  rv   ensure_subcache_forclean_unusedadd_node
cache_linkadd_strong_linkra   InterruptProcessingExceptionrS   rq   r0   sysexc_infofull_type_nameerrorr  
format_excis_oomrU   debug_memory_summaryunload_all_modelsRuntimeErrorr`   	format_tbadd)Ar  r7   cachescurrent_itemr   r  r6   r   pending_subgraph_resultspending_async_nodesr  r*  r  parent_node_idr@   rY   r   r   r   ex	output_uir   cached_resultsresolved_outputsis_subgraphr   resolved_outputsource_nodesource_outputnode_cachedr   rB   r   lazy_status_presentv3_data_lazyrequired_inputsr   r   r   has_pending_tasksr(  cached_outputsnew_node_idsnew_output_idsnew_output_linksr   node_outputsrW   	node_info
display_idfrom_node_idfrom_socketcachesubcachelinkcache_entryiexerror_detailstypr]   tbr  input_data_formattedr   tipsr2   )	r=   r  r\   r   r&  r6   r  r'  r   r3   execute  sf  





&








	








$

r~  c                   @   sf   e Zd ZdddZdd Zdedefd	d
Zdd Zde	de	fddZ
i g fddZi g fddZdS )PromptExecutorFNc                 C   s   || _ || _|| _|   d S r9   )rx   rw   r  reset)r;   r  rw   rx   r2   r2   r3   r<     s   zPromptExecutor.__init__c                 C   s"   t | j| jd| _g | _d| _d S )N)rw   rx   T)rm   rw   rx   rY  status_messagessuccessr}   r2   r2   r3   r    s   
zPromptExecutor.resetdata	broadcastc                 C   sX   i |dt t d i}| j||f | jjd us|r*| j||| jj d S d S )N	timestampi  )r  timer  r   r  r	  r
  )r;   eventr  r  r2   r2   r3   add_message  s   zPromptExecutor.add_messagec           
   
   C   s   |d }|| d }t |tjjr$|||t|d}	| jd|	dd d S |||t||d |d |d	 |d
 t|d	}	| jd|	dd d S )NrW   r=   )r6   rW   r  r  execution_interruptedTr  r  r  r  r  r  r  F)rC   r;  rB  rM  rf   r  )
r;   r6   r   r  r  rQ  r^  rW   r=   r  r2   r2   r3   handle_execution_error  s(   z%PromptExecutor.handle_execution_errorr  r6   c                 C   s   t  sd S t D ]9}z|dkr|| n	|dkr|| W q tyA } ztd|jj d| d|  W Y d }~qd }~ww d S )NstartendzCache provider z
 error on : )	r&   r'   on_prompt_starton_prompt_endrR   _cache_loggerrT   	__class__r,   )r;   r  r6   providerr^   r2   r2   r3   _notify_prompt_lifecycle  s   

,z'PromptExecutor._notify_prompt_lifecyclec                 C   s   t | |||| d S r9   )r   runexecute_async)r;   r   r6   r   execute_outputsr2   r2   r3   r~    s   zPromptExecutor.executec                    s  t |d td d|v r|d  j_nd  j_g  _ jdd|idd  d| t	 j
d d	 } jtjkrC jjjnd }tj|| zt t t|}t|| tt j t|| jj} jjD ]}	|	|| |I d H  |	  qpt| }
t j! fd
d|
D  I d H }dd t"|
|D }tj#$   jd||ddd i }i }i }t% }t&| jj} jj' }t|D ]}|(| q|) sS|* I d H \}}}|d ur +||j,|||| n|d usJ dt- j| j||||||||I d H \}}}|t.j/k _0|t.j/kr) +||j,|||| ni|t.j1kr4|2  n|3   jtjkrOtj#j4dd ||d tj5| |) r|' D ]0}||v r`qWt6||shqW jj|I d H }|d ur|7|}t8 j||||| qW jdd|idd i }i }|9 D ]\}}|d ||< |d ||< q||d _:d  j_;tj#j<rtj#=  W d    n1 sw   Y  W tjd d  d| d S W tjd d  d| d S tjd d  d| w )Npreview_methodFr	  execution_startr6   r  r  rn   i   @c                 3   s    | ]
} j j|V  qd S r9   )rY  rc   r_   )rE   rW   r}   r2   r3   r     s    z/PromptExecutor.execute_async.<locals>.<genexpr>c                 S   s   g | ]
\}}|d ur|qS r9   r2   )rE   rW   r   r2   r2   r3   rG     s
    z0PromptExecutor.execute_async.<locals>.<listcomp>execution_cached)rK   r6   z(Node ID should not be None at this pointr   )pins_requiredram_requiredexecution_successr   r+  )rc   r+  r  )>r
   r_   rK   interrupt_processingr  r	  r  r  r  r  rx   rw   rg   rl   rY  rc   ram_releaser;  r<  set_ram_cache_release_statetorchinference_moder   r   r   r   r5   rv   
set_promptr   rI  rf   r   r$  r   rB  cleanup_models_gcr7  r   all_node_idsrJ  is_emptystage_node_executionr  original_promptr~  r)   r0   r  r1   unstage_node_executioncomplete_node_executionfree_memoryextra_ram_releaser  r1  r  r   history_resultr6  DISABLE_SMART_MEMORYrU  )r;   r   r6   r   r  ram_headroomram_release_callbackdynamic_promptis_changed_cachert  node_idscache_resultscached_nodesr[  r\  ui_node_outputsr  r   r  rW   rQ  r^  r   r   r  r  meta_outputsui_infor2   r}   r3   r    s   





,





 NNzPromptExecutor.execute_async)FN)r,   r-   r.   r<   r  rd   r  r  r  r`   r  r~  r  r2   r2   r2   r3   r    s    
	r  c           ,         sL  |}||v r|| S || d }|| d }t j| }g }d}	d }
g }d}t|tr@| }t||\}}}
d}t||}n| }d}t||d }|d ur]t	
|}|j}|jd u}i }t|di t|di }|D ]}t|||\}}}|d usJ ||vr|dkr|
s| n|d	d
 }dd|d|id}|| qr|| }||f}t|trdt|dkrdd| |||dd}|| qr|d }|| d }t j| j}||d  }|||< d|vrt||s| d| d| d}dd|||||dd}|| qrzt| |||I d H }|d du r%d}	W qrW qr tyc }  z0t \}!}}"d}	t|!}#ddt| ||t| |#t|"|ddg}$d|$|f||< W Y d } ~ qrd } ~ ww zIt|t rxd|v rx|d }|||< |d krt!|}|||< |d!krt"|}|||< |d"krt|}|||< |d#krt#|}|||< W n2 ty }  z%d$d%| d&| d'| d'|  |||t| d(d}|| W Y d } ~ qrd } ~ ww ||vr|sd)|v r||d) k rd*d+$||d) | |||dd}|| qrd,|v r0||d, kr0d-d.$||d, | |||dd}|| qrt|ts=|t%j&j'kr|t%j&j'krK|d/g }%n|}%||%vr|}&d0}'t|%d1krhd2t|% d}'d }&nt|%}'d3d4| d5| d6|' ||&|dd}|| qrqrt|dks|r	t(|||\}(}}
i })|(D ]}||v s|r|(| |)|< qd|v r|g|)d< t)| |||)||
d7I d H }*t*|*I d H }*|)D ]9}t+|*D ]1\}+}|durt|t,s| }|dur|d8t| 7 }d9d:|d|id}|| qՐqՐqt|dks|	durd||f}*ndg |f}*|*||< |*S );Nr@   r=   TFvalidate_inputsVALIDATE_INPUTSrequiredoptional.r   required_input_missingzRequired input is missing
input_namer   r  details
extra_infor+   bad_linked_inputzBBad linked input, must be a length-2 list of [node_id, slot_index])r  input_configreceived_valuer   r*   input_typesz, received_type(z) mismatch input_type()return_type_mismatchz)Return type mismatch between linked nodes)r  r  received_typelinked_node!exception_during_inner_validationz$Exception when validating inner node)r  r  r  r  r  r  	__value__INTFLOATSTRINGBOOLEANinvalid_input_typez&Failed to convert an input value to a z valuez, )r  r  r  r  minvalue_smaller_than_minzValue {} smaller than min of {}r   value_bigger_than_maxzValue {} bigger than max of {}optionsr.     z(list of length value_not_in_listzValue not in listz: 'z	' not in rA   z - custom_validation_failedz!Custom validation failed for node)-rK   rL   rM   r   r   r%   r   r!   r   r   getfullargspecr	   varkwr7  r_   unionr   splitr   rC   rf   r   r   r   r  rR   rN  rO  rP  r`   r  rW  rd   r  rV   r  rU   r$   Comboio_typerO   rP   rQ   	enumerater   ),r6   r   item	validatedr   r@   r=   	obj_classerrorsvalidrB   validate_function_inputsvalidate_has_kwargsclass_inputsr]   validate_function_namevalidate_functionargspecreceived_typesr   rF   
input_typer   r  r  rQ  valrq   o_ido_class_typer   r  r^  rz  r{  r  reasonscombo_optionsr  	list_infor\   input_filteredretr   r2   r2   r3   r  .  s  



"























r  c                 C   s"   | j }|dkr
| jS |d | j S )Nbuiltinsr  )r-   r.   )klassmoduler2   r2   r3   rP  #  s   rP  partial_execution_listc                    s  t  }|D ]}d|| vr;|| }|di d}dd|p#d|  dd| d	|d |d
d}d|g i f  S || d }tj|d }	|	d u ru|| }|di d|}dd| dd| d	|||d
d}d|g i f  S t|	dr|	jdu r|d u s||v r|| qt|dkrdddi d}d|g i fS t  }
g }i }i }|D ]}d}g }zt| |||I d H }|d }|d }W n6 t	y } z*t
 \}}}d}t|}ddt||t|ddg}d||f||< W Y d }~nd }~ww |du r|
| qtd| d t|dkr1td |D ]}td|d  d|d   q|||fg7 }| D ]V\}}|d }|d }|durt|dkr||vr|| d }|g |d||< td | d!| d |D ]}td|d  d|d   qu|| d" | q<td# qt|
dkrg }|D ]\}}|D ]}||d  d|d   qqd$|}d%d&|i d}d|t|
|fS dd t|
|fS )'Nr=   _metatitlemissing_node_typezNode 'zID #zO' has no class_type. The workflow may be corrupted or a custom node is missing.z
Node ID '#')rW   r=   
node_titler  Fz2' not found. The custom node may not be installed.r-  Tr   prompt_no_outputszPrompt has no outputsr.  r*   exception_during_validationzException when validating node)r  r  z%Failed to validate prompt for output :z* (prompt):z  - r  r  r  )r  dependent_outputsr=   z*  r  zOutput will be ignored
 prompt_outputs_failed_validationz Prompt outputs failed validation)r7  r_   rK   rL   rN   r-  rX  r   r  rR   rN  rO  rP  r`   r  rW  rS   rQ  r   r   joinrf   )r6   r   r  rc   rF   	node_datar  rQ  r=   class_good_outputsr  node_errorsr  r   r  r  mr^  rz  r]   r{  r  reasonrW   r   errors_listr2   r2   r3   validate_prompt)  s   





	

"

" 
r  i'  c                   @   s   e Zd Zdd Zdd Zd$ddZG dd	 d	eZ	d$d
ed fddZ	dd Z
dd Zdd Zdd Zdd Zd%ddZdd Zdd Zdd  Zd&d"d#ZdS )'PromptQueuec                 C   s@   || _ t | _t| j| _d| _g | _i | _i | _	i | _
d S r  )r  	threadingRLockmutex	Condition	not_emptytask_counterqueuecurrently_runninghistoryflags)r;   r  r2   r2   r3   r<     s   

zPromptQueue.__init__c                 C   sN   | j  t| j| | j  | j  W d    d S 1 s w   Y  d S r9   )r  heapqheappushr  r  queue_updatedr  notify)r;   r  r2   r2   r3   put  s
   
"zPromptQueue.putNc                 C   s   | j R t| jdkr-| j j|d |d ur&t| jdkr&	 W d    d S t| jdkst| j}| j}t|| j	|< |  jd7  _| j
  ||fW  d    S 1 sXw   Y  d S )Nr   )timeoutr*   )r  r   r  r   r  heappopr  r8  deepcopyr  r  r  )r;   r  r  r   r2   r2   r3   r_     s   
$zPromptQueue.getc                   @   s.   e Zd ZU ed ed< eed< ee ed< dS )PromptQueue.ExecutionStatus)r  rQ  
status_str	completedmessagesN)r,   r-   r.   r   re   r  r   r`   r2   r2   r2   r3   ExecutionStatus  s   
 r%  statusr!  c                 C   s   | j P | j|}t| jtkr| jtt| j d }|d ur)t	|
 }|d ur1||}|i |d| j|d < | j|d  | | j  W d    d S 1 sVw   Y  d S )N)r   rc   r&  r*   )r  r  popr   r  MAXIMUM_HISTORY_SIZEnextiterr8  r   _asdictupdater  r  )r;   item_idr  r&  process_itemr   status_dictr2   r2   r3   	task_done  s    "zPromptQueue.task_donec                 C   sX   | j  g }| j D ]}||g7 }q|t| jfW  d    S 1 s%w   Y  d S r9   )r  r  r   r8  r   r  )r;   outrF   r2   r2   r3   get_current_queue  s   $zPromptQueue.get_current_queuec                 C   sR   | j  dd | j D }t| j}||fW  d    S 1 s"w   Y  d S )Nc                 S   s   g | ]}|qS r2   r2   rD   r2   r2   r3   rG     s    z:PromptQueue.get_current_queue_volatile.<locals>.<listcomp>)r  r  r   r8  r  )r;   runningqueuedr2   r2   r3   get_current_queue_volatile  s
   $z&PromptQueue.get_current_queue_volatilec                 C   s>   | j  t| jt| j W  d    S 1 sw   Y  d S r9   )r  r   r  r  r}   r2   r2   r3   get_tasks_remaining  s   $zPromptQueue.get_tasks_remainingc                 C   s<   | j  g | _| j  W d    d S 1 sw   Y  d S r9   )r  r  r  r  r}   r2   r2   r3   
wipe_queue  s   "zPromptQueue.wipe_queuec                 C   s   | j @ tt| jD ]/}|| j| r:t| jdkr |   n| j| t| j | j	   W d    dS qW d    dS 1 sFw   Y  dS )Nr*   TF)
r  r   r   r  r7  r'  r  heapifyr  r  )r;   functionrF   r2   r2   r3   delete_queue_item  s    




zPromptQueue.delete_queue_itemr   c           	      C   s
  | j x |d u rOi }d}|dk r|d urt| j| }| jD ]'}||krA| j| }|d ur1||}|||< |d urAt||krA n|d7 }q|W  d    S || jv rr| j| }|d u rct|}n||}||iW  d    S i W  d    S 1 s~w   Y  d S )Nr   r*   )r  r   r  r8  r   )	r;   r6   	max_itemsoffsetmap_functionr1  r   r   pr2   r2   r3   get_history  s4   




$zPromptQueue.get_historyc                 C   s2   | j  i | _W d    d S 1 sw   Y  d S r9   )r  r  r}   r2   r2   r3   wipe_history  s   "zPromptQueue.wipe_historyc                 C   s:   | j  | j|d  W d    d S 1 sw   Y  d S r9   )r  r  r'  )r;   id_to_deleter2   r2   r3   delete_history_item!  s   "zPromptQueue.delete_history_itemc                 C   s@   | j  || j|< | j  W d    d S 1 sw   Y  d S r9   )r  r  r  r  )r;   r   r  r2   r2   r3   set_flag%  s   
"zPromptQueue.set_flagTc                 C   sV   | j  |r| j}i | _|W  d    S | j W  d    S 1 s$w   Y  d S r9   )r  r  r8  )r;   r  r  r2   r2   r3   	get_flags*  s   $zPromptQueue.get_flagsr9   )NNr   N)T)r,   r-   r.   r<   r  r_   r   r%  r   r0  r2  r5  r6  r7  r:  r?  r@  rB  rC  rD  r2   r2   r2   r3   r    s&    



r  )FNNN)NNN)^r8  r  r   rS   rN  r  r  r  enumr   typingr   r   r   r   r   r   r  comfy.cli_argsr	   comfy.memory_managementr;  comfy.model_managementcomfy_aimdo.model_vbarr?  latent_previewr
   rK   comfy_execution.cachingr   r   r   r   r   r   r   comfy_execution.graphr   r   r   r   comfy_execution.graph_utilsr   r   comfy_execution.validationr   comfy_execution.progressr   r   r   r   comfy_execution.utilsr   comfy_api.internalr   r    r!   r"   r#   comfy_api.latestr$   r%   comfy_execution.cache_providerr&   r'   r(   r  r)   rR   r4   r5   ra   rg   rm   SENSITIVE_EXTRA_DATA_KEYSrO   map_node_over_listrQ   rP   r   r   r   r  r  r  r~  r  r  rP  rf   r`   r  r(  r  r2   r2   r2   r3   <module>   sl    $	,)B
O
A ^ ' vy