
    +j              -       
   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% 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          Z0 G d d          Z1e
 G d d                      Z2e
 G d d                      Z3h dZ4g dZ5g dZ6g dZ7ddddddd d!d"d#dd$dd%d&dd'd(e8ej9                 d)e1d*e8e0         d+ee0ez  ge:dz  f         dz  d,edz  d-e;e<ef         e=e>e<ef                  z  dz  d.e<d/e:d0edz  d1e?d2e:d3e:d4e<d5e?dz  d6e<dz  d7e:dz  d8e@d9e?d:ee?ege@f         dz  d;e0f(d<ZAddddddd=d>d?d@d!dAdddBddCd(e8ej9                 dDe1d*e8e0         dEee0ez  ge<e?z  dz  f         dFee0ez  ge?dz  f         dz  d+ee0ez  ge:dz  f         dz  dGe=e<e?z           dz  dHe=e<e?z           dz  dIe=e<e?z           dz  d,edz  dJe:dKe?dLe:dMe?dNe:dOe:d5e?dz  dPe1dz  dQe:dRe<dz  d;e0f*dSZBddddddd d!d"d#ddTd$dd%d&dddUd(e8ej9                 d)e1d+ee;e<ef         ge:dz  f         dz  d,e;e<ef         ez  dz  d-e;e<ef         e=e>e<ef                  z  dz  d.e<d/e:d0edz  d1e?d2e:d3e:d4e<d5e?dz  dVe@d6e<dz  d7e:dz  d8e@d9e?d:ee?ege@f         dz  dWee;e<e<f         gdf         dz  d;e;e<ef         eCz  f*dXZDddddddd=d>d?d@d!dAdddBddCd(e8ej9                 dDe1dEee;e<ef         ge<e?z  dz  f         dFee;e<ef         ge?dz  f         dz  d+ee;e<ef         ge:dz  f         dz  dGe=e<e?z           dz  dHe=e<e?z           dz  dIe=e<e?z           dz  d,e;e<ef         ez  dz  dJe:dKe?dLe:dMe?dNe:dOe:d5e?dz  dPe1dz  dQe:dRe<dz  d;e;e<ef         f(dYZEdddZd[e8ej9                 d\e<dz  d]e<e?z  dz  d^e:dz  d;df
d_ZF	 d}ddddd`d[e8ej9                 d]e<e?z  dz  dae?dbe?dz  d^e:dz  dce@dz  dde?dz  dRe<dz  d;dfdeZGd;e;e<e@f         fdfZHdge>d;e>e<ee<f         fdhZIdie;e<ef         dje<d,e;e<ef         dz  d;e;e<ef         fdkZJd]e?dled;e<fdmZKdje<dne<doe?d;e<fdpZLd.e<dje<d,e;e<ef         dz  d-e;e<ef         e=e>e<ef                  z  dz  d;e;e<ef         e<z  dz  f
dqZMdre2dse@fdtZNd*e8e0         dued;e0fdvZOd*e8e0         dwee0gef         dz  d;ee;e<ef         gef         dz  fdxZPdyee<e?z           dz  d;eQe<e?z           fdzZRd{e<e?z  dz  d;e<e?z  dz  fd|ZSdS )~    N)CallableIterable)	dataclass)Enum)BytesIO)AnyLiteralTypeVar)urljoinurlparse)ClientErrorContentTypeError)	BaseModel)utils)IO)PromptServer)get_deploy_environment   )request_logger)default_base_urlget_auth_headerget_node_idis_processing_interruptedsleep_with_interrupt)ApiServerErrorLocalNetworkErrorProcessingInterruptedM)boundc                   j    e Zd Z	 d
ddddeded         deeef         dz  deeef         dz  fd	ZdS )ApiEndpointGETN)query_paramsheaderspathmethod)r"   POSTPUTDELETEPATCHr#   r$   c                F    || _         || _        |pi | _        |pi | _        d S N)r%   r&   r#   r$   )selfr%   r&   r#   r$   s        ;/home/wildlama/comfy/ComfyUI/comfy_api_nodes/util/client.py__init__zApiEndpoint.__init__&   s.     	(.B}"    )r"   )__name__
__module____qualname__strr	   dictr   r/    r0   r.   r!   r!   %   s         DI%
 /3)-% % %% ?@%
 38nt+% c3h$&% % % % % %r0   r!   c                      e Zd ZU eej                 ed<   eed<   eed<   e	ed<   e
e	ef         dz  ed<   e
e	ef         eee	ef                  z  dz  ed<   edz  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z  ed<   dZe	dz  ed<   dZedz  ed<   dZee
e	ef         gedz  f         dz  ed<   dZeeegef         dz  ed<   dZee
e	e	f         gdf         dz  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)r1   r2   r3   typer   	ComfyNode__annotations__r!   floatr4   r5   r   listtupler   intrE   rF   boolrG   rI   rJ   rK   rL   rM   r6   r0   r.   r8   r8   4   s        2<    NNN
sCx.4
S>DsCx11D8888o%%%""""J!d!!!"&OS4Z&&&)4C$J444'++++GKOXtCH~.<=DKKK9=OXsCj$./$6===IMxc3h(8$(>?$FMMMMMr0   r8   c                       e Zd ZU eed<   dZeed<   dZeed<   dZ	edz  ed<   dZ
edz  ed<   d	Zeed
<   dZedz  ed<   dS )_PollUIStatestartedQueuedstatus_labelT	is_queuedNpriceestimated_duration        base_processing_elapsedactive_since)r1   r2   r3   rQ   rP   rZ   r4   r[   rU   r\   r]   rT   r_   r`   r6   r0   r.   rW   rW   K   s         NNN L#   ItE54<%)d
)))%(U(((!%L%$,%%%%%r0   rW   >             )	succeededsucceedsuccess	completedfinisheddonecomplete)	cancelledcanceled	cancelingfailfailederror)createdqueuedqueueing	submittedinitializingwaitin_queueapplication/jsong      @         ?g       @zWaiting for serverrH   T   )rK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   rI   rJ   rF   rA   rL   clsr:   response_modelrK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   rI   rJ   rF   rA   rL   returnc          	        K   t          | |fi dt          ||          d|d|d|d|d|d|	d|
d	|d
|d|ddd|d|d|d|d| d {V }t          |t                    st	          d          t          ||          S )NrK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   	as_binaryFrI   rJ   rF   rA   rL   XExpected JSON response to validate into a Pydantic model, got non-JSON (binary or text).)sync_op_raw_wrap_model_extractor
isinstancer5   	Exception_validate_or_raise)r~   r:   r   rK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   rI   rJ   rF   rA   rL   raws                       r.   sync_opr   \   sQ     ,    .noNNN T	
 e "\  *)  K  K $m : .- %  65  .-!" *)#$ #<";%& ('      C* c4   trsssnc222r0         @i  g      ^@
   gffffff?g      $@)progress_extractorrK   completed_statusesfailed_statusesqueued_statusesr=   poll_intervalmax_poll_attemptstimeout_per_pollmax_retries_per_pollretry_delay_per_pollretry_backoff_per_pollr]   cancel_endpointcancel_timeout
