a
    dD                     @  s  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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 d dlZd dlZd dlZd dl Z d d
lm!Z! d dl"m#Z# dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,h dZ-dZ.e!j/e!j0e!j1e!j2e!j3gZ4e5e6dpLd7d8 Z9G dd de:Z;G dd de:Z<G dd de:Z=G d d! d!e:Z>G d"d# d#eZ?eG d$d% d%Z@eG d&d' d'ZAd(d) ZBeG d*d+ d+ZCeG d,d- d-ZDd.d/d0d1d2ZEd.d/d0d3d4ZFd.d/d0d5d6ZGdd7d.d.d8d9d:d;d<ZHdd.d=d=d.d>d?d@ZIdd.d=d.dAdBdCZJd.d=dDdEdFZKd.d=dGdHdIZLdJdKdLdMZMd.dNdOdPZNdJdQdRdSZOdd.dNdTdUZPd.dVdGdWdXZQdd.dZd.d[d\d]ZRd.d.d^d_d`ZSdd.d=dad=dbdcddZTddedadfdgdhZUdJdidjdkdlZVdd.d=dZdndodpZWdqdrdsdtduZXG dvdw dweYZZdxdydzd{Z[drd.d|d}d~Z\dS )    )annotationsN)CancelledError)	dataclassfield)datetime)Enum)Path)Lock)AnyCallableOptional)
SpaceStage)WebSocketCommonProtocolzapi/predict/z
queue/joinuploadconfiginfozinfo?serialize=Falsez0https://gradio-space-api-fetcher-v2.hf.space/apiresetzhttps://hf.space/{}>   columnformZdatasetgroupZ	accordionZinterpretationZboxtabsrowtabstateZtabitemr   zversion.txt    asciic                   @  s   e Zd ZdZdS )TooManyRequestsErrorz.Raised when the API returns a 429 status code.N__name__
__module____qualname____doc__ r"   r"   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/gradio_client/utils.pyr   @   s   r   c                   @  s   e Zd ZdZdS )
QueueErrorzMRaised when the queue is full or there is an issue adding a job to the queue.Nr   r"   r"   r"   r#   r$   F   s   r$   c                   @  s   e Zd ZdZdS )InvalidAPIEndpointErrorz(Raised when the API endpoint is invalid.Nr   r"   r"   r"   r#   r%   L   s   r%   c                   @  s   e Zd ZdZdS )SpaceDuplicationErrorz:Raised when something goes wrong with a Space Duplication.Nr   r"   r"   r"   r#   r&   R   s   r&   c                   @  sn   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ed ddddZd dddZedd 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int)statusreturnc              
   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.)r'   r(   r)   r*   r+   r,   r-   r/   r.   r0   r1   index)r3   orderr"   r"   r#   orderingf   s    zStatus.ordering)otherc                 C  s   |  | |  |k S N)r7   )selfr8   r"   r"   r#   __lt__w   s    zStatus.__lt__str)msgr4   c              	   C  s*   t jt jt jt jt jt jt jt jd|  S )zKMap the raw message from the backend to the status code presented to users.)	send_hash
queue_fullZ
estimation	send_dataZprocess_startsZprocess_generatingprocess_completedprogress)	r'   r)   r*   r+   r,   r-   r.   r0   r/   )r=   r"   r"   r#   msg_to_statusz   s    	zStatus.msg_to_statusN)r   r   r    r!   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   staticmethodr7   r;   rC   r"   r"   r"   r#   r'   X   s    r'   c                   @  sJ   e Zd ZU ded< ded< ded< ded< ded< ed	d
dddZdS )ProgressUnitzOptional[int]r5   lengthzOptional[str]unitzOptional[float]rB   descz
list[dict]zlist[ProgressUnit])datar4   c                   s    fdd|D S )Nc              
     s<   g | ]4} | d | d| d| d| ddqS )r5   rF   rG   rB   rH   )r5   rF   rG   rB   rH   )get).0dclsr"   r#   
