
    L3i                        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 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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@mAZAmBZB d dlCmDZD d dlEmFZF d dlGmHZH e j                  rd dlJZJdeKdeKfdZLd ZM eN       ZOej                  dej                  fd       ZRej                  dej                  fd       ZSd eTfd!ZUd" ZVd# ZWd$ ZX G d% d&      ZYy)'    N)	JobStatusget_jobget_all_jobs)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                 2    | D cg c]  }|dd 	 c}S c c}w )z7Remove sensitive data (index 5) from queue item tuples.N    )r   items      /home/serv3090/ComfyUI/server.py_remove_sensitive_from_queuer&   9   s    !&'D!H'''s   c                    K   	  | |       d {    y 7 # t         j                  t         j                  t        t        t
        f$ r.}t        j                  dj                  |             Y d }~y d }~ww xY ww)Nzsend error: {})	aiohttpClientErrorClientPayloadErrorConnectionResetErrorBrokenPipeErrorConnectionErrorloggingwarningformat)functionmessageerrs      r%   send_socket_catch_exceptionr4   >   s]     6w!;!;=QSbdst 6(//4556s7   A:  A: 2A7	$A2-A:2A77A:requestc                    K   | j                   }|j                  d      s|j                  d      r6|t        vr.t        j                  |       t	        j
                  d| d        ||        d{   }|S 7 w)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addr.   r/   )r5   handlerr7   responses       r%   deprecation_warningr=   G   s{      <<D}%9L)M//$((.OORSWRX Yh i $+7#33HO 4s   A0A;2A93A;c                   K   | j                   j                  dd      } ||        d {   }t        |t        j                        s|S |j
                  dvr|S |j                  rd|v r|j                          |S 7 Rw)NzAccept-Encoding )zapplication/jsonz
text/plaingzip)headersget
isinstancer
   Responsecontent_typebodyenable_compression)r5   r;   accept_encodingr<   s       r%   compress_bodyrI   Z   su     oo))*;R@O#*7#33Hh-$FF}}?2##%O 4s   (A?A=AA?allowed_originc                 Z     t         j                  dt         j                  f fd       }|S )Nr5   c                    K   | j                   dk(  rt        j                         }n ||        d {   }|j                  d<   d|j                  d<   d|j                  d<   d|j                  d<   |S 7 Bw)	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
   rD   rA   )r5   r;   r<   rJ   s      r%   cors_middlewarez/create_cors_middleware.<locals>.cors_middlewareh   sy     >>Y&||~H$W--H:H67;c78;X78?E;< .s   0A8A6AA8r
   
middlewareRequest)rJ   rQ   s   ` r%   create_cors_middlewarerU   g   s,    ^^s{{       c                    | y	 t        j                  |       j                  ryy#  Y nxY wd}t        j                  t        j
                  fD ]y  }	 t        j                  | d |t        j                        }|D ]2  \  }}}}}t        j                  |d         j                  s|c c S d}4 b# t        j                  $ r Y ww 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%   rZ   rZ   x   s    |%11H>>6??3 		""4vv7I7IJA-. $)1a ++HQK8DD#O#H	$
  			 Os!   & *AB1,B11CCc                  T    t         j                  dt         j                  fd       } | S )Nr5   c                   K   d| j                   v r?d| j                   v r0| j                   d   }| j                   d   }|j                         }t        j                  j	                  |      }|j
                  j                         }t        j                  j                  d|z         }t        |j                        }|j                  |j                  }|j                  |j                  }|r`|^|\t        |      dkD  rNt        |      dkD  r@||k7  r;t        j                  dj                  ||             t        j                  d      S | j                   dk(  rt        j                         }	|	S  ||        d {   }	|	S 7 w)	NHostOriginz//r   zJWARNING: request with non matching host and origin {} != {}, returning 403  statusrM   )rA   lowerurllibparseurlparsenetlocurlsplitrZ   hostnameportlenr.   r/   r0   r
   rD   rP   )
r5   r;   ra   originhost_domainparsedorigin_domainhost_domain_parsedrb   r<   s
             r%   origin_only_middlewarez=create_origin_only_middleware.<locals>.origin_only_middleware   sv    
 W__$W__)D??6*D__X.F**,K\\**62F"MM//1M!'!6!6tk7I!J ##5#>#>?H{{"099!&&. &K38QVYZeVfijVjor  tA  pB  EF  pF-/OO$p$w$w  yD  FS  %T  U<<s33>>Y&||~H  %W--H .s   E?F
FF
rR   )r|   s    r%   create_origin_only_middlewarer}      s,    ^^ckk  @ "!rV   c                  T    t         j                  dt         j                  fd       } | S )Nr5   c                    K   | j                   dk(  rt        j                         }n ||        d {   }d|j                  d<   |S 7 w)NrM   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-PolicyrO   )r5   r;   r<   s      r%   block_external_middlewarezCcreate_block_external_middleware.<locals>.block_external_middleware   sH     >>Y&||~H$W--H 7Q23 .s   0A
AA
rR   )r   s    r%    create_block_external_middlewarer      s+    ^^   %$rV   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y)PromptServerc                 
    !  t         _        t                _        t	                _        t                _        t                _	        t                _        t                _        dg _        t        j                           _        | _        t'        j(                          _        d  _        d _        t0        t2        g}t4        j6                  r|j9                  t:               t4        j<                  r)|j9                  t?        t4        j<                               n|j9                  tA                      t4        jB                  r|j9                  tE                      t4        jF                  r#|j9                  tI        jJ                                tM        t4        jN                  dz  dz        }tQ        jR                  ||       _*        tW                _,        tW                _-        t4        j\                  #t_        j`                  t4        jb                        nt4        j\                   _2        tg        jh                  d jd                          t4        jj                  r!tm         jT                   j                         n)tm         jT                         to        jp                          tQ        jr                         }| _:        d  _;        d  _<        g  _=        |j}                  d       fd       }|j}                  d       fd	       }|j}                  d
      d        }|j}                  d      d        }|j}                  d      d        }	|j}                  d       fd       }
