o
    wik                  
   @   s   zd dl Z W n ey Z zededZ[ww d dlZd dlZd dlZd dlmZ d dl	Z
d dlT 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 dd Zdd ZG dd deZdS )    NzThe installation does not include http support. Specify 'http' or 'all' while installing the tritonclient package to include the support)quote)*)
InferInputInferRequestedOutput   )InferenceServerClientBase)InferenceServerClientPlugin)Request   )InferResult)_get_inference_request_get_query_stringc              
      s   | j dkrMd}z%|  I dH }|d}t|rt|nddi}t|d t| j dW S  tyL } ztd| t| j |dW  Y d}~S d}~ww dS )	z
    Returns the :py:class:`InferenceServerException` object if response
    indicates the error. If no error then return None
       Nzutf-8errorz2client received an empty response from the server.)msgstatuszAan exception occurred in the client while decoding the response: )r   r   debug_details)	r   readdecodelenjsonloadsInferenceServerExceptionstr	Exception)responsebodyresulterror_responsee r    [/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/tritonclient/http/aio/__init__.py
_get_error6   s,   

r"   c                    s    t | I dH }|dur|dS )zi
    Raise :py:class:`InferenceServerException` if received non-Success
    response from the server
    N)r"   )r   r   r    r    r!   _raise_if_errorR   s
   r#   c                       s  e Zd ZdZ					dF fdd	Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd ZdGddZdGddZ	dHddZdGddZ	dHdd Z	dHd!d"ZdGd#d$Z	dId%d&Z	dJd'd(Z	dKd)d*Zdi ddfd+d,Z	dLd-d.ZdGd/d0ZdGd1d2Z	dHd3d4Z	dMd6d7Z	dHd8d9Z	dHd:d;Z	dGd<d=Z	dHd>d?Ze 			5			5		dNd@dAZ!e 	dOdBdCZ"				5			5						dPdDdEZ#  Z$S )QInferenceServerClientad  This feature is currently in beta and may be subject to change.

    An analogy of the :py:class:`tritonclient.http.InferenceServerClient` to enable
    calling via asyncio syntax. The object is intended to be used by a single
    thread and simultaneously calling methods with different threads is not
    supported and can cause undefined behavior.

    Fd         N@Nc                    s   t    |ds|drtd |rdnd}||d dkr"|n|d d  | _tj||d| _tj| jtj	|ddd	| _
|| _d S )
Nzhttp://zhttps://z!url should not include the scheme/)ssllimit)totalF)	connectortimeoutauto_decompress)super__init__
startswithraise_error_urlaiohttpTCPConnector_connClientSessionClientTimeout_stub_verbose)selfurlverbose
conn_limitconn_timeoutr)   ssl_contextscheme	__class__r    r!   r0   f   s   
	"

zInferenceServerClient.__init__c                    s   | S Nr    r;   r    r    r!   
__aenter__|   s   z InferenceServerClient.__aenter__c                    s   |   I d H  d S rD   )close)r;   typevalue	tracebackr    r    r!   	__aexit__   s   zInferenceServerClient.__aexit__c                    s&   | j  I dH  | j I dH  dS )zWClose the client. Any future calls to server
        will result in an Error.

        N)r9   rG   r6   rE   r    r    r!   rG      s   zInferenceServerClient.closec                    s   t |}| | |j}| | | jd | }|dur%|d t| }| jr0td|| | j	j
|| |dI dH }| jrEt| |S )a  Issues the GET request to the server

        Parameters
        ----------
        request_uri: str
            The request URI to be used in GET request.
        headers: dict
            Additional HTTP headers to include in the request.
        query_params: dict
            Optional url query parameters to use in network
            transaction.

        Returns
        -------
        aiohttp.ClientResponse
            The response from server.

        r(   N?zGET {}, headers {})r<   headers)r	   _call_pluginrM   _validate_headersr3   r   r:   printformatr9   get_fix_header)r;   request_urirM   query_paramsrequestreq_urlresr    r    r!   _get   s   

