o
    i                  -   @   s  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mZ d dlmZmZmZ d dlmZm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mZ d dl m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z- ededZ.G dd dZ/e
G dd dZ0e
G dd dZ1h dZ2g dZ3g dZ4g dZ5dddddddd d!d"dd#dd$d%dd&d'e6ej7 d(e/d)e6e. d*ee.eB ge8dB f dB d+edB d,e9e:ef e;e<e:ef  B dB d-e:d.e8d/edB d0e=d1e8d2e8d3e:d4e=dB d5e:dB d6e8dB d7e>d8e=d9ee=ege>f dB d:e.f(d;d<Z?ddddddd=d>d?d@d dAdddBdCd'e6ej7 dDe/d)e6e. dEee.eB ge:e=B dB f dFee.eB ge=dB f dB d*ee.eB ge8dB f dB dGe;e:e=B  dB dHe;e:e=B  dB dIe;e:e=B  dB d+edB dJe8dKe=dLe8dMe=dNe8dOe8d4e=dB dPe/dB dQe8d:e.f(dRdSZ@dddddddd d!d"ddTd#dd$d%dddUd'e6ej7 d(e/d*ee9e:ef ge8dB f dB d+e9e:ef eB dB d,e9e:ef e;e<e:ef  B dB d-e:d.e8d/edB d0e=d1e8d2e8d3e:d4e=dB dVe>d5e:dB d6e8dB d7e>d8e=d9ee=ege>f dB dWee9e:e:f gdf dB d:e9e:ef eAB f*dXdYZBddddddd=d>d?d@d dAdddBdCd'e6ej7 dDe/dEee9e:ef ge:e=B dB f dFee9e:ef ge=dB f dB d*ee9e:ef ge8dB f dB dGe;e:e=B  dB dHe;e:e=B  dB dIe;e:e=B  dB d+e9e:ef eB dB dJe8dKe=dLe8dMe=dNe8dOe8d4e=dB dPe/dB dQe8d:e9e:ef f&dZd[ZCddd\d]e6ej7 d^e:dB d_e:e=B dB d`e8dB d:df
dadbZD	dddddcd]e6ej7 d_e:e=B dB dde=dee=dB d`e8dB dfe>dB dge=dB d:dfdhdiZEd:e9e:e>f fdjdkZFdle<d:e<e:ee:f fdmdnZGdoe9e:ef dpe:d+e9e:ef dB d:e9e:ef fdqdrZHd_e=dsed:e:fdtduZIdpe:dve:dwe=d:e:fdxdyZJd-e:dpe:d+e9e:ef dB d,e9e:ef e;e<e:ef  B dB d:e9e:ef e:B dB f
dzd{ZKd|e0d}e>fd~dZLd)e6e. ded:e.fddZMd)e6e. dee.gef dB d:ee9e:ef gef dB fddZNdee:e=B  dB d:eOe:e=B  fddZPde:e=B dB d:e:e=B dB fddZQdS )    N)CallableIterable)	dataclass)Enum)BytesIO)AnyLiteralTypeVar)urljoinurlparse)ClientErrorContentTypeError)	BaseModel)utils)IO)PromptServer   )request_logger)default_base_urlget_auth_headerget_node_idis_processing_interruptedsleep_with_interrupt)ApiServerErrorLocalNetworkErrorProcessingInterruptedM)boundc                   @   sN   e Zd Z	dddddeded deeef dB deeef dB fd	d
ZdS )ApiEndpointGETN)query_paramsheaderspathmethod)r   POSTPUTDELETEPATCHr    r!   c                C   s$   || _ || _|p	i | _|pi | _d S N)r"   r#   r    r!   )selfr"   r#   r    r!    r*   9/mnt/c/Users/fbmor/ComfyUI/comfy_api_nodes/util/client.py__init__$   s   
zApiEndpoint.__init__)r   )__name__
__module____qualname__strr   dictr   r,   r*   r*   r*   r+   r   #   s    r   c                   @   sD  e Zd ZU eej ed< eed< eed< e	ed< e
e	ef dB ed< e
e	ef eee	ef  B dB ed< edB ed< eed	< eed
< eed< eed< dZe	ed< dZeed< dZedB ed< dZe	dB ed< dZedB ed< dZee
e	ef gedB f dB ed< dZeeegef dB ed< dZee
e	e	f gdf dB ed< dS )_RequestConfignode_clsendpointtimeoutcontent_typeNdatafilesmultipart_parsermax_retriesmax_retries_on_rate_limitretry_delayretry_backoffWaiting
wait_labelTmonitor_progressestimated_total	Completedfinal_label_on_successprogress_origin_tsprice_extractoris_rate_limitedresponse_header_validator)r-   r.   r/   typer   	ComfyNode__annotations__r   floatr0   r1   r   listtupler   intr?   r@   boolrA   rC   rD   rE   rF   rG   r*   r*   r*   r+   r2   2   s(   
 $&&r2   c                   @   sj   e Zd ZU eed< dZeed< dZeed< dZ	edB ed< dZ
edB ed< d	Zeed
< dZedB ed< dS )_PollUIStatestartedQueuedstatus_labelT	is_queuedNpriceestimated_duration        base_processing_elapsedactive_since)r-   r.   r/   rK   rJ   rS   r0   rT   rO   rU   rV   rN   rX   rY   r*   r*   r*   r+   rP   I   s   
 rP   >             )	succeededsucceedsuccess	completedfinisheddonecomplete)	cancelledcanceled	cancelingfailfailederror)createdqueuedqueueing	submittedinitializingwaitapplication/jsong      @         ?g       @zWaiting for serverrB   T   )rE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   rC   rD   r@   r;   rF   clsr4   response_modelrE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   rC   rD   r@   r;   rF   returnc                   s   t | |fi dt||d|d|d|d|d|d|	d|
d	|d
|d|ddd|d|d|d|d|I d H }t|tsJtdt||S )NrE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   	as_binaryFrC   rD   r@   r;   rF   XExpected JSON response to validate into a Pydantic model, got non-JSON (binary or text).)sync_op_raw_wrap_model_extractor
isinstancer1   	Exception_validate_or_raise)rv   r4   rw   rE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   rC   rD   r@   r;   rF   rawr*   r*   r+   sync_opZ   sT   
	



r         @   g      ^@
   gffffff?g      $@)progress_extractorrE   completed_statusesfailed_statusesqueued_statusesr7   poll_intervalmax_poll_attemptstimeout_per_pollmax_retries_per_pollretry_delay_per_pollretry_backoff_per_pollrV   cancel_endpointcancel_timeoutpoll_endpointstatus_extractorr   r   r   r   r   r   r   r   r   r   r   r   c                   s   t | fi d|dt||dt||dt||d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|I d H }t|tsOtdt||S )Nr   r   r   rE   r   r   r   r7   r   r   r   r   r   r   rV   r   r   rz   )poll_op_rawr|   r}   r1   r~   r   )rv   r   rw   r   r   rE   r   r   r   r7   r   r   r   r   r   r   rV   r   r   r   r*   r*   r+   poll_op   sR   


	



r   F)rE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   ry   rC   rD   r@   r;   rF   rG   ry   rG   c                   s   t |tr!|jdd}t| D ]\}}t |tr |j||< qtdi d| d|d|d|d|d|d	|d
|d|	d|
d|d|d|d|d|d|d|d|d|}t||dI dH S )a  
    Make a single network request.
      - If as_binary=False (default): returns JSON dict (or {'_raw': '<text>'} if non-JSON).
      - If as_binary=True: returns bytes.
      - response_header_validator: optional callback receiving response headers dict
    T)exclude_noner3   r4   r5   r6   r7   r8   r9   r:   r<   r=   r?   r@   rA   rC   rD   rE   r;   rF   rG   )expect_binaryNr*   )	r}   r   
model_dumprL   itemsr   valuer2   _request_base)rv   r4   rE   r7   r8   r6   r5   r9   r:   r<   r=   r?   rV   ry   rC   rD   r@   r;   rF   rG   kvcfgr*   r*   r+   r{      s^   


	
r{   c          #         s  t |du rtn|}t |du rtn|}t |du rtn|}t }d}|r,tdnd}d}t||dt	
  fdd}t	| }zz||
k rzt ||||||dddddd	I dH }t|tsntd
W n/ ty   |rtt t ||ddddddd	I dH  W d    1 sw   Y   w zt||}W n ty } ztd| d}W Y d}~nd}~ww |r||}|dur|_|r||}|dur||kr|j|dd |}t } ||v }!|!rjdur j| j 7  _d_n	jdu r| _|!_|p|!rdnd_||v rjdur4 j| j 7  _d_  tt |I dH  W d   n	1 sNw   Y  |rb|dkrb|jddd t |ri|ndt| | |jdtjd |W W   tt |I dH  W d   S 1 sw   Y  S ||v rdt | }"t|" t|"zt!|	 dddI dH  W n2 ty   |rtt t ||ddddddd	I dH  W d    1 sw   Y   w |!s|d7 }||
k sQtd|
 dt|
|	  d ty     t"t#fy     ty3 } ztd| |d}~ww   tt |I dH  W d   w 1 sNw   Y  w )aH  
    Polls an endpoint until the task reaches a terminal state. Displays time while queued/processing,
    checks interruption every second, and calls Cancel endpoint (if provided) on interruption.

    Uses default complete, failed and queued states assumption.

    Returns the final JSON response from the poll endpoint.
    Nr   d   )rQ   rV   c               
      s   zE  sDt rW dS t } jjdur| j nd }t jt| j	 j
jjt|d tdI dH    rW dS W dS  ty_ } ztd| W Y d}~dS d}~ww )z;Emit a UI update every second while polling is in progress.NrW   statuselapsed_secondsrA   rU   rT   processing_elapsed_secondsrt   zPolling ticker exited: %s)is_setr   time	monotonicrX   rY   _display_time_progressrS   rN   rQ   rV   rU   rT   asynciosleepr~   loggingdebug)nowproc_elapsedexcrv   statestop_tickerr*   r+   _ticker  s0   	zpoll_op_raw.<locals>._tickerCheckingF)
r7   r5   r:   r<   r=   r?   rV   ry   rC   r@   z,Polling endpoint returned non-JSON response.zCancelling task)r5   r:   r?   rV   ry   rC   r@   zStatus extraction failed: %stotalrR   
ProcessingrB   r   zTask failed: r   zPolling timed out after z non-queued attempts (~zs of active polling).zPolling aborted due to error: )$_normalize_statusesCOMPLETED_STATUSESFAILED_STATUSESQUEUED_STATUSESr   r   r   ProgressBarrP   r   Eventcreate_taskr{   r}   r1   r~   r   
contextlibsuppress_normalize_status_valuer   rk   rU   update_absoluterY   rX   rT   rS   setr   rN   jsondumpsr   r   r   )#rv   r   r   r   rE   r   r   r   r7   r   r   r   r   r   r   rV   r   r   completed_statesfailed_statesqueued_statesrQ   consumed_attemptsprogress_barlast_progressr   ticker_task	resp_jsonr   e	new_pricenew_progressnow_tsrT   msgr*   r   r+   r      s&  




	& 


o
 r   r   rU   r3   textr   rU   c                C   s   g }|r| dt|tr| n|  |d ur4t|d ddd}|dkr4| d| d |d ur=| | |rMtjd	|t
|  d S d S )	NzStatus:    z,.1f0.zPrice: z credits
)appendr}   r0   
capitalizerK   rstripr   instancesend_progress_textjoinr   )r3   r   r   rU   display_linespr*   r*   r+   _display_text  s   "
r   )rU   rT   r   r   rA   rT   r   c          
      C   sz   |d ur+|dkr+|du r+|d ur|n|}t dt|t| }dt| d| d}	ndt| d}	t| |	||d d S )Nr   FzTime elapsed: zs (~zs remaining)sr   )maxrN   r   )
r3   r   r   rA   rU   rT   r   pe	remaining	time_liner*   r*   r+   r     s   
r   c                     s  ddd} t jdd}t j|d4 I dH }ttt. |d4 I dH }|jdk | d	< W d  I dH  n1 I dH s?w   Y  W d   n1 sNw   Y  | d	 sc| W  d  I dH  S t	t
 }|j d
|j d}ttt. ||4 I dH }|jdk | d< W d  I dH  n1 I dH sw   Y  W d   n1 sw   Y  W d  I dH  | S 1 I dH sw   Y  | S )zLBest-effort connectivity diagnostics to distinguish local vs. server issues.F)internet_accessibleapi_accessibler   r   r5   Nzhttps://www.google.comr^   r   z://z/healthr   )aiohttpClientTimeoutClientSessionr   r   r   OSErrorgetr   r   r   schemenetloc)resultsr5   sessionrespparsed
health_urlr*   r*   r+   _diagnose_connectivity  s6   (
(r   tc                 C   sH   t | dkr| d | d dfS t | dkr | d | d | d fS td)z*Normalize (filename, value, content_type).   r   r   application/octet-streamrs   z4files tuple must be (filename, file[, content_type]))len
ValueError)r   r*   r*   r+   _unpack_tuple  s
   r   endpoint_paramsr#   c                 C   sB   t | pi }| dkr|r| D ]\}}|d ur|||< q|S )Nr   )r1   upperr   )r   r#   r7   paramsr   r   r*   r*   r+   _merge_params  s   r   bodyc                 C   s   | dkrdS | dkrdS | dkrdS | dkrdS zOt |trQ|d	}t |trH|d
}|d}|r@|r@d| d| dW S |rHd| W S dt| W S t|}t|dkrad| W S d|  dW S  tyv   d|  d Y S w )Ni  z2Unauthorized: Please login first to use this node.i  zFPayment Required: Please add credits to your account to use this node.i  zGThere is a problem with your account. Please contact support@comfy.org.  zaRate Limit Exceeded: The server returned 429 after all retry attempts. Please wait and try again.rk   messagerH   zAPI Error: z (Type: )   zAPI Error (raw): zAPI Error (status HTTP z: Unknown error)r}   r1   r   r   r   r0   r   r~   )r   r   errr   typtxtr*   r*   r+   _friendly_http_message  s4   




r  r"   attemptc              	   C   s>   | dddp
d}|  d| d| dt jd d  S )N/_op_try   )stripreplaceuuiduuid4hex)r#   r"   r	  slugr*   r*   r+   _generate_operation_id   s   (r  c           
      C   s   |  dkrd S | dkrXtdd |pi  D }g }|rRt|tr$|nt| }|D ]%\}}|d u r5q,t|tr?|d }	nt|d|}	||t|	pLdd q,d	||d
S | dkr`|p_i S |pci S )Nr   multipart/form-datac                 S   s   g | ]
\}}|d ur|qS r(   r*   .0r   r   r*   r*   r+   
<listcomp>.  s    z6_snapshot_request_body_for_logging.<locals>.<listcomp>r   name )fieldfilenameT)
_multipartform_fieldsfile_fields!application/x-www-form-urlencoded)	r   sortedr   r}   rL   rM   getattrr   r0   )
r6   r#   r7   r8   r  r   	file_iter
field_namefile_objr  r*   r*   r+   "_snapshot_request_body_for_logging%  s$   