d d d9fd	 |j                  d       fd       }|j                  d       fd       }|j}                  d       fd       }|j}                  d      d        }|j}                  d      d        }|j}                  d      d         }|j}                  d!       fd"       }d# !|j}                  d$      !fd%       }|j}                  d&      !fd'       }|j}                  d(       fd)       }|j}                  d*       fd+       }|j}                  d,       fd-       }|j}                  d.       fd/       }|j}                  d0       fd1       }|j                  d!       fd2       }|j                  d0       fd3       }|j                  d4       fd5       }|j                  d6       fd7       }|j                  d,       fd8       }y ):Ncustom_nodes_from_webr   i   )client_max_sizemiddlewaresz[Prompt Server] web root: z/wsc                 |  K   t        j                         }|j                  |        d {    | j                  j                  j                  dd      }|rj                  j                  |d        nt        j                         j                  }|j                  |<   di ij                  |<   	 j                  dj                         |d|       d {    j                  |k(  r3j                  'j                  ddj                  i|       d {    d}|2 3 d {   }|j                   t"        j$                  j&                  k(  r't)        j*                  d	|j-                         z         W|j                   t"        j$                  j.                  k(  s	 t1        j2                  |j4                        }|r|j                  d
      dk(  rl|j                  di       }|j                  |   d<   j                  dt7        j8                         |       d {    t)        j:                  d| d|        d}%7  7 s7 47 *7 /# t0        j<                  $ r) t)        j*                  d| d|j4                          Y nt>        $ r#}t)        j@                  d|        Y d }~d }~ww xY w6 	 j                  j                  |d        j                  j                  |d        |S # j                  j                  |d        j                  j                  |d        w xY ww)NclientIdr?   r   rm   )rm   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queryrB   socketspopuuiduuid4hexsockets_metadatasendget_queue_info	client_idlast_node_idr   r(   	WSMsgTypeERRORr.   r/   	exceptionTEXTjsonloadsr   r   get_server_featuresdebugJSONDecodeError	Exceptionerror)	r5   wsr   first_messagemsgr   client_flagseselfs	           r%   websocket_handlerz0PromptServer.__init__.<locals>.websocket_handler   s    &&(B**W%%%//''++J;C  d+jjl&& !#DLL*92)>D!!#&)5iiT5H5H5JSV*WY\]]]>>S(T->->-J))K64;L;L1NPSTTT !%!# V V#xx7#4#4#:#::(PSUS_S_Sa(abW%6%6%;%;;V#'::chh#7D,&1A_1T/3xx/CNZ 5 5c :? K '+ii$3$1$E$E$G$''" !" !" !(&J3%rR^Q_$`!" -2M[ & ^ U
V!"  $33 #OO"DSECHH: V  ) V#MM,PQRPS*TUUV7 "$<   d+%%))#t4I   d+%%))#t4s   )L<IBL<5'K? IAK? IK? 'K+I,K/A6K? 'BI(I)!I
K? L<K? K? KI8K K? K J;5K? ;K  K? :L<?:L99L</c                    K   t        j                  t        j                  j	                  j
                  d            }d|j                  d<   d|j                  d<   d|j                  d<   |S w)Nz
index.htmlzno-store, must-revalidatezCache-Controlzno-cachePragma0Expires)r
   FileResponseosr7   joinweb_rootrA   )r5   r<   r   s     r%   get_rootz'PromptServer.__init__.<locals>.get_root8  s_     ''T]]L(QRH0KH_-)3HX&*-HY'Os   A-A0z/embeddingsc                 ~    t        j                  d      }t        j                  t	        t        d |                  S )N
embeddingsc                 F    t         j                  j                  |       d   S )Nr   )r   r7   splitext)as    r%   <lambda>z?PromptServer.__init__.<locals>.get_embeddings.<locals>.<lambda>C  s    8H8H8KA8N rV   )folder_pathsget_filename_listr
   json_responselistmap)r5   r   s     r%   get_embeddingsz-PromptServer.__init__.<locals>.get_embeddings@  s1    %77EJ$$T#.NPZ*[%\]]rV   z/modelsc                 z    t        t        j                  j                               }t	        j
                  |      S N)r   r   folder_names_and_pathskeysr
   r   )r5   model_typess     r%   list_model_typesz/PromptServer.__init__.<locals>.list_model_typesE  s,    |BBGGIJK$$[11rV   z/models/{folder}c                    K   | j                   j                  dd       }|t        j                  vrt	        j
                  d      S t        j                  |      }t	        j                  |      S w)Nfolder  rl   )
match_inforB   r   r   r
   rD   r   r   )r5   r   filess      r%   
get_modelsz)PromptServer.__init__.<locals>.get_modelsK  s\     ''++Hd;F\@@@||3// 226:E$$U++s   A/A1z/extensionsc           	      :  K   t        j                   t        j                  j                  t        j                  j
                        d      d      }t        t        fd|            }t        j                  j                         D ]u  \  t        j                   t        j                  j                  t        j                        d      d      }|j                  t        t        fd|                   w t        j                  |      S w)Nzextensions/**/*.jsT)	recursivec                 ~    dt         j                  j                  | j                        j	                  dd      z   S )Nr   \)r   r7   relpathr   replace)fr   s    r%   r   z?PromptServer.__init__.<locals>.get_extensions.<locals>.<lambda>X  s.    C"''//!T]]2S2[2[\`be2f,f rV   z**/*.jsc                     dt         j                  j                        z   dz   t        j                  j                  |       j                  dd      z   S )N/extensions/r   r   )ro   rp   quoter   r7   r   r   )r   dirnames    r%   r   z?PromptServer.__init__.<locals>.get_extensions.<locals>.<lambda>\  sN    ^fllFXFXG 66 "$''//!S"9"A"A$"L6M rV   )globr   r7   r   escaper   r   r   nodesEXTENSION_WEB_DIRSitemsextendr
   r   )r5   r   
