o
    An0j                     @  sV  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dl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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#m$Z$m%Z%m&Z&m'Z' d dl(Z)d dl*Z*d dl+Z+d d
l+m,Z, d dl-m.Z. erd dl/m0Z0 dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAe,jBe,jCe,jDe,jEe,jFgZGG dd de#ddZHdd!d"ZIeI ZJG d#d$ d$eKZLG d%d& d&eKZMG d'd( d(eKZNG d)d* d*eKZOG d+d, d,ePeZQG d-d. d.eZReG d/d0 d0ZSeG d1d2 d2ZTd3d4 ZUeG d5d6 d6ZVeG d7d8 d8ZWdd:d;ZXdd=d>ZYdd?d@ZZ	dddHdIZ[ddWdXZ\dd^d_Z]dd`daZ^ddbdcZ_ddedfZ`dgdh ZadddldmZb	dddpdqZcddsdtZdddvdwZeddzd{Zfdd~dZgdddZhdddZiddddZjdddZkddddZldddZm			ddddZnddddZodddZp		ddddZqdddZrG dd desZtdddZug dZvevd ZwdddZxdddZydddZzdddZ{dddZ|dddZ}dddZ~dddĄZdddƄZdddȄZdddʄZh dˣZddd΄ZdddЄZddd؄ZdS )    )annotationsN)Callable	Coroutine)	dataclassfield)datetime)Enum)Path)Lock)	TYPE_CHECKINGAnyLiteralOptional	TypedDictUnionget_args
get_originget_type_hints)
SpaceStage)WebSocketCommonProtocol)ParameterInfozapi/predict/z
queue/joinz
queue/dataZuploadloginconfigzinfo?all_endpoints=Truezinfo?serialize=Falsez0https://gradio-space-api-fetcher-v2.hf.space/apiresetzhttps://hf.space/{}zheartbeat/{session_hash}cancelstatec                   @  s^   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< ded< ded< dS )Messagestrmsgdict[str, Any]outputevent_idintrankfloatrank_eta
queue_sizeboolsuccess
list[dict]progress_dataloglevelN)__name__
__module____qualname____annotations__ r1   r1   Z/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/site-packages/gradio_client/utils.pyr   G   s   
 r   F)totalreturnr   c                  C  sH   zt tdd } t| }|dd}|W S  ty#   Y dS w )Nzpackage.jsonutf-8version )	pkgutilget_datar-   decodestripjsonloadsget	Exception)Zpackage_json_datapackage_datar6   r1   r1   r2   get_package_versionT   s   
rA   c                   @     e Zd ZdZdS )TooManyRequestsErrorz.Raised when the API returns a 429 status code.Nr-   r.   r/   __doc__r1   r1   r1   r2   rC   c       rC   c                   @  rB   )
QueueErrorzMRaised when the queue is full or there is an issue adding a job to the queue.NrD   r1   r1   r1   r2   rG   i   rF   rG   c                   @  rB   )InvalidAPIEndpointErrorz(Raised when the API endpoint is invalid.NrD   r1   r1   r1   r2   rH   o   rF   rH   c                   @  rB   )SpaceDuplicationErrorz:Raised when something goes wrong with a Space Duplication.NrD   r1   r1   r1   r2   rI   u   rF   rI   c                   @  sD   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdS )ServerMessage	send_hash
queue_full
estimation	send_dataprocess_startsprocess_generatingprocess_completedr+   progress	heartbeatzServer stopped unexpectedly.unexpected_errorclose_streamprocess_streamingN)r-   r.   r/   rK   rL   rM   rN   rO   rP   rQ   r+   rR   rS   server_stoppedrT   rU   rV   r1   r1   r1   r2   rJ   {   s    rJ   c                   @  sb   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZedddZdddZedddZdS )Statusz'Status codes presented to client users.STARTINGJOINING_QUEUE
QUEUE_FULLIN_QUEUESENDING_DATA
PROCESSING	ITERATINGPROGRESSFINISHED	CANCELLEDLOGstatusr4   r"   c              
   C  s6   t jt jt jt jt jt jt jt jt j	t j
