
    +jC                        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Zd dl	m
Z
mZmZm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Zd dlmZmZ d dlmZ d dlmZ d dlZd dl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&m'Z' d dl(Z(d d	l)m*Z* d d
l+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZCmDZD d dlEmFZF d dlGmHZH d dlImJZJ e"jK        rd dlLZLdeMdeMfdZNd ZO eP            ZQejR        dejS        fd            ZTejR        dejS        fd            ZUd eVfd!ZWd" ZXd# ZYd$ ZZ G d% d&          Z[dS )'    N)	JobStatusget_jobget_all_jobsvalidate_job_id)ImageImageOps)PngInfo)BytesIO)web)args)feature_flags)__version__)FrontendManagerparse_version)_ComfyNodeInternal)asset_seeder)register_assets_routes)register_file_in_place)resolve_hash_to_path)UserManager)ModelFileManager)CustomNodeManager)SubgraphManager)NodeReplaceManager)OptionalUnion)InternalRoutes)BinaryEventTypes)cache_controlqueuereturnc                     d | D             S )z7Remove sensitive data (index 5) from queue item tuples.c                 "    g | ]}|d d         S )N    ).0items     &/home/wildlama/comfy/ComfyUI/server.py
<listcomp>z0_remove_sensitive_from_queue.<locals>.<listcomp><   s     '''D!H'''    r%   )r    s    r(   _remove_sensitive_from_queuer+   :   s    ''''''r*   c                    K   	  | |           d {V  d S # t           j        t           j        t          t          t
          f$ r2}t          j        d                    |                     Y d }~d S d }~ww xY w)Nzsend error: {})	aiohttpClientErrorClientPayloadErrorConnectionResetErrorBrokenPipeErrorConnectionErrorloggingwarningformat)functionmessageerrs      r(   send_socket_catch_exceptionr9   ?   s      6hw!;=QSbdst 6 6 6(//445555555556s    -A6'A11A6requestc                   K   | j         }|                    d          s|                    d          r;|t          vr2t                              |           t	          j        d| d            ||            d{V }|S )z6Middleware to warn about deprecated frontend API pathsz/scripts/uiz/extensions/core/z@[DEPRECATION WARNING] Detected import of deprecated legacy API: z. This is likely caused by a custom node extension using outdated APIs. Please update your extensions or contact the extension author for an updated version.N)path
startswith_deprecated_paths_warnedaddr3   r4   )r:   handlerr<   responses       r(   deprecation_warningrB   H   s       <D}%% 9L)M)M ///$((...OiSW i i i   $+77#3#3333333HOr*   c                    K   | j                             dd          } ||            d {V }t          |t          j                  s|S |j        dvr|S |j        rd|v r|                                 |S )NzAccept-Encoding )zapplication/jsonz
text/plaingzip)headersget
isinstancer   Responsecontent_typebodyenable_compression)r:   r@   accept_encodingrA   s       r(   compress_bodyrN   [   s      o))*;R@@O#*77#3#3333333Hh-- $FFF} &?22##%%%Or*   allowed_originc                 P     t           j        dt           j        f fd            }|S )Nr:   c                    K   | j         dk    rt          j                    }n ||            d {V }|j        d<   d|j        d<   d|j        d<   d|j        d<   |S )	NOPTIONSzAccess-Control-Allow-Originz&POST, GET, DELETE, PUT, OPTIONS, PATCHzAccess-Control-Allow-MethodszContent-Type, AuthorizationzAccess-Control-Allow-Headerstruez Access-Control-Allow-Credentialsmethodr   rI   rF   )r:   r@   rA   rO   s      r(   cors_middlewarez/create_cors_middleware.<locals>.cors_middlewarei   s      >Y&&|~~HH$WW--------H:H67;c78;X78?E;<r*   r   
middlewareRequest)rO   rV   s   ` r(   create_cors_middlewarerZ   h   s>    ^s{      ^ r*   c                 d   | dS 	 t          j        |           j        rdS dS #  Y nxY wd}t          j        t          j        fD ]k}	 t          j        | d |t          j                  }|D ]/\  }}}}}t          j        |d                   j        s|c c S d}0W# t          j        $ r Y hw xY w|S )NFTr   )		ipaddress
ip_addressis_loopbacksocketAF_INETAF_INET6getaddrinfoSOCK_STREAMgaierror)hostloopbackfamilyr_sockaddrs         r(   r^   r^   y   s    |u%%1 	45H>6?3 	 		"4vv7IJJA-. $ $)1a +HQK88D $#OOOOO#HH	$
  	 	 	D	 Os!   # 'ABBB-,B-c                  J    t           j        dt           j        fd            } | S )Nr:   c                 B  K   d| j         v r(| j         d         }|dk    rt          j        d          S d| j         v r1d| j         v r'| j         d         }| j         d         }|                                }t          j                            |          }|j                                        }t          j                            d|z             }t          |j
                  }	|j        |j
        }|j        |j
        }|	rm|k|it          |          dk    rVt          |          dk    rC||k    r=t          j        d	                    ||                     t          j        d          S | j        d
k    rt          j                    }
n ||            d {V }
|
S )NzSec-Fetch-Sitez
cross-site  statusHostOriginz//r   zJWARNING: request with non matching host and origin {} != {}, returning 403rR   )rF   r   rI   lowerurllibparseurlparsenetlocurlsplitr^   hostnameportlenr3   r4   r5   rU   )r:   r@   sec_fetch_sitere   originhost_domainparsedorigin_domainhost_domain_parsedrf   rA   s              r(   origin_only_middlewarez=create_origin_only_middleware.<locals>.origin_only_middleware   s     w..$_-=>N--|3//// W_$$W_)D)D?6*D_X.F**,,K\**622F"M//11M!'!6!6tk7I!J!J ##5#>??H{"09!&. & 4K38QVYZeVfVfijVjVjor  tA  pB  pB  EF  pF  pF-//O$p$w$w  yD  FS  %T  %T  U  U  U<s3333>Y&&|~~HH$WW--------Hr*   rW   )r   s    r(   create_origin_only_middlewarer      s4    ^"ck " " " ^"H "!r*   c                  J    t           j        dt           j        fd            } | S )Nr:   c                 ~   K   | j         dk    rt          j                    }n ||            d {V }d|j        d<   |S )NrR   zdefault-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self'; connect-src 'self' data:; frame-src 'self'; object-src 'self';zContent-Security-PolicyrT   )r:   r@   rA   s      r(   block_external_middlewarezCcreate_block_external_middleware.<locals>.block_external_middleware   sW      >Y&&|~~HH$WW--------H 7Q23r*   rW   )r   s    r(    create_block_external_middlewarer      s3    ^    ^ %$r*   c                       e Zd Zd Zd Zd Zd ZddZd ZddZ	dd	Z
dd
ZddZddZd Zd ZddZddZd Zd Z	 ddeeeef         defdZdS )PromptServerc                 4    !  t           _        t                       _        t	                       _        t                       _        t                       _	        t                       _        t                      _        dg _        t          j                    _        | _        t'          j                     _        d  _        d _        t0          t2          g}t4          j        r|                    t:                     t4          j        r-|                    t?          t4          j                             n!|                    tA                                 t4          j!        r!|                    tE                                 t4          j#        r&|                    tI          j%                               tM          t4          j'        dz  dz            }tQ          j)        ||           _*        tW                       _,        tW                       _-        t4          j.        t_          j0        t4          j1                  nt4          j.         _2        tg          j4        d j2                    t4          j5        rtm           j*         j                   n'tm           j*                   to          j8                     tQ          j9                    }| _:        d  _;        d  _<        g  _=        |>                    d           fd            }|>                    d           fd	            }|>                    d
          d             }|>                    d          d             }|>                    d          d             }	|>                    d           fd            }
d d d9fd	 |?                    d           fd            }|?                    d           fd            }|>                    d           fd            }|>                    d          d             }|>                    d          d             }|>                    d          d              }|>                    d!           fd"            }d# !|>                    d$          !fd%            }|>                    d&          !fd'            }|>                    d(           fd)            }|>                    d*           fd+            }|>                    d,           fd-            }|>                    d.           fd/            }|>                    d0           fd1            }|?                    d!           fd2            }|?                    d0           fd3            }|?                    d4           fd5            }|?                    d6           fd7            }|?                    d,           fd8            }d S ):Ncustom_nodes_from_webr   i   )client_max_sizemiddlewaresz[Prompt Server] web root: z/wsc                   K   t          j                    }|                    |            d {V  | j        j                            dd          }|rj                            |d            nt          j	                    j
        }|j        |<   di ij        |<   	                     d                                |d|           d {V  j        |k    r+j        $                    ddj        i|           d {V  d}|2 3 d {V }|j        t"          j        j        k    r*t)          j        d	|                                z             K|j        t"          j        j        k    r	 t1          j        |j                  }|r|                    d
          dk    rn|                    di           }|j        |         d<                       dt7          j                    |           d {V  t)          j        d| d|            d}# t0          j        $ r# t)          j        d| d|j                    Y >t>          $ r"}t)          j         d|            Y d }~dd }~ww xY wn6 	 j                            |d            j                            |d            n;# j                            |d            j                            |d            w xY w|S )NclientIdrD   r   ro   )ro   sid	executingnodeTz&ws connection closed with exception %stypedataz$Feature flags negotiated for client z: Fz"Invalid JSON received from client z$Error processing WebSocket message: )!r   WebSocketResponsepreparerel_urlqueryrG   socketspopuuiduuid4hexsockets_metadatasendget_queue_info	client_idlast_node_idr   r-   	WSMsgTypeERRORr3   r4   	exceptionTEXTjsonloadsr   r   get_server_featuresdebugJSONDecodeError	Exceptionerror)	r:   wsr   first_messagemsgr   client_flagseselfs	           r(   websocket_handlerz0PromptServer.__init__.<locals>.websocket_handler  s     &((B**W%%%%%%%%%/'++J;;C '  d++++jll& !#DL*92)>D!#&)5iiT5H5H5J5JSV*W*WY\]]]]]]]]]>S((T->-J))K64;L1NPSTTTTTTTTT !%!# V V V V V V V#x7#4#:::(PSUS_S_SaSa(abbbbW%6%;;;V#':ch#7#7D, "&1A1A_1T1T/3xx/C/CNZ 5c :? K '+ii$3$1$E$G$G$''" '" !" !" !" !" !" !" !" !($`3$`$`R^$`$`!" !" !" -2MM#3   #O VS V VCH V V      ) V V V#M*TQR*T*TUUUUUUUUV1 < "$<   d+++%))#t4444   d+++%))#t4444IsQ   A,J2 I9A J2 2B$HJ2 .I4J2 		I4I/)J2 /I44J2 28K*/c                    K   t          j        t          j                            j        d                    }d|j        d<   d|j        d<   d|j        d<   |S )Nz