extensionsr   r   r   s      @@r%   get_extensionsz-PromptServer.__init__.<locals>.get_extensionsS  s     IIbggllDMM*,@BMQSE c"fhmnoJ"55;;= W	c		"'',,t{{3/?"KW[\!!$s ,MNS(U #V WW
 $$Z00s   DDc                     | d} | dk(  rt        j                         }|| fS | dk(  rt        j                         }|| fS | 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_typea  sx    "7"';;= X%% V#'::< X%% X%'<<>X%%rV   c                    t        j                         }t        j                  j	                  |       r |       } |       }t        | d      5 }|j                  |j                                |j                  |j                  j                                |j                  j                  d       d d d        |j                         |j                         k(  S y# 1 sw Y   +xY w)Nrbr   F)node_helpershasherr   r7   existsopenupdatereadfileseek	hexdigest)filepathimager   r   br   s         r%   compare_image_hashz1PromptServer.__init__.<locals>.compare_image_hashn  s    !((*F ww~~h'HH(D) 'QHHQVVX&HHUZZ__./JJOOA&' {{}55' 's   A$CC%c                    | j                  d      }| j                  d      }d}| j                  d      } |      \  }}|r|j                  r|j                  }|st        j                  d      S | j                  dd      }t
        j                  j                  |t
        j                  j                  |            }	t
        j                  j                  t
        j                  j                  |	|            }
t
        j                  j                  ||
f      |k7  rt        j                  d      S t
        j                  j                  |	      st        j                  |	       t
        j                  j                  |      }||d	k(  s|d
k(  rnd}t
        j                  j                  |
      ra |
|      rd}nU|d    d| d|d    }t
        j                  j                  |	|      }
|dz  }t
        j                  j                  |
      ra|sK| ||| |
       n>t        |
d      5 }|j                  |j                  j!                                d d d        |||d}t"        j$                  r	 |dv r|nd}t'        |
||g      }|j(                  j*                  |j(                  j,                  |j.                  j0                  |j.                  j2                  |j.                  j4                  |j6                  d|d<   t        j>                  |      S t        j                  d      S # 1 sw Y   xY w# t8        $ r t;        j<                  dd       Y Yw xY w)Nr   	overwriteFr     rl   	subfolderr?   rN   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) rB   r   filenamer
   rD   r   r7   r   normpathabspath
commonpathr   makedirsr   r   writer   r   enable_assetsr   refr  r   r  hash
size_bytesr  r  r   r.   r/   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,;<M,N)J) >><<s33 HH["5	%'WW\\*bgg>N>Ny>Y%Z"77??277<<8JH+UV77%%z8&<=K<<s33ww~~&89KK 23((2(i6.AYRUEUA''..2-h>15.!&+AhZr!AeAhZ#@#%77<<0BH#MQ ''..2 **6+E4B!(D1 7QGGEJJOO$567 "*	K\]%%e3DH[3[/ah!7PX`c_d!e"(**--$*JJOO*0,,*;*;$*LL$;$;)/)?)?$*KK)W ((..||3//-7 7" % e(T_cdes   9*L>BM
 >M
 M-,M-z/upload/imagec                 P   K   | j                          d {   } |      S 7 wr   r  )r5   r  r#  s     r%   upload_imagez+PromptServer.__init__.<locals>.upload_image  s%      'D%% (s   &$&z/upload/maskc                 X   K   | j                          d {   }d } ||      S 7 w)Nc                    t        j                  |j                  d            }t        j                  |d         \  }}|st        j                  d      S |d   dk(  sd|v rt        j                  d      S |'|j                  dd	      }t        j                  |      }|t        j                  d      S |j                  d
d      dk7  r|t        j                  j                  ||d
         }t        j                  j                  t        j                  j                  |      |f      |k7  rt        j                  d      S |}t        j                  j                  ||      }t        j                  j                  |      rt        j                  |      5 }	t!               }
t#        |	d      r0|	j$                  D ]!  }|
j'                  ||	j$                  |          # |	j)                  d      }	t        j                  | j*                        j)                  d      }|j-                  d      }|	j/                  |       |	j1                  |d|
       d d d        y y # 1 sw Y   y xY w)Noriginal_refr  r   rl   r   r   ..r   r   r  r?   rk   textRGBAA   )compress_levelpnginfo)r   r   rB   r   annotated_filepathr
   rD   get_directory_by_typer   r7   r   r  r  isfiler   r   r   hasattrr+  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   #zz$((>*BC'3'F'F|T^G_'`$*<<s33 A;#%)9<<s33%'++FH=D!-!C!CD!IJ%<<s33##K4:&(ggll:|K?X&YOww))277???+KZ*XY]gg"||377!0Jww||J977>>$'D) X\#*9"<7'3'8'8 O ( 1 1#|7H7H7M NO'3';';F'C#(::ejj#9#A#A&#I %-$7$7$<	$--i8$))(1h)WX X (X Xs    B<I&&I/r%  )r5   r  r  r#  s      r%   upload_maskz*PromptServer.__init__.<locals>.upload_mask  s2      'D&XP  &9::U (s   *(*z/viewc           	      L  K   d| j                   j                  v r| j                   j                  d   }|j                  d      rfj                  j	                  |       }t        ||      }|t        j                  d      S |j                  |j                  |j                  }}}nd }t        j                  |      \  }}|st        j                  d      S |d   dk(  sd	|v rt        j                  d      S |;| j                   j                  j                  d