extra_textpoll_endpointstatus_extractorr   r   r   r   r   r   r   r   r   r   r   r   r   c          	      P  K   t          | fi d|dt          ||          dt          ||          dt          ||          d|d|d|d|	d	|
d
|d|d|d|d|d|d|d|d| d {V }t          |t                    st	          d          t          ||          S )Nr   r   r   rK   r   r   r   r=   r   r   r   r   r   r   r]   r   r   r   r   )poll_op_rawr   r   r5   r   r   )r~   r   r   r   r   rK   r   r   r   r=   r   r   r   r   r   r   r]   r   r   r   r   s                        r.   poll_opr      sq     .   #m /~?OPPP 1ASTTT	
 .noNNN .- ( ( T $m ,+ *) 21 21  65  .-!" (#$ &~%& :'      C* c4   trsssnc222r0   F)rK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   r   rI   rJ   rF   rA   rL   rM   r   rM   c                  K   t          |t                    r\|                    d          }t          |                                          D ]$\  }}t          |t
                    r
|j        ||<   %t          di d| d|d|d|d|d|d	|d
|d|	d|
d|d|d|d|d|d|d|d|d|}t          ||           d{V 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_noner9   r:   r;   r<   r=   r>   r?   r@   rB   rC   rE   rF   rG   rI   rJ   rK   rA   rL   rM   )expect_binaryNr6   )	r   r   
model_dumprR   itemsr   valuer8   _request_base)r~   r:   rK   r=   r>   r<   r;   r?   r@   rB   rC   rE   r]   r   rI   rJ   rF   rA   rL   rM   kvcfgs                          r.   r   r      s     : $	"" "D11&& 	" 	"DAq!T"" "'Q
     "\	
 T e *)  K  K $m : *) +*  65 .-  (!" #<";#$ (%& #<";'C* s)<<<<<<<<<<r0   c                
   $%K   t          |t          n|          }t          |t          n|          }t          |t          n|          }t	          j                    }d}|rt          j        d          nd}d}t          ||          $t          j
                    % $%fd}t          j         |                      }	 ||