index.htmlzno-store, must-revalidatezCache-Controlzno-cachePragma0Expires)r   FileResponseosr<   joinweb_rootrF   )r:   rA   r   s     r(   get_rootz'PromptServer.__init__.<locals>.get_root=  sU      'T]L(Q(QRRH0KH_-)3HX&*-HY'Or*   z/embeddingsc                     t          j        d          }t          j        t	          t          d |                              S )N
embeddingsc                 L    t           j                            |           d         S )Nr   )r   r<   splitext)as    r(   <lambda>z?PromptServer.__init__.<locals>.get_embeddings.<locals>.<lambda>H  s    8H8H8K8KA8N r*   )folder_pathsget_filename_listr   json_responselistmap)r:   r   s     r(   get_embeddingsz-PromptServer.__init__.<locals>.get_embeddingsE  s:    %7EEJ$T#.N.NPZ*[*[%\%\]]]r*   z/modelsc                     t          t          j                                                  }t	          j        |          S N)r   r   folder_names_and_pathskeysr   r   )r:   model_typess     r(   list_model_typesz/PromptServer.__init__.<locals>.list_model_typesJ  s/    |BGGIIJJK$[111r*   z/models/{folder}c                    K   | j                             dd           }|t          j        vrt	          j        d          S t          j        |          }t	          j        |          S )Nfolder  rn   )
match_inforG   r   r   r   rI   r   r   )r:   r   filess      r(   
get_modelsz)PromptServer.__init__.<locals>.get_modelsP  s`      '++Hd;;F\@@@|3//// 26::E$U+++r*   z/extensionsc           	      F  K   t          j         t          j                            t          j        j                  d          d          }t          t          fd|                    }t          j	        
                                D ]\  t          j         t          j                            t          j                  d          d          }|                    t          t          fd|                               t          j        |          S )Nzextensions/**/*.jsT)	recursivec                 |    dt           j                            | j                                      dd          z   S )Nr   \)r   r<   relpathr   replace)fr   s    r(   r   z?PromptServer.__init__.<locals>.get_extensions.<locals>.<lambda>]  s0    C"'//!T]2S2S2[2[\`be2f2f,f r*   z**/*.jsc                     dt           j                                      z   dz   t          j                            |                               dd          z   S )N/extensions/r   r   )rs   rt   quoter   r<   r   r   )r   dirnames    r(   r   z?PromptServer.__init__.<locals>.get_extensions.<locals>.<lambda>a  sV    ^flFXFXG G 66 "$'//!S"9"9"A"A$"L"L6M r*   )globr   r<   r   escaper   r   r   nodesEXTENSION_WEB_DIRSitemsextendr   r   )r:   r   
extensionsr   r   r   s      @@r(   get_extensionsz-PromptServer.__init__.<locals>.get_extensionsX  s3     IbgllDM**,@B BMQS S SE c"f"f"f"fhmnnooJ"5;;== W W	c	"',,t{3/?/?"K"KW[\\\!!$s ,M ,M ,M ,M ,MNS(U (U #V #V W W W W $Z000r*   c                     | d} | dk    rt          j                    }n3| dk    rt          j                    }n| dk    rt          j                    }|| fS )Ninputtempoutput)r   get_input_directoryget_temp_directoryget_output_directory)dir_typetype_dirs     r(   get_dir_by_typez.PromptServer.__init__.<locals>.get_dir_by_typef  sg    "7""';==V##':<<X%%'<>>X%%r*   c                    t          j                    }t          j                            |           r |            } |            }t          | d          5 }|                    |                                           |                    |j                                                   |j        	                    d           d d d            n# 1 swxY w Y   |
                                |
                                k    S dS )Nrbr   F)node_helpershasherr   r<   existsopenupdatereadfileseek	hexdigest)filepathimager   r   br   s         r(   compare_image_hashz1PromptServer.__init__.<locals>.compare_image_hashs  s   !(**F w~~h'' 6FHHFHH(D)) 'QHHQVVXX&&&HHUZ__..///JOOA&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' {{}}555s   A.CCCc                    |                      d          }|                      d          }d}|                      d          } |          \  }}|r|j        r|j        }|st          j        d          S |                      dd          }t
          j                            |t
          j                            |                    }	t
          j        	                    t
          j                            |	|                    }
t
          j        
                    ||
f          |k    rt          j        d          S t
          j                            |	          st          j        |	           t
          j                            |          }||d	k    s|d
k    rnd}t
          j                            |
          ri |
|          rd}nZ|d          d| d|d          }t
          j                            |	|          }
|dz  }t
          j                            |
          i|sd| ||| |
           nTt          |
d          5 }|                    |j                                                   d d d            n# 1 swxY w Y   |||d}t"          j        r	 |dv r|nd}t'          |
||g          }|j        j        |j        j        |j        j        |j        j        |j        j        |j        d|d<   n&# t8          $ r t;          j        dd           Y nw xY wt          j        |          S t          j        d          S )Nr   	overwriteFr     rn   	subfolderrD   rS   1   Tr   z ()wb)r   r  r   )r   r   r   )abs_pathr   tags)idr   
asset_hashsize	mime_typer  assetz*Failed to register uploaded image as asset)exc_info) rG   r   filenamer   rI   r   r<   r   normpathabspath
commonpathr   makedirsr   r   writer   r   enable_assetsr   refr  r   r  hash
size_bytesr  r  r   r3   r4   r   )postimage_save_functionr   r  image_is_duplicateimage_upload_type
upload_dirr  r  full_output_folderr   splitir   resptagresultr  r   s                    r(   image_uploadz+PromptServer.__init__.<locals>.image_upload  s   HHW%%E--I!& $ 0 0,;O<M,N,N)J) 70 70 > 4<s3333 HH["55	%'W\\*bg>N>Ny>Y>Y%Z%Z"7??27<<8JH+U+UVV7%%z8&<==KK<s3333w~~&899 4K 2333((22(i6.A.AYRUEUEUA'..22 --h>> "15.!&+Ah#@#@!#@#@eAh#@#@#%7<<0BH#M#MQ '..22  * 7*6++E4BBBB!(D11 7QGGEJOO$5$56667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 "*	K\]]% ee3DH[3[3[//ah!7PX`c_d!e!e!e"(*-$*JO*0,*;$*L$;)/)?$*K) )W % e e e(T_cdddddde (...|3////s%   -J

