o
     
j5                     @   s  U 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
mZ d dlmZ d dlmZmZmZ eeZi di d	i d
i di di di di di di di di di di di di di di i i dZeeeeef f ed< edeeef deeef fddZedee dee fddZdeeef ee B deeef ee B fd dZG d!d" d"ZG d#d$ d$eZG d%d& d&eZG d'd( d(eZed)d*d+eded, fd-d.Zd/ed0edefd1d2Z d)S )3    )	lru_cache)Anyoverload)	constants)InferenceProviderMapping)	MimeBytesRequestParameters)ChatCompletionInputMessage)build_hf_headers	get_tokenloggingcerebrascohereclarifai	deepinfrazfal-aizfireworks-aigroqzhf-inference
hyperbolicnebiusnscalenvidiaovhcloud	replicate	sambanovascalewaytogether)	wavespeedzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                 C      d S N r   r!   r!   _/home/kuhnn/.local/lib/python3.10/site-packages/huggingface_hub/inference/_providers/_common.pyfilter_none/      r$   c                 C   r   r    r!   r"   r!   r!   r#   r$   1   r%   c                 C   sv   t | tr&i }|  D ]\}}|d u rqt |ttfrt|}|||< q|S t | tr2dd | D S tdt|  )Nc                 S   s&   g | ]}t |ttfrt|n|qS r!   )
isinstancedictlistr$   ).0vr!   r!   r#   
<listcomp>A   s   & zfilter_none.<locals>.<listcomp>zExpected dict or list, got )r&   r'   itemsr(   r$   
ValueErrortype)r   cleanedkr*   r!   r!   r#   r$   5   s   


c                   @   s  e Zd ZdZdedededdfddZdd	d
edeeef dededB dedB deeef dB defddZ		d,de
eB dedB defddZdedB defddZdedB defddZdeeef deeef dB dedB deeef fddZdededeeef fddZded edefd!d"Zdedefd#d$Zd ededefd%d&Zd
eded'ededB fd(d)Zd
eded'ededB dedB f
d*d+ZdS )-TaskProviderHelperz.Base class for task-specific provider helpers.providerbase_urltaskr   Nc                 C   s   || _ || _|| _d S r    )r2   r4   r3   )selfr2   r3   r4   r!   r!   r#   __init__I   s   
zTaskProviderHelper.__init__)extra_payloadinputs
parametersheadersmodelapi_keyr7   c                C   s   |  |}| |}| ||}| ||j}| j|||d}	|	dur,t|	t|p)i }	| ||||}
|	dur@|
dur@t	d|	du rL|
du rLt	d| 
||	|
}t|| j|j|	|
|dS )z
        Prepare the request to be sent to the provider.

        Each step (api_key, model, headers, url, payload) can be customized in subclasses.
        )provider_mapping_infoNz8Both payload and data cannot be set in the same request.z2Either payload or data must be set in the request.)urlr4   r;   jsondatar:   )_prepare_api_key_prepare_mapping_info_prepare_headers_prepare_urlprovider_id_prepare_payload_as_dictrecursive_merger$   _prepare_payload_as_bytesr-   _normalize_headersr   r4   )r5   r8   r9   r:   r;   r<   r7   r=   r>   payloadr@   normalized_headersr!   r!   r#   prepare_requestN   s*   

z"TaskProviderHelper.prepare_requestresponserequest_paramsc                 C   s   |S )z
        Return the response in the expected format.

        Override this method in subclasses for customized response handling.r!   )r5   rM   rN   r!   r!   r#   get_response   s   	zTaskProviderHelper.get_responsec                 C   s,   |du rt  }|du rtd| j d|S )zZReturn the API key to use for the request.

        Usually not overwritten in subclasses.Nz)You must provide an api_key to work with z$ API or log in with `hf auth login`.)r   r-   r2   r5   r<   r!   r!   r#   rA      s   z#TaskProviderHelper._prepare_api_keyc              
   C   s  |du rt d| j dt| ji |rt| j | S d}t|D ]}|j| jkr0|} nq$|du rAt d| d| j d|j| jkr[t d| d| j d| j d|j d	|jd	krmtd| d
| j d |jdkrtd| d| j d |S )zbReturn the mapped model ID to use for the request.

        Usually not overwritten in subclasses.Nz+Please provide an HF model ID supported by .zModel z is not supported by provider z is not supported for task z and provider z. Supported task: stagingz! is in staging mode for provider z. Meant for test purposes only.errorz,Our latest automated health check on model 'z' for provider 'z<' did not complete successfully.  Inference call might fail.)	r-   r2   r   get!_fetch_inference_provider_mappingr4   statusloggerwarning)r5   r;   provider_mappingmappingr!   r!   r#   rB      s6   

