o
    iU0                     @   s  U d dl mZ d dlmZmZmZmZ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 i i i i i i i i i i i 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ef ee f deeeef ee f fddZG dd d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dedefddZ!dS )     )	lru_cache)AnyDictListOptionalUnionoverload)	constants)InferenceProviderMapping)	MimeBytesRequestParameters)ChatCompletionInputMessage)build_hf_headers	get_tokenlogging)cerebrascohereclarifaizfal-aizfireworks-aigroqzhf-inference
hyperbolicnebiusnscale	replicate	sambanovascalewaytogetherzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                 C      d S N r   r!   r!   `/home/ubuntu/.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$   -   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>=   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$   1   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e dee deeeef  de	fddZ
	d,deeef dee	 defddZdee defddZdee defddZdeeef deeeef  dee 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e fd(d)Zd
eded'edee dee 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__E   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_requestJ   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 )z[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   rn   )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   rn   )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   r   rL   r   bytesrO   rA   r
   rB   r   rI   rC   rD   rd   re   rF   rH   r!   r!   r!   r#   r1   B   s|    
	
8

%




r1   c                	       sj   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	e
f  de	dedee	 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   rn   )Nz/v1/chat/completionsr!   rp   r!   r!   r#   re     r%   z%BaseConversationalTask._prepare_router8   r9   r=   c                 C      t d|i|d|jiS )Nmessagesr;   r$   rE   rq   r!   r!   r#   rF     s   z/BaseConversationalTask._prepare_payload_as_dict)rr   rs   rt   ru   rv   r6   re   r   r   r   r   r
   r   rF   __classcell__r!   r!   r   r#   rx     s    rx   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
e 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                    ry   )Nztext-generationr{   r|   r~   r   r!   r#   r6      r   zBaseTextGenerationTask.__init__rb   r<   r   c                 C   rn   )Nz/v1/completionsr!   rp   r!   r!   r#   re   #  r%   z%BaseTextGenerationTask._prepare_router8   r9   r=   c                 C   r   )Npromptr;   r   rq   r!   r!   r#   rF   &  s   z/BaseTextGenerationTask._prepare_payload_as_dict)rr   rs   rt   ru   rv   r6   re   r   r   r
   r   rF   r   r!   r!   r   r#   r     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   rk   rY   r!   r!   r#   rU   ,  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_   =  s     z#recursive_merge.<locals>.<dictcomp>)r,   )r   r   r!   r   r#   rG   :  s   
rG   )"	functoolsr   typingr   r   r   r   r   r   huggingface_hubr	   r   r
   !huggingface_hub.inference._commonr   r   :huggingface_hub.inference._generated.types.chat_completionr   huggingface_hub.utilsr   r   r   
get_loggerrr   rW   r   rv   __annotations__r$   r1   rx   r   rU   rG   r!   r!   r!   r#   <module>   sH     
$: D