d      }t        j                  |      }|t        j                  d      S d| j                   j                  v rt        j                   j#                  || j                   j                  d         }t        j                   j%                  t        j                   j'                  |      |f      |k7  rt        j                  d      S |}t        j                   j)                  |      }t        j                   j#                  ||      }t        j                   j+                  |      rd| j                   j                  v r9t-        j.                  |      5 }	| j                   j                  d   j1                  d      }
|
d   }|dvs(d| j                   j                  j                  dd      v rd}d}|
d   j3                         rt5        |
d         }t7               }|dv s)| j                   j                  j                  dd      dk(  r|	j9                  d      }	|	j;                  |||       |j=                  d       t        j                  |j?                         d| dd| di      cd d d        S d| j                   j                  vrd }n| j                   j                  d   }|dk(  rt-        j.                  |      5 }	|	j@                  d!k(  r/|	j1                         \  }}}}t-        jB                  d|||f      }n|	j9                  d      }t7               }|j;                  |d"#       |j=                  d       t        j                  |j?                         d$dd| di      cd d d        S |dk(  rt-        j.                  |      5 }	|	j@                  d!k(  r|	j1                         \  }}}}n!t-        jD                  d%|	jF                  d&      }t-        jD                  d!|	jF                        }|jI                  |       t7               }|j;                  |d"#       |j=                  d       t        j                  |j?                         d$dd| di      cd d d        S |xs tK        jL                  |      d   xs d'}|d(v rd'}t        jN                  |d| d|d)*      S t        j                  d      S # 1 sw Y   ZxY w# 1 sw Y   ,xY w# 1 sw Y   8xY ww)+Nr  zblake3:)owner_idr   rl   r   r   r   r*  r   r   r  rk   preview;)webpjpegr   channelr?   rF  Z   )rG  rgbRGB)r0   qualityzimage/Content-Dispositionz
filename="")rF   rE   rA   rgbar,  PNG)r0   	image/pngL   zapplication/octet-stream>   text/css	text/htmltext/javascripttext/html-sandboxedapplication/xhtml+xml)rN  zContent-Type)rA   )(r   r   r8   user_managerget_request_user_idr   r
   rD   r  download_namerE   r   r1  rB   r2  r   r7   r   r  r  basenamer3  r   r   r  isdigitintr	   r6  r9  r   r   modemergenewr
  r8  	mimetypes
guess_typer   )r5   r  rC  r"  r   resolved_content_typer:  r   r;  imgpreview_infoimage_formatrM  bufferrH  rd   gr   r   new_imgre   	alpha_imgalpha_bufferrE   r   s                           r%   
view_imagez)PromptServer.__init__.<locals>.view_image  sv    W__222"??00< &&y1#00DDWMH1(XNF~"||377<BOOVMaMacicvcv$9(D,0)+7+J+J8+T(Hj#"||377  {c)TX-="||377!)&4488J%1%G%G%M
!)"||377"goo&;&;;*,'',,z7??CXCXYdCe*f77--rww/OQ[.\]akk#&<<s#;;%4
!ww//9H77<<
H=D77>>$' GOO$9$99"ZZ- m+2??+@+@+K+Q+QRU+VL+7?L+3CCsgooNcNcNgNghqsuNvGv/5&(G+B/779*-l2.>*?%,YF+x77??;P;P;T;TU^`b;cgl;l&)kk%&8HHVL'HR"KKN#&<<V[[]SYZfYgQh9NR]^f]ggiPj8k$m!m m& !(=(=="(")//"7"7	"B%'"ZZ- m"xx61-0YY[
1a*/++eaAY*G*-++e*<%,YF#LLL>"KKN#&<<V[[]Q\9NR]^f]ggiPj8k$mm m !C"ZZ- m"xx61-0YY[
1a$)IIc388S$A ).		&#(((CI%..q1+29L%NN<NF(--a0#&<<\5F5F5HWb9NR]^f]ggiPj8k$mm m& 2 :(33H=a@:9 % (  ,H  H+EL"// 9DXJb7Q0<%   <<s++Ym m2m mm msS   JX$DW?%AX$=B)X&$X$
CXA$X$?X	X$XX$X!X$z/view_metadata/{folder_name}c                   K   | j                   j                  dd       }|t        j                  d      S d| j                  j
                  vrt        j                  d      S | j                  j
                  d   }|j                  d      st        j                  d      S t        j                  ||      }|t        j                  d      S t        j                  j                  |d      }|t        j                  d      S t        j                  |      }d|vrt        j                  d      S t        j                  |d         S w)	Nfolder_namer   rl   r  z.safetensorsi   )max_size__metadata__)r   rB   r
   rD   r   r   endswithr   get_full_pathcomfyutilssafetensors_headerr   r   r   )r5   rp  r  safetensors_pathoutdts         r%   view_metadataz,PromptServer.__init__.<locals>.view_metadatak  s    !,,00EK"||3//!6!66||3//,,Z8H$$^4||3//+99+xP'||3//++001AI0VC{||3//CBR'||3//$$R%788s   EEz/system_statsc                   K   t         j                  j                         }t         j                  j                  |      }t         j                  j                  j                  d      }t         j                  j                  |      }t         j                  j                  |      }t         j                  j                  |d      \  }}t         j                  j                  |d      \  }}	t        j                         }
t        j                         }t        j                         }t        j                  ||t        |
||t        j                  t         j                  j                   t"        j$                  j'                  t"        j$                  j'                  t        j(                        d         d   dk(  t        j*                  d||j,                  |j.                  ||||	d	gd
}t1        j2                  |      S w)NcpuT)torch_total_too)torch_free_toor   r  python_embeded)r   	ram_totalram_freecomfyui_versionrequired_frontend_versioninstalled_templates_versionrequired_templates_versionpython_versionpytorch_versionembedded_pythonargv)r   r   index
vram_total	vram_freetorch_vram_totaltorch_vram_free)systemdevices)ru  model_managementget_torch_deviceget_torch_device_nametorchdeviceget_total_memoryget_free_memoryr   get_required_frontend_versionget_installed_templates_versionget_required_templates_versionsysplatformr   versiontorch_versionr   r7   r  
executabler  r   r  r
   r   )r5   r  device_name