r'  r   r   c           7         s|   j j}t|}|js|jstt dd |d} j j	}t
 j j||dkr- jnd}dtjdtf fdd} jdurD jnt }d} j}	d}
 j}d	}d}d}	 |d7 }t }d}d}t| j j|}td||| |r{ddinddi}|js|js|t j  j jr| j j d|i}|dkr|dd t j| j j}zz߈ jrt |||}t!j" j#d}t!j$|d} jdkr|dkr|dd  j%r jr % j}t&|t!j'st(dn.t!j'd
d} jr" j) D ]\}}|du rq|*|t&|t+t,fst-|n| q jrt& jt.r0 jn j) }|D ]N\}}|du rBq7t&|t/rPt0|\}}}n
t1|d|}|}d}t&|t2r{t34t5 |6d W d   n	1 svw   Y  |j*||||d q7||d< n) jdkr|dkrd|d<  jpi |d< n|dkrd|d<  jpi |d< t7j8||||rt9|nd|rt9|nd|d |j:||fd|i|} t | }!|!h}"|r|";| tj<|"tj=dI dH \}#}$|r||#v r|!|$v r|!>  t?d |!I dH }%|%4 I dH m |%j@d!kryz	|%A I dH }&W n tBtAjCfy;   |%D I dH }&Y nw d	}'d"}(d#})|%j@d$kpT jEduoT E|%j@|&}*|*rx|
 jFk rx|
d7 }
tG|d%}(| jH9 }d&|
 d' jF })d
}'n"|%j@tIv r||
  jJkr|	}(|	 jH9 }	d(||
  d' jJ })d
}'|'r_tKd)|||%j@|(|) t7j8||||%j@t9|%j|&d*|%j@ d+|) d,|(d-d.d/ tL|( j jrψ jMnd jr|nd jN jrtOndd0I dH  	 W d  I dH  W W |P  |r|>  t34t5 |I dH  W d   n	1 sw   Y  |r8t34t5 |Q I dH  W d   n	1 s3w   Y  |r^ jr^ jRr^tO j jR|durO|ntSt |  jN|d	|d1 qXtT|%j@|&}+t7j8||||%j@t9|%j|&|+d/ t5|+|rt, },t }-|%jUVd22 z33 dH W }.|,W|. t }/|/|- d3kr|/}-tX rt?d  jrtO j jMtS|/|  jN q6 t+|,}0d4d5 |%j) D }1 jYrt34t5  Y|1}W d   n	1 sw   Y   jZr Z|1 d
}tSt | }t7j8||||%j@|1|0d6 |0W  d  I dH  W W |P  |r=|>  t34t5 |I dH  W d   n	1 s8w   Y  |r]t34t5 |Q I dH  W d   n	1 sXw   Y  |r jr jRrtO j jR|durt|ntSt |  jN|d	|d1 S S S S z|%A I dH }2|2}3W n: tBtAjCfy   |%D I dH }4z|4rtA[|4ni }2W n tAjCy   d7|4i}2Y nw t&|2t9r|2n|4}3Y nw t34t5  jYr܈ Y|2nd}W d   n	1 sw   Y  d
}tSt | }t7j8||||%j@t9|%j|3d6 |2W  d  I dH  W W |P  |r:|>  t34t5 |I dH  W d   n	1 s5w   Y  |rZt34t5 |Q I dH  W d   n	1 sUw   Y  |r jr jRrtO j jR|durq|ntSt |  jN|d	|d1 S S S S 1 I dH sw   Y  W nL t?y   td8   t\t]fy }5 z/||
  jJkrtKd9|||	||
  jJt-|5 t7j8||||rt9|nd|rt9|nd|t^|5j_ d:t-|5 d;d< tL|	 j jr jMnd jr|nd jN jrtOndd0I dH  |	 jH9 }	W Y d}5~5W |P  |r;|>  t34t5 |I dH  W d   n	1 s6w   Y  |r[t34t5 |Q I dH  W d   n	1 sVw   Y  |r jr jRrtO j jR|durr|ntSt |  jN|d	|d1 qXt` I dH }6|6d= st7j8||||rt9|nd|rt9|nd|d>t-|5 d< tad?|5t7j8||||rt9|nd|rt9|nd|d@t-|5 d< tbdAt  dB|5d}5~5ww W |P  |r|>  t34t5 |I dH  W d   n	1 sw   Y  |r&t34t5 |Q I dH  W d   n	1 s!w   Y  |rL jrL jRrLtO j jR|dur=|ntSt |  jN|d	|d1 np|P  |rs|>  t34t5 |I dH  W d   n	1 snw   Y  |rt34t5 |Q I dH  W d   n	1 sw   Y  |r jr jRrtO j jR|dur|ntSt |  jN|d	|d1 w w w w qY)CzfCore request with retries, per-second interruption monitoring, true cancellation, and friendly errors.r
  r   Nstop_evtstart_tsc                    sx   z/|   s.t rW dS  jrt j jtt |  j	 t
dI dH  |   rW dS W dS  t
jy;   Y dS w )z:Every second: update elapsed time and signal interruption.Nrt   )r   r   r@   r   r3   r?   rN   r   r   rA   r   r   CancelledError)r(  r)  r   r*   r+   _monitorJ  s   z_request_base.<locals>._monitorr   FTr   z[DEBUG] HTTP %s %s (attempt %d)Acceptz*/*rr   r!   zContent-Typer   r   r  z-multipart_parser must return aiohttp.FormData)default_to_multipartr  r   )r  r6   r7   r!  r   )operation_idrequest_methodrequest_urlrequest_headersrequest_paramsrequest_datar   )return_whenzTask cancelledi  rW   r  r   g      >@zrate-limit retry z of zretry z%HTTP %s %s -> %s. Waiting %.2fs (%s).r  z (z, will retry in z.1fzs))r/  r0  r1  response_status_coderesponse_headersresponse_contenterror_message)display_callbackr   i   rt   c                 S   s   i | ]	\}}|  |qS r*   )lowerr  r*   r*   r+   
<dictcomp>  s    z!_request_base.<locals>.<dictcomp>)r/  r0  r1  r6  r7  r8  _rawzPolling was interrupted by userz=Connection error calling %s %s. Retrying in %.2fs (%d/%d): %s: z (will retry))r/  r0  r1  r2  r3  r4  r9  r   zLocalNetworkError: zuUnable to connect to the API server due to local network issues. Please check your internet connection and try again.zApiServerError: zThe API server at zB is currently unreachable. The service may be experiencing issues.)cr4   r"   r   r   r   r
   r   r   lstripr#   r   r    r7   r   r   rK   rD   r   r   r<   r  r   r   updater   r3   r!   popr'  r6   r8   r@   r   r   r   r5   r   r9   r}   FormDatar   r   	add_fieldbytes	bytearrayr0   rL   rM   r   r#  r   r   r   r~   seekr   log_request_responser1   requestaddrq   FIRST_COMPLETEDcancelr   r   r   r   JSONDecodeErrorr   rF   r;   minr=   _RETRY_STATUSr:   warningr   r?   rA   r   r   closerC   rN   r  contentiter_chunkedextendr   rE   rG   loadsr   r   rH   r-   r   r   r   )7r   r   url
parsed_urlr#   r   r,  
start_timer	  delayrate_limit_attemptsrate_limit_delayoperation_succeededfinal_elapsed_secondsextracted_price
stop_eventmonitor_tasksessr/  payload_headers
payload_kwrequest_body_logr5   formr   r   r$  r%  r&  r  
file_valuer6   req_cororeq_tasktasksrd   pendingr   r   should_retry	wait_timeretry_labelis_rlr   buff	last_tickchunkr   bytes_payloadresp_headerspayloadresponse_content_to_logr   r   diagr*   r+  r+   r   @  s^  
(


	






	 7
 	

 7
 7
 x
		


		 7

  r   rs  c              
   C   sZ   z|  |W S  ty, } ztdt| d| | tdt| d|  d| |d }~ww )Nz%Response validation failed for %s: %sr-   zResponse validation failed for r>  )model_validater~   r   rk   r#  )rw   rs  r   r*   r*   r+   r     s   
r   	extractorc                    s6   du rdS i  dt ttf dtf fdd}|S )a'  Wrap a typed extractor so it can be used by the dict-based poller.
    Validates the dict into `response_model` before invoking `extractor`.
    Uses a small per-wrapper cache keyed by `id(dict)` to avoid re-validating
    the same response for multiple extractors in a single poll attempt.
    Ndrx   c              
      s^   zt | } |}|d u r| }| |< |W S  ty. } ztd|  d }~ww )Nz,Extractor failed (typed -> dict wrapper): %s)idr   rv  r~   r   rk   )rx  keymodelr   _cacherw  rw   r*   r+   _wrapped  s   


z'_wrap_model_extractor.<locals>._wrapped)r1   r0   r   )rw   rw  r~  r*   r|  r+   r|     s
   	"r|   valuesc                 C   s8   | st  S t  }| D ]}t|}|d ur|| q
|S r(   )r   r   rI  )r  outr   nvr*   r*   r+   r     s   
r   valc                 C   s   t | tr|   S | S r(   )r}   r0   r  r;  )r  r*   r*   r+   r     s   
r   r(   )Rr   r   r   r   r   r  collections.abcr   r   dataclassesr   enumr   ior   typingr   r   r	   urllib.parser
   r   r   aiohttp.client_exceptionsr   r   pydanticr   comfyr   comfy_api.latestr   serverr   r  r   _helpersr   r   r   r   r   common_exceptionsr   r   r   r   r   r2   rP   rN  r   r   r   rH   rI   rK   r1   r0   rL   rM   rN   rO   r   r   rD  r{   r   r   r   r   r   r   r  r  r'  r   r   r|   r   r   r   r*   r*   r*   r+   <module>   s   
	

6	

3	

?	


 F


	
6		
  J
&&