g
}|| S )z'Order of messages. Helpful for testing.)rX   rY   rZ   r[   r\   r]   r^   r`   r_   ra   rb   index)rd   orderr1   r1   r2   ordering   s   
zStatus.orderingotherc                 C  s   |  | |  |k S N)rg   )selfrh   r1   r1   r2   __lt__   s   zStatus.__lt__r   r   c                 C  sX   t jtjt jtjt jtjt jtj	t j
tjt jtjt jtjt jtjt jtjt jtji
|  S )zKMap the raw message from the backend to the status code presented to users.)rJ   rK   rX   rZ   rL   r[   rM   r\   rN   r]   rO   r^   rP   r_   rQ   ra   rR   r`   r+   rc   rW   )r   r1   r1   r2   msg_to_status   s   zStatus.msg_to_statusN)rd   rX   r4   r"   )rh   rX   )r   r   r4   rX   )r-   r.   r/   rE   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   staticmethodrg   rk   rl   r1   r1   r1   r2   rX      s$    
rX   c                   @  sD   e Zd ZU ded< ded< ded< ded< ded< edddZdS )ProgressUnitzOptional[int]re   lengthzOptional[str]unitzOptional[float]rR   descdatar)   r4   list[ProgressUnit]c                   s    fdd|D S )Nc              
     s<   g | ]} | d | d| d| d| ddqS )re   ro   rp   rR   rq   )re   ro   rp   rR   rq   r>   ).0dclsr1   r2   
<listcomp>   s    z)ProgressUnit.from_msg.<locals>.<listcomp>r1   )rx   rr   r1   rw   r2   from_msg   s   
zProgressUnit.from_msgN)rr   r)   r4   rs   )r-   r.   r/   r0   classmethodrz   r1   r1   r1   r2   rn      s   
 rn   c                   @  sV   e Zd ZU dZded< ded< ded< ded< d	ed
< ded< ded< dZded< dS )StatusUpdatezIUpdate message sent from the worker thread to the Job on the main thread.rX   codez
int | Noner#   r&   zfloat | Noneetazbool | Noner(   zdatetime | Nonetimezlist[ProgressUnit] | Noner*   Nztuple[str, str] | Noner+   )r-   r.   r/   rE   r0   r+   r1   r1   r1   r2   r|      s   
 r|   c                	   C  s   t tjd d d d t d dS )N)r}   r#   r&   r~   r(   r   r*   )r|   rX   rY   r   nowr1   r1   r1   r2   create_initial_status_update   s   r   c                   @  s6   e Zd ZU dZeedZded< eedZ	ded< dS )	JobStatuszpThe job status.

    Keeps track of the latest status update and intermediate outputs (not yet implements).
    )default_factoryr|   latest_statusz	list[Any]outputsN)
r-   r.   r/   rE   r   r   r   r0   listr   r1   r1   r1   r2   r      s   
 r   c                   @  sV   e Zd ZU dZded< ded< ded< ded	< d
Zded< dZded< d
Zded< dS )CommunicatorzKHelper class to help communicate between the worker thread and main thread.r
   lockr   jobzCallable[..., tuple]prediction_processorr   	reset_urlFr'   should_cancelN
str | Noner!   thread_complete)r-   r.   r/   rE   r0   r   r!   r   r1   r1   r1   r2   r      s   
 r   r'   c                 C  s   t | tsdS | dS )zN
    Check if the given value is a string that looks like an HTTP(S) URL.
    F)zhttp://zhttps://)
isinstancer   
startswithpossible_urlr1   r1   r2   is_http_url_like  s   

r   r   c                 C  s   ddi}z7t  (}t j| |d}|jdkr&|j| |djW  d   W S |jW  d   W S 1 s4w   Y  W dS  tyE   Y dS w )zb
    Probe the given URL to see if it responds with a 200 status code (to HEAD, then to GET).
    z
User-Agentz8gradio (https://gradio.app/; gradio-team@huggingface.co)headersi  NF)httpxZClientheadstatus_coder>   Z
is_successr?   )r   r   clientZhead_requestr1   r1   r2   	probe_url  s   

(r   c                 C  s   t d t| ot| S )z3
    Check if the given string is a valid URL.
    z^is_valid_url should not be used. Use is_http_url_like() and probe_url(), as suitable, instead.)warningswarnr   r   r   r1   r1   r2   is_valid_url%  s   r   	websocketr   rr   	hash_datahelperCommunicator | Noner   c                   s\  d}i }|s*t |  }| st|rh|jH |jrYt 4 I d H %}|j|j	t
|d}|  t j||ddI d H  W d   I d H  n1 I d H sOw   Y  tj W d    n1 scw   Y  t dI d H  | r| }	t
|	}|r|jn d|v }
tt|d |d|d	d |d
t |d|
rt|d nd d}|di dg }|r|jtjkrz|j| }W n ty } z	|g}W Y d }~nd }~ww |jj !| ||j_"W d    n1 sw   Y  |d dkrt#d|d dkr| $|I d H  n|d dkr"| $|I d H  |d dk}|r|d S )NF)r<   T)Zreturn_exceptionsg{Gz?r*   r   r&   r#   r(   r%   r}   r&   r#   r(   r   r~   r*   r    rr   rL    Queue is full! Please try again.rK   rN   rQ   )%asyncioZcreate_taskrecvdoner   r   r   ZAsyncClientpostr   r<   r=   r   Zgather
concurrentfuturesCancelledErrorsleepresultr|   rX   rl   r>   r   r   rn   rz   r}   ra   r   r?   r   r   appendr   rG   send)r   rr   r   r   	completedresptaskhttpr   r   has_progressstatus_updater    r   er1   r1   r2   get_pred_from_ws0  sr   (



4r   r   httpx.Clientdictsse_urlsse_data_urlr   dict[str, str]cookiesdict[str, str] | None
ssl_verifyexecutor%concurrent.futures.ThreadPoolExecutordict[str, Any] | Nonec
                 C  s   d|_ |	t||||}
|	t| |||||||	}tjj|
|gtjjd\}}d|_ t|dkr:t	dt| d|D ]}|
   S d S NF)Zreturn_whenT   zDid not expect z tasks to be done.)r   submitcheck_for_cancelstream_sse_v0r   r   waitFIRST_COMPLETEDlen
ValueErrorr   )r   rr   r   r   r   r   r   r   r   r   future_cancel
future_sser   _futurer1   r1   r2   get_pred_from_sse_v0o  s2   

r   pending_messages_per_eventdict[str, list[Message | None]]r!   protocol'Literal['sse_v1', 'sse_v2', 'sse_v2.1']c                 C  s   d| _ |t| |||}|t| |||}	tjj||	gtjjd\}
}d| _ t|
dkr6t	dt|
 d|
D ]}|
 }|rB||   S d S r   )r   r   r   stream_sse_v1plusr   r   r   r   r   r   	exceptionr   )r   r   r   r   r!   r   r   r   r   r   r   r   r   r   r1   r1   r2   get_pred_from_sse_v1plus  s(   



r   c                 C  s   	 t d | j | jr	 W d    n| jrtj W d    n1 s'w   Y  q| jr>t	j
| jd| ji|||d tj )NT皙?r!   )r<   r   r   verify)r   r   r   r   r   r   r   r   r!   r   r   r   )r   r   r   r   r1   r1   r2   r     s(   


r   c                 C  sD  z| j d||||d}| D ]}	|	d}	t|	dkrq|	drt|	dd  }
|
d tjtj	fv r8q|j
n d|
v }tt|
d |
d	|
d
d |
dt |
d|rdt|
d nd d}|
di dg }|r|jtjkrz|j| }W n ty } z	|g}W Y d }~nd }~ww |jj| ||j_W d    n1 sw   Y  |jrtj |
d dkrtd|
d dkr|
d }||_ | j!|d|i||||d}|"  q|
d dkr|
d   W  d    W S qt#d|	 W d    t#d1 sw   Y  t#d tjjy!    w )NGET)paramsr   r   
r   data:   r   r*   r&   r#   r(   r%   r   r    rr   rL   r   rN   r!   )r<   r   r   rQ   zUnexpected message: z*Did not receive process_completed message.)$stream
iter_linesrstripr   r   r<   r=   rJ   r+   rS   r   r|   rX   rl   r>   r   r   rn   rz   r}   ra   r   r?   r   r   r   r   r   r   r   r   rG   r!   r   raise_for_statusr   )r   rr   r   r   r   r   r   r   responseliner   r   r   r    r   r   r!   reqr1   r1   r2   r     s   







2
66r   1Literal['sse_v1', 'sse_v2', 'sse_v2.1', 'sse_v3']c                 C  s  z|| }d }	 t |dkr|d}ntd q|d u s"| jr'tj | j d }|d t	j
krF|d}|d}	|rF|	rF||	f}tt|d |d|dd |d	t |d
d|v rlt|d nd |d}
|di dg }|d t	jkr|dv r|d u rt|}nt|D ]\}}|| }t||}|||< |||< q|r|
jtjkrz| j| }W n ty } z	|g}W Y d }~nd }~ww | jj| |
| j_W d    n1 sw   Y  |d t	jkr||= |d W S |d t	j krt!dq	 tjjy    w )NTr   r   r   r+   r,   r&   r#   r(   r%   r*   )r}   r&   r#   r(   r   r~   r*   r+   r    rr   )Zsse_v2zsse_v2.1Zsse_v3zServer stopped.)"r   popr   r   r   r   r   r   r   rJ   r+   r>   r|   rX   rl   r   r   rn   rz   rP   r   	enumerate
apply_diffr}   ra   r   r?   r   r   r   r   rQ   rW   r   )r   r   r!   r   Zpending_messagesZpending_responses_for_diffsr   Zlog_messager+   r,   r   r    ivalueZprev_outputZ
new_outputr   r   r1   r1   r2   r     sr   








)
9r   c                 C  s4   t | } dd }|D ]\}}}|| |||} q| S )Nc                 S  s   t |dkr|dkr|S |dkr| | S td| | }tt |d D ]}|||  }q%|d }|dkr<|||< | S |dkrJ||  |7  < | S |dkrct|tr]|t|| | S |||< | S |dkrxt|trs|t|= | S ||= | S td	| )
Nr   replacer   zUnsupported action: r   adddeletezUnknown action: )r   r   ranger   r   insertr"   )targetpathactionr   currentr   Z	last_pathr1   r1   r2   
apply_edit^  s:   
	

zapply_diff.<locals>.apply_edit)copydeepcopy)objdiffr   r   r   r   r1   r1   r2   r   [  s
   
!r   	file_pathdirr   c                 C  sN   t |pt td }|jddd |t | j }t| | t	|
 S )N   Texist_okparents)r	   tempfile
gettempdirsecrets	token_hexmkdirnameshutilcopy2r   resolve)r   r   	directorydestr1   r1   r2   create_tmp_copy_of_file  s
   r  url_pathhf_tokenc           	   	   C  s   |durt j|dd |rdd| ini }t|pt td }|jddd |t| j }t	j
d| |dd	-}|  t|d
}| D ]}|| qHW d   n1 sZw   Y  W d   n1 siw   Y  t| S )z0Kept for backwards compatibility for 3.x spaces.NTr   AuthorizationBearer r   r   r   )r   Zfollow_redirectswb)osmakedirsr	   r   r  r  r  r  r  r   r   r   openZiter_rawwriter   r  )	r  r  r   r   r	  r   r   fchunkr1   r1   r2   download_tmp_copy_of_file  s&   r  filenamec                 C  s<   |  drdS t| d }|d ur|dddd}|S )Nz.vttztext/vttr   zx-wavZwavzx-flacflac)endswith	mimetypes
guess_typer   )r  mimetyper1   r1   r2   get_mimetype  s   
r  encodingc                 C  s^   |  dd} t| d }|dkrdS |d u rd S t|}|d ur-|dr-|dd  }|S )Nz	audio/wavzaudio/x-wavr   z
audio/flacr  .r   )r   r  r  guess_extensionr   )r   type	extensionr1   r1   r2   get_extension  s   
r%  
file_types	list[str]c                 C  s~   t | }|D ]6}|dkr dS |dr-|d }t| jd }||kr, dS q|d ur<|| dr< dS qdS )NfileTr!  /F)r  r   lstriplowerr	   suffix)r   r&  Z	mime_type	file_typeZfile_extr1   r1   r2   is_valid_file  s   
r.  r  
str | Pathc                 C  sp   t | d)}t| }t|d}tt| }d|d ur|nd d | 	 W  d    S 1 s1w   Y  d S )Nrbr5   r   r7   ;base64,)r  base64	b64encodereadr   r  )r  r(  encoded_string
base64_strr  r1   r1   r2   encode_file_to_base64  s   
$r7  urlc                 C  sL   t | }|  t|j}t|d}t| }d|d ur|nd d | S )Nr5   r   r7   r1  )r   r>   r   r2  r3  contentr   r  )r8  r   r5  r6  r  r1   r1   r2   encode_url_to_base64  s   

r:  r   c                 C  s    t | } t| rt| S t| S ri   )r   r   r:  r7  )r   r1   r1   r2   encode_url_or_file_to_base64  s   r;  c                 c  sr    t  }|rdd| ini }tjd| |d}| D ]	}||7 }|V  qW d    n1 s/w   Y  |V  d S )Nr  r  r   r   )	bytearrayr   r   Z
iter_bytes)r8  r  Zarrr   rrr   r1   r1   r2   download_byte_stream  s   
r>  tuple[bytes, str | None]c                 C  s&   t | }| ddd }t||fS )N,r   r   )r%  rsplitr2  	b64decode)r   r$  rr   r1   r1   r2   decode_base64_to_binary  s   rC     	max_bytesr"   c                 C  s   t j| \}}ddd |D }|| } t|  }||krA||krAt|dkr-	 | S |dd }|| } t|  }||ks$| S )aT  
    Strips invalid characters from a filename and ensures it does not exceed the maximum byte length
    Invalid characters are any characters that are not alphanumeric or one of the following: . _ -
    The filename may include an extension (in which case it is preserved exactly as is), or could be just a name without an extension.
    r7   c                 S      g | ]}|  s|d v r|qS )z._- isalnumru   charr1   r1   r2   ry          z5strip_invalid_filename_characters.<locals>.<listcomp>r   Nr   )r  r   splitextjoinr   encode)r  rE  r  extZfilename_lenr1   r1   r2   !strip_invalid_filename_characters  s   rP  original_namec                 C  s    d dd | D dd S )zECleans up a Python parameter name to make the API info more readable.r7   c                 S  rF  )z _rG  rI  r1   r1   r2   ry     rK  z,sanitize_parameter_names.<locals>.<listcomp> r   )rM  r   r+  )rQ  r1   r1   r2   sanitize_parameter_names  s   rS  str | Path | Noneprefixc           	      C  s   t |pt td }|jddd t| \}}|d urA|d u rAt |j}|}d|v rA|d|d }||dd d  }|d urIt	|}|d u rVtj
d||d}ntj
d|d| |d	}|| |  |S )
Nr   Tr   r!  r   r   F)r   rU  r   )r   rU  r,  r   )r	   r   r  r  r  r  rC  r  re   rP  NamedTemporaryFiler  flush)	r   r   r   rU  r	  rr   r$  r  file_objr1   r1   r2   decode_base64_to_file  s0   

rY  jsnstr | dict | listc                 C  sT   |d urt j|dd tjdd|dd}t| trt| } t| | |	  |S )NTr  Fz.jsonzw+)r   r,  r   mode)
r  r  r   rV  r   r   r<   r=   dumprW  )rZ  r   rX  r1   r1   r2   dict_or_str_to_json_file;  s   

r^  dict | listc                 C  s6   t | }t|W  d    S 1 sw   Y  d S ri   )r  r<   load)r   r  r1   r1   r2   file_to_jsonI  s   
$ra  ,  space_idtimeout_in_secondsc              
   C  sh   t jj|dtd}ztjd|  dd|i|d W d S  tjy3 } ztdt	|  d|d }~ww )	NZgradio_client)tokenZlibrary_nameZlibrary_versionz"https://huggingface.co/api/spaces/z
/sleeptimeseconds)r<   r   z>Could not set sleep timeout on duplicated Space. Please visit z5 to set a timeout manually to reduce billing charges.)
huggingface_hubutilsZbuild_hf_headers__version__r   r   ZHTTPStatusErrorrI   	SPACE_URLformat)rc  r  rd  r   r   r1   r1   r2   set_space_timeoutQ  s&   
rl  funcr   r   c                 O  s"   t jjt j | g|R i |S )a  
    Runs async functions in sync scopes. Can be used in any scope.

    Example:
        if inspect.iscoroutinefunction(block_fn.fn):
            predictions = utils.synchronize_async(block_fn.fn, *processed_input)

    Args:
        func:
        *args:
        **kwargs:
    )fsspecZasynsyncZget_loop)rm  argskwargsr1   r1   r2   synchronize_asyncm  s   "rr  c                   @  s   e Zd ZdS )APIInfoParseErrorN)r-   r.   r/   r1   r1   r1   r2   rs  }  s    rs  schemac                 C  sz   d| v rdS d| v rdS d| v r| d S |  drdS |  dr"dS |  dr)dS |  dr0dS d| vr6i S td|  )	Nconstenumr#  $refoneOfanyOfallOfzCannot parse type for )r>   rs  )rt  r1   r1   r2   get_type  s"   



r{  )a-  Dict(path: str | None (Path to a local file), url: str | None (Publicly available url or base64 encoded image), size: int | None (Size of image in bytes), orig_name: str | None (Original filename), mime_type: str | None (mime type of image), is_stream: bool (Can always be set to False), meta: Dict())a-  dict(path: str | None (Path to a local file), url: str | None (Publicly available url or base64 encoded image), size: int | None (Size of image in bytes), orig_name: str | None (Original filename), mime_type: str | None (mime type of image), is_stream: bool (Can always be set to False), meta: dict())z`Dict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None)zqDict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool)zDict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: Dict())zdict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: dict())zdict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: dict(_type: Literal[gradio.FileData]))r   c                 C  s   t | | d}|tdS )N$defsfilepath)_json_schema_to_python_typer>   r   CURRENT_FILE_DATA_FORMAT)rt  type_r1   r1   r2   json_schema_to_python_type  s   r  c           
        sV  | i krdS t | }|i krd| di v rdS dS |dkr,t | d dd   S |dkr2d	S |d