cpu_devicer  r  r  r  r  r  r  r  r  system_statss                 r%   r  z+PromptServer.__init__.<locals>.system_stats  s    ++<<>F00FFvNK//55<<UCJ..??
KI--==jIH+0+A+A+R+RSYko+R+p(J().)?)?)O)OPVgk)O)l&I(7(U(U(W%*9*Y*Y*[')8)W)W)Y& ,,!* ('21J3N2L&)kk','='='K'K')ww}}RWW]]3>>5RST5U'VWX'Y]m'mHH !, &!'&0%.,<+:
L4 $$\22s   HHz	/featuresc                 X   K   t        j                  t        j                               S wr   )r
   r   r   r   )r5   s    r%   get_featuresz+PromptServer.__init__.<locals>.get_features  s      $$]%F%F%HIIs   (*z/promptc                 R   K   t        j                  j                               S wr   )r
   r   r   )r5   r   s    r%   
get_promptz)PromptServer.__init__.<locals>.get_prompt  s!     $$T%8%8%:;;s   $'c           	         t         j                  |    }t        |t              r|j	                         S i }|j                         |d<   |j                         j                         D ci c]  \  }}|t        |j                               ! c}}|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                  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 c c}}w ))Nr   input_orderINPUT_IS_LISTFis_input_listr   OUTPUT_IS_LISToutput_is_listRETURN_NAMESoutput_namer   display_nameDESCRIPTIONr?   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   r   r   getattrRETURN_TYPESr4  r  rv   r  NODE_DISPLAY_NAME_MAPPINGSr  r  r  r  r  r  r  )
node_class	obj_classinfor>  values        r%   	node_infoz(PromptServer.__init__.<locals>.node_info  s   11*=I)%78 1133D%113DMOXOdOdOfOlOlOn"o|U3UZZ\(:#:"oD$+I$ND!&33DNAHTdAeY%=%=lqkrux  zC  zP  zP  vQ  lQD!"<CI~<^)"8"8dhiqdrD%DLS]af  bB  bB  bG  bG  bI  TI5#C#CJ#O  OYD ;B9];[)"7"7acD$+I7OQX$YD!#Dy-0Y5J5Jd5R&*]#&+]#y";<AbAbfjAj26./27./y*-#,#5#5Z y"34*3*C*C&'y,6%)\"y.%8'+^$y*e4#'Z y*-#,#5#5Z %,Y8H"%MD!"y"78.7.K.K*+KS #ps   *$I7z/object_infoc                   K   t        j                  d       t        j                  5  i }t        j
                  D ]  }	  |      ||<    t        j                  |      cd d d        S # t        $ rC t        j                  d| d       t        j                  t        j                                Y zw xY w# 1 sw Y   y xY ww)N)modelsr   r   )rootsz@[ERROR] An error occurred while retrieving information for the 'z' node.)r   startr   cache_helperr   r  r   r.   r   	traceback
format_excr
   r   )r5   ry  xr  s      r%   get_object_infoz.PromptServer.__init__.<locals>.get_object_info  s     %BC** .22 >A>!*1A> ((-. .
 % >(hijhkkr&sti&:&:&<=>. .sA   'CB;A,B;"
C,A	B85B;7B88B;;C Cz/object_info/{node_class}c                    K   | j                   j                  dd       }i }||t        j                  v r |      ||<   t	        j
                  |      S w)Nr  )r   rB   r   r  r
   r   )r5   r  ry  r  s      r%   get_object_info_nodez3PromptServer.__init__.<locals>.get_object_info_node  sV      ++//dCJC&Z5;T;T-T"+J"7J$$S))s   AAz	/api/jobsc                   K   | j                   j                  }|j                  d      }|j                  d      }|j                  dd      j                         }|j                  dd      j                         }d}|r|j	                  d      D cg c]1  }|j                         s|j                         j                         3 }}|D cg c]  }|t        j                  vs| }}|rKt        j                  d	d
dj                  |       ddj                  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 r:	 t        |j                  d            }	|	dk  rt        j                  d	did      S 	 d}
d|v r"	 t        |j                  d            }
|
dk  rd}
j                  j                         \  }}j                  j!                         }t#        |      }t#        |      }t%        ||||||||	|
	      \  }}|
t'        |      z   |k  }t        j                  ||
|	||dd      S c c}w c c}w # t        t        f$ r t        j                  d	did      cY S w xY w# t        t        f$ r t        j                  d	did      cY S w xY ww)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)
            rm   workflow_idsort_by
created_at
sort_orderdescN,r   zInvalid status value(s): z, z. Valid values: r   rl   >   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   rB   rn   r  stripr   ALLr
   r   r   r_  
ValueError	TypeErrorprompt_queueget_current_queue_volatileget_historyr&   r   rv   )r5   r   status_paramr  r  r  r  sinvalid_statusesr  r  runningqueuedhistoryr  r  r  r   s                    r%   get_jobsz'PromptServer.__init__.<locals>.get_jobs  s     OO))E 99X.L))M2Kii	<8>>@G<8>>@J M<H<N<Ns<S aqWXW^W^W`!2 a a/<#W!@VA#W #W#,, $=diiHX>Y=ZZjkoktktu~  vC  vC  lD  kE  #F  G" 
 BB((TU 
 0((BC 
 E %		' 23Ez"00$&HI#&   " F5  8!45Fz!" #//JJLOGV''335G27;G1&9F&+'%KD% T*e3H$$$"" (	&  G !b#W< #I. ,, "<="  #I. ,, "=>" st   BKI.) I.	KI3'I3+BK;7I8 2K;!J& BK8(J# K"J##K&(KKKKz/api/jobs/{job_id}c                   K   | j                   j                  dd      }|st        j                  ddid      S j                  j                         \  }}j                  j                  |      }t        |      }t        |      }t        ||||      }|t        j                  ddid	      S t        j                  |      S w)
zGet a single job by ID.job_idNr   zjob_id is requiredr   rl   	prompt_idzJob not foundr   )	r   rB   r
   r   r  r  r  r&   r   )r5   r   r  r  r  jobr   s         r%   get_job_by_idz,PromptServer.__init__.<locals>.get_job_by_id[  s      ''++Hd;F((23 
 #//JJLOGV''33f3EG27;G1&9F&'67;C{((o. 
 $$S))s   CCz/historyc                 >  K   | j                   j                  j                  dd       }|t        |      }| j                   j                  j                  dd       }|t        |      }nd}t	        j
                  j                  j                  ||            S w)N	max_itemsr  rJ  )r  r  )r   r   rB   r_  r
   r   r  r  )r5   r  r  r   s      r%   r  z*PromptServer.__init__.<locals>.get_historyt  s     --11+tDI$	N	__**..x>F!V$$T%6%6%B%BY_e%B%fggs   BBz/history/{prompt_id}c                    K   | j                   j                  dd       }t        j                  j                  j                  |            S w)Nr  r  )r   rB   r
   r   r  r  )r5   r  r   s     r%   get_history_prompt_idz4PromptServer.__init__.<locals>.get_history_prompt_id  sD     **..{DAI$$T%6%6%B%BY%B%WXXs   AAz/queuec                    K   i }j                   j                         }t        |d         |d<   t        |d         |d<   t        j                  |      S w)Nr   queue_runningr  queue_pending)r  r  r&   r
   r   )r5   