JJ(AL  L*)L*z/upload/imagec                 R   K   |                                   d {V } |          S r   r  )r:   r  r(  s     r(   upload_imagez+PromptServer.__init__.<locals>.upload_image  s6       ''''''D<%%%r*   z/upload/maskc                 Z   K   |                                   d {V }d } ||          S )Nc                 2   t          j        |                    d                    }t          j        |d                   \  }}|st          j        d          S |d         dk    sd|v rt          j        d          S |*|                    dd	          }t          j        |          }|t          j        d          S |                    d
d          dk    rt          j	        
                    ||d
                   }t          j	                            t          j	                            |          |f          |k    rt          j        d          S |}t          j	        
                    ||          }t          j	                            |          rt          j        |          5 }	t!                      }
t#          |	d          r+|	j        D ]#}|
                    ||	j        |                    $|	                    d          }	t          j        | j                                      d          }|                    d          }|	                    |           |	                    |d|
           d d d            d S # 1 swxY w Y   d S d S )Noriginal_refr  r  rn   r   r   ..r   r   r  rD   rm   textRGBAA   )compress_levelpnginfo)r   r   rG   r   annotated_filepathr   rI   get_directory_by_typer   r<   r   r  r  isfiler   r   r	   hasattrr0  add_textconvertr   
getchannelputalphasave)r   r  r   r.  r  
output_dirr   full_output_dirr   original_pilmetadatakeymask_pil	new_alphas                 r(   r  zGPromptServer.__init__.<locals>.upload_mask.<locals>.image_save_function  s   #z$((>*B*BCC'3'F|T^G_'`'`$* 4<s3333 A;#%%)9)9<s3333%'++FH==D!-!CD!I!IJ%<s3333##K44::&(gll:|K?X&Y&YOw))27???+K+KZ*XYY]ggg"|37777!0Jw||J997>>$'' XD)) X\#*99"<77 O'3'8 O O ( 1 1#|7H7M N N N N'3';';F'C'C#(:ej#9#9#A#A&#I#I %-$7$7$<$<	$--i888$))(1h)WWWX X X X X X X X X X X X X X X X X XX Xs   0CJ

JJr*  )r:   r  r  r(  s      r(   upload_maskz*PromptServer.__init__.<locals>.upload_mask  sN       ''''''D&X &X &XP  <&9:::r*   z/viewc           	        K   d| j         j        v r| j         j        d         }|                    d          rYj                            |           }t          ||          }|t          j        d          S |j        |j	        |j
        }}}nxd }t          j        |          \  }}|st          j        d          S |d         dk    sd	|v rt          j        d          S |4| j         j                            d
