o
    vZh'                     @   s   U d dl mZ d dlmZmZmZ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 eeZi i i i i i i i i i d
Zeeeee
f f ed< d	eeef d
e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fddZdeded
efddZdS )    )	lru_cache)AnyDictOptionalUnion)	constants)InferenceProviderMapping)RequestParameters)build_hf_headers	get_tokenlogging)
ZcerebrasZcoherezfal-aizfireworks-aizhf-inferenceZ
hyperbolicZnebiusZ	replicateZ	sambanovaZtogether!HARDCODED_MODEL_INFERENCE_MAPPINGdreturnc                 C   s   dd |   D S )Nc                 S   s   i | ]\}}|d ur||qS N ).0kvr   r   [/var/www/auris/lib/python3.10/site-packages/huggingface_hub/inference/_providers/_common.py
<dictcomp>%   s    zfilter_none.<locals>.<dictcomp>items)r   r   r   r   filter_none$   s   r   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dede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   )r   r   r   )selfr   r   r   r   r   r   __init__+   s   
zTaskProviderHelper.__init__)extra_payloadinputs
parametersheadersmodelapi_keyr    c                C   s   |  |}| |}| ||}| ||j}| j|||d}	|	dur*t|	|p(i }	| ||||}
|	dur>|
dur>td|	du rJ|
du rJt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.)urlr   r$   jsondatar#   )_prepare_api_key_prepare_mapping_info_prepare_headers_prepare_urlprovider_id_prepare_payload_as_dictrecursive_merge_prepare_payload_as_bytes
ValueErrorr	   r   )r   r!   r"   r#   r$   r%   r    r&   r'   payloadr)   r   r   r   prepare_request0   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   )r   r5   r6   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 `huggingface-cli login`.)r   r2   r   r   r%   r   r   r   r*   g   s   z#TaskProviderHelper._prepare_api_keyc              
   C   s   |du rt d| j dt| ji |rt| j | S t|| j}|du r6t d| d| j d|j| jkrPt d| d| j d| j d|j d	|jd	krbt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: Zstagingz! is in staging mode for provider z. Meant for test purposes only.)	r2   r   r   get!_fetch_inference_provider_mappingr   statusloggerwarning)r   r$   provider_mappingr   r   r   r+   s   s$   
z(TaskProviderHelper._prepare_mapping_infoc                 C   s   i t |d|S )zwReturn the headers to use for the request.

        Override this method in subclasses for customized headers.
        )token)r
   )r   r#   r%   r   r   r   r,      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)r   r%   rA   r   Zrouter   r   r   r-      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.Zhf_z	Calling 'z'' provider through Hugging Face router.)r   z' provider directly.)
startswithr=   infor   r   ZINFERENCE_PROXY_TEMPLATEformatr   r8   r   r   r   rC      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   r   rA   r%   r   r   r   rD      s   z!TaskProviderHelper._prepare_router&   c                 C   rJ   )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   r   r!   r"   r&   r   r   r   r/      s   z+TaskProviderHelper._prepare_payload_as_dictc                 C   rJ   )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   )r   r!   r"   r&   r    r   r   r   r1      s   z,TaskProviderHelper._prepare_payload_as_bytesr   )__name__
__module____qualname____doc__strr   r   r   r   r	   r4   r   bytesr7   r*   r   r+   r,   r-   rC   rD   r/   r1   r   r   r   r   r   (   sj    
	
/



r   c                	       ^   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 )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
    r   r   c                       t  j||dd d S )NZconversationalr   r   r   superr   r   r   r   	__class__r   r   r         zBaseConversationalTask.__init__rA   r%   r   c                 C   rJ   )Nz/v1/chat/completionsr   rL   r   r   r   rD         z%BaseConversationalTask._prepare_router!   r"   r&   c                 C      d|it |d|jiS )Nmessagesr$   r   r.   rM   r   r   r   r/         z/BaseConversationalTask._prepare_payload_as_dictrN   rO   rP   rQ   rR   r   rD   r   r   r   r   r/   __classcell__r   r   r[   r   rU          rU   c                	       rT   )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
    r   r   c                    rV   )Nztext-generationrW   rX   rZ   r[   r   r   r      r]   zBaseTextGenerationTask.__init__rA   r%   r   c                 C   rJ   )Nz/v1/completionsr   rL   r   r   r   rD      r^   z%BaseTextGenerationTask._prepare_router!   r"   r&   c                 C   r_   )Npromptr$   ra   rM   r   r   r   r/      rb   z/BaseTextGenerationTask._prepare_payload_as_dictrc   r   r   r[   r   rf      re   rf   N)maxsizer$   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   )HfApiZinferenceProviderMapping)expandNz$No provider mapping found for model )huggingface_hub.hf_apiri   Z
model_infoZinference_provider_mappingr2   )r$   ri   rH   r?   r   r   r   r;      s   r;   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   )
isinstancedictr0   )r   keyvaluerl   r   r   r      s     z#recursive_merge.<locals>.<dictcomp>r   )rl   rm   r   rr   r   r0      s   
r0   )	functoolsr   typingr   r   r   r   Zhuggingface_hubr   rk   r   Z!huggingface_hub.inference._commonr	   Zhuggingface_hub.utilsr
   r   r   Z
get_loggerrN   r=   r   rR   __annotations__r   r   rU   rf   r;   r0   r   r   r   r   <module>   s4    
" "