k     r	 t           ||||||ddddd           d{V }t          |t                    st          d	          n`# t           $ rS |rOt#          j        t                    5  t           ||dd
dddd	  	         d{V  ddd           n# 1 swxY w Y    w xY w	 t'           ||                    }n.# t          $ r!}t)          j        d|           d}Y d}~nd}~ww xY w|r ||          }||$_        |r, ||          } | || k    r|                    | d           | }t	          j                    }!||v }"|"r'$j        $xj        |!$j        z
  z  c_        d$_        n$j        |!$_        |"$_        |p|"rdnd$_        ||v r#$j        $xj        |!$j        z
  z  c_        d$_        %                                 t#          j        t                    5  | d{V  ddd           n# 1 swxY w Y   |r|dk    r|                    dd           t;           |r|ndt=          |!|z
            |$j        dt=          $j                             |%                                 t#          j        t                    5  | d{V  ddd           S # 1 swxY w Y   S ||v r:dt?          j         |           }#t)          j        |#           t          |#          	 tC          |	 ddd           d{V  n`# t           $ rS |rOt#          j        t                    5  t           ||dd
dddd	  	         d{V  ddd           n# 1 swxY w Y    w xY w|"s|dz  }||
k     t          d|
 dt=          |
|	z             d          # t           $ r  tD          tF          f$ r  t          $ r}t          d|           |d}~ww xY w# %                                 t#          j        t                    5  | d{V  ddd           w # 1 swxY w Y   w x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   )rX   r]   c                    K   	                                  st                      rdS t          j                    } j        j        
| j        z
  ndz   }t          j        t          | j	        z
            j
        j        j        t          |                     t          j        d           d{V                                   dS dS # t          $ r }t!          j        d|           Y d}~dS d}~ww xY w)z;Emit a UI update every second while polling is in progress.Nr^   statuselapsed_secondsrG   r\   r[   processing_elapsed_secondsr   r|   zPolling ticker exited: %s)is_setr   time	monotonicr_   r`   _display_time_progressrZ   rT   rX   r]   r\   r[   asynciosleepr   loggingdebug)nowproc_elapsedexcr~   r   statestop_tickers      r.   _tickerzpoll_op_raw.<locals>._ticker!  sL     	<!((** ),.. En&&$<272D2PS5---VY  ' -$'em(;$<$<$)$<+#o/2</@/@)	 	 	 	 mC(((((((((# "((** ) ) ) ) )$  	< 	< 	<M5s;;;;;;;;;	<s   "C B)C 
D  C;;D CheckingF)
r=   r;   r@   rB   rC   rE   r]   r   rI   rF   z,Polling endpoint returned non-JSON response.zCancelling task)r;   r@   rE   r]   r   rI   rF   zStatus extraction failed: %stotalrY   
ProcessingrH   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   ProgressBarrW   r   Eventcreate_taskr   r   r5   r   r   
contextlibsuppress_normalize_status_valuer   rr   r\   update_absoluter`   r_   r[   rZ   setr   rT   jsondumpsr   r   r   )&r~   r   r   r   rK   r   r   r   r=   r   r   r   r   r   r   r]   r   r   r   completed_statesfailed_statesqueued_statesrX   consumed_attemptsprogress_barlast_progressr   ticker_task	resp_jsonr   e	new_pricenew_progressnow_tsr[   msgr   r   s&   `                 `                 @@r.   r   r      sJ     < +ASA[+=+=astt'?;RXghhM'?;RXghhMnG-?I5$S)))TL $M=OPPPE-//K< < < < < < < <0 %ggii00K~"333"-!, 4 4"8)'+#+/%*# # #      	 ")T22 T#$RSSST(   " #,Y77  )+$2()'8/3&+37-2
 
 
 
 
 
 
 
 
 
                01A1A)1L1LMM   <a@@@  ,+OI66	("+EK! 111)<<+0M0M 00S0III$0M^%%F-/I 0%111Ve>P5PP11)-E&%-)/E&'EO!'!T	,SHH|E)))%111Ve>P5PP11)-E&!!!(33 & &%%%%%%%%& & & & & & & & & & & & & & &   AMS$8$8 00C0@@@&%+<66$'(8$9$9$6+#/253P/Q/Q)	 	 	 	 !L 	 ++ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	K &&=dj&;&;==c"""nn$*=#tT4PPPPPPPPPP(   " #,Y77  )+$2()'8/3&+37-2
 
 
 
 
 
 
 
 
 
                 '!Q&!]  "333` O'8 O O&677O O O
 
 	
 !   ~.    E E E<<<==1DE 	 ++ 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s)  Q8 AD Q8 %E2:E%E2%E)	)E2,E)	-E22Q8 6F Q8 