kr>d| d
  dS |dkrRdddd | d D  d S |dkrXdS |dkr^dS |dkrddS |dkrjdS |dkr| dg }d|v rd fdd|d D }d| dS d| v rd fdd| d D }d| dS t| }d| dS |d krd!d" | d#i } fd$d| D }d%| v r| d% }t|tr|r|d&g7 }n|d't|  g7 }d|}d(| d)S |d*v r	d+ fd,d| | D }|S |d-kr$d fd.d/| | D }	d0|	 d}|S td1|  )2z/Convert the json schema into a python type hintr   r<   descriptionz str | float | bool | list | dictrw  r)  r   nullNoneru  zLiteral[]rv  z, c                 S  s   g | ]
}d t | d  qS )')r   )ru   vr1   r1   r2   ry     s    z/_json_schema_to_python_type.<locals>.<listcomp>integerr"   stringr   booleanr'   numberr$   arrayitemsprefixItemsc                      g | ]}t | qS r1   r~  ru   r   defsr1   r2   ry         ztuple[c                   r  r1   r  r  r  r1   r2   ry     r  zlist[objectc                 S  s    |  drd|  d dS dS )Nr  z ()r7   rt   )r  r1   r1   r2   get_desc  s    z-_json_schema_to_python_type.<locals>.get_desc
propertiesc                   s4   g | ]\}}|d kr| dt |  | qS )r|  z: r  )ru   nr  r  r  r1   r2   ry     s
    additionalPropertieszstr, Anyzstr, zdict(r  )rx  ry  z | c                   r  r1   r  r  r  r1   r2   ry     r  rz  c                 3  s    | ]}t | V  qd S ri   r  r  r  r1   r2   	<genexpr>  s    z._json_schema_to_python_type.<locals>.<genexpr>zAll[zCannot parse schema )	r{  r>   r~  splitrM  r  r   r'   rs  )
rt  r  r  r  elementspropsZdesZadditional_propertiesrq   rr   r1   r  r2   r~    sz   



r~  	type_hintc                 C  s"   zt | W S  ty   i  Y S w ri   )_python_type_to_json_schemar?   )r  r1   r1   r2   python_type_to_json_schema  s
   
r  c                 C  s`  | t du r
ddiS | tu rddiS | tu rddiS | tu r"ddiS | tu r*ddiS t| }|tu rHt| }t|dkrBd	|d
 iS dt	|iS |t
u sRt|dkrt| }t|dkrt d|v rtdd |D }t|}d|v r}|d dg|d< |S ddi|g|d< |S ddd |D iS |t	u rt| d
 }dt|dS |tu rt| }ddd |D t|t|dS |tu rt| \}}|turtddt|d}|S t| r't| dr'i }	g }
t| }| D ],\}}t||	|< t| dr| jr|
| qt| dr| j| js|
| qd|	d}|
r%|
|d< |S | tu r.i S dS ) z,Convert a Python type hint to a JSON schema.Nr#  r  r  r  r  r  r   ru  r   rv  |   c                 s  s     | ]}|t d ur|V  qd S ri   )r#  ru   tr1   r1   r2   r    s    z._python_type_to_json_schema.<locals>.<genexpr>rx  ry  c                 S     g | ]}t |qS r1   r  r  r1   r1   r2   ry         z/_python_type_to_json_schema.<locals>.<listcomp>r  )r#  r  c                 S  r  r1   r  r  r1   r1   r2   ry   $  r  )r#  r  ZminItemsZmaxItemsz0JSON Schema only supports string keys in objectsr  )r#  r  r0   	__total____dataclass_fields__)r#  r  required)r#  r   r"   r$   r'   r   r   r   r   r   r   nextr  tupler   r   inspectisclasshasattrr   r  r  r   r  defaultr   )r  originZliteral_valuestypesZ
other_typert  Z	item_typeZkey_typeZ
value_typer  r  hints
field_nameZ
field_typer1   r1   r2   r    s   




r  json_objis_rootCallable[..., bool]c                 C  sz   || r|| S t | tr"i }|  D ]\}}t|||||< q|S t | ttfr;g }| D ]}|t||| q-|S | S )zk
    Traverse a JSON object and apply a function to each element that satisfies the is_root condition.
    )r   r   r  traverser   r  r   r  rm  r  Znew_objkeyr   itemr1   r1   r2   r  L  s   
r  'Callable[..., Coroutine[Any, Any, Any]]c                   s   || r|| I dH S t | tr)i }|  D ]\}}t|||I dH ||< q|S t | ttfrEg }| D ]}|t|||I dH  q4|S | S )zq
    Traverse a JSON object and apply a async function to each element that satisfies the is_root condition.
    N)r   r   r  async_traverser   r  r   r  r1   r1   r2   r  `  s   
r  api_infoc                   s&   t | | d t fddtD S )Nr|  c                 3  s    | ]}| v V  qd S ri   r1   )ru   Zfile_data_formatinfor1   r2   r  z  s    z value_is_file.<locals>.<genexpr>)r~  r>   anyFILE_DATA_FORMATS)r  r1   r  r2   value_is_filex  s   r  c                 C  s&   t | ttfot|  ot|  S )zp
    Check if the given value is a valid str or Path filepath on the local filesystem, e.g. "path/to/file".
    )r   r   r	   existsis_file)sr1   r1   r2   is_filepath}  s   &r  c                 C  s    t | tod| v ot | d tS )z
    Check if the given value is a valid FileData object dictionary in versions of Gradio<=4.20, e.g.
    {
        "path": "path/to/file",
    }
    r   )r   r   r   rv   r1   r1   r2   is_file_obj  s    r  c                 C  s<   t | tod| v ot | d tod| v o| d dddkS )z
    Check if the given value is a valid FileData object dictionary in newer versions of Gradio
    where the file objects include a specific "meta" key, e.g.
    {
        "path": "path/to/file",
        "meta": {"_type: "gradio.FileData"}
    }
    r   meta_typer7   gradio.FileData)r   r   r   r>   r  r1   r1   r2   is_file_obj_with_meta  s   