d          }t          j        |          }|t          j        d          S d| j         j        v rt          j                            || j         j        d                   }t          j                            t          j                            |          |f          |k    rt          j        d          S |}t          j                            |          }t          j                            ||          }t          j                            |          rd| j         j        v r\t-          j        |          5 }	| j         j        d                             d          }
|
d         }|dvs"d| j         j                            dd          v rd}d}|
d                                         rt5          |
d                   }t7                      }|dv s$| j         j                            dd          dk    r|	                    d          }	|	                    |||           |                    d           t          j        |                                d| dd| di          cd d d            S # 1 swxY w Y   d| j         j        vrd }n| j         j        d         }|dk    rt-          j        |          5 }	|	j         d!k    r2|	                                \  }}}}t-          j!        d|||f          }n|	                    d          }t7                      }|                    |d"#           |                    d           t          j        |                                d$dd| di          cd d d            S # 1 swxY w Y   nM|dk    rt-          j        |          5 }	|	j         d!k    r|	                                \  }}}}nt-          j"        d%|	j#        d&          }t-          j"        d!|	j#                  }|$                    |           t7                      }|                    |d"#           |                    d           t          j        |                                d$dd| di          cd d d            S # 1 swxY w Y   nA|ptK          j&        |          d         pd'}|d(v rd'}t          j'        |d| d|d)*          S t          j        d          S )+Nr  zblake3:)owner_idr   rn   r  r   r   r/  r   r   r  rm   preview;)webpjpegr   channelrD   rK  Z   )rL  rgbRGB)r5   qualityzimage/Content-Dispositionz
filename="")rK   rJ   rF   rgbar1  PNG)r5   	image/pngL   zapplication/octet-stream>   text/css	text/htmltext/javascripttext/html-sandboxedapplication/xhtml+xml)rS  zContent-Type)rF   )(r   r   r=   user_managerget_request_user_idr   r   rI   r  download_namerJ   r   r6  rG   r7  r   r<   r   r  r  basenamer8  r   r   r#  isdigitintr
   r;  r>  r   r   modemergenewr  r=  	mimetypes
guess_typer   )r:   r  rH  r'  r   resolved_content_typer?  r   r@  imgpreview_infoimage_formatrR  bufferrM  rh   gr  r   new_imgri   	alpha_imgalpha_bufferrJ   r   s                           r(   
view_imagez)PromptServer.__init__.<locals>.view_image  s     W_222"?0< &&y11 >#0DDWMMH1(XNNNF~"|37777<BOVMacicv$9(DD,0)+7+J8+T+T(Hj# 8"|37777  {c))TX-=-="|37777!)&488JJ%1%G%M%M
!)"|37777"go&;;;*,',,z7?CXYdCe*f*f7--rw/O/OQ[.\]]akkk#&<s#;#;#;;%4
!w//99H7<<
H==D7>>$'' L GO$999"Z-- m+2?+@+K+Q+QRU+V+VL+7?L+3CCCsgoNcNgNghqsuNvNvGvGv/5&(G+B/7799 @*-l2.>*?*?%,YYF+x777?;P;T;TU^`b;c;cgl;l;l&)kk%&8&8HHVL'HRRR"KKNNN#&<V[[]]QhZfQhQh9NPj^fPjPjPj8k$m $m $m!m m m m m m m m m m m m m m m m& !(==="(")/"7	"B%''"Z-- m"x611-0YY[[
1a*/+eaAY*G*G*-++e*<*<%,YYF#LLL>>>"KKNNN#&<V[[]]Q\9NPj^fPjPjPj8k$m $m $mm m m m m m m m m m m m m m m m m !C"Z-- m"x611-0YY[[
1a$)Ic38S$A$A ).	&#((C(CI%..q111+299L%NN<NFFF(--a000#&<\5F5F5H5HWb9NPj^fPjPjPj8k$m $m $mm m m m m m m m m m m m m m m m m& 2 :(3H==a@:9 % (  ,H  H  H+EL"/ 7QX7Q7Q7Q0<% %       <s++++s9   D0NNNB;RR"RCV((V,/V,z/view_metadata/{folder_name}c                 ~  K   | j                             dd           }|t          j        d          S d| j        j        vrt          j        d          S | j        j        d         }|                    d          st          j        d          S t          j        ||          }|t          j        d          S t          j
                            |d          }|t          j        d          S t          j        |          }d|vrt          j        d          S t          j        |d                   S )	Nfolder_namer   rn   r  z.safetensorsi   )max_size__metadata__)r   rG   r   rI   r   r   endswithr   get_full_pathcomfyutilssafetensors_headerr   r   r   )r:   ru  r  safetensors_pathoutdts         r(   view_metadataz,PromptServer.__init__.<locals>.view_metadatap  s2     !,00EEK"|3////!666|3////,Z8H$$^44 0|3////+9+xPP'|3////+001AI0VVC{|3////CBR''|3////$R%7888r*   z/system_statsc                   K   t           j                                        t           j        j                            d          }t           j                            |          }t           j                            |          }t          j                    }t          j	                    }t          j
                    }t          j                    }t           j                                        }|v rgfd|D             z   }ngt          |          z   }g }	|D ]}
t           j                            |
d          \  }}t           j                            |
d          \  }}|	                    t           j                            |
          |