zInferenceServerClient._getc                    s   t |}| | |j}| | | jd | }|dur%|d t| }| jr1td||| t	|t
r:| }| jj||| |dI dH }| jrPt| |S )a  Issues the POST request to the server

        Parameters
        ----------
        request_uri: str
            The request URI to be used in POST request.
        request_body: str
            The body of the request
        headers: dict
            Additional HTTP headers to include in the request.
        query_params: dict
            Optional url query parameters to use in network
            transaction.

        Returns
        -------
        aiohttp.ClientResponse
            The response from server.
        r(   NrL   zPOST {}, headers {}
{})r<   datarM   )r	   rN   rM   rO   r3   r   r:   rP   rQ   
isinstancer   encoder9   postrS   )r;   rT   request_bodyrM   rU   rV   rW   rX   r    r    r!   _post   s$   


zInferenceServerClient._postc                 C   s2   |sdS dd |  D }d|v rtd dS dS )aR  Checks for any unsupported HTTP headers before processing a request.

        Parameters
        ----------
        headers: dict
            HTTP headers to validate before processing the request.

        Raises
        ------
        InferenceServerException
            If an unsupported HTTP header is included in a request.
        Nc                 S   s   i | ]	\}}|  |qS r    )lower).0kvr    r    r!   
<dictcomp>   s    z;InferenceServerClient._validate_headers.<locals>.<dictcomp>ztransfer-encodingzUnsupported HTTP header: 'Transfer-Encoding' is not supported in the Python client library. Use raw HTTP request libraries or the C++ client instead for this header.)itemsr2   )r;   rM   headers_lowercaser    r    r!   rO      s   z'InferenceServerClient._validate_headersc                 C   s6   |du rdS i }|  D ]\}}t||t|< q|S )zReturns a header that is valid for aiohttp.

        Parameters
        ----------
        headers: dict (or None)
            HTTP headers to fix before processing the request.

        N)re   r   )r;   rM   