z(TaskProviderHelper._prepare_mapping_inforJ   r@   c                 C   sT   dd |  D }|ddu r(|dur |jdur |j|d< |S |dur(d|d< |S )zzNormalize the headers to use for the request.

        Override this method in subclasses for customized headers.
        c                 S   s"   i | ]\}}|d ur|  |qS r    )lowerr)   keyvaluer!   r!   r#   
<dictcomp>   s   " z9TaskProviderHelper._normalize_headers.<locals>.<dictcomp>zcontent-typeNzapplication/json)r,   rT   	mime_type)r5   r:   rJ   r@   rK   r!   r!   r#   rI      s   
z%TaskProviderHelper._normalize_headersc                 C   s   i t |d|S )zwReturn the headers to use for the request.

        Override this method in subclasses for customized headers.
        )token)r
   )r5   r:   r<   r!   r!   r#   rC      s   z#TaskProviderHelper._prepare_headersmapped_modelc                 C   s0   |  |}| ||}|d d|d S )zVReturn the URL to use for the request.

        Usually not overwritten in subclasses./)_prepare_base_url_prepare_routerstriplstrip)r5   r<   rb   r3   router!   r!   r#   rD      s   
zTaskProviderHelper._prepare_urlc                 C   sH   | drtd| j d tjj| jdS td| j d | jS )[Return the base URL to use for the request.

        Usually not overwritten in subclasses.hf_z	Calling 'z'' provider through Hugging Face router.)r2   z' provider directly.)
startswithrW   infor2   r   INFERENCE_PROXY_TEMPLATEformatr3   rP   r!   r!   r#   rd      s
   
z$TaskProviderHelper._prepare_base_urlc                 C      dS )ztReturn the route to use for the request.

        Override this method in subclasses for customized routes.
         r!   r5   rb   r<   r!   r!   r#   re      s   z!TaskProviderHelper._prepare_router=   c                 C   ro   )zReturn the payload to use for the request, as a dict.

        Override this method in subclasses for customized payloads.
        Only one of `_prepare_payload_as_dict` and `_prepare_payload_as_bytes` should return a value.
        Nr!   r5   r8   r9   r=   r!   r!   r#   rF      s   z+TaskProviderHelper._prepare_payload_as_dictc                 C   ro   )zReturn the body to use for the request, as bytes.

        Override this method in subclasses for customized body data.
        Only one of `_prepare_payload_as_dict` and `_prepare_payload_as_bytes` should return a value.
        Nr!   )r5   r8   r9   r=   r7   r!   r!   r#   rH      s   z,TaskProviderHelper._prepare_payload_as_bytesr    )__name__
__module____qualname____doc__strr6   r   r'   r   rL   bytesrO   rA   r   rB   r   rI   rC   rD   rd   re   rF   rH   r!   r!   r!   r#   r1   F   s|    
	
8
%