j        |
j        ||||d           t$          j        ||t(          ||||t$          j        t           j        j        t.          j                            t.          j                            t$          j                  d                   d         d	k    t$          j        d
|	d}t9          j        |          S )Ncpuc                      g | ]
}|k    |S r%   r%   )r&   dprimary_devices     r(   r)   z?PromptServer.__init__.<locals>.system_stats.<locals>.<listcomp>  s%    3d3d3d!PQUcPcPcAPcPcPcr*   T)torch_total_too)torch_free_too)r   r   index
vram_total	vram_freetorch_vram_totaltorch_vram_freer   r  python_embeded)r   	ram_totalram_freecomfyui_versionrequired_frontend_versioninstalled_templates_versionrequired_templates_versioncomfy_package_versionspython_versionpytorch_versionembedded_pythonargv)systemdevices)rz  model_managementget_torch_devicetorchdeviceget_total_memoryget_free_memoryr   get_required_frontend_versionget_installed_templates_versionget_required_templates_versionget_comfy_package_versionsget_all_torch_devicesr   appendget_torch_device_namer   r  sysplatformr   versiontorch_versionr   r<   r#  
executabler  r   r   )r:   
cpu_devicer  r  r  r  r  r  torch_devicesdevice_entriesr  r  r  r  r  system_statsr  s                   @r(   r  z+PromptServer.__init__.<locals>.system_stats  s0     "3DDFFN/5<<UCCJ.??
KKI-==jIIH(7(U(W(W%*9*Y*[*[')8)W)Y)Y&%4%O%Q%Q" "2HHJJM..!/ 03d3d3d3d}3d3d3d d!/ 043F3F FN"  /4/E/V/VWXjn/V/o/o,
,-2-C-S-STUfj-S-k-k*	?%%!2HHKKFW",!*(8'6' '     ,!* ('21J3N2L.D&)k','='K')w}}RW]]3>5R5RST5U'V'VWX'Y]m'mH  * L" $\222r*   z	/featuresc                 P   K   t          j        t          j                              S r   )r   r   r   r   )r:   s    r(   get_featuresz+PromptServer.__init__.<locals>.get_features  s       $]%F%H%HIIIr*   z/promptc                 T   K   t          j                                                  S r   )r   r   r   )r:   r   s    r(   
get_promptz)PromptServer.__init__.<locals>.get_prompt  s$      $T%8%8%:%:;;;r*   c                    t           j        |          }t          |t                    r|                                S i }|                                |d<   d |                                                                D             |d<   t          |dd          |d<   |j        |d<   t          |d          r|j
        ndgt          |j                  z  |d	<   t          |d
          r|j        n|d         |d<   | |d<   | t           j                                        v rt           j        |          n| |d<   t          |d          r|j        nd|d<   t          |dd          |d<   d|d<   t          |d          r|j        dk    rd|d<   nd|d<   t          |d          r|j        dk    rd|d<   nd|d<   t          |d          r
|j        |d<   t          |d          r
|j        |d<   t          |dd          rd|d<   t          |d d          rd|d!<   t          |d"d          rd|d#<   t          |d$          r
|j        |d%<   t          |d&g           |d'<   t          |d(          r
|j        |d)<   |S )*Nr   c                 X    i | ]'\  }}|t          |                                          (S r%   )r   r   )r&   rC  values      r(   
<dictcomp>z<PromptServer.__init__.<locals>.node_info.<locals>.<dictcomp>  s.    "o"o"o|U3UZZ\\(:(:"o"o"or*   input_orderINPUT_IS_LISTFis_input_listr   OUTPUT_IS_LISToutput_is_listRETURN_NAMESoutput_namer   display_nameDESCRIPTIONrD   descriptionRELATIVE_PYTHON_MODULEr   python_modulesdcategoryOUTPUT_NODEToutput_nodeHAS_INTERMEDIATE_OUTPUThas_intermediate_outputCATEGORYOUTPUT_TOOLTIPSoutput_tooltips
DEPRECATED
deprecatedEXPERIMENTALexperimentalDEV_ONLYdev_onlyAPI_NODEapi_nodeSEARCH_ALIASESsearch_aliasesESSENTIALS_CATEGORYessentials_category)r   NODE_CLASS_MAPPINGS
issubclassr   GET_NODE_INFO_V1INPUT_TYPESr   getattrRETURN_TYPESr9  r  rz   r  NODE_DISPLAY_NAME_MAPPINGSr   r  r  r  r  r  r  r  )
node_class	obj_classinfos      r(   	node_infoz(PromptServer.__init__.<locals>.node_info  s    1*=I)%788 4 11333D%1133DM"o"oyOdOdOfOfOlOlOnOn"o"o"oD$+I$N$ND!&3DNAHTdAeAe  &QY%=%=lqkrux  zC  zP  vQ  vQ  lQD!"<CI~<^<^"r)"8"8dhiqdrD%DLS]af  bB  bG  bG  bI  bI  TI  TI5#CJ#O#O  OYD ;B9];[;["c)"7"7acD$+I7OQX$Y$YD!#Dy-00 ,Y5Jd5R5R&*]##&+]#y";<< 8AbfjAjAj26.//27./y*-- 6#,#5Z y"344 D*3*C&'y,66 *%)\"y.%88 ,'+^$y*e44 (#'Z y*-- 6#,#5Z %,Y8H"%M%MD!"y"788 L.7.K*+Kr*   z/object_infoc                   K   t          j        d           t          j        5  i }t          j        D ]^}	  |          ||<   # t          $ r@ t          j        d| d           t          j        t          j
                               Y [w xY wt          j        |          cd d d            S # 1 swxY w Y   d S )N)modelsr   r   )rootsz@[ERROR] An error occurred while retrieving information for the 'z' node.)r   startr   cache_helperr   r  r   r3   r   	traceback
format_excr   r   )r:   r~  xr  s      r(   get_object_infoz.PromptServer.__init__.<locals>.get_object_info  s     %BCCCC* . .2 > >A>!*1A$ > > >&sij&s&s&sttti&:&<&<=====> (--. . . . . . . . . . . . . . . . . .s5   B3AB3ABB3BB33B7:B7z/object_info/{node_class}c                    K   | j                             dd           }i }||t          j        v r |          ||<   t	          j        |          S )Nr  )r   rG   r   r  r   r   )r:   r  r~  r  s      r(   get_object_info_nodez3PromptServer.__init__.<locals>.get_object_info_node  s[       +//dCCJC&Z5;T-T-T"+)J"7"7J$S)))r*   z	/api/jobsc                 r  K   | j         j        }|                    d          }|                    d          }|                    dd                                          }|                    dd                                          }d}|r{d |                    d	          D             }d
 |D             }|rNt          j        ddd                    |           dd                    t          j	                   id          S |dvrt          j        ddid          S |dvrt          j        ddid          S d}d|v rq	 t          |                    d                    }|dk    rt          j        ddid          S n/# t          t          f$ r t          j        ddid          cY S w xY wd}	d|v r[	 t          |                    d                    }	|	dk     rd}	n/# t          t          f$ r t          j        ddid          cY S w xY wj                                        \  }
}j                                        }t!          |
          }
t!          |          }t#          |
||||||||		  	        \  }}|	t%          |          z   |k     }t          j        ||	|||dd          S )a  List all jobs with filtering, sorting, and pagination.

            Query parameters:
                status: Filter by status (comma-separated): pending, in_progress, completed, failed
                workflow_id: Filter by workflow ID
                sort_by: Sort field: created_at (default), execution_duration
                sort_order: Sort direction: asc, desc (default)
                limit: Max items to return (positive integer)
                offset: Items to skip (non-negative integer, default 0)
            ro   workflow_idsort_by
created_at
sort_orderdescNc                     g | ]<}|                                 |                                                                 =S r%   )striprr   r&   ss     r(   r)   z;PromptServer.__init__.<locals>.get_jobs.<locals>.<listcomp>  s<     a a aqWXW^W^W`W` a!2!2 a a ar*   ,c                 .    g | ]}|t           j        v|S r%   )r   ALLr  s     r(   r)   z;PromptServer.__init__.<locals>.get_jobs.<locals>.<listcomp>  s$    #W#W#W!@V@VA@V@V@Vr*   r   zInvalid status value(s): z, z. Valid values: r  rn   >   r  execution_durationz4sort_by must be 'created_at' or 'execution_duration'>   ascr  z"sort_order must be 'asc' or 'desc'limitr   z limit must be a positive integerzlimit must be an integeroffsetzoffset must be an integer)status_filterr  r  r  r  r   )r   r  totalhas_more)jobs
pagination)r   r   rG   rr   r#  r   r   r   r   r  rd  
ValueError	TypeErrorprompt_queueget_current_queue_volatileget_historyr+   r   rz   )r:   r   status_paramr  r  r  r  invalid_statusesr  r   runningqueuedhistoryr  r  r  r   s                   r(   get_jobsz'PromptServer.__init__.<locals>.get_jobs	  s      O)E 99X..L))M22Kii	<88>>@@G<88>>@@J M  a aL<N<Ns<S<S a a a#W#W}#W#W#W # ,   #FdiiHX>Y>Y  #F  #Fkoktktu~  vC  lD  lD  #F  #F  G"   
 BBB(TU   
 00(BC   
 E %		' 2 233Ezz"0$&HI#&       "
 #I.   , "<="      F5   8!4!455Fzz!""I.   , "=>"      #/JJLLOGV'3355G27;;G1&99F&+'%  KD% T*e3H$$"" (	 & &   s$   ?F	 	)F54F5?*G* *)HHz/api/jobs/{job_id}c                   K   | j                             dd          }|st          j        ddid          S j                                        \  }}j                            |          }t          |          }t          |          }t          ||||          }|t          j        ddid	          S t          j        |          S )
zGet a single job by ID.job_idNr   zjob_id is requiredr  rn   	prompt_idzJob not foundr   )	r   rG   r   r   r  r	  r
  r+   r   )r:   r  r  r  r  jobr   s         r(   get_job_by_idz,PromptServer.__init__.<locals>.get_job_by_idk  s       '++Hd;;F (23   
 #/JJLLOGV'33f3EEG27;;G1&99F&'67;;C{(o.   
 $S)))r*   z/historyc                 .  K   | j         j                            dd           }|t          |          }| j         j                            dd           }|t          |          }nd}t	          j        j                            ||                    S )N	max_itemsr   rO  )r  r   )r   r   rG   rd  r   r   r  r
  )r:   r  r   r   s      r(   r
  z*PromptServer.__init__.<locals>.get_history  s      -11+tDDI$	NN	_*..x>>F!V$T%6%B%BY_e%B%f%fgggr*   z/history/{prompt_id}c                    K   | j                             dd           }t          j        j                            |                    S )Nr  r  )r   rG   r   r   r  r
  )r:   r  r   s     r(   get_history_prompt_idz4PromptServer.__init__.<locals>.get_history_prompt_id  sD      *..{DAAI$T%6%B%BY%B%W%WXXXr*   z/queuec                    K   i }j                                         }t          |d                   |d<   t          |d                   |d<   t          j        |          S )Nr   queue_runningr  queue_pending)r  r	  r+   r   r   )r:   