r  c                 C  s   t | od| v ot| d tS )a>  
    Check if the given value is a valid FileData object dictionary in newer versions of Gradio
    where the file objects include a specific "meta" key, and ALSO include a "url" key, e.g.
    {
        "path": "path/to/file",
        "url": "/file=path/to/file",
        "meta": {"_type: "gradio.FileData"}
    }
    r8  )r  r   r   r  r1   r1   r2   is_file_obj_with_url  s   
r  >   tabZtabitemboxZsidebarZdatasetformZinterpretationZ	accordiongrouptabscolumnr   rowfilepath_or_urlc                 C  sl   t | }|ddid}t|ri ||dd |dS t| r.i |dt|jiS td| d	)
Nr  r  )r   r  r)  r   )	orig_namer8  r  zFile z; does not exist on local filesystem and is not a valid URL.)r   r   r  r	   r  r  r   )r  r  rr   r1   r1   r2   handle_file  s   
r  c                 C  s   t d t| S )NzXfile() is deprecated and will be removed in a future version. Use handle_file() instead.)r   r   r  )r  r1   r1   r2   r(    s   r(  parameters_infolist[ParameterInfo] | Nonerp  r  rq  r   c                 C  s:  G dd dt }t|}| d u r|rtd|S t|}||jgt| |   }i }g }t| D ]/\}}	d|	v rF|||	d < ||	d  n|d |	ddr_|| |jkr_|	d||< q0| D ]$\}
}|
|v r||
 |k rzt	d	|
 d