F:F50Q8 5F::DQ8 ;	KQ8 KQ8 KA%Q8 *	M??N	N	>Q8 
O$ #Q8 $%Q	P4(Q4P8	8Q;P8	<Q7Q8 8%R5R00R55R8 8.T&	S;/T;S??TS?Tr   r\   r9   textr   r\   c                   g }|rA|                     dt          |t                    r|                                n|            |Yt	          |          dz  d                    d                              d          }|dk    r|                     d| d           ||                     |           |rBt          j                            d	                    |          t          |                      d S d S )	NzStatus:    z,.1f0.zPrice: z credits
)appendr   r4   
capitalizerQ   rstripr   instancesend_progress_textjoinr   )r9   r   r   r\   display_linesps         r.   _display_textr     s     "M fdz&RU?V?V(b(9(9(;(;(;\bddeeeU||c!((//44;;C@@88  !61!6!6!6777T""" b00=1I1I;W_K`K`aaaaab br0   )r\   r[   r   r   r   rG   r[   r   c                   |T|dk    rN|du rJ||n|}t          dt          |          t          |          z
            }	dt          |           d|	 d}
ndt          |           d}
|r|
 d| n|
}t          | |||           d S )	Nr   FzTime elapsed: zs (~zs remaining)sz

r   )maxrT   r   )r9   r   r   rG   r\   r[   r   r   pe	remaining	time_liner   s               r.   r   r     s     "':':yE?Q?Q+E+Q''Wf3//#b''9::	VS%9%9VVyVVV		<S%9%9<<<	-7Fi))Z)))YD(Du======r0   c                    	
K   ddd} t          j        d          }d}t          j        |          4 d{V 
dt          d	t          f
fd
		fd|D             }	 t          j        |          D ]}| d{V rd| d<    n|D ]*}|                                s|                                 +t          j	        |ddi d{V  nI# |D ]*}|                                s|                                 +t          j	        |ddi d{V  w xY w| d         s| cddd          d{V  S t          t                                }|j         d|j         d}t          j        t           t"                    5  
                    |          4 d{V }|j        dk     | d<   ddd          d{V  n# 1 d{V swxY w Y   ddd           n# 1 swxY w Y   ddd          d{V  n# 1 d{V swxY w Y   | S )zLBest-effort connectivity diagnostics to distinguish local vs. server issues.F)internet_accessibleapi_accessibler   r   )zhttps://www.google.comzhttps://www.baidu.comr;   Nurlr   c                    K   	                      |           4 d {V }|j        dk     cd d d           d {V  S # 1 d {V swxY w Y   d S # t          t          t          j        f$ r Y dS w xY w)Nre   F)getr   r   OSErrorr   TimeoutError)r   respsessions     r.   _probez&_diagnose_connectivity.<locals>._probe  s     ";;s++ - - - - - - -t;,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'*>?   uus1   A >A 
AA AA A10A1c                 J    g | ]}t          j         |                     S r6   )r   r   ).0ur   s     r.   
<listcomp>z*_diagnose_connectivity.<locals>.<listcomp>  s,    SSS!w*66!9955SSSr0   Tr   return_exceptionsz://z/healthre   r   )aiohttpClientTimeoutClientSessionr4   rU   r   as_completedrk   cancelgatherr   r   schemenetlocr   r   r   r   r   r   )resultsr;   internet_probe_urlsprobe_tasksfuttparsed
health_urlr   r   r   s            @@r.   _diagnose_connectivityr    s       % G ##...G N$W555 > > > > > > >	c 	d 	 	 	 	 	 	 TSSS?RSSS		G+K88  999999 59G12E !  vvxx HHJJJ.+FFFFFFFFFFF !  vvxx HHJJJ.+FFFFFFFFFFF,- 	)> > > > > > > > > > > > > >, *,,--@@&-@@@
 g66 	> 	>{{:.. > > > > > > >$,0K#,=()> > > > > > > > > > > > > > > > > > > > > > > > > > >	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>1> > > > > > > > > > > > > > > > > > > > > > > > > > >6 Nsz   #G3 &CAG3ADG30AG3<GF9'G9
GGGG
G3G	G3G	G33
G= G=r  c                     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-streamr{   z4files tuple must be (filename, file[, content_type]))len
ValueError)r  s    r.   _unpack_tupler    s^    
1vv{{tQqT555
1vv{{tQqT1Q4
K
L
LLr0   endpoint_paramsr&   c                     t          | pi           }|                                dk    r#|r!|                                D ]\  }}||||<   |S )Nr"   )r5   upperr   )r  r&   r=   paramsr   r   s         r.   _merge_paramsr    s[    /'R((F||~~4JJLL 	 	DAq}q	Mr0   bodyc                    | dk    rdS | dk    rdS | dk    rdS | dk    rdS 	 t          |t                    r|                    d	          }t          |t                    r>|                    d
          }|                    d          }|r|r	d| d| dS |rd| S dt          j        |           S t          |          }t          |          dk    rd| S d|  dS # t          $ r	 d|  dcY S w xY 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.rr   messagerN   zAPI Error: z (Type: )   zAPI Error (raw): zAPI Error (status HTTP z: Unknown error)r   r5   r   r   r   r4   r  r   )r   r  errr   typtxts         r.   _friendly_http_messager)     sY   }}CC}}WW}}XX}}rr/dD!! 	2((7##C#t$$ /ggi((ggfoo =3 =<<<c<<<< /....3D!1!1333d))C3xx30300011111 / / /.v....../s*   A5C# C# C# 6&C# C# #C65C6r%   attemptc           	          |                     d                              dd          pd}|  d| d| dt          j                    j        d d          S )N/_op_try   )stripreplaceuuiduuid4hex)r&   r%   r*  slugs       r.   _generate_operation_idr7  =  s\    ::c??""3,,4DAAtAAAA4:<<+;BQB+?AAAr0   c                    |                                 dk    rd S | dk    rt          d |pi                                 D                       }g }|rt          |t                    r|n t	          |                                          }|D ]^\  }}|t          |t
                    r	|d         }	nt          |d|          }	|                    |t          |	pd          d           _d||d	S | d