queue_infocurrent_queuer   s      r(   	get_queuez(PromptServer.__init__.<locals>.get_queue  sa      J -HHJJM*F}UVGW*X*XJ'*F}UVGW*X*XJ'$Z000r*   c                   K   t          j        d           |                                  d {V }                    |          }d|v rt	          |d                   }n&j        }d|v r|d         r| }xj        dz  c_        d|v r|d         }|                    d          }|!t          t          j	                              }nA	 t          |          }n0# t          $ r# ddd	i d
}t          j        |i dd          cY S w xY wd }d|v r|d         }j                            |           t!          j        |||           d {V }i }	d|v r|d         }	d|v r|d         |	d<   |d         r|d         }
i }t           j        D ]}||	v r|	                    |          ||<   t)          t+          j                    dz            |	d<   j                            ||||	|
|f           |||d         d}t          j        |          S t          j        d                    |d                              t          j        |d         |d         dd          S dddi d
}t          j        |i dd          S )Nz
got promptnumberfrontr  promptr  invalid_prompt_idzprompt_id must be a valid UUIDznprompt_id must be a UUID string in canonical lowercase hyphenated form; omit it to let the server generate one)r   r7   details
extra_info)r   node_errorsr  rn   partial_execution_targets
extra_datar   r      i  create_time   )r  r"  r(  zinvalid prompt: {}	no_promptzNo prompt provided)r3   r  r   trigger_on_promptfloatr"  rG   strr   r   r   r  r   r   node_replace_managerapply_replacements	executionvalidate_promptSENSITIVE_EXTRA_DATA_KEYSr   rd  timer  putr4   r5   )r:   	json_datar"  r$  client_prompt_idr  r   r)  validr*  outputs_to_execute	sensitivesensitive_valrA   r   s                 r(   post_promptz*PromptServer.__init__.<locals>.post_prompt  s-     L&&&&||~~------I..y99I9$$y233i'' ) )"(q 9$$"8,#,==#=#= #+ #DJLL 1 1II	b$34D$E$E		% b b b$7'G (X*,	! !  #05QS1T1T]`aaaaaab -1).);;09:U0V-)<<VDDD'7	6Kdeeeeeeee
9,,!*<!8J)++.7.DJ{+8 g).q& "I)2)L U U(J667A~~m7T7TIm403DIKK$4F0G0GJ}-%))69fjRdfo*pqqq-6&Y^_`YabbH,X666O$8$?$?a$I$IJJJ,uQxPUVWPX-Y-Ybeffff (33"$	  (5)L)LUXYYYYs   C *D
	D
c                   K   |                                   d {V }d|v r!|d         rj                                         d|v r,|d         }|D ]!fd}j                            |           "t	          j        d          S )Ncleardeletec                     | d         k    S )Nr  r%   )r   id_to_deletes    r(   r   z;PromptServer.__init__.<locals>.post_queue.<locals>.<lambda>  s    AaDL,@ r*      rn   )r   r  
wipe_queuedelete_queue_itemr   rI   )r:   r9  	to_deletedelete_funcrD  r   s       @r(   
post_queuez)PromptServer.__init__.<locals>.post_queue  s      &||~~------I)##W% 3%002229$$%h/	$- E EL"@"@"@"@K%77DDDD<s++++r*   z
/interruptc                   K   	 |                                   d {V }n# t           j        $ r i }Y nw xY w|                    d          }|ryj                                        \  }}d}|D ])}|d         |k    rt          j        d|            d} n*|rt          j                     n@t          j        d| d           n't          j        d           t          j                     t          j
        d	
          S )Nr  Fr  zInterrupting prompt TzPrompt z- is not currently running, skipping interruptz)Global interrupt (no prompt_id specified)rE  rn   )r   r   rG   r  get_current_queuer3   r  r   interrupt_processingr   rI   )r:   r9  r  currently_runningri   should_interruptr'   r   s          r(   post_interruptz-PromptServer.__init__.<locals>.post_interrupt  sI     "),,..000000		'   			 "k22I -'+'8'J'J'L'L$!1 $) -  DAw)++%GI%G%GHHH+/( ,
 $ e.0000L!c9!c!c!cdddd HIII*,,,<s++++s     44z/freec                 2  K   |                                   d {V }|                    dd          }|                    dd          }|rj                            d|           |rj                            d|           t	          j        d          S )Nunload_modelsFfree_memoryrE  rn   )r   rG   r  set_flagr   rI   )r:   r9  rR  rS  r   s       r(   	post_freez(PromptServer.__init__.<locals>.post_free  s      %llnn,,,,,,I%MM/5AAM#--u==K K!**?MJJJ G!**=+FFF<s++++r*   c                   K   |                                   d {V }d|v r!|d         rj                                         d|v r'|d         }|D ]}j                            |           t	          j        d          S )NrA  rB  rE  rn   )r   r  wipe_historydelete_history_itemr   rI   )r:   r9  rH  rD  r   s       r(   post_historyz+PromptServer.__init__.<locals>.post_history  s      &||~~------I)##W% 5%224449$$%h/	$- H HL%99,GGGG<s++++r*   r   )@r   instancer   r_  r   model_file_managerr   custom_node_managerr   subgraph_managerr   r2  r   internal_routessupportsr4  PromptQueuer  loopasyncioQueuemessagesclient_sessionr"  r   rB   r   enable_compress_response_bodyr  rN   enable_cors_headerrZ   r   disable_api_nodesr   enable_managercomfyui_managercreate_middlewareroundmax_upload_sizer   Applicationappdictr   r   front_end_rootr   init_frontendfront_end_versionr   r3   r  r  r   r   disableRouteTableDefroutesr   r   on_prompt_handlersrG   r  )"r   ra  r   rm  rv  r   r   r   r   r   r   r+  rF  rs  r  r  r  r  r  r  r  r  r
  r  r   r?  rJ  rP  rU  rY  r  r   r(  r  s"   `                             @@@@r(   __init__zPromptServer.__init__   s    $'MM"2"4"4#4#6#6  / 1 1$6$8$8!-d3301%1$77	>B$&9:- 	.}---" 	@5d6MNNOOOO<>>???! 	C?AABBB 	D@BBCCC 4t ;d BCC??P[\\\vv $ "* )$*@AAA$ 	
 	A$-AABBB 	#"48T->????"48,,, """"$$ "$	E		9	 9	 9	 9	 
	9	v 
C	 	 	 	 
	 
M	"	"	^ 	^ 
#	"	^ 
I			2 	2 
		2
 
&	'	'	, 	, 
(	'	, 
M	"	"	1 	1 	1 	1 
#	"	1	& 	& 	&	 	 	?	0 ?	0 ?	0 ?	0 ?	0 ?	0 ?	0B 
_	%	%	& 	& 	& 	& 
&	%	&
 
^	$	$+	; +	; +	; +	; 
%	$+	;Z 
G		w	, w	, w	, w	, 
	w	,r 
2	3	3	9 	9 
4	3	9, 
O	$	$1	3 1	3 
%	$1	3f 
K	 	 	J 	J 
!	 	J 
I			< 	< 	< 	< 
		</	 /	 /	b 
N	#	#
	. 
	. 
	. 
	. 
$	#
	. 
/	0	0	* 	* 	* 	* 
1	0	* 
K	 	 _	 _	 _	 _	 
!	 _	B 
(	)	)	* 	* 	* 	* 
*	)	*0 
J			h 	h 	h 	h 
 		h 
*	+	+	Y 	Y 	Y 	Y 
,	+	Y 
H			1 	1 	1 	1 
		1 
Y		B	Z B	Z B	Z B	Z 
 	B	ZH 
X			, 	, 	, 	, 
		, 
\	"	"	, 	, 	, 	, 
#	"	,> 
W			, 	, 	, 	, 
		, 
Z	 	 
	, 
	, 
	, 
	, 
!	 
	, 
	, 
	,r*   c                 h   K   t          j        d           }t          j        |          | _        d S )N)r  )timeout)r-   ClientTimeoutClientSessionre  )r   rz  s     r(   setupzPromptServer.setup*  s5      'd333%3GDDDr*   c                    | j                             | j                   | j                            | j                   | j                            | j        | j        t          j                                                   | j	                            | j        t          j                                                   | j
                            | j                   | j                            d| j                                                   t          j                    }| j        D ]P}t!          |t          j                  r4 |                    |j        d|j        z             |j        fi |j         Q| j                            |           | j                            | j                   t          j                                        D ]6\  }}| j                            t          j        d|z   |          g           7t3          j                    }d}|rO	 t7          |          t7          d          k     }n-# t8          $ r }t;          j        d||           Y d }~nd }~ww xY w|rDt3          j                    }|r.| j                            t          j        d|          g           n5t3          j                     }	|	r | j        j!        "                    d|	           t3          j#                    }