||||
 < qdt	d	|
 d|j|v rt	d||
|j  |S )Nc                   @  rB   )z!construct_args.<locals>._KeywordsNO_VALUEN)r-   r.   r/   r  r1   r1   r1   r2   	_Keywords  s    r  zzThis endpoint does not support key-word arguments Please click on 'view API' in the footer of the Gradio app to see usage.Zparameter_namezargument {index}Zparameter_has_defaultFZparameter_defaultzParameter `zs` is already set as a positional argument. Please click on 'view API' in the footer of the Gradio app to see usage.zl` is not a valid key-word argument. Please click on 'view API' in the footer of the Gradio app to see usage.z)No value provided for required argument: )r   r   r   r   r  r   r   r>   r  	TypeErrorre   )r  rp  rq  r  _argsnum_argsZkwarg_arg_mappingZkwarg_namesre   Z
param_infor  r   r1   r1   r2   construct_args  sJ   




r  )r4   r   )r4   r'   )r   r   r4   r'   ri   )
r   r   rr   r   r   r   r   r   r4   r   )r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r4   r   )r   r   r   r   r   r   r   r   r!   r   r   r   r   r'   r   r   r4   r   )r   r   r   r   r   r   r   r'   )r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   r   )
r   r   r   r   r!   r   r   r   r4   r   )r   r   r   r   r4   r   )NN)r  r   r  r   r   r   r4   r   )r  r   r4   r   )r   r   r4   r   )r   r   r&  r'  r4   r'   )r  r/  )r8  r   )r   r/  )r   r   r4   r?  )rD  )r  r   rE  r"   r4   r   )rQ  r   r4   r   )NNN)r   r   r   r   r   rT  rU  r   )rZ  r[  r   rT  )r   r/  r4   r_  )Nrb  )rc  r   r  r   rd  r"   )rm  r   r4   r   )rt  r   )rt  r   r4   r   )r  r   r4   r   )r  r   rm  r   r  r  r4   r   )r  r   rm  r  r  r  r4   r   )r  r   r4   r'   )r  r/  )r  r  rp  r  rq  r   r4   r   )
__future__r   r   r2  concurrent.futuresr   r   r  r<   r  r  r8   r  r  r   r   r   collections.abcr   r   dataclassesr   r   r   rv  r   pathlibr	   	threadingr
   typingr   r   r   r   r   r   r   r   r   Zfsspec.asynrn  r   rg  r   Zwebsockets.legacy.protocolr   Zgradio_client.data_classesr   ZAPI_URLZ
SSE_URL_V0ZSSE_DATA_URL_V0ZSSE_URLZSSE_DATA_URLZWS_URLZ
UPLOAD_URLZ	LOGIN_URLZ
CONFIG_URLZAPI_INFO_URLZRAW_API_INFO_URLZSPACE_FETCHER_URLZ	RESET_URLrj  ZHEARTBEAT_URLZ
CANCEL_URLZSTATE_COMPONENTZNO_APP_FILEZCONFIG_ERRORZBUILD_ERRORZRUNTIME_ERRORZPAUSEDZINVALID_RUNTIMEr   rA   ri  r?   rC   rG   rH   rI   r   rJ   rX   rn   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r%  r.  r7  r:  r;  r>  rC  rP  rS  rY  r^  ra  rl  rr  r   rs  r{  r  r  r  r~  r  r  r  r  r  r  r  r  r  ZSKIP_COMPONENTSr  r(  r  r1   r1   r1   r2   <module>   s    ,	
4


	

?
'
 

FG/	

	






#







M

P