r1   c                	       sf   e Zd ZdZdedef fddZdededefd	d
Zdeee	B  dede
dedB fddZ  ZS )BaseConversationalTaskz
    Base class for conversational (chat completion) tasks.
    The schema follows the OpenAI API format defined here: https://platform.openai.com/docs/api-reference/chat
    r2   r3   c                       t  j||dd d S )Nconversationalr2   r3   r4   superr6   r5   r2   r3   	__class__r!   r#   r6        zBaseConversationalTask.__init__rb   r<   r   c                 C   ro   )Nz/v1/chat/completionsr!   rq   r!   r!   r#   re     r%   z%BaseConversationalTask._prepare_router8   r9   r=   Nc                 C      t d|i|d|jiS )Nmessagesr;   r$   rE   rr   r!   r!   r#   rF     s   z/BaseConversationalTask._prepare_payload_as_dict)rs   rt   ru   rv   rw   r6   re   r(   r'   r	   r   rF   __classcell__r!   r!   r   r#   ry   	  s    
ry   c                       sH   e Zd ZdZ fddZdedefddZded	B defd
dZ  Z	S )AutoRouterConversationalTaska  
    Auto-router for conversational tasks.

    We let the Hugging Face router select the best provider for the model, based on availability and user preferences.
    This is a special case since the selection is done server-side (avoid 1 API call to fetch provider mapping).
    c                    s   t  jddd d S )Nautozhttps://router.huggingface.co)r2   r3   r}   )r5   r   r!   r#   r6   &  s   z%AutoRouterConversationalTask.__init__r<   r   c                 C   s   | ds	td| jS )ri   rj   z>Cannot select auto-router when using non-Hugging Face API key.)rk   r-   r3   rP   r!   r!   r#   rd   )  s   
z.AutoRouterConversationalTask._prepare_base_urlr;   Nc                 C   s"   |du rt dtd||dddS )z
        In auto-router, we don't need to fetch provider mapping info.
        We just return a dummy mapping info with provider_id set to the HF model ID.
        NzPlease provide an HF model ID.r   liver{   )r2   hf_model_id
providerIdrV   r4   )r-   r   )r5   r;   r!   r!   r#   rB   3  s   z2AutoRouterConversationalTask._prepare_mapping_info)
rs   rt   ru   rv   r6   rw   rd   r   rB   r   r!   r!   r   r#   r     s
    
r   c                	       s^   e Zd ZdZdedef fddZdededefd	d
Zdedede	dedB fddZ
  ZS )BaseTextGenerationTaskz
    Base class for text-generation (completion) tasks.
    The schema follows the OpenAI API format defined here: https://platform.openai.com/docs/api-reference/completions
    r2   r3   c                    rz   )Nztext-generationr|   r}   r   r   r!   r#   r6   J  r   zBaseTextGenerationTask.__init__rb   r<   r   c                 C   ro   )Nz/v1/completionsr!   rq   r!   r!   r#   re   M  r%   z%BaseTextGenerationTask._prepare_router8   r9   r=   Nc                 C   r   )Npromptr;   r   rr   r!   r!   r#   rF   P  s   z/BaseTextGenerationTask._prepare_payload_as_dict)rs   rt   ru   rv   rw   r6   re   r   r'   r   rF   r   r!   r!   r   r#   r   D  s    r   N)maxsizer;   r   c                 C   s>   ddl m} | j| dgd}|j}|du rtd|  |S )z;
    Fetch provider mappings for a model from the Hub.
    r   )HfApiinferenceProviderMapping)expandNz$No provider mapping found for model )huggingface_hub.hf_apir   
model_infoinference_provider_mappingr-   )r;   r   rl   rY   r!   r!   r#   rU   V  s   rU   dict1dict2c                    s   i   fdd|  D S )Nc                    sD   i | ]\}}|| v rt  | trt |trt | |n|qS r!   )r&   r'   rG   r\   r   r!   r#   r_   g  s     z#recursive_merge.<locals>.<dictcomp>)r,   )r   r   r!   r   r#   rG   d  s   
rG   )!	functoolsr   typingr   r   huggingface_hubr   r   r   !huggingface_hub.inference._commonr   r   :huggingface_hub.inference._generated.types.chat_completionr	   huggingface_hub.utilsr
   r   r   
get_loggerrs   rW   r   r'   rw   __annotations__r$   r(   r1   ry   r   r   rU   rG   r!   r!   r!   r#   <module>   sv    
	
 $2 D&