)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/dZ0ej1dej2fdZ3ej1dej2fdZ4de5fdZ6dZ7dZ8GddZ9dS)N)ImageImageOps)PngInfo)BytesIO)web)args) __version__)FrontendManager) UserManager)ModelFileManager)CustomNodeManager)OptionalUnion)InternalRoutesceZdZdZdZdZdS)BinaryEventTypesN)__name__ __module__ __qualname__ PREVIEW_IMAGEUNENCODED_PREVIEW_IMAGETEXT-D:\ComfyUI_windows_portable\ComfyUI\server.pyrr'sM DDDrrcK ||d{VdS#tjtjttt f$r2}t jd|Yd}~dSd}~wwxYw)Nzsend error: {}) aiohttp ClientErrorClientPayloadErrorConnectionResetErrorBrokenPipeErrorConnectionErrorloggingwarningformat)functionmessageerrs rsend_socket_catch_exceptionr,,s6hw  !;=QSbds t666(//445555555556s-A6'A11A6requestcK||d{V}|jds4|jds|jdr|jdd|S)N.js.cssz index.json Cache-Controlno-cache)pathendswithheaders setdefault)r-handlerresponses r cache_controlr92s#*77#3#3333333H|U##Aw|'<'.cors_middlewareHs >Y & &|~~HH$WW--------H:H67;\78;X78?E;<rr middlewareRequest)rErKs` rcreate_cors_middlewarerOGs>^ s{     ^  rcd|dS tj|jrdSdS#YnxYwd}tjtjfD]k} tj|d|tj}|D]/\}}}}}tj|djs|ccSd}0W#tj$rYhwxYw|S)NFTr) ipaddress ip_address is_loopbacksocketAF_INETAF_INET6 getaddrinfo SOCK_STREAMgaierror)hostloopbackfamilyr_sockaddrs rrSrSXs |u   % % 1 45  H>6?3   "4vv7IJJA-. $ $)1a +HQK88D$#OOOOO#HH  $     D  Os!#'A BBB-,B-cJtjdtjfd}|S)Nr-cKd|jvr1d|jvr'|jd}|jd}|}tj|}|j}tjd|z}t|j}|j |j}|j |j}|rm|k|it|dkrVt|dkrC||kr=tj d ||tjdS|jdkrtj} n||d{V} | S) 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_middlewaress W_ $ $W_)D)D?6*D_X.F**,,K\**622F"M//11M!'!6!6tk7I!J!J ##5#>??H{"09 !&. &  4K3 8QVYZeVfVfijVjVjortApBpBEFpFpF-//O$p$w$wyDFS%T%TUUUY & &|~~HH$WW--------HrrL)rus rcreate_origin_only_middlewarervrs4^ck^@ "!rceZdZdZdZdZdZddZdZddZ dd Z dd Z dd Z d Z d ZddZddZdZdZ ddeeeefdefdZdS) PromptServerc t_tjtjddtjddt _t_t_ t_ dg_ tj_|_t%j_d_d_t.g}t0jr|t6t0jr-|t;t0jn!|t=t?t0j dzdz}tCj"||_#tI_%t0j&tOj(t0j)n t0j&_*tWj,d j*tCj-}|_.d_/d_0g_1|2d fd }|2d fd }|2dd}|2dd}|2dd} |2dfd} ddd7fd |3dfd} |3dfd} |2dd} |2dd }|2d!d"}|2d#fd$}d%|2d&fd'}|2d(fd)}|2d*fd+}|2d,fd-}|2d.fd/}|3d#fd0}|3d.fd1}|3d2d3}|3d4fd5}|3d*fd6}dS)8Nz%application/javascript; charset=utf-8r/z image/webpz.webpcustom_nodes_from_webri)client_max_size middlewaresz[Prompt Server] web root: z/wscKtj}||d{V|jjdd}|rj|dntj j }|j|<  d |d|d{Vj |kr+j$ ddji|d{V|23d{V}|jt jjkr)t'jd|zK6 j|dn #j|dwxYw|S)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_handlers&((B**W%% % % % % % % %/'++J;;C '   d++++jll& "DL  ,iid6I6I6K6KTW*Y*Y[^_________>S((T->-J))K64;L1NPSTTTTTTTTT!#ccccccc#x7#4#:::(PSUS_S_SaSa(abbb"$   d++++   d++++IsA*E&=EAE&&F/cKtjtjjd}d|jd<d|jd<d|jd<|S)Nz index.htmlr2r1Pragma0Expires)r FileResponseosr3joinweb_rootr5)r-r8rs rget_rootz'PromptServer.__init__..get_rootsU' T]L(Q(QRRH0:H _ -)3H X &*-H Y 'Orz /embeddingsctjd}tjt t d|S)N embeddingscLtj|dS)Nr)rr3splitext)as rz?PromptServer.__init__..get_embeddings..s8H8H8K8KA8Nr) folder_pathsget_filename_listr json_responselistmap)r-rs rget_embeddingsz-PromptServer.__init__..get_embeddingss:%7 EEJ$T#.N.NPZ*[*[%\%\]] ]rz/modelscttj}t j|SN)rrfolder_names_and_pathskeysrr)r- model_typess rlist_model_typesz/PromptServer.__init__..list_model_typess/|BGGIIJJK$[11 1rz/models/{folder}cK|jdd}|tjvrt jdStj|}t j|S)Nfolderre) match_infor=rrrr?rr)r-rfiless r get_modelsz)PromptServer.__init__..get_modelss`'++Hd;;F\@@@|3//// 26::E$U++ +rz /extensionsc FKtjtjtjjdd}t tfd|}tj D]\tjtjtjdd}| t tfd|tj |S)Nzextensions/**/*.jsT) recursivec|dtj|jddzS)Nr\)rr3relpathrreplace)frs rrz?PromptServer.__init__..get_extensions..s0C"'//!T]2S2S2[2[\`be2f2f,frz**/*.jscdtjzdztj|ddzS)N /extensions/rr)rhriquoterr3rr)rdirnames rrz?PromptServer.__init__..get_extensions..sV^flFXFXGG66 "$'//!S"9"9"A"A$"L"L6Mr)globrr3rescaperrrnodesEXTENSION_WEB_DIRSitemsextendrr)r-r extensionsrrrs @@rget_extensionsz-PromptServer.__init__..get_extensionss3Ibgll DM**,@BBMQSSSEc"f"f"f"fhmnnooJ"5;;== W W c "',,t{3/?/?"K"KW[\\\!!$s,M,M,M,M,MNS(U(U#V#VWWWW$Z00 0rc|d}|dkrtj}n3|dkrtj}n|dkrtj}||fS)Ninputtempoutput)rget_input_directoryget_temp_directoryget_output_directory)dir_typetype_dirs rget_dir_by_typez.PromptServer.__init__..get_dir_by_typesg"7""';==V##':<<X%%'<>>X% %rctj}tj|r|}|}t |d5}||||j|j ddddn #1swxYwY| | kSdS)NrbrF) node_helpershasherrr3existsopenupdatereadfileseek hexdigest)filepathimagerrbrs rcompare_image_hashz1PromptServer.__init__..compare_image_hashs!(**Fw~~h'' 6FHHFHH(D))'QHHQVVXX&&&HHUZ__..///JOOA&&&'''''''''''''''{{}} 555sA.CCCc|d}|d}d}|d}|\}}|rY|jrQ|j}|stjdS|dd}t j|t j|} t j t j| |} t j || f|krtjdSt j | st j | t j |} | |d ks|d krnd } t j | ri| |rd }nZ| d d| d| d }t j| |} | d z } t j | i|sd||||| nTt| d5} | |jdddn #1swxYwYtj|||dStjdS)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 0 ,;O4N>Ny>Y>Y%Z%Z"7??27<<8JH+U+UVV7%%z8&<==KK>"15.!&+Ah#@#@!#@#@eAh#@#@#%7<<0BH#M#MQ '..22*7*6++E4BBBB!(D117QGGEJOO$5$5666777777777777777(8)]n)o)oppp|3////s-J  JJz /upload/imagecRK|d{V}|Srr)r-rrs r upload_imagez+PromptServer.__init__..upload_imageQs6 ''''''D<%% %rz /upload/maskcZK|d{V}d}||S)Nc2tj|d}tj|d\}}|st jdS|ddksd|vrt jdS|*|dd }tj|}|t jdS|d d d krtj ||d }tj tj ||f|krt jd S|}tj ||}tj |rtj|5} t!} t#| d r+| jD]#} | | | j| $| d} tj|jd} | d} | | | |d| ddddS#1swxYwYdSdS)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#z$((>*B*BCC '3'F|T^G_'`'`$*4>$'' XD)) X\#*99"<77O'3'8OO ( 1 1#|7H7M N N N N'3';';F'C'C #(:ej#9#9#A#A&#I#I%-$7$7$<$< $--i888$))(1h)WWW X X X X X X X X X X X X X X X X X X X Xs0C J  JJr)r-rrrs r upload_maskz*PromptServer.__init__..upload_maskWsN ''''''D& X& X& XP <&9:: :rz/viewc Kd|jjvr|jjd}tj|\}}|st jdS|ddksd|vrt jdS|4|jjdd}tj|}|t jdSd |jjvrtj ||jjd }tj tj ||f|krt jd S|}tj |}tj ||}tj |rd |jjvr\tj|5}|jjd d }|d}|d vs"d|jjddvrd}d} |drt'|d} t)} |dvs$|jjdddkr|d}|| || | dt j| d|dd|dicdddS#1swxYwYd|jjvrd} n|jjd} | dkrtj|5}|jdkr2|\} } }}tjd| | |f}n|d}t)} || d | dt j| d!dd|dicdddS#1swxYwYn| dkrtj|5}|jdkr|\}}}}ntjd"|jd#}tjd|j}||t)}||d |dt j|d!dd|dicdddS#1swxYwYnvt=j|dpd$}tj |d%!}|d&vrd$}t j"|d|d|d'(St jd)S)*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"?0<&2&Eh&O&O#4>$''H GO$999"Z--m+2?+@+K+Q+QRU+V+VL+7?L+3CCCsgoNcNgNghqsuNvNvGvGv/5 &(G+B/7799@*-l2.>*?*?%,YYF+x777?;P;T;TU^`b;c;cgl;l;l&)kk%&8&8HHVL'HRRR"KKNNN#&>>"KKNNN#&T;z/view_metadata/{folder_name}c~K|jdd}|tjdSd|jjvrtjdS|jjd}|dstjdStj||}|tjdStj |d}|tjdStj |}d|vrtjdStj|dS) 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_metadatas2!,00EEK"|3////!666|3////,Z8H$$^44 0|3////+9+xPP '|3////+001AI0VVC{|3////CB!R''|3////$R%788 8rz /system_statsc JKtj}tj|}tjjd}tj|}tj|}tj|d\}}tj|d\}} tj ||ttj tjj tjtjtjdddktjd||j|j|||| d gd } t)j| S) 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_statssc+<<>>F0FFvNNK/5<5R5RST5U'V'VWX'Y]m'mH  !, & !'&0%.,<+: L.$\22 2rz/promptcTKtjSr)rrr)r-rs r get_promptz)PromptServer.__init__..get_prompt(s$$T%8%8%:%:;; ;rctj|}i}||d<d|D|d<|j|d<t |dr|jndgt|jz|d<t |dr|jn|d|d <||d <|tj vrtj |n||d <t |d r|j nd |d<t|dd|d<d|d<t |dr|j dkrd|d<nd|d<t |dr |j|d<t |dr |j|d<t|ddrd|d<t|ddrd|d<t |dr |j|d<|S) NrcXi|]'\}}|t|(Sr)rr).0rvalues r z.node_info..0s."o"o"o|U3UZZ\\(:(:"o"o"or 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_TYPESr RETURN_TYPESrrwroryNODE_DISPLAY_NAME_MAPPINGSrr|getattrrrrr) node_class obj_classinfos r node_infoz(PromptServer.__init__..node_info,sS1*=ID%1133DM"o"oyOdOdOfOfOlOlOnOn"o"o"oD &3DNAHTdAeAe&QY%=%=lqkruxzCzPvQvQlQD! ".get_object_infoMs * . .2>>A>!*1A$>>> &sij&s&s&sttt i&:&<&<=====>(-- . . . . . . . . . . . . . . . . . .s2B1BAA;8B:A;;BB"%B"z/object_info/{node_class}cK|jdd}i}||tjvr|||<t j|S)Nr)rr=rrrr)r-rrKrs rget_object_info_nodez3PromptServer.__init__..get_object_info_nodeYs[ +// dCCJC&Z5;T-T-T"+)J"7"7J$S)) )rz/historycK|jjdd}|t|}t jj|S)N max_items)r)rrr=r1rr prompt_queue get_history)r-rrs rrz*PromptServer.__init__..get_historyasW-11+tDDI$ NN $T%6%B%BY%B%W%WXX Xrz/history/{prompt_id}cK|jdd}tjj|S)N prompt_id)r)rr=rrrr)r-rrs rget_history_prompt_idz4PromptServer.__init__..get_history_prompt_idhsD*..{DAAI$T%6%B%BY%B%W%WXX Xrz/queuecKi}j}|d|d<|d|d<tj|S)Nr queue_runningr queue_pending)rget_current_queue_volatilerr)r- queue_info current_queuers r get_queuez(PromptServer.__init__..get_queuemsOJ -HHJJM*7*:J '*7*:J '$Z00 0rcJKtjd|d{V} |}d|vrt |d}n& j}d|vr |dr| } xjdz c_d|vr|d}t j|}i}d|vr|d}d|vr |d|d<|drgttj }|d } j |||||f|||d d }tj|Stjd |dtj|d|d d dSdddid} tj| id dS)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 L & & &&||~~------I..y99I9$$y233i'' ))"( q 9$$"8,!1&99 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%3%002229$$%h/ $-EEL"@"@"@"@K%77 DDDD.post_interrupts(  & ( ( (.post_frees%llnn,,,,,,I%MM/5AAM#-- u==K K!**?MJJJ G!**=+FFF.post_historys&||~~------I)##W%5%224449$$%h/ $-HHL%99,GGGGB $o  - .   } - - -  " @   5d6MNN O O O O   <>> ? ? ? 4t ;d BCC??P[\\\vv "*  )$*@ A A A$  A$-AABBB"$$  "$ E         4 C       M " " ^ ^ # " ^ I   2 2   2 & ' ' , , ( ' , M " " 1 1 1 1 # " 1 & & &   . 0. 0. 0. 0. 0. 0. 0` _ % % & & & & & % & ^ $ $+ ;+ ;+ ;+ ; % $+ ;Z G  f ,f ,  f ,P 2 3 3 9 9 4 3 9, O $ $ 3 3 % $ 3D I   < < < <   <   B N # # . . . . $ # . / 0 0 * * * * 1 0 * J   Y Y Y Y  Y * + + Y Y Y Y , + Y H   1 1 1 1   1 Y  ( Z( Z( Z( Z ( ZT X   , , , ,   , \ " " , , # " , W   , , , ,   , Z  , , , , !  , , ,rchKtjd}tj||_dS)N)total)timeout)r ClientTimeout ClientSessionr)rrs rsetupzPromptServer.setups5'd333%3GDDDrcH|j|j|j|j|j|j|jt j|j d|j tj }|jD]P}t|tjr4||jd|jz|jfi|jQ|j||j|jt jD]6\}}|jtjd|z|g7t/j}|r.|jtjd|g|jtjd|jgdS)Nz /internalz/apirz /templatesr)r add_routesrrrrrLOADED_MODULE_DIRSr add_subapprget_apprrr>RouteDefrouterJr3r7kwargsrstaticr templates_pathr)r api_routesrrrworkflow_templates_paths rrzPromptServer.add_routess $$T[111 **4;777  ++DK5C[CaCaCcCcddd K)=)E)E)G)GHHH&(( [ c cE%.. cC   v /BCCEMbbUZUabbb J''' DK(((17799 J JID# H  NT,A3!G!G H I I I I"1"@"B"B "  H   <)@AA!     JsDM * *      rcPi}i}|j|d<||d<|S)Nqueue_remaining exec_info)rget_tasks_remaining)r prompt_infor s rrzPromptServer.get_queue_infos6  '+'8'L'L'N'N #$#, K rNcK|tjkr|||d{VdSt|tt fr||||d{VdS||||d{VdS)Nr)rr send_imager>bytes bytearray send_bytes send_jsonreventdatars rrzPromptServer.sends $< < <//$C/00 0 0 0 0 0 0 0 0 0 ui0 1 1 3//%s33 3 3 3 3 3 3 3 3 3..c22 2 2 2 2 2 2 2 2 2rct|tstd|tjd|}t |}|||S)Nz)Binary event types must be integers, got >I)r>r1 RuntimeErrorstructpackrr)rrrpackedr*s r encode_byteszPromptServer.encode_bytessa%%% TR5RRSS ST5))F##trcK|d}|d}|d}|Kttdrtjj}n tj}t j|||f|}d}|dkrd}n|dkrd}t}tj d|} | | | ||dd | } | tj| | d{VdS) Nrrr ResamplingJPEGr*r_)r(r&rr )rrrBILINEAR ANTIALIASrcontainrrrrrgetvaluerrr) r image_datar image_typerrD resamplingtype_numbytesIOheader preview_bytess rrzPromptServer.send_image s] 1 a=  ul++ -"-6 "_ $UXx,@*MME   HH 5 H))T8,, f 7:r! LLL((** oo.&&$'8 &VVVVVVVVVVVrcKtj|jd}|d{Vd}d}tjrctjrWtjtj tj }| tjtjd}|rtj d|D]}|d}|d} tj||| | } | d{Vt!|d s||_| |_d |vrd |} n|} |r)tj d || | ||||j|jdSdS)N) access_loghttp)protocol verify_mode)certfilekeyfilehttpszStarting server rr) ssl_contextr;:z[{}]z To see the GUI go to: {}://{}:{})r AppRunnerrrr tls_keyfile tls_certfilessl SSLContextPROTOCOL_TLS_SERVER CERT_NONEload_cert_chainr&rTCPSiter=rr;rnr() r addressesr9r<runnerssl_ctxschemeaddrr;rnsite address_prints rr:z PromptServer.start_multi_addressDstxD999llnn   ! 1 !.#2IWZWdeee''1B(,(8(:::   . L, - - - e eD1gG7D;vw'JJJD**,,       4++ !&   g~~ & g 6 6 '  e ?FFv}^bccddd  $ M&$, : : : : : % $rc:|j|dSr)rr)rr7s radd_on_prompt_handlerz"PromptServer.add_on_prompt_handlerfs &&w/////rc|jD]W} ||}#t$r<tjdtjt jYTwxYw|S)NzA[ERROR] An error occurred during the on_prompt_handler processing)rrr&r'rr)rrr7s rrzPromptServer.trigger_on_promptis}. 8 8G 8#GI..  8 8 8 cddd 4 6 677777 8s AAArnode_idc0t|tr|d}t|d}tjdt ||z|z}|tj||dS)Nzutf-8r) r>rencoderrror3rr)rrr[r node_id_bytesr*s rsend_progress_textzPromptServer.send_progress_textss dC  (;;w''DG ++G44 +dC $6$677-G$N ',gs;;;;;rr)TN)NT)rrrrrrrrrrrrr3r5r7r=r:rYrrrrrr_rrrrxrxsr,r,r,hEEE    D3333VVVV0UUUUTTTT::::FFF""" WWWW ; ; ; ;D000EI < <%C/0 <;> < < < < < rls   &&&&&&''''''333333((((((......555555""""""""EEEEEE        666      3"4""""""Hg <g <g <g <g <g <g <g <g <g