|
r.| j                            t          j        d	|
          g           | j                            t          j        d
| j$                  g           d S )Nz	/internalz/apir   Tz0.3.0z*Unable to parse templates version '%s': %sz
/templatesz/templates/{path:.*}z/docsr   )%r_  
add_routesrv  r[  r\  ro  r   LOADED_MODULE_DIRSr   r]  r2  
add_subappr^  get_appr   ru  rH   RouteDefrouterU   r<   r@   kwargsr   staticr   r  r   r   r3   r4   legacy_templates_pathtemplate_asset_handlerrouteradd_getembedded_docs_pathr   )r   
api_routesr  r   r   r  use_legacy_templatesexcworkflow_templates_pathr@   r  s              r(   r  zPromptServer.add_routes.  sf   $$T[111**4;777 ++DK5C[CaCaCcCcddd((e6N6T6T6V6VWWW!,,T[999K)=)E)E)G)GHHH &((
[ 	c 	cE %.. cC
  v
/BCCEMbbUZUabbbJ'''DK((( 17799 	J 	JID#HNT,A3!G!G HIIII&5&U&W&W##& 	
!"=>>#G,,- %$    @/          		I&5&K&M&M#& ##J|-DEE%    &<>>G I''(>HHH -?AA 	H
7$677!    	JsDM**
 	 	 	 	 	s    I   
I*
I%%I*c                 P    i }i }| j                                         |d<   ||d<   |S )Nqueue_remaining	exec_info)r  get_tasks_remaining)r   prompt_infor  s      r(   r   zPromptServer.get_queue_infom  s6    	'+'8'L'L'N'N	#$#,K r*   Nc                   K   |t           j        k    r|                     ||           d {V  d S |t           j        k    r%|\  }}|                     |||           d {V  d S t          |t          t          f          r|                     |||           d {V  d S | 	                    |||           d {V  d S )Nr   )
r   UNENCODED_PREVIEW_IMAGE
send_imagePREVIEW_IMAGE_WITH_METADATAsend_image_with_metadatarH   bytes	bytearray
send_bytes	send_json)r   eventr   r   preview_imagerB  s         r(   r   zPromptServer.sendt  s     $<<<//$C/00000000000&BBB&*#M8//xS/QQQQQQQQQQQui011 	3//%s33333333333..c22222222222r*   c                     t          |t                    st          d|           t          j        d|          }t          |          }|                    |           |S )Nz)Binary event types must be integers, got >I)rH   rd  RuntimeErrorstructpackr  r   )r   r  r   packedr7   s        r(   encode_byteszPromptServer.encode_bytes  sa    %%% 	TR5RRSSST5))F##tr*   c                   K   |d         }|d         }|d         }|Pt          t          d          rt          j        j        }nt          j        j        }t          j        |||f|          }d}|dk    rd}n|dk    rd}t                      }t          j	        d|          }	|
                    |	           |                    ||dd	           |                                }
|                     t          j        |
|
           d {V  d S )Nr   r  r+  
ResamplingJPEGrV  r  _   r5   rR  r4  r  )r9  r   r  BILINEARLANCZOSr   containr
   r  r  r  r>  getvaluer  r   PREVIEW_IMAGE)r   
image_datar   
image_typer   rv  
resamplingtype_numbytesIOheaderpreview_bytess              r(   r  zPromptServer.send_image  s     ]
1a=ul++ 6"-6

"-5
$UXx,@*MMEHH5  H))T8,,f

7:r!
LLL((**oo.<mQToUUUUUUUUUUUr*   c                   K   |d         }|d         }|d         }|Pt          t          d          rt          j        j        }nt          j        j        }t          j        |||f|          }|dk    rdnd}|i }||d<   dd l}	 |	j        |          	                    d	          }
t          |
          }t                      }|                    ||d
d           |                                }t                      }|                    t!          j        d|                     |                    |
           |                    |           |                     t&          j        ||           d {V  d S )Nr   r  r+  r  rV  rW  z
image/jpegr  utf-8r  r  r  r  )r9  r   r  r  r  r   r  r   dumpsencoderz   r
   r>  r  r  r   r  r  r  r   r  )r   r  rB  r   r  r   rv  r  mimetyper   metadata_jsonmetadata_lengthr  image_bytescombined_datas                  r(   r  z%PromptServer.send_image_with_metadata  s     ]
1a=ul++ 6"-6

"-5
$UXx,@*MME","5"5;;< H!) 	"
8,,33G<<m,, ))

7:r!
LLL&&(( "V[??@@@]+++[)))oo.JM_bocccccccccccr*   c                 ,  K   |                      ||          }|Ht          | j                                                  }|D ]}t	          |j        |           d {V  d S || j        v r(t	          | j        |         j        |           d {V  d S d S r   )r  r   r   valuesr9   r  r   r  r   r   r7   r   r   s          r(   r  zPromptServer.send_bytes  s      ##E400;4<..0011G J J1"-IIIIIIIIIIJ JDL  -dl3.?.JGTTTTTTTTTTT ! r*   c                 
  K   ||d}|Ht          | j                                                  }|D ]}t          |j        |           d {V  d S || j        v r(t          | j        |         j        |           d {V  d S d S )N)r   r   )r   r   r  r9   r  r  s          r(   r  zPromptServer.send_json  s       $//;4<..0011G I I1",HHHHHHHHHHI IDL  -dl3.?.I7SSSSSSSSSSS ! r*   c                 V    | j                             | j        j        |||f           d S r   )ra  call_soon_threadsaferd  
put_nowait)r   r  r   r   s       r(   	send_synczPromptServer.send_sync  s7    	&&M$udC&8	: 	: 	: 	: 	:r*   c                 Z    |                      dd|                                 i           d S )Nro   )r  r   )r   s    r(   queue_updatedzPromptServer.queue_updated  s-    x8T-@-@-B-B!DEEEEEr*   c                 h   K   	 | j                                          d {V } | j        |  d {V  0r   )rd  rG   r   )r   r   s     r(   publish_loopzPromptServer.publish_loop  sU      	"))++++++++C$)S/!!!!!!!	"r*   Tc                 J   K   |                      ||fg|           d {V  d S )N)call_on_start)start_multi_address)r   addressry   verboser  s        r(   r  zPromptServer.start  s>      &&$'8&VVVVVVVVVVVr*   c           	        K   t          j        | j        d           }|                                 d {V  d }d}t          j        rct          j        rWt          j        t          j	        t          j
                  }|                    t          j        t          j                   d}|r9t          j        d           t          j        rt          j        d dd            |D ]}|d	         }|d
         }	t          j        |||	|          }
	 |
                                 d {V  nR# t"          $ rE}|j        t$          j        k    r*t          j        d|	 d| d           t+          d
           d }~ww xY wt-          | d          s|| _        |	| _        d|v rd                    |          }n|}|r)t          j        d                    |||	                     | ||| j        | j                   d S d S )N)
access_loghttp)protocolverify_mode)certfilekeyfilehttpszStarting server
zP--------------------------------------------------------------------------------a  
ComfyUI has been started in debug-hang mode. Run your workflow as normal up to
the point of the hang or freeze, then use ctrl-C in the cmd or controlling
terminal to dump the python backtraces for debugging. Please attach the extra
debug info to your bug report.
r   r  )ssl_contextzPort z is already in use on address zI. Please close the other application or use a different port with --port.r  :z[{}]z To see the GUI go to: {}://{}:{})r   	AppRunnerro  r}  r   tls_keyfiletls_certfilessl
SSLContextPROTOCOL_TLS_SERVER	CERT_NONEload_cert_chainr3   r  
debug_hangTCPSiter  OSErrorerrno
EADDRINUSEr   
SystemExitr9  r  ry   r5   )r   	addressesr  r  runnerssl_ctxschemeaddrr  ry   siter   address_prints                r(   r  z PromptServer.start_multi_address  su     txD999llnn 	 1 	nc.ESVS`aaaG##T->(,(8 $ : : :F 
	L,---  " "
  " "    	e 	eD1gG7D;vw'JJJDjjll""""""""   7e...M  #a$  #a  #ag  #a  #a  #a  b  b  b$Q--'	 4++ !& 	g~~ &g 6 6 ' e?FFv}^bccddd$M&$,	::::: %$s   D..
E=8A E88E=c                 :    | j                             |           d S r   )rw  r  )r   r@   s     r(   add_on_prompt_handlerz"PromptServer.add_on_prompt_handler  s    &&w/////r*   c                     | j         D ]W}	  ||          }# t          $ r< t          j        d           t          j        t	          j                               Y Tw xY w|S )NzA[ERROR] An error occurred during the on_prompt_handler processing)rw  r   r3   r4   r  r  )r   r9  r@   s      r(   r/  zPromptServer.trigger_on_prompt  s}    . 	8 	8G8#GI..		 8 8 8 cddd	 4 6 6777778 s   AAAr0  node_idc                 0   t          |t                    r|                    d          }t          |                              d          }t          j        dt          |                    |z   |z   }|                     t          j        ||           d S )Nr  r  )	rH   r1  r  r  r  rz   r  r   r   )r   r0  r  r   node_id_bytesr7   s         r(   send_progress_textzPromptServer.send_progress_text'  s     dC   	(;;w''DG++G44 +dC$6$677-G$N',gs;;;;;r*   r   )NN)TN)NT)__name__
__module____qualname__rx  r}  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r/  r   r  r  r1  r  r%   r*   r(   r   r      s       \, \, \,|E E E= = =~  
3 
3 
3 
3  V V V V0#d #d #d #dJU U U UT T T T: : : :F F F" " "
W W W W/; /; /; /;b0 0 0   EI
< 
<%C/0
<;>
< 
< 
< 
< 
< 
<r*   r   )\r  r   r  rb  r  r7  r   r   r4  comfy_execution.jobsr   r   r   r   r   rs   r   r   r  r  r_   r\   PILr   r   PIL.PngImagePluginr	   ior
   r-   r   r3   rh  comfy.cli_argsr   comfy.utilsrz  comfy.model_management	comfy_apir   r   r  r   app.frontend_managementr   r   comfy_api.internalr   app.assets.seederr   app.assets.api.routesr   app.assets.services.ingestr   $app.assets.services.asset_managementr   app.user_managerr   app.model_managerr   app.custom_node_managerr   app.subgraph_managerr   app.node_replace_managerr   typingr   r   *api_server.routes.internal.internal_routesr   r  r   middleware.cache_middlewarer   ri  rj  r   r+   r9   setr>   rX   rY   rB   rN   r1  rZ   r^   r   r   r   r%   r*   r(   <module>r     s    				 



                R R R R R R R R R R R R      



              & & & & & &                                 # # # # # #     ' ' ' ' ' ' B B B B B B B B 1 1 1 1 1 1 * * * * * * 8 8 8 8 8 8 = = = = = = E E E E E E ( ( ( ( ( ( . . . . . . 5 5 5 5 5 5 0 0 0 0 0 0 7 7 7 7 7 7 " " " " " " " " E E E E E E % % % % % % 6 5 5 5 5 5 ( ( ( ( ( (
6 6 6 355 s{    $ 	 	 	 	 	3    "  4&" &" &"R% % %f< f< f< f< f< f< f< f< f< f<r*   