queue_infocurrent_queuer   s      r%   	get_queuez(PromptServer.__init__.<locals>.get_queue  s[     J --HHJM*F}UVGW*XJ'*F}UVGW*XJ'$$Z00s   AAc                 B  K   t        j                  d       | j                          d {   }j                  |      }d|v rt	        |d         }n-j
                  }d|v r|d   r| }xj
                  dz  c_        d|v rq|d   }t        |j                  dt        j                                     }d }d|v r|d   }j                  j                  |       t        j                  |||       d {   }i }d|v r|d   }d	|v r|d	   |d	<   |d
   r|d   }i }	t        j                  D ]  }
|
|v s|j                  |
      |	|
<    t!        t#        j"                         dz        |d<   j$                  j'                  ||||||	f       |||d   d}t)        j*                  |      S t        j,                  dj/                  |d                t)        j*                  |d   |d   dd      S dddi d}t)        j*                  |i dd      S 7 7 #w)Nz
got promptnumberfrontr  promptr  partial_execution_targets
extra_datar   r      i  create_time   )r  r  node_errorszinvalid prompt: {})r   r  r   rl   	no_promptzNo prompt provided)r   r2   details
extra_info)r.   r  r   trigger_on_promptfloatr  strrB   r   r   node_replace_managerapply_replacements	executionvalidate_promptSENSITIVE_EXTRA_DATA_KEYSr   r_  timer  putr
   r   r/   r0   )r5   	json_datar  r  r  r  validr  outputs_to_execute	sensitivesensitive_valr<   r   r   s                r%   post_promptz*PromptServer.__init__.<locals>.post_prompt  s?    LL&&||~-I..y9I9$y23i' )"(q 9$"8,	k4::< HI	,0).);09:U0V-))<<VD'77	6Kdee
9,!*<!8J)+.7.DJ{+8).q& "I)2)L)L U(J67A~~m7TIm4U 14DIIK$4F0GJ}-%%))69fjRdfo*pq-6&Y^_`YabH,,X66OO$8$?$?a$IJ,,uQxPUVWPX-Ybeff (33"$	 ((5)LUXYYe .. fs)   )HHCH9H:>H9C!HHc                   K   | j                          d {   }d|v r|d   rj                  j                          d|v r,|d   }|D ]"  fd}j                  j                  |       $ t	        j
                  d      S 7 mw)Ncleardeletec                     | d   k(  S )Nr  r#   )r   id_to_deletes    r%   r   z;PromptServer.__init__.<locals>.post_queue.<locals>.<lambda>  s    AaDL,@ rV      rl   )r   r  
wipe_queuedelete_queue_itemr
   rD   )r5   r&  	to_deletedelete_funcr0  r   s       @r%   