<listcomp>   s   z,ProgressUnit.from_ws_msg.<locals>.<listcomp>r"   )rN   rI   r"   rM   r#   from_ws_msg   s    
zProgressUnit.from_ws_msgN)r   r   r    __annotations__classmethodrP   r"   r"   r"   r#   rE      s   
rE   c                   @  sJ   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S )StatusUpdatezIUpdate message sent from the worker thread to the Job on the main thread.r'   codez
int | Nonerank
queue_sizezfloat | Noneetazbool | Nonesuccesszdatetime | Nonetimezlist[ProgressUnit] | Noneprogress_dataN)r   r   r    r!   rQ   r"   r"   r"   r#   rS      s   
rS   c                	   C  s   t tjd d d d t d dS )N)rT   rU   rV   rW   rX   rY   rZ   )rS   r'   r(   r   nowr"   r"   r"   r#   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_factoryrS   latest_statusz	list[Any]outputsN)
r   r   r    r!   r   r\   r_   rQ   listr`   r"   r"   r"   r#   r]      s   
r]   c                   @  s>   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S )CommunicatorzKHelper class to help communicate between the worker thread and main thread.r	   lockr]   jobzCallable[..., tuple]prediction_processorr<   	reset_urlFboolshould_cancelN)r   r   r    r!   rQ   rh   r"   r"   r"   r#   rb      s   
rb   r<   rg   )possible_urlr4   c                 C  s
   |  dS )z>
    Check if the given string looks like an HTTP(S) URL.
    )zhttp://zhttps://)
startswithri   r"   r"   r#   is_http_url_like   s    rl   c                 C  s   ddi}zlt  P}|j| |d}|jdkrL|j| |djW  d   W S |jW  d   W S 1 sh0    Y  W n ty   Y dS 0 dS )zb
    Probe the given URL to see if it responds with a 200 status code (to HEAD, then to GET).
    z
User-Agentz-gradio (https://gradio.app/; team@gradio.app)headersi  NF)requestssessionheadstatus_coderJ   ok	Exception)ri   rn   sessZhead_requestr"   r"   r#   	probe_url   s    

 *rv   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warnrl   rv   rk   r"   r"   r#   is_valid_url   s    ry   r   zCommunicator | Nonezdict[str, Any])	websocketrI   	hash_datahelperr4   c                   sZ  d}i }|sRt |  }| s|r|j |jrt 4 I d H J}|j|j	t
|d}|  t j||ddI d H  W d   I d H  q1 I d H s0    Y  t W d    n1 s0    Y  t dI d H  q| }	t
|	}|r|j d|v }
tt|d |d|d	d |d
t |d|
rNt|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 }~0 0 |jj| ||j_ W d    n1 s0    Y  |d dkrt!d|d dkr&| "|I d H  n|d dkrD| "|I d H  |d dk}q|d S )NF)jsonT)Zreturn_exceptionsg{Gz?rZ   r=   rV   rU   rX   Zrank_eta)rT   rV   rU   rX   rY   rW   rZ   outputrI   r?   z Queue is full! Please try again.r>   r@   rA   )#asyncioZcreate_taskrecvdonerc   rh   httpxZAsyncClientpostrf   r}   loadscancelZgatherr   sleepresultrS   r'   rC   rJ   r   r[   rE   rP   rT   r0   re   rt   rd   r`   appendr_   r$   send)rz   rI   r{   r|   Z	completedrespZtaskhttpr   r=   Zhas_progressZstatus_updater~   r   er"   r"   r#   get_pred_from_ws   s`    @$

(r   z
str | None)url_pathhf_tokendirr4   c              	   C  s   |d urt j|dd |r&dd| ini }t|p6t td }|jddd |t| j }t	j
| |ddP}|  t|d}t|j| W d    n1 s0    Y  W d    n1 s0    Y  t| S )	NTexist_okAuthorizationBearer    r   parents)rn   streamwb)osmakedirsr   tempfile
gettempdirsecrets	token_hexmkdirnamero   rJ   raise_for_statusopenshutilcopyfileobjrawr<   resolve)r   r   r   rn   	directory	file_pathrfr"   r"   r#   download_tmp_copy_of_file8  s    Jr   )r   r   r4   c                 C  sN   t |pt td }|jddd |t | j }t| | t	|
 S )Nr   Tr   )r   r   r   r   r   r   r   r   copy2r<   r   )r   r   r   destr"   r"   r#   create_tmp_copy_of_fileI  s
    r   )filenamer4   c                 C  s<   |  drdS t| d }|d ur8|dddd}|S )Nz.vttztext/vttr   zx-wavZwavzx-flacflac)endswith	mimetypes