fix_headerkeyrI   r    r    r!   rS      s   	z!InferenceServerClient._fix_headerc                    &   d}| j |||dI dH }|jdkS )zJRefer to :py:meth:`tritonclient.http.InferenceServerClient.is_server_live`zv2/health/liverT   rM   rU   Nr   rY   r   r;   rM   rU   rT   r   r    r    r!   is_server_live     
z$InferenceServerClient.is_server_livec                    ri   )zKRefer to :py:meth:`tritonclient.http.InferenceServerClient.is_server_ready`zv2/health/readyrj   Nr   rk   rl   r    r    r!   is_server_ready  rn   z%InferenceServerClient.is_server_ready c                    s^   t |tkrtd |dkrdt||}ndt|}| j|||dI dH }|jdkS )zJRefer to :py:meth:`tritonclient.http.InferenceServerClient.is_model_ready`model version must be a stringrp   zv2/models/{}/versions/{}/readyzv2/models/{}/readyrj   Nr   )rH   r   r2   rQ   r   rY   r   )r;   
model_namemodel_versionrM   rU   rT   r   r    r    r!   is_model_ready   s   
z$InferenceServerClient.is_model_readyc                    P   d}| j |||dI dH }t|I dH  | I dH }| jr#t| t|S )zORefer to :py:meth:`tritonclient.http.InferenceServerClient.get_server_metadata`v2rj   NrY   r#   r   r:   rP   r   r   r;   rM   rU   rT   r   contentr    r    r!   get_server_metadata3  s   
z)InferenceServerClient.get_server_metadatac                    s   t |tkrtd |dkrdt||}ndt|}| j|||dI dH }t|I dH  | I dH }| jr?t	| t
|S )zNRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_model_metadata`rq   rp   zv2/models/{}/versions/{}zv2/models/{}rj   NrH   r   r2   rQ   r   rY   r#   r   r:   rP   r   r   r;   rr   rs   rM   rU   rT   r   ry   r    r    r!   get_model_metadataA  s    
z(InferenceServerClient.get_model_metadatac                    st   |dkrd t||}nd t|}| j|||dI dH }t|I dH  | I dH }| jr5t| t|S )zLRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_model_config`rp   zv2/models/{}/versions/{}/configzv2/models/{}/configrj   N	rQ   r   rY   r#   r   r:   rP   r   r   r|   r    r    r!   get_model_configY  s   
z&InferenceServerClient.get_model_configc                    sR   d}| j |d||dI dH }t|I dH  | I dH }| jr$t| t|S )zVRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_model_repository_index`zv2/repository/indexrp   rT   r^   rM   rU   N)r_   r#   r   r:   rP   r   r   rx   r    r    r!   get_model_repository_indexo  s   
z0InferenceServerClient.get_model_repository_indexc                    s   d t|}i }|durd|vri |d< ||d d< |dur:| D ]\}}	d|vr0i |d< t|	|d |< q$| j|t|||dI dH }
t|
I dH  | j	r\t
d | dS dS )zFRefer to :py:meth:`tritonclient.http.InferenceServerClient.load_model`zv2/repository/models/{}/loadN
parametersconfigr   Loaded model '{}')rQ   r   re   base64	b64encoder_   r   dumpsr#   r:   rP   )r;   rr   rM   rU   r   filesrT   load_requestpathry   r   r    r    r!   
load_model  s,   z InferenceServerClient.load_modelc                    sd   d t|}dd|ii}| j|t|||dI dH }t|I dH  | jr0td | dS dS )zHRefer to :py:meth:`tritonclient.http.InferenceServerClient.unload_model`zv2/repository/models/{}/unloadr   unload_dependentsr   Nr   )rQ   r   r_   r   r   r#   r:   rP   )r;   rr   rM   rU   r   rT   unload_requestr   r    r    r!   unload_model  s   z"InferenceServerClient.unload_modelc                    s   |dkr$t |tkrtd |dkrdt||}n
dt|}nd}| j|||dI dH }t|I dH  | I dH }| jrFt	| t
|S )zTRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_inference_statistics`rp   rq   zv2/models/{}/versions/{}/statszv2/models/{}/statszv2/models/statsrj   Nr{   r|   r    r    r!   get_inference_statistics  s$   
z.InferenceServerClient.get_inference_statisticsc                    sx   |dur|dkrd t|}nd}| j|t|||dI dH }t|I dH  | I dH }| jr7t| t	|S )zQRefer to :py:meth:`tritonclient.http.InferenceServerClient.update_trace_settings`Nrp   v2/models/{}/trace/settingv2/trace/settingr   )
rQ   r   r_   r   r   r#   r   r:   rP   r   )r;   rr   settingsrM   rU   rT   r   ry   r    r    r!   update_trace_settings  s   
z+InferenceServerClient.update_trace_settingsc                    sp   |dur|dkrd t|}nd}| j|||dI dH }t|I dH  | I dH }| jr3t| t|S )zNRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_trace_settings`Nrp   r   r   rj   r~   )r;   rr   rM   rU   rT   r   ry   r    r    r!   get_trace_settings  s   
z(InferenceServerClient.get_trace_settingsc                    sX   d}| j |t|||dI dH }t|I dH  | I dH }| jr't| t|S )zORefer to :py:meth:`tritonclient.http.InferenceServerClient.update_log_settings`
v2/loggingr   N)r_   r   r   r#   r   r:   rP   r   )r;   r   rM   rU   rT   r   ry   r    r    r!   update_log_settings  s   
z)InferenceServerClient.update_log_settingsc                    ru   )zLRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_log_settings`r   rj   Nrw   rx   r    r    r!   get_log_settings  s   
z&InferenceServerClient.get_log_settingsc                    h   |dkrd t|}nd}| j|||dI dH }t|I dH  | I dH }| jr/t| t|S )z[Refer to :py:meth:`tritonclient.http.InferenceServerClient.get_system_shared_memory_status`rp   z&v2/systemsharedmemory/region/{}/statuszv2/systemsharedmemory/statusrj   Nr~   r;   region_namerM   rU   rT   r   ry   r    r    r!   get_system_shared_memory_status     
z5InferenceServerClient.get_system_shared_memory_statusr   c                    sh   d t|}|||d}t|}	| j||	||dI dH }
t|
I dH  | jr2td | dS dS )zYRefer to :py:meth:`tritonclient.http.InferenceServerClient.register_system_shared_memory`z(v2/systemsharedmemory/region/{}/register)rh   offset	byte_sizer   Nz.Registered system shared memory with name '{}'rQ   r   r   r   r_   r#   r:   rP   )r;   namerh   r   r   rM   rU   rT   register_requestr^   r   r    r    r!   register_system_shared_memory&  s   
z3InferenceServerClient.register_system_shared_memoryc                    t   |dkrd t|}nd}| j|d||dI dH }t|I dH  | jr8|dkr2td | dS td dS dS )z[Refer to :py:meth:`tritonclient.http.InferenceServerClient.unregister_system_shared_memory`rp   z*v2/systemsharedmemory/region/{}/unregisterz v2/systemsharedmemory/unregisterr   Nz0Unregistered system shared memory with name '{}'z-Unregistered all system shared memory regionsrQ   r   r_   r#   r:   rP   r;   r   rM   rU   rT   r   r    r    r!   unregister_system_shared_memory9  s$   z5InferenceServerClient.unregister_system_shared_memoryc                    r   )zYRefer to :py:meth:`tritonclient.http.InferenceServerClient.get_cuda_shared_memory_status`rp   z$v2/cudasharedmemory/region/{}/statuszv2/cudasharedmemory/statusrj   Nr~   r   r    r    r!   get_cuda_shared_memory_statusQ  r   z3InferenceServerClient.get_cuda_shared_memory_statusc                    sl   d t|}d|i||d}t|}	| j||	||dI dH }
t|
I dH  | jr4td | dS dS )zWRefer to :py:meth:`tritonclient.http.InferenceServerClient.register_cuda_shared_memory`z&v2/cudasharedmemory/region/{}/registerb64)
raw_handle	device_idr   r   Nz,Registered cuda shared memory with name '{}'r   )r;   r   r   r   r   rM   rU   rT   r   r^   r   r    r    r!   register_cuda_shared_memoryg  s"   
z1InferenceServerClient.register_cuda_shared_memoryc                    r   )zYRefer to :py:meth:`tritonclient.http.InferenceServerClient.unregister_cuda_shared_memory`rp   z(v2/cudasharedmemory/region/{}/unregisterzv2/cudasharedmemory/unregisterr   Nz.Unregistered cuda shared memory with name '{}'z+Unregistered all cuda shared memory regionsr   r   r    r    r!   unregister_cuda_shared_memory~  s    z3InferenceServerClient.unregister_cuda_shared_memoryc	           	      C   s   t | ||||||||d	S )zQRefer to :py:meth:`tritonclient.http.InferenceServerClient.generate_request_body`	inputs
request_idoutputssequence_idsequence_startsequence_endpriorityr-   custom_parameters)r   )	r   r   r   r   r   r   r   r-   r   r    r    r!   generate_request_body  s   z+InferenceServerClient.generate_request_bodyc                 C   s   t | |||S )zORefer to :py:meth:`tritonclient.http.InferenceServerClient.parse_response_body`)r   from_response_body)response_bodyr=   header_lengthcontent_encodingr    r    r!   parse_response_body  s   z)InferenceServerClient.parse_response_bodyc                    sb  t |||||||	|
|d	\}}|dkr$|du ri }d|d< t|}n|dkr7|du r.i }d|d< t|}|dkrF|du rAi }d|d< n|dkrT|du rPi }d|d< |durb|du r^i }||d< t|tkrltd |d	kryd
t||}ndt|}| j	||||dI dH }t
|I dH  |jdd}|jdd}| I dH }t|| j||S )zARefer to :py:meth:`tritonclient.http.InferenceServerClient.infer`r   gzipNzContent-EncodingdeflatezAccept-EncodingzInference-Header-Content-Lengthrq   rp   zv2/models/{}/versions/{}/inferzv2/models/{}/inferr   )r   r   compresszlibrH   r   r2   rQ   r   r_   r#   rM   rR   r   r   r   r:   )r;   rr   r   rs   r   r   r   r   r   r   r-   rM   rU   request_compression_algorithmresponse_compression_algorithmr   r^   	json_sizerT   r   r   r   r   r    r    r!   infer  sl   



zInferenceServerClient.infer)Fr%   r&   FN)NN)rp   NN)NNNN)NNF)rp   rp   NN)NNN)r   NN)Nrp   r   FFr   NN)FNN)rp   Nrp   r   FFr   NNNNNN)%__name__
__module____qualname____doc__r0   rF   rK   rG   rY   r_   rO   rS   rm   ro   rt   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   __classcell__r    r    rB   r!   r$   \   s    '-

	


















r$   )r4   ModuleNotFoundErrorr   RuntimeErrorr   r   r   urllib.parser   	rapidjsonr   tritonclient.httpr   r   _clientr   _pluginr   _requestr	   _infer_resultr   _utilsr   r   r"   r#   r$   r    r    r    r!   <module>   s2   