k    r|pi S |pi S )Nr"   multipart/form-datac                     g | ]	\  }}||
S r,   r6   r   r   r   s      r.   r  z6_snapshot_request_body_for_logging.<locals>.<listcomp>K  s    RRRDAqAMaMMMr0   r   name )fieldfilenameT)
_multipartform_fieldsfile_fields!application/x-www-form-urlencoded)	r  sortedr   r   rR   rS   getattrr   r4   )
r<   r&   r=   r>   rA  rB  	file_iter
field_namefile_objr?  s
             r.   "_snapshot_request_body_for_loggingrI  B  s4    ||~~t,,,RRTZR,>,>,@,@RRRSS,. 		[!+E4!8!8Qd5;;==>Q>QI(1 [ [$
H#h.. E'{HH&xDDH""ZSUWEXEX#Y#YZZZZ";{[[[:::zr:2r0   r   r   c                 N&   K    j         j        }t          |          }|j        sL|j        sEt          t                                          d          dz   |                    d                    } j         j	        }t           j         j        ||dk    r j        nd          }dt          j        dt          f fd} j         j        nt#          j                    }d} j        }	d}
 j        }d}d}d}	 |d
z  }t          j                    }d}d}t)          | j         j        |          }t+          j        d|||           |rddinddi}|j        s?|j        s8|                    t1           j                             t5                      |d<    j         j        r|                     j         j                   d|i}|dk    r|                    dd           t;           j        | j         j                  }	  j         rt          j!         |||                    }tE          j#         j$                  }tE          j%        |          } j        dk    r|dk    r|                    dd            j&        rK j        rD &                     j                  }tO          |tD          j(                  stS          d          ntE          j(        d	          } j        rc j        *                                D ]I\  }}||+                    |tO          |tX          tZ          f          st]          |          n|           J j        rtO           j        t^                    r j        n j        *                                }|D ]\  }}|tO          |t`                    rtc          |          \  }}}nte          |d|          }|}d}tO          |tf                    rFti          j5        tl                    5  |7                    d           ddd           n# 1 swxY w Y   |+                    ||||           ||d<   n: j        dk    r|dk    rd|d<    j        pi |d<   n|dk    rd|d<    j        pi |d<   tq          j9        ||||rtu          |          nd|rtu          |          nd|            |j;        ||fd|i|} t          j!        |           }!|!h}"|r|"<                    |           t          j=        |"t          j>                   d{V \  }#}$|r+||#v r'|!|$v r|!?                                 t          d           |! d{V }%|%4 d{V  |%jA        d!k    r	 |%B                                 d{V }&n6# t          t          jD        f$ r |%E                                 d{V }&Y nw xY wd}'d"}(d#})|%jA        d$k    p# jF        duo F                    |%jA        |&          }*|*r:|
 jG        k     r/|
d
z  }
t          |d%          }(| jI        z  }d&|
 d' jG         })d	}'n:|%jA        t          v r,||