post_queuez)PromptServer.__init__.<locals>.post_queue  s     &||~-I)#W%%%0029$%h/	$- EL"@K%%77DE <<s++ .s   BBA.Bz
/interruptc                   K   	 | j                          d {   }|j                  d      }|r{j                  j	                         \  }}d}|D ]&  }|d   |k(  st        j                  d|        d} n |rt        j                          nCt        j                  d| d       n)t        j                  d       t        j                          t        j                  d	
      S 7 # t         j                  $ r i }Y w xY ww)Nr  Fr  zInterrupting prompt TzPrompt z- is not currently running, skipping interruptz)Global interrupt (no prompt_id specified)r1  rl   )r   r   rB   r  get_current_queuer.   r  r   interrupt_processingr
   rD   )r5   r&  r  currently_runningre   should_interruptr$   r   s          r%   post_interruptz-PromptServer.__init__.<locals>.post_interrupt  s     "),,.0	
 "k2I'+'8'8'J'J'L$!1 $) - DAw)+';I;%GH+/( $..0LL79+5b!cd HI**,<<s++7 1'' 	s>   DC, C*C, ?DBD*C, ,DDDDz/freec                 ,  K   | j                          d {   }|j                  dd      }|j                  dd      }|rj                  j                  d|       |rj                  j                  d|       t	        j
                  d      S 7 zw)Nunload_modelsFfree_memoryr1  rl   )r   rB   r  set_flagr
   rD   )r5   r&  r>  r?  r   s       r%   	post_freez(PromptServer.__init__.<locals>.post_free  s{     %lln,I%MM/5AM#--u=K!!**?MJ!!**=+F<<s++ -s   BBA;Bc                   K   | j                          d {   }d|v r|d   rj                  j                          d|v r'|d   }|D ]  }j                  j                  |        t	        j
                  d      S 7 hw)Nr-  r.  r1  rl   )r   r  wipe_historydelete_history_itemr
   rD   )r5   r&  r4  r0  r   s       r%   post_historyz+PromptServer.__init__.<locals>.post_history  s     &||~-I)#W%%%2249$%h/	$- HL%%99,GH <<s++ .s   BB A)Br   )@r   instancer   rZ  r   model_file_managerr   custom_node_managerr   subgraph_managerr   r  r   internal_routessupportsr!  PromptQueuer  loopasyncioQueuemessagesclient_sessionr  r   r=   r   enable_compress_response_bodyappendrI   enable_cors_headerrU   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   r.   r  r  r   r   disableRouteTableDefroutesr   r   on_prompt_handlersrB   r  )"r   rM  r   rZ  rc  r   r   r   r   r   r   r&  rA  rn  r{  r  r  r  r  r  r  r  r  r  r  r+  r6  r<  rA  rE  r   r   r#  r  s"   `                             @@@@r%   __init__zPromptServer.__init__   s    $'M"2"4#4#6  / 1$6$8!-d301%11$7	>B$&9:--}-""5d6M6MNO<>?!!?AB@@BC 4 4t ;d BC???P[\v $ ""* ))$*@*@A$$ 	
 	1$--AB"488T->->?"488,  """$ "$	E	9	 
9	v 
C	 
	 
M	"	^ 
#	^ 
I		2 
	2
 
&	'	, 
(	, 
M	"	1 
#	1	&	?	0B 
_	%	& 
&	&
 
^	$+	; 
%+	;Z 
G	w	, 
w	,r 
2	3	9 
4	9, 
O	$&	3 
%&	3P 
K	 	J 
!	J 
I		< 
	</	b 
N	#
	. 
$
	. 
/	0	* 
1	* 
K	 _	 
!_	B 
(	)	* 
*	*0 
J		h 
 	h 
*	+	Y 
,	Y 
H		1 
	1 
Y	4	Z 
 4	Zl 
X		, 
	, 
\	"	, 
#	,> 
W		, 
	, 
Z	 
	, 
!
	,rV   c                 n   K   t        j                  d       }t        j                  |      | _        y w)N)r  )timeout)r(   ClientTimeoutClientSessionrQ  )r   rg  s     r%   setupzPromptServer.setup  s)     ''d3%33GDs   35c                 h   | j                   j                  | j                         | j                  j                  | j                         | j                  j                  | j                  | j
                  t        j                  j                                | j                  j                  | j                  t        j                  j                                | j                  j                  | j                         | j
                  j                  d| j                  j                                t        j                         }| j                  D ]a  }t!        |t        j"                        s |j%                  |j&                  d|j(                  z         |j*                  fi |j,                   c | j
                  j                  |       | j
                  j                  | j                         t        j.                  j                         D ]8  \  }}| j
                  j                  t        j0                  d|z   |      g       : t3        j4                         }d}|r	 t7        |      t7        d      k  }|rGt3        j>                         }|rm| j
                  j                  t        j0                  d|      g       n<t3        j@                         }	|	r&| j
                  jB                  jE                  d|	       t3        jF                         }
|
r0| j
                  j                  t        j0                  d	|
      g       | j
                  j                  t        j0                  d
| jH                        g       y # t8        $ r"}t;        j<                  d||       Y d }~,d }~ww xY w)Nz	/internalz/apir   Tz0.3.0z*Unable to parse templates version '%s': %sz
/templatesz/templates/{path:.*}z/docsr   )%rZ  
add_routesrc  rG  rH  r\  r   LOADED_MODULE_DIRSr   rI  r  
add_subapprJ  get_appr
   rb  rC   RouteDefrouterP   r7   r;   kwargsr   staticr   r  r   r   r.   r/   legacy_templates_pathtemplate_asset_handlerrouteradd_getembedded_docs_pathr   )r   
api_routesrq  r   r   r  use_legacy_templatesexcworkflow_templates_pathr;   rx  s              r%   rl  zPromptServer.add_routes  s   $$T[[1**4;;7  ++DKK5C[C[CaCaCcd((e6N6N6T6T6VW!!,,T[[9K)=)=)E)E)GH &&(
[[ 	cE %.C
  v

/BCEMMbUZUaUab		c
 	J'DKK( 11779 	JID#HHNT,A3!G HI	J '6&U&U&W##&
!"=>#G,- %  &5&K&K&M#&##JJ|-DE%  &<<>G''(>H -??AHH

7$67!  	JJsDMM*
 	3  @/ s   )N 	N1N,,N1c                 R    i }i }| j                   j                         |d<   ||d<   |S )Nqueue_remaining	exec_info)r  get_tasks_remaining)r   prompt_infor  s      r%   r   zPromptServer.get_queue_infoO  s6    	'+'8'8'L'L'N	#$#,K rV   Nc                 ~  K   |t         j                  k(  r| j                  ||       d {    y |t         j                  k(  r"|\  }}| j	                  |||       d {    y t        |t        t        f      r| j                  |||       d {    y | j                  |||       d {    y 7 7 U7 %7 w)Nr   )
r   UNENCODED_PREVIEW_IMAGE
send_imagePREVIEW_IMAGE_WITH_METADATAsend_image_with_metadatarC   bytes	bytearray
send_bytes	send_json)r   eventr   r   preview_imager=  s         r%   r   zPromptServer.sendV  s     $<<<//$C/000&BBB&*#M8//xS/QQQui01//%s333..c222 1 R32sE   *B=B54B=!B7"1B=B9B=/B;0B=7B=9B=;B=c                     t        |t              st        d|       t        j                  d|      }t        |      }|j                  |       |S )Nz)Binary event types must be integers, got >I)rC   r_  RuntimeErrorstructpackr  r   )r   r  r   packedr2   s        r%   encode_byteszPromptServer.encode_bytesb  sJ    %%!J5'RSST5)F#trV   c                   K   |d   }|d   }|d   }|^t        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|      }	|j                  |	       |j                  ||dd	       |j                         }
| j                  t        j                  |
|
       d {    y 7 w)Nr   r  r  
ResamplingJPEGrQ  r  _   r0   rM  r/  r  )r4  r   r  BILINEARLANCZOSr   containr	   r  r  r  r9  getvaluer  r   PREVIEW_IMAGE)r   
image_datar   
image_typer   rq  
resamplingtype_numbytesIOheaderpreview_bytess              r%   r  zPromptServer.send_imagek  s     ]
1a=ul+"--66
"--55
$$UXx,@*MEH5 H)T8,f

7:r!
L((*oo.<<mQToUUUs   C<D>D?Dc                   K   |d   }|d   }|d   }|^t        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                  |      j                  d	      }
t        |
      }t               }|j                  ||d
d       |j                         }t               }|j                  t!        j"                  d|             |j                  |
       |j                  |       | j%                  t&        j(                  ||       d {    y 7 w)Nr   r  r  r  rQ  rR  z
image/jpegr  utf-8r  r  r  r  )r4  r   r  r  r  r   r  r   dumpsencoderv   r	   r9  r  r  r   r  r  r  r   r  )r   r  r=  r   r  r   rq  r  mimetyper   metadata_jsonmetadata_lengthr  image_bytescombined_datas                  r%   r  z%PromptServer.send_image_with_metadata  sD    ]
1a=ul+"--66
"--55
$$UXx,@*ME","5;< H!) 	"

8,33G<m, )

7:r!
L&&( "V[[?@]+[)oo.JJM_bocccs   EE!EE!c                 B  K   | j                  ||      }|It        | j                  j                               }|D ]   }t	        |j
                  |       d {    " y || j                  v r,t	        | j                  |   j
                  |       d {    y y 7 B7 wr   )r  r   r   valuesr4   r  r   r  r   r   r2   r   r   s          r%   r  zPromptServer.send_bytes  s     ##E40;4<<..01G J1"--IIIJDLL -dll3.?.J.JGTTT ! JTs$   ABB;BBBBc                 (  K   ||d}|It        | j                  j                               }|D ]   }t        |j                  |       d {    " y || j                  v r,t        | j                  |   j                  |       d {    y y 7 B7 w)N)r   r   )r   r   r  r4   r  r  s          r%   r  zPromptServer.send_json  s      $/;4<<..01G I1",,HHHIDLL -dll3.?.I.I7SSS ! ISs$   A	BB;BBBBc                 j    | j                   j                  | j                  j                  |||f       y r   )rM  call_soon_threadsaferP  
put_nowait)r   r  r   r   s       r%   	send_synczPromptServer.send_sync  s*    		&&MM$$udC&8	:rV   c                 H    | j                  dd| j                         i       y )Nrm   )r  r   )r   s    r%   queue_updatedzPromptServer.queue_updated  s    x8T-@-@-B!DErV   c                    K   	 | j                   j                          d {   } | j                  |  d {    :7 7 wr   )rP  rB   r   )r   r   s     r%   publish_loopzPromptServer.publish_loop  s=     ))++C$))S/!! +!s   A>AA A Ac                 L   K   | j                  ||fg|       d {    y 7 w)N)call_on_start)start_multi_address)r   addressru   verboser  s        r%   r  zPromptServer.start  s&     &&$'8&VVVs   $"$c                 B  K   t        j                  | j                  d       }|j                          d {    d }d}t        j
                  rtt        j                  rdt        j                  t        j                  t        j                        }|j                  t        j                  t        j
                         d}|rt        j                  d       |D ]  }|d   }|d   }	t        j                  |||	|	      }
|
j                          d {    t!        | d
      s|| _        |	| _        d|v rdj'                  |      }n|}|sst        j                  dj'                  |||	              | ||| j"                  | j$                         y y 7 c7 w)N)
access_loghttp)protocolverify_mode)certfilekeyfilehttpszStarting server
r   r  )ssl_contextr  :z[{}]z To see the GUI go to: {}://{}:{})r
   	AppRunnerr\  rj  r   tls_keyfiletls_certfilessl
SSLContextPROTOCOL_TLS_SERVER	CERT_NONEload_cert_chainr.   r  TCPSiter  r4  r  ru   r0   )r   	addressesr  r  runnerssl_ctxschemeaddrr  ru   siteaddress_prints               r%   r  z PromptServer.start_multi_address  s^    txxD9lln 1 1nnc.E.ESVS`S`aG##T->->(,(8(8 $ :FLL,- 	eD1gG7D;;vw'JD**,4+& 	g~ &g 6 '?FFv}^bcd!	e$ $&$,,		: %; 	 s)   5FFCFF8FAFFc                 :    | j                   j                  |       y r   )rd  rS  )r   r;   s     r%   add_on_prompt_handlerz"PromptServer.add_on_prompt_handler  s    &&w/rV   c                     | j                   D ]  }	  ||      } |S # t        $ r? t        j                  d       t        j                  t	        j
                                Y Ww xY w)NzA[ERROR] An error occurred during the on_prompt_handler processing)rd  r   r.   r/   r  r  )r   r&  r;   s      r%   r  zPromptServer.trigger_on_prompt  sa    .. 	8G8#I.		8 	  8 cd	 4 4 678s   AA%$A%r+  node_idc                    t        |t              r|j                  d      }t        |      j                  d      }t        j                  dt        |            |z   |z   }| j                  t        j                  ||       y )Nr  r  )	rC   r  r  r  r  rv   r  r   r   )r   r+  r  r   node_id_bytesr2   s         r%   send_progress_textzPromptServer.send_progress_text  sh     dC ;;w'DG++G4 ++dC$67-G$N',,gs;rV   r   )NN)TN)NT)__name__
__module____qualname__re  rj  rl  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r#   rV   r%   r   r      s    C,JE=~
3V0#dJUT:F"
W ;D0 EI
<%C/0
<;>
<rV   r   )Zr   r  rN  r  r$  r   r   r!  comfy_execution.jobsr   r   r   r   ro   r   r   r  r  r[   rX   PILr   r   PIL.PngImagePluginr   ior	   r(   r
   r.   rc  comfy.cli_argsr   comfy.utilsru  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   rV  rW  r   r&   r4   setr9   rS   rT   r=   rI   r  rU   rZ   r}   r   r   r#   rV   r%   <module>r     s+   	 
       A A      
    &         #  ' B 1 * 8 = E ( . 5 0 7 " E % 6( ( (
6 5 s{{  $ 	 	 	3 "4""J%~< ~<rV   