)2hddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlmZmZddlmZddlmZddlZddlmZddlZddlZddlmZddlZddlZddlZddl m!Z!ddl"m#Z#dd l$m%Z%dd l&m'Z'dd l(m)Z)dd l*m+Z+m,Z,dd l-m.Z.GddZ/dZ0ejbdejdfdZ3ejbdejdfdZ4de5fdZ6dZ7dZ8GddZ9y)N)ImageImageOps)PngInfo)BytesIO)web)args) __version__)FrontendManager) UserManager)ModelFileManager)CustomNodeManager)OptionalUnion)InternalRoutesceZdZdZdZdZy)BinaryEventTypesN)__name__ __module__ __qualname__ PREVIEW_IMAGEUNENCODED_PREVIEW_IMAGETEXT-D:\ComfyUI_windows_portable\ComfyUI\server.pyrr'sM DrrcK ||d{y7#tjtjttt f$r.}t jdj|Yd}~yd}~wwxYww)Nzsend error: {}) aiohttp ClientErrorClientPayloadErrorConnectionResetErrorBrokenPipeErrorConnectionErrorloggingwarningformat)functionmessageerrs rsend_socket_catch_exceptionr,,s]6w   !;!;=QSbds t6(//4556s7A: A:2A7 $A2-A:2A77A:requestc K||d{}|jjds6|jjds|jjdr|jjdd|S7sw)N.js.cssz index.json Cache-Controlno-cache)pathendswithheaders setdefault)r-handlerresponses r cache_controlr92sh#*7#33H||U#w||'<'.cors_middlewareHsy >>Y &||~H$W--H:H67;\78;X78?E;< .s0A8A6AA8r middlewareRequest)rErKs` rcreate_cors_middlewarerOGs,^^ s{{   rc|y tj|jryy#YnxYwd}tjtj fD]y} tj |d|tj}|D]2\}}}}}tj|djs|ccSd}4b#tj$rYwwxYw|S)NFTr) ipaddress ip_address is_loopbacksocketAF_INETAF_INET6 getaddrinfo SOCK_STREAMgaierror)hostloopbackfamilyr_sockaddrs rrSrSXs |    % 1 1  H>>6??3 ""4vv7I7IJA-.)1a ++HQK8DD#O#H ./    4 Os!&*AB1,B11CCcTtjdtjfd}|S)Nr-cKd|jvr?d|jvr0|jd}|jd}|j}tjj |}|j j}tjj d|z}t|j}|j |j}|j |j}|r`|^|\t|dkDrNt|dkDr@||k7r;tjdj||tjdS|j dk(rtj} | S||d{} | S7w) NHostOriginz//rzJWARNING: request with non matching host and origin {} != {}, returning 403statusrH)r5lowerurllibparseurlparsenetlocurlsplitrShostnameportlenr&r'r(rr?rJ) r-r7rZorigin host_domainparsed origin_domainhost_domain_parsedr[r8s rorigin_only_middlewarez=create_origin_only_middleware..origin_only_middlewaressv W__ $W__)D??6*D__X.F**,K\\**62F"MM//1M!'!6!6tk7I!J ##5#>#>?H{{"099 !&&. & K3 8QVYZeVfijVjortApBEFpF-/OO$p$w$wyDFS%TU<>Y &||~H%W--H.sE?F FF rL)rus rcreate_origin_only_middlewarervrs,^^ckk@ "!rceZdZdZdZdZdZddZdZddZ dd Z dd Z dd Z d Z d ZddZddZdZdZ ddeeeefdefdZy) PromptServerct_tjtjddtjddt _t_t_ t_ dg_ tj_|_t%j&_d_d_t.g}t0j2r|j5t6t0j8r)|j5t;t0j8n|j5t=t?t0j@dzdz}tCjD||_#tI_%t0jL#tOjPt0jRnt0jL_*tWjXd jTtCjZ}|_.d_/d_0g_1|jed fd }|jed fd }|jedd}|jedd}|jedd} |jedfd} ddd7fd |jgdfd} |jgdfd} |jedd} |jedd }|jed!d"}|jed#fd$}d%|jed&fd'}|jed(fd)}|jed*fd+}|jed,fd-}|jed.fd/}|jgd#fd0}|jgd.fd1}|jgd2d3}|jgd4fd5}|jgd*fd6}y)8Nz%application/javascript; charset=utf-8r/z image/webpz.webpcustom_nodes_from_webri)client_max_size middlewaresz[Prompt Server] web root: z/wscpKtj}|j|d{|jjj dd}|rj j|dntjj}|j |< jdj|d|d{j|k(r3j'jddji|d{|23d{}|jt j"j$k(s1t'j(d|j+zX7@77c7Z6 j j|d|S#j j|dwxYww)NclientIdr;rf)rfsid executingnodez&ws connection closed with exception %s)rWebSocketResponsepreparerel_urlqueryr=socketspopuuiduuid4hexsendget_queue_info client_id last_node_idtyper WSMsgTypeERRORr&r' exception)r-wsrmsgselfs rwebsocket_handlerz0PromptServer.__init__..websocket_handlersk&&(B**W% % %//''++J;C   d+jjl&& "DLL  ,iid6I6I6KTW*Y[^___>>S(T->->-J))K64;L;L1NPSTTT!#c#xx7#4#4#:#::(PSUS_S_Sa(ab' &`Uc   d+I   d+s})F6E,A6F6$'F E/ AF E1FE5E3E5(F'F,F6/F1F3E55F7F6F33F6/cKtjtjj j d}d|j d<d|j d<d|j d<|Sw)Nz index.htmlr2r1Pragma0Expires)r FileResponseosr3joinweb_rootr5)r-r8rs rget_rootz'PromptServer.__init__..get_roots_'' T]]L(QRH0:H  _ -)3H  X &*-H  Y 'OsA-A0z /embeddingsc~tjd}tjt t d|S)N embeddingscFtjj|dS)Nr)rr3splitext)as rz?PromptServer.__init__..get_embeddings..s8H8H8KA8Nr) folder_pathsget_filename_listr json_responselistmap)r-rs rget_embeddingsz-PromptServer.__init__..get_embeddingss1%77 EJ$$T#.NPZ*[%\] ]rz/modelsczttjj}t j |SN)rrfolder_names_and_pathskeysrr)r- model_typess rlist_model_typesz/PromptServer.__init__..list_model_typess,|BBGGIJK$$[1 1rz/models/{folder}cK|jjdd}|tjvrt j dStj |}t j|Sw)Nfolderre) match_infor=rrrr?rr)r-rfiless r get_modelsz)PromptServer.__init__..get_modelss\''++Hd;F\@@@||3// 226:E$$U+ +sA/A1z /extensionsc :Ktjtjjtjj dd}t tfd|}tjjD]u\tjtjjtjdd}|jt tfd|wtj|Sw)Nzextensions/**/*.jsT) recursivec~dtjj|jj ddzS)Nr\)rr3relpathrreplace)frs rrz?PromptServer.__init__..get_extensions..s,C"''//!T]]2S2[2[\`be2f,frz**/*.jscdtjjzdztjj |j ddzS)N /extensions/rr)rhriquoterr3rr)rdirnames rrz?PromptServer.__init__..get_extensions..sL^fllFXFXG66 "$''//!S"9"A"A$"L6Mr)globrr3rescaperrrnodesEXTENSION_WEB_DIRSitemsextendrr)r-r extensionsrrrs @@rget_extensionsz-PromptServer.__init__..get_extensionssIIbggll DMM*,@BMQSEc"fhmnoJ"55;;= c "'',,t{{3/?"KW[\!!$s,MNS(U#VW> $$Z0 0sDDc|d}|dk(rtj}||fS|dk(rtj}||fS|dk(rtj}|fS)Ninputtempoutput)rget_input_directoryget_temp_directoryget_output_directory)dir_typetype_dirs rget_dir_by_typez.PromptServer.__init__..get_dir_by_typesx"7"';;= X% % V#'::<X% %X%'<<>X% %rctj}tjj |r|}|}t |d5}|j |j|j |jj|jjdddd|j|jk(Sy#1swY+xYw)NrbrF) node_helpershasherrr3existsopenupdatereadfileseek hexdigest)filepathimagerrbrs rcompare_image_hashz1PromptServer.__init__..compare_image_hashs!((*Fww~~h'HH(D)QHHQVVX&HHUZZ__./JJOOA&*{{} 55 *)s A$CC%cL|jd}|jd}d}|jd}|\}}|r?|jr2|j}|stjdS|jdd}t j j|t j j|} t j jt j j| |} t j j|| f|k7rtjdSt j j| st j| t j j|} | |d k(s|d k(rnd } t j j| ra| |rd }nU| d d| d| d }t j j| |} | d z } t j j| ra|sK| |||| n>t| d5} | j|jj!dddtj"|||dStjdS#1swY8xYw)Nr overwriteFrre subfolderr;rI1rTrz ()wb)rrr)r=rfilenamerr?rr3rnormpathabspath commonpathrmakedirsrrwriterr)postimage_save_functionrrimage_is_duplicateimage_upload_type upload_dirrrfull_output_folderrsplitirrrs r image_uploadz+PromptServer.__init__..image_upload!sHHW%E-I!&  $ 0 ,;><N>Ny>Y%Z"77??277<<8JH+UV77%%z8&<=K<15.!&+AhZr!AeAhZ#@#%77<<0BH#MQ ''..2**6+E4B!(D1QGGEJJOO$562((8)]n)opp||3// 21s 9*JJ#z /upload/imagecPK|jd{}|S7 wrr)r-rrs r upload_imagez+PromptServer.__init__..upload_imageQs% 'D% %(s &$ &z /upload/maskcXK|jd{}d}||S7w)Nctj|jd}tj|d\}}|st j dS|ddk(sd|vrt j dS|'|jdd }tj|}|t j dS|jd d d k7r|tjj||d }tjjtjj||f|k7rt j d S|}tjj||}tjj|rtj|5} t!} t#| d r0| j$D]!} | j'| | j$| #| j)d} tj|j*j)d} | j-d} | j/| | j1|d| dddyy#1swYyxYw)N original_refrrrerr..rrrr;rdtextRGBAA)compress_levelpnginfo)jsonloadsr=rannotated_filepathrr?get_directory_by_typerr3rrrisfilerrrhasattrradd_textconvertr getchannelputalphasave)rrrrr output_dirrfull_output_dirr original_pilmetadatakeymask_pil new_alphas rrzGPromptServer.__init__..upload_mask..image_save_function[s#zz$((>*BC '3'F'F|T^G_'`$*<>$'D)\#*9"<7'3'8'8 ( 1 1#|7H7H7M N(9'3';';F'C #(::ejj#9#A#A&#I%-$7$7$< $--i8$))(1h)W*)())s B.upload_maskWs2 'D& XP &9: :U(s *(*z/viewc Kd|jjvr|jjd}tj|\}}|st j dS|ddk(sd|vrt j dS|;|jjj dd}tj|}|t j dSd |jjvrtjj||jjd }tjjtjj||f|k7rt j d S|}tjj|}tjj||}tjj|rd |jjvr9tj |5}|jjd j#d }|d}|d vs(d|jjj ddvrd}d} |dj%rt'|d} t)} |dvs)|jjj dddk(r|j+d}|j-| || | j/dt j | j1d|dd|dicdddSd|jjvrd} n|jjd} | dk(rtj |5}|j2dk(r/|j#\} } }}tj4d| | |f}n|j+d}t)} |j-| d | j/dt j | j1d!dd|dicdddS| dk(rtj |5}|j2dk(r|j#\}}}}n!tj6d"|j8d#}tj6d|j8}|j;|t)}|j-|d |j/dt j |j1d!dd|dicdddSt=j>|dxsd$}tjjA|d%jC}|d&vrd$}t jD|d|d|d'(St j d)S#1swYxYw#1swY,xYw#1swY8xYww)*Nrrrerrrrrrrdpreview;)webpjpegrchannelr;rZ)r rgbRGB)r(qualityzimage/Content-Dispositionz filename="")rAr@r5rgbarPNG)r(z image/pngLzapplication/octet-streamr>.htm.htmlr/r0)r'z Content-Type)r5r)#rrrr rr?r=r rr3rrrbasenamer rrrisdigitintrrrrrmodemergenewsizer mimetypes guess_typerrgr)r-rrrrrimg preview_info image_formatr&bufferr!r]grrnew_imgr^ alpha_img alpha_bufferr@file_extensions r view_imagez)PromptServer.__init__..view_imagesW__222"??00<&2&E&Eh&O#<>$' GOO$9$99"ZZ-+2??+@+@+K+Q+QRU+VL+7?L+3CCsgooNcNcNgNghqsuNvGv/5 &(G+B/779*-l2.>*?%,YF+x77??;P;P;T;TU^`b;cgl;l&)kk%&8HHVL'HR"KKN#&<"KKN#&<,$WCW !BW1V;6W>WW WWz/view_metadata/{folder_name}cK|jjdd}|tjdSd|jj vrtjdS|jj d}|j dstjdStj||}|tjdStjj|d}|tjdStj|}d|vrtjdStj|dSw) N folder_namerrerz .safetensorsi)max_size __metadata__)rr=rr?rrr4r get_full_pathcomfyutilssafetensors_headerr r r)r-rCrsafetensors_pathoutdts r view_metadataz,PromptServer.__init__..view_metadatas!,,00EK"||3//!6!66||3//,,Z8H$$^4||3//+99+xP '||3//++001AI0VC{||3//CB!R'||3//$$R%78 8sEEz /system_statsc Ktjj}tjj|}tjjj d}tjj |}tjj|}tjj |d\}}tjj|d\}} tj||ttjtjjtjjtjjtj dddk(tj"d||j$|j&|||| d gd } t)j*| Sw) NcpuT)torch_total_too)torch_free_toorrpython_embeded)r ram_totalram_freecomfyui_versionpython_versionpytorch_versionembedded_pythonargv)rrindex vram_total vram_freetorch_vram_totaltorch_vram_free)systemdevices)rGmodel_managementget_torch_deviceget_torch_device_nametorchdeviceget_total_memoryget_free_memoryrrr sysversion torch_versionr3r executablerYrrZrr) r-re device_name cpu_devicerSrTr[r]r\r^ system_statss rrnz+PromptServer.__init__..system_statssg++<<>F00FFvNK//55<>5RST5U'VWX'Y]m'mHH !, & !'&0%.,<+: L.$$\2 2sGGz/promptcRKtjjSwr)rrr)r-rs r get_promptz)PromptServer.__init__..get_prompt(s!$$T%8%8%:; ;s$'c tj|}i}|j|d<|jjDcic]\}}|t |j !c}}|d<|j |d<t|dr |jndgt|j z|d<t|dr |jn|d|d<||d <|tjj vrtj|n||d <t|d r |jnd |d <t|dd|d<d|d<t|dr|jdk(rd|d<nd|d<t|dr|j|d<t|dr|j |d<t|ddrd|d<t|ddrd|d<t|dr|j"|d<|Scc}}w)Nr input_orderrOUTPUT_IS_LISTFoutput_is_list RETURN_NAMES output_namer display_name DESCRIPTIONr; descriptionRELATIVE_PYTHON_MODULEr python_modulesdcategory OUTPUT_NODET output_nodeCATEGORYOUTPUT_TOOLTIPSoutput_tooltips DEPRECATED deprecated EXPERIMENTAL experimentalAPI_NODEapi_node)rNODE_CLASS_MAPPINGS INPUT_TYPESrrr RETURN_TYPESrrsroruNODE_DISPLAY_NAME_MAPPINGSrxgetattrr~rrr) node_class obj_classinforvalues r node_infoz(PromptServer.__init__..node_info,s#11*=ID%113DMOXOdOdOfOlOlOn"oOn|U3UZZ\(:#:On"oD &33DNAHTdAeY%=%=lqkruxzCzPzPvQlQD! ".get_object_infoMs**22A>!*1A3 ((-+* %> (hijhkkr&st i&:&:&<=> +*s?B1B% AB% B1A B"B%!B""B%%B.*B1z/object_info/{node_class}cK|jjdd}i}||tjvr |||<t j |Sw)Nr)rr=rrrr)r-rrKrs rget_object_info_nodez3PromptServer.__init__..get_object_info_nodeYsV ++// dCJC&Z5;T;T-T"+J"7J$$S) )sAAz/historycK|jjjdd}| t|}t j j j|Sw)N max_items)r)rrr=r1rr prompt_queue get_history)r-rrs rrz*PromptServer.__init__..get_historyasW--11+tDI$ N $$T%6%6%B%BY%B%WX XsA#A&z/history/{prompt_id}cK|jjdd}tjjj |Sw)N prompt_id)r)rr=rrrr)r-rrs rget_history_prompt_idz4PromptServer.__init__..get_history_prompt_idhsD**..{DAI$$T%6%6%B%BY%B%WX XsA Az/queuecKi}jj}|d|d<|d|d<tj|Sw)Nr queue_runningr queue_pending)rget_current_queue_volatilerr)r- queue_info current_queuers r get_queuez(PromptServer.__init__..get_queuemsOJ --HHJM*7*:J '*7*:J '$$Z0 0sAAcKtjd|jd{} j|}d|vrt |d}n- j }d|vr|dr| } xj dz c_d|vr|d}t j|}i}d|vr|d}d|vr|d|d<|dr`ttj}|d } jj|||||f|||d d }tj|Stjd j!|dtj|d|d d dSdddid} tj| id dS7Xw)Nz got promptnumberfrontrprompt extra_datarrrr)rr node_errorszinvalid prompt: {})rrrre no_promptzNo prompt provided)rr*details extra_info)r&rr trigger_on_promptfloatr executionvalidate_promptstrrrrputrrr'r() r- json_datarrvalidrroutputs_to_executer8rrs r post_promptz*PromptServer.__init__..post_promptus LL &&||~-I..y9I9$y23i' )"( q 9$"8,!11&9 9,!*.post_queue..sAaDL,@rre)r r wipe_queuedelete_queue_itemrr?)r-r to_delete delete_funcrrs @r post_queuez)PromptServer.__init__..post_queues&||~-I)#W%%%0029$%h/ $-L"@K%%77 D%.<.post_interrupts!  & & (<.post_frees{%lln,I%MM/5AM#-- u=K!!**?MJ!!**=+F<.post_historys}&||~-I)#W%%%2249$%h/ $-L%%99,G%.<B $o  - -   } -  " "   5d6M6MN O   <> ? 4 4t ;d BC???P[\v ""*  ) )$*@*@ A$$  1$--AB""$  "$ E    4 C    M " ^ # ^ I  2  2 & ' , ( , M " 1 # 1 & . 0` _ % & & & ^ $+ ; %+ ;Z G f , f ,P 2 3 9 4 9, O $ 3 % 3D I  <  < B N # . $ . / 0 * 1 * J  Y  Y * + Y , Y H  1  1 Y ( Z ( ZT X  ,  , \ " , # , W  ,  , Z  , ! ,rcnKtjd}tj||_yw)N)total)timeout)r ClientTimeout ClientSessionr)rrs rsetupzPromptServer.setups)''d3%33GDs35c|jj|j|jj|j|jj|j|j t jj|j jd|jjtj}|jD]a}t|tjs|j!|j"d|j$z|j&fi|j(c|j j||j j|jt j*jD]8\}}|j jtj,d|z|g:t/j0}|r0|j jtj,d|g|j jtj,d|j2gy)Nz /internalz/apirz /templatesr)r add_routesrrrrrLOADED_MODULE_DIRSr add_subapprget_apprrr>RouteDefrouterJr3r7kwargsrstaticr templates_pathr)r api_routesrrrworkflow_templates_paths rrzPromptServer.add_routess $$T[[1 **4;;7   ++DKK5C[C[CaCaCcd K)=)=)E)E)GH&&( [[E%.C   v /BCEMMbUZUaUab ! J' DKK(11779ID# HH  NT,A3!G H I:#2"@"@"B " HH   <)@A!   JJsDMM *  rcRi}i}|jj|d<||d<|S)Nqueue_remaining exec_info)rget_tasks_remaining)r prompt_infors rrzPromptServer.get_queue_infos6  '+'8'8'L'L'N #$#, K rNcK|tjk(r|j||d{yt|tt fr|j |||d{y|j|||d{y7S7#7 w)Nr)rr send_imager>bytes bytearray send_bytes send_jsonreventdatars rrzPromptServer.sendss $<< <//$C/0 0 0 ui0 1//%s3 3 3..c2 2 2 1 3 2s3*BB1BBB:B;BBBct|tstd|tjd|}t |}|j ||S)Nz)Binary event types must be integers, got >I)r>r1 RuntimeErrorstructpackr r)rrrpackedr*s r encode_byteszPromptServer.encode_bytessJ%%!J5'RS ST5)F#trcK|d}|d}|d}|Tttdrtjj}ntj}t j |||f|}d}|dk(rd}n|dk(rd}t}tjd|} |j| |j||dd |j} |jtj| | d{y7w) Nrrr ResamplingJPEGr*r_)r(r&rr )rrrBILINEAR ANTIALIASrcontainrrrrrgetvaluerrr) r image_datar image_typerrD resamplingtype_numbytesIOheader preview_bytess rr zPromptServer.send_image s] 1 a=  ul+"--66 "__ $$UXx,@*ME  H 5 H)T8, f 7:r! L((* oo.<AAAAcLK|j||fg|d{y7w)N) call_on_start)start_multi_address)raddressrnverboser6s rstartzPromptServer.startAs&&&$'8 &VVVs $"$cBKtj|jd}|jd{d}d}tj rttj rdtjtjtj}|jtj tj d}|rtjd|D]}|d}|d} tj||| | } | jd{t!|d s||_| |_d |vrd j'|} n|} |sstjd j'|| | ||||j"|j$yy7c7w)N) access_loghttp)protocol verify_mode)certfilekeyfilehttpszStarting server rr) ssl_contextr8:z[{}]z To see the GUI go to: {}://{}:{})r AppRunnerrrr tls_keyfile tls_certfilessl SSLContextPROTOCOL_TLS_SERVER CERT_NONEload_cert_chainr&rTCPSiter:rr8rnr() r addressesr6r9runnerssl_ctxschemeaddrr8rnsite address_prints rr7z PromptServer.start_multi_addressDsWtxxD9lln    1 1..#2I2IWZWdWde''1B1B(,(8(8(:   LL, -D1gG7D;;vw'JD**,  4+&   g~ & g 6 '  ?FFv}^bcd!$  $ &$,, : %;  s)5FFCFF8FA FFc:|jj|yr)rr)rr7s radd_on_prompt_handlerz"PromptServer.add_on_prompt_handlerfs &&w/rc|jD] } ||} |S#t$r?tjdtjt j YWwxYw)NzA[ERROR] An error occurred during the on_prompt_handler processing)rrr&r'rr)rrr7s rrzPromptServer.trigger_on_promptis\..G 8#I. /  8 cd 4 4 67 8sAA%$A%rnode_idct|tr|jd}t|jd}tjdt ||z|z}|j tj||y)Nzutf-8r) r>rencoderrror0rr)rrrXr node_id_bytesr*s rsend_progress_textzPromptServer.send_progress_textssh dC ;;w'DG ++G4 ++dC $67-G$N ',,gs;rr)TN)NT)rrrrrrrrrr rrr0r2r4r:r7rVrrr r rr\rrrrxrxsr,hE  D3V0UT:F" W ;D0EI <%C/0 <;> ris   &'3(.5"E  6    3"4""Hg <g