guess_typereplace)r   mimetyper"   r"   r#   get_mimetypeQ  s    
r   )encodingr4   c                 C  s^   |  dd} t| d }|dkr&dS |d u r2d S t|}|d urZ|drZ|dd  }|S )Nz	audio/wavzaudio/x-wavr   z
audio/flacr   .   )r   r   r   guess_extensionrj   )r   type	extensionr"   r"   r#   get_extensionZ  s    
r   z
str | Path)r   c                 C  sn   t | dP}t| }t|d}tt| }d|d ur>|nd d | W  d    S 1 s`0    Y  d S )Nrbutf-8data: ;base64,)r   base64	b64encodereadr<   r   )r   fileencoded_string
base64_strr   r"   r"   r#   encode_file_to_base64g  s    
r   )urlc                 C  sL   t | }|  t|j}t|d}t| }d|d ur>|nd d | S )Nr   r   r   r   )ro   rJ   r   r   r   contentr<   r   )r   r   r   r   r   r"   r"   r#   encode_url_to_base64t  s    

r   pathc                 C  s    t | } t| rt| S t| S r9   )r<   rl   r   r   r   r"   r"   r#   encode_url_or_file_to_base64  s    r   c                 c  sp   t  }|rdd| ini }tjd| |d,}| D ]}||7 }|V  q4W d    n1 s\0    Y  |V  d S )Nr   r   GETrm   )	bytearrayr   r   Z
iter_bytes)r   r   Zarrrn   r   rI   r"   r"   r#   download_byte_stream  s    &r   ztuple[bytes, str | None]c                 C  s&   t | }| ddd }t||fS )N,r   )r   rsplitr   	b64decode)r   r   rI   r"   r"   r#   decode_base64_to_binary  s    r      r2   )r   	max_bytesr4   c                 C  s\   d dd | D } t|  }||krX||krXt| dkr>qX| dd } t|  }q(| S )zjStrips invalid characters from a filename and ensures that the file_length is less than `max_bytes` bytes.r   c                 S  s    g | ]}|  s|d v r|qS )z._- isalnumrK   charr"   r"   r#   rO     r   z5strip_invalid_filename_characters.<locals>.<listcomp>r   Nr   )joinlenencode)r   r   Zfilename_lenr"   r"   r#   !strip_invalid_filename_characters  s    r   )original_namer4   c                 C  s    d dd | D dd S )zECleans up a Python parameter name to make the API info more readable.r   c                 S  s    g | ]}|  s|d v r|qS )z _r   r   r"   r"   r#   rO     r   z,sanitize_parameter_names.<locals>.<listcomp> _)r   r   lower)r   r"   r"   r#   sanitize_parameter_names  s    r   zstr | Path | None)r   r   r   prefixc           	      C  s   t |pt td }|jddd t| \}}|d ur|d u rt |j}|}d|v r|d|d }||dd d  }|d urt	|}|d u rtj
d||d}ntj
d|d| |d	}|| |  |S )
Nr   Tr   r   r   r   F)deleter   r   )r   r   suffixr   )r   r   r   r   r   r   r   r   r5   r   NamedTemporaryFilewriteflush)	r   r   r   r   r   rI   r   r   file_objr"   r"   r#   decode_base64_to_file  s0    

r   zstr | dict | list)jsnr   c                 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   r   
isinstancer<   r}   r   dumpr   )r   r   r   r"   r"   r#   dict_or_str_to_json_file  s    

r   zdict | list)r   r4   c                 C  s6   t | }t|W  d    S 1 s(0    Y  d S r9   )r   r}   load)r   r   r"   r"   r#   file_to_json  s    
r   ,  )space_idr   timeout_in_secondsc              
   C  s   t jj|dtd}tjd|  dd|i|d}zt j| W n@ t jjy~ } z$tdt	
|  d|W Y d }~n
d }~0 0 d S )	NZgradio_client)tokenZlibrary_nameZlibrary_versionz"https://huggingface.co/api/spaces/z
/sleeptimeseconds)r}   rn   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__ro   r   Zhf_raise_for_statusZHfHubHTTPErrorr&   	SPACE_URLformat)r   r   r   rn   reqerrr"   r"   r#   set_space_timeout  s$    
r  r   r
   )funcr4   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)r  argskwargsr"   r"   r#   synchronize_async  s    r	  c                   @  s   e Zd ZdS )APIInfoParseErrorN)r   r   r    r"   r"   r"   r#   r
    s   r
  dictschemac                 C  s>   d| v r| d S |  drdS |  dr,dS td|  d S )Nr   oneOfanyOfzCannot parse type for )rJ   r
  r  r"   r"   r#   get_type  s    

r  )r  r4   c                 C  s   t | }|i kr(d| d v r dS dS  n|dkr4dS |dkr@dS |d	krLd
S |dkrXdS |dkrddS |dkr| d}d|v rddd |d D }d| dS t|}d| dS nd|dkrddd | d  D }d| dS |dv rddd | | D }|S td |  d!S )"z/Convert the json schema into a python type hintr}   descriptionzDict[Any, Any]r
   nullNoneintegerr2   stringr<   booleanrg   numberzint | floatarrayitemsZprefixItemsz, c                 S  s   g | ]}t |qS r"   json_schema_to_python_typerK   ir"   r"   r#   rO   7  r   z.json_schema_to_python_type.<locals>.<listcomp>zTuple[]zList[objectc              	   S  s0   g | ](\}}| d t | d|d dqS )z: z (r  ))r  rJ   )rK   nvr"   r"   r#   rO   ?  s   Z
propertieszDict(r   )r  r  z | c                 S  s   g | ]}t |qS r"   r  r  r"   r"   r#   rO   F  r   zCannot parse schema N)r  rJ   r   r  r  r
  )r  type_r  elementsZdesrH   r"   r"   r#   r  !  sF    


r  )N)NN)N)N)r   )NNN)N)Nr   )]
__future__r   r   r   r}   r   r   pkgutilr   r   r   rw   concurrent.futuresr   Zdataclassesr   r   r   enumr   pathlibr   	threadingr	   typingr
   r   r   Zfsspec.asynr  r   r   ro   r   Zwebsockets.legacy.protocolr   ZAPI_URLZWS_URLZ
UPLOAD_URLZ
CONFIG_URLZAPI_INFO_URLZRAW_API_INFO_URLZSPACE_FETCHER_URLZ	RESET_URLr   ZSKIP_COMPONENTSZSTATE_COMPONENTZNO_APP_FILEZCONFIG_ERRORZBUILD_ERRORZRUNTIME_ERRORZPAUSEDZINVALID_RUNTIMEget_datar   decodestripr   rt   r   r$   r%   r&   r'   rE   rS   r\   r]   rb   rl   rv   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  
ValueErrorr
  r  r  r"   r"   r"   r#   <module>   s   1
 E 	
   #
  