z
   jK        k    r|	}(|	 jI        z  }	d(||
z
   d' jK         })d	}'|'rt+          jL        d)|||%jA        |(|)           tq          j9        ||||%jA        tu          |%j                  |&d*|%jA         d+|) d,|(d-d./           t          |( j         j         r jN        nd j         r|nd jO         j         rt          nd0           d{V  	 ddd          d{V  |Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rX j         rQ jS        rJt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1           Nt          |%jA        |&          }+tq          j9        ||||%jA        tu          |%j                  |&|+/           tm          |+          |rt[                      },t#          j                    }-|%jV        W                    d2          2 3 d{V }.|,X                    |.           t#          j                    }/|/|-z
  d3k    rW|/}-t                      rt          d            j         r1t           j         jN        t          |/|z
             jO                   6 tY          |,          }0d4 |%j        *                                D             }1 jZ        rFti          j5        tl                    5   Z                    |1          }ddd           n# 1 swxY w Y    j[        r [                    |1           d	}t          t#          j                    |z
            }tq          j9        ||||%jA        |1|05           |0cddd          d{V  |Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rY j         rS jS        rMt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1           S S S S 	 |%B                                 d{V }2|2}3n# t          t          jD        f$ ri |%E                                 d{V }4	 |4rt          j\        |4          ni }2n# t          jD        $ r d6|4i}2Y nw xY wtO          |2tt                    r|2n|4}3Y nw xY wti          j5        tl                    5   jZ        r Z                    |2          nd}ddd           n# 1 swxY w Y   d	}t          t#          j                    |z
            }tq          j9        ||||%jA        tu          |%j                  |35           |2cddd          d{V  |Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rY j         rS jS        rMt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1           S S S S # 1 d{V swxY w Y   n"# t          $ r t+          j        d7            t          t          f$ r}5||
z
   jK        k    rt+          jL        d8|||	||
z
   jK        t]          |5                     tq          j9        ||||rtu          |          nd|rtu          |          nd|t          |5          j`         d9t]          |5           d:;           t          |	 j         j         r jN        nd j         r|nd jO         j         rt          nd0           d{V  |	 jI        z  }	Y d}5~5|Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rX j         rQ jS        rJt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1            t                       d{V }6|6d<         s]tq          j9        ||||rtu          |          nd|rtu          |          nd|d=t]          |5           ;           t          d>          |5tq          j9        ||||rtu          |          nd|rtu          |          nd|d?t]          |5           ;           t          d@t                       dA          |5d}5~5ww xY w	 |Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rX j         rQ jS        rJt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1           n# |Q                                 |rM|?                                 ti          j5        tl                    5  | d{V  ddd           n# 1 swxY w Y   |rKti          j5        tl                    5  |R                                 d{V  ddd           n# 1 swxY w Y   |rY j         rS jS        rMt           j         jS        ||n"t          t#          j                    |z
             jO        |d|1           w w w w xY w.)BzfCore request with retries, per-second interruption monitoring, true cancellation, and friendly errors.r,  r"   Nstop_evtstart_tsc                 t  K   	 |                                  st                      rdS j        rBt          j        j        t          t          j                    |z
            j	                   t          j        d           d{V  |                                  dS dS # t          j        $ r Y dS w xY w)z:Every second: update elapsed time and signal interruption.Nr|   )r   r   rF   r   r9   rE   rT   r   r   rG   r   r   CancelledError)rK  rL  r   s     r.   _monitorz_request_base.<locals>._monitorg  s      
	oo'' ),.. F' *cnc$.:J:JX:U6V6VX[Xk   mC((((((((( oo'' ) ) ) ) ) % 	 	 	FF	s   "B$ A7B$ $B76B7r   FTr   z[DEBUG] HTTP %s %s (attempt %d)Acceptz*/*rz   z	Comfy-Envr$   zContent-Typer   r   r9  z-multipart_parser must return aiohttp.FormData)default_to_multipartr<  r  )r?  r<   r=   rC  r   )operation_idrequest_methodrequest_urlrequest_headersrequest_paramsrequest_datar  )return_whenzTask cancelledi  r^   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))rR  rS  rT  response_status_coderesponse_headersresponse_contenterror_message)display_callback)r   r   rG   r\   r[   r   i   r|   c                 >    i | ]\  }}|                                 |S r6   )lowerr;  s      r.   
<dictcomp>z!_request_base.<locals>.<dictcomp>&  s&    #R#R#RTQAGGIIq#R#R#Rr0   )rR  rS  rT  rY  rZ  r[  _rawzPolling was interrupted by userz=Connection error calling %s %s. Retrying in %.2fs (%d/%d): %s: z (will retry))rR  rS  rT  rU  rV  rW  r\  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.)dr:   r%   r   r
  r  r   r   r   lstripr&   r  r#   r=   r   r   rQ   rJ   r   r   rB   r7  r   r   updater   r9   r   r$   poprI  r<   r>   rF   r   r  r  r;   r  r?   r   FormDatar  r   	add_fieldbytes	bytearrayr4   rR   rS   r  rE  r   r   r   r   seekr   log_request_responser5   requestaddrx   FIRST_COMPLETEDr  r   r   r   r   JSONDecodeErrorr   rL   rA   minrC   _RETRY_STATUSr@   warningr   rE   rG   r   r   closerI   rT   r)  contentiter_chunkedextendr   rK   rM   loadsr   r   rN   r1   r  r   r   )7r   r   r   
parsed_urlr&   r  rO  
start_timer*  delayrate_limit_attemptsrate_limit_delayoperation_succeededfinal_elapsed_secondsextracted_price
stop_eventmonitor_tasksessrR  payload_headers
payload_kwrequest_body_logr;   formr   r   rF  rG  rH  r?  
file_valuer<   req_cororeq_tasktasksrk   pendingr   r  should_retry	wait_timeretry_labelis_rlr   buff	last_tickchunkr   bytes_payloadresp_headerspayloadresponse_content_to_logr   r   diags7   `                                                      r.   r   r   ]  s     
,
C#J MZ%6 M&((//44s:CJJsOOLL\ F3<4f&TY//chh_cddF %       ,/+A+M''SWSaScScJGOE %(,$(Of1]__
,0-1-fcl6GQQ7gNNN/<`8U++8M_B`  	D): 	D""?3<#@#@AAA+A+C+COK(< 	9""3<#7888&/%A
U??555=c>NPVX[X`bebkllR	# U&288J
3S3STT+#+>>>G(999D#888Vu__##ND999' 
fCH 
f//99D%dG,<== Z()XYYYZ #+FFFDx f$'HNN$4$4 f fDAq y ( NN1Jq5R[J\<]<].dc!fffcdeeee9 m-7	4-H-H _		ciooN_N_I09 m m,
H#+$%h66 FANxAXAX>Hj,,'.x'L'LH)1J+EL%j':: 3!+!4Y!?!? 3 3 * 2 2 23 3 3 3 3 3 3 3 3 3 3 3 3 3 3z:_kllll%)
6""!%HHHVW\__2U/%(X^
6""52D/%(X^
6"/)%9H R_ 5 5 5d/5?tF|||4-    $t|FCMMM*MMH*844H JE (		,'''"),u'BY"Z"Z"ZZZZZZZMD' > 4 4w&&OO%%%+,<=== ">>>>>>D v# v# v# v# v# v# v# v#;#%%1%)YY[[000000,d.BC 1 1 1%)YY[[0000001#(L #I"$K K3. +47bC<O<OPTP[]a<b<b   
,!4s7T!T!T+q0+$'(8$$?$?	(C,==(&r:M&r&rSVSp&r&r'+557EX;X]`]l:l:l$)	!22&cw9L/L&c&cRURa&c&c'+# !C" K%'   ';)5+1(+15-1$,-?-?-1*o$+*o*o*o*o^g*o*o*o*o    3%L.1.BLCNN*-*>HJJD/GJG[-e-C-Cae          !ev# v# v# v# v# v# v# v# v# v# v# v#l NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D   Y 1dCCC"7%1'-$'-1[)-dl););)-&)    $C..(  7#$;;D $ 0 0I'+|'@'@'K'K 
" 
" 
" 
" 
" 
" 
"eE***"n..?c11(+I8:: N&;<L&M&M M"3 " 6$'L#.#cJFVBWBWY\Yl!" !" !" (L %*$KKM#R#RT\=O=O=Q=Q#R#R#RL* P'0;; P P.1.A.A,.O.OOP P P P P P P P P P P P P P P4 D55lCCC*.',/0@0@:0M,N,N)"7%1'-$'-1[)5)6    )}v# v# v# v# v# v# v# v# v# v# v# v# v#l NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D      }	a(,		"3"3"3"3"3"37>//,d.BC a a a%)YY[[0000005:>&Fdj&6&6&6BGG#3 5 5 5'-tnGGG5=GQU=V=V2`''\`///a $,Y77 h hJMJ]*g#*=*=g*F*F*Fcgh h h h h h h h h h h h h h h*.',/0@0@:0M,N,N)"7%1'-$'-1[)-dl););)@    #mv# v# v# v# v# v# v# v# v# v# v# v# v#l NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D      }v# v# v# v# v# v# v# v# v# v# v# v# v# v# v#p % 	 	 	M;<<<W% 9	 9	 9	--#/AAS11OFF   3!-#) #=L$VD$9$9$9RV39#C4<<<t!1%)!WW%5"N"NQ"N"N"N    +L&)&:DCNN"%"6@JJD'?B?S%]%;%;Y]          **< NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D   M 011111111D-. 3!-#) #=L$VD$9$9$9RV39#C4<<<t!1"@A"@"@    (K   /)%9H R_ 5 5 5d/5?tF|||4-9Q99    !;%5%7%7 ; ; ;  m9	wv#l NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D    NN '##%%%(33 ' '&&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '(33 ' '**,,&&&&&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '" s'; @Z &L5 1< .- !1!1J!>??$'$7)#/D      sfs  Hw$ 	P+w$ +P/	/w$ 2P/	3D>w$ 1w?Vw0W
wWEw)w$ =	^^^8__#&_#Bwe* Cw=gwg#	#w&g#	'A$ww$  	j55j9	<j9	ll		l	,n	w	0p:opo)&p(o))pwpw$qwq	wq	Aw1w$ 	tt	"t	u((u,	/u,	
ww$ ww$ "AH $0ADC4AC>AH 	}$$}(+}(
~11~58~5@C&AC>C>ADDAH E
	AEEAE#E&AE#FAF,F,AF0F3AF0HAAL"I	AI,I AL"I,AI0I0AL"I3AI0I4AL"JAJ9J-AL"J9AJ=J=AL"K AJ=KA!AL"r  c           	          	 |                      |          S # t          $ rO}t          j        dt	          | d|           |           t          dt	          | d|            d|           |d }~ww xY w)Nz%Response validation failed for %s: %sr1   zResponse validation failed for rb  )model_validater   r   rr   rE  )r   r  r   s      r.   r   r     s    
,,W555   3NJ??	
 	
 	

 hgnjR`.a.ahhefhh
 
	s    
A0A
A++A0	extractorc                 h     dS i dt           t          t          f         dt          f f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dr   c                     	 t          |           }                    |          }|                    |           }||<    |          S # t          $ r}t	          j        d|            d }~ww xY w)Nz,Extractor failed (typed -> dict wrapper): %s)idr   r  r   r   rr   )r  keymodelr   _cacher  r   s       r.   _wrappedz'_wrap_model_extractor.<locals>._wrapped  s    		Q%%CJJsOOE}&55a88#s9U### 	 	 	MH!LLL	s   A
A 
A3A..A3)r5   r4   r   )r   r  r  r  s   `` @r.   r   r     s\     tF
DcN 
s 
 
 
 
 
 
 
 
 Or0   valuesc                     | st                      S t                      }| D ](}t          |          }||                    |           )|S r,   )r   r   rm  )r  outr   nvs       r.   r   r     sR     uu%%C  $Q''>GGBKKKJr0   valc                 |    t          | t                    r&|                                                                 S | S r,   )r   r4   r1  r_  )r  s    r.   r   r     s3    #s #yy{{  """Jr0   r,   )Tr   r   r   r   r   r3  collections.abcr   r   dataclassesr   enumr   ior   typingr   r	   r
   urllib.parser   r   r  aiohttp.client_exceptionsr   r   pydanticr   comfyr   comfy_api.latestr   serverr   comfy.deploy_environmentr   r=  r   _helpersr   r   r   r   r   common_exceptionsr   r   r   r   r!   r8   rW   rq  r   r   r   rN   rO   rQ   r5   r4   rR   rS   rT   rU   r   r   rh  r   r   r   r   r  r  r  r)  r7  rI  r   r   r   r   r   r   r6   r0   r.   <module>r     sE            . . . . . . . . ! ! ! ! ! !             ( ( ( ( ( ( ( ( ( ( * * * * * * * *  C C C C C C C C                         ; ; ; ; ; ;                    X W W W W W W W W WGCy!!!% % % % % % % % N N N N N N N N, & & & & & & & & *))eee SSSddd AE!;?*(,*%))4'+!%'9=)-3 -3 -3	bl	-3-3 G	-3
 q3wi56=-3 d
-3 S>DsCx11D8-3 -3 -3 o-3 -3 -3 -3 -3 d
-3   $J!-3" #-3$ %-3&  #'-3( sCj$./$6)-3* +-3 -3 -3 -3l BF@D15.2.2! # ""%$'%)*. !+.3 .3 .3	bl	.3.3 G	.3
 Cy#)d*::;.3 !!c'C$J!67$>.3 q3wi56=.3 S3Y$..3 #)_t+.3 #)_t+.3 d
.3 .3 .3 .3 .3   !.3" "#.3$ d
%.3& !4''.3( ).3* d
+.3, -.3 .3 .3 .3j HL.2;?*(,*%))4'+!%'9=IM+7= 7= 7=	bl	7=7= tCH~.<=D	7=
 sCx.9
$t
+7= S>DsCx11D87= 7= 7= o7= 7= 7= 7= 7= d
7= 7=   $J!7=" #7=$ %7=&  #'7=( sCj$./$6)7=*  (c3h(8$(>?$F+7=, 
#s(^e-7= 7= 7= 7=~ IMGK15.2.2.2 # ""%$'%)*. !)A A A	bl	AA S#X/sT1AAB	A
 !$sCx.!13:!=>EA tCH~.<=DA S3Y$.A #)_t+A #)_t+A sCx.9
$t
+A A A A A  A  "!A" d
#A$ !4'%A& 'A( d
)A* 
#s(^+A A A AP  $b b b2< b
*b #I	b
 4<b 
b b b b0 #'	> !-1!> > >2< >#I> > 4Z	> 4<> d{> !$d
> d
> 
> > > >*'d39o ' ' ' 'TMU MuS#s]3 M M M M4S> 3 d3PS8nW[F[ `dehjmem`n    /3 /c /c / / / /:B3 Bc BC BC B B B B
 sCx.4
 S>DsCx11D8	
 
#s(^cD    6F^ FD F F F FR
tAw      GS!D( tCH~#$t+   8s 3d : s39~    sT!1 cCi$6F      r0   