
    \j5                        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j$                  e      Z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       Zed
ee   dee   fd       Zd
eeef   ee   z  deeef   ee   z  fdZ G d d      Z G d de      Z G d de      Z G d de      Z ed      deded   fd       ZdededefdZ y)    )	lru_cache)Anyoverload)	constants)InferenceProviderMapping)	MimeBytesRequestParameters)ChatCompletionInputMessage)build_hf_headers	get_tokenlogging)cerebrascohere	deepinfrazfal-aizfireworks-aigroqzhf-inferencenscaleovhcloud	replicatescalewaytogether	wavespeedzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                      y N r   s    _/root/.hermes/venv/lib/python3.12/site-packages/huggingface_hub/inference/_providers/_common.pyfilter_noner    *   s    8;    c                      y r   r   r   s    r   r    r    ,   s    .1r!   c                 f   t        | t              rEi }| j                         D ].  \  }}|	t        |t        t        f      rt	        |      }|||<   0 |S t        | t              r1| D cg c]%  }t        |t        t        f      rt	        |      n|' c}S t        dt        |              c c}w )NzExpected dict or list, got )
isinstancedictitemslistr    
ValueErrortype)r   cleanedkvs       r   r    r    0   s    #t"$IIK 	DAqy!dD\*NGAJ	 #tNQR*Qt"=A1DRR
249+>
?? Ss   **B.c                      e Zd ZdZdedededdfdZddd	ed
eeef   dededz  dedz  deeef   dz  defdZ		 d de
ez  dedz  defdZdedz  defdZdedz  defdZdeeef   deeef   dz  dedz  deeef   fdZdededeeef   fdZdededefdZdedefdZdededefdZd	ed
edededz  fdZd	ed
edededz  dedz  f
dZy)!TaskProviderHelperz.Base class for task-specific provider helpers.providerbase_urltaskr   Nc                 .    || _         || _        || _        y r   )r/   r1   r0   )selfr/   r0   r1   s       r   __init__zTaskProviderHelper.__init__D   s     	 r!   )extra_payloadinputs
parametersheadersmodelapi_keyr5   c                   | j                  |      }| j                  |      }| j                  ||      }| j                  ||j                        }| j                  |||      }	|	t        |	t        |xs i             }	| j                  ||||      }
|	|
t        d      |	|
t        d      | j                  ||	|
      }t        || j                  |j                  |	|
|      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_infoz8Both payload and data cannot be set in the same request.z2Either payload or data must be set in the request.)urlr1   r9   jsondatar8   )_prepare_api_key_prepare_mapping_info_prepare_headers_prepare_urlprovider_id_prepare_payload_as_dictrecursive_merger    _prepare_payload_as_bytesr(   _normalize_headersr	   r1   )r3   r6   r7   r8   r9   r:   r5   r<   r=   payloadr?   normalized_headerss               r   prepare_requestz"TaskProviderHelper.prepare_requestI   s     ''0 !% : :5 A ''9 )>)J)JK //
Zo/p%g{=;NB/OPG --fjBWYfg 4#3WXX?t|QRR "44WgtL '33&
 	
r!   responserequest_paramsc                     |S )z
        Return the response in the expected format.

        Override this method in subclasses for customized response handling.r   )r3   rL   rM   s      r   get_responsezTaskProviderHelper.get_response~   s	     r!   c                 T    |
t               }|t        d| j                   d      |S )zZReturn the API key to use for the request.

        Usually not overwritten in subclasses.z)You must provide an api_key to work with z$ API or log in with `hf auth login`.)r   r(   r/   r3   r:   s     r   r@   z#TaskProviderHelper._prepare_api_key   s:     ?kG?;DMM?Jno  r!   c                    |t        d| j                   d      t        j                  | j                  i       j                  |      rt        | j                     |   S d}t	        |      D ]  }|j                  | j                  k(  s|} n |t        d| d| j                   d      |j
                  | j
                  k7  r6t        d| d| j
                   d| j                   d|j
                   d	      |j                  d	k(  r&t        j                  d| d
| j                   d       |j                  dk(  r&t        j                  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(   r/   r   get!_fetch_inference_provider_mappingr1   statusloggerwarning)r3   r9   provider_mappingmappings       r   rA   z(TaskProviderHelper._prepare_mapping_info   s    =J4==/YZ[\\ -00CGGN4T]]CEJJ8? 	G4==0#* 	
 #veW,J4==/YZ[\\  DII-:499+^TXTaTaSb c##3#8#8"9< 
 ""i/NN@Ono ""g-NN>ugEUVZVcVcUd e- -  r!   rI   r?   c                     |j                         D ci c]  \  }}|	|j                         | }}}|j                  d      &||j                  |j                  |d<   |S |d|d<   |S c c}}w )zzNormalize the headers to use for the request.

        Override this method in subclasses for customized headers.
        zcontent-typezapplication/json)r&   lowerrV   	mime_type)r3   r8   rI   r?   keyvaluerJ   s          r   rH   z%TaskProviderHelper._normalize_headers   s     DK==?hZS%V[Vgciik50hh!!.19DNN$>59^^">2 "! $5G">2!! is
   
A.A.c                 "    i t        |      |S )zwReturn the headers to use for the request.

        Override this method in subclasses for customized headers.
        )token)r   )r3   r8   r:   s      r   rB   z#TaskProviderHelper._prepare_headers   s    
 >"1=W==r!   mapped_modelc                     | j                  |      }| j                  ||      }|j                  d       d|j                  d       S )zVReturn the URL to use for the request.

        Usually not overwritten in subclasses./)_prepare_base_url_prepare_routerstriplstrip)r3   r:   rd   r0   routes        r   rC   zTaskProviderHelper._prepare_url   sK     ))'2##L'://#&'qc):(;<<r!   c                    |j                  d      rMt        j                  d| j                   d       t        j
                  j                  | j                        S t        j                  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.)r/   z' provider directly.)
startswithrY   infor/   r   INFERENCE_PROXY_TEMPLATEformatr0   rQ   s     r   rg   z$TaskProviderHelper._prepare_base_url   sn    
 e$KK)DMM?2YZ[55<<dmm<TTKK)DMM?2FGH== r!   c                      y)ztReturn the route to use for the request.

        Override this method in subclasses for customized routes.
         r   r3   rd   r:   s      r   rh   z!TaskProviderHelper._prepare_route   s    
 r!   r<   c                      y)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   r3   r6   r7   r<   s       r   rE   z+TaskProviderHelper._prepare_payload_as_dict   s     r!   c                      y)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   )r3   r6   r7   r<   r5   s        r   rG   z,TaskProviderHelper._prepare_payload_as_bytes   s     r!   r   )__name__
__module____qualname____doc__strr4   r   r%   r	   rK   bytesrO   r@   r   rA   r   rH   rB   rC   rg   rh   rE   rG   r   r!   r   r.   r.   A   s   8! ! !3 !4 ! 043
 3
 cN	3

 3
 Tz3
 t3
 CH~,3
 
3
p 48	$,	 *D0	 
		
d
 
s 
# 3: # :R # J"CH~"04S#X0E"MVY]M]"	c3h"> >s >tCH~ >=C =s =s =
! 
! 
!3   '+D\	   8	
 d{ 
T	r!   r.   c            	       j     e Zd ZdZdedef fdZdededefdZd	eee	z     d
ede
dedz  fdZ x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/   r0   c                 *    t         |   ||d       y )Nconversationalr/   r0   r1   superr4   r3   r/   r0   	__class__s      r   r4   zBaseConversationalTask.__init__
  s    (XDTUr!   rd   r:   r   c                      y)Nz/v1/chat/completionsr   ru   s      r   rh   z%BaseConversationalTask._prepare_route  s    %r!   r6   r7   r<   Nc                 <    t        d|i|d|j                  i      S )Nmessagesr9   r    rD   rw   s       r   rE   z/BaseConversationalTask._prepare_payload_as_dict  s'     Ji*igG\GhGhijjr!   )ry   rz   r{   r|   r}   r4   rh   r'   r%   r
   r   rE   __classcell__r   s   @r   r   r     sw    
V V V&3 & & &kT667k k  8	k
 
kr!   r   c                   H     e Zd ZdZ fdZdedefdZdedz  defdZ x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                 (    t         |   dd       y )Nautozhttps://router.huggingface.co)r/   r0   r   )r3   r   s    r   r4   z%AutoRouterConversationalTask.__init__!  s    &3RSr!   r:   r   c                 R    |j                  d      st        d      | j                  S )rm   rn   z>Cannot select auto-router when using non-Hugging Face API key.)ro   r(   r0   rQ   s     r   rg   z.AutoRouterConversationalTask._prepare_base_url$  s(    
 !!%(]^^== r!   r9   Nc                 <    |t        d      t        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.
        zPlease provide an HF model ID.r   liver   )r/   hf_model_id
providerIdrX   r1   )r(   r   )r3   r9   s     r   rA   z2AutoRouterConversationalTask._prepare_mapping_info.  s1    
 ==>>'!
 	
r!   )
ry   rz   r{   r|   r4   r}   rg   r   rA   r   r   s   @r   r   r     s9    T! ! !
3: 
:R 
r!   r   c            	       ^     e Zd ZdZdedef fdZdededefdZd	ed
ede	dedz  fdZ
 x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
    r/   r0   c                 *    t         |   ||d       y )Nztext-generationr   r   r   s      r   r4   zBaseTextGenerationTask.__init__E  s    (XDUVr!   rd   r:   r   c                      y)Nz/v1/completionsr   ru   s      r   rh   z%BaseTextGenerationTask._prepare_routeH  s     r!   r6   r7   r<   Nc                 <    t        d|i|d|j                  i      S )Npromptr9   r   rw   s       r   rE   z/BaseTextGenerationTask._prepare_payload_as_dictK  s'     Hfg
gGEZEfEfghhr!   )ry   rz   r{   r|   r}   r4   rh   r   r%   r   rE   r   r   s   @r   r   r   ?  sf    
W W W!3 ! ! !ii'+iD\i	ir!   r   N)maxsizer9   r   c                 |    ddl m}  |       j                  | dg      }|j                  }|t	        d|        |S )z;
    Fetch provider mappings for a model from the Hub.
    r   )HfApiinferenceProviderMapping)expandz$No provider mapping found for model )huggingface_hub.hf_apir   
model_infoinference_provider_mappingr(   )r9   r   rp   r[   s       r   rW   rW   Q  sM    
 -7e-G,HID66?wGHHr!   dict1dict2c           
          i | |j                         D ci c]>  \  }}||| v r2t        | |   t              rt        |t              rt        | |   |      n|@ c}}S c c}}w r   )r&   r$   r%   rF   )r   r   r`   ra   s       r   rF   rF   _  sx    
 $kkm	
 U uE#J!=*UTXBY !sU3
 
s   AA)!	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_loggerry   rY   r   r%   r}   __annotations__r    r'   r.   r   r   r   rW   rF   r   r!   r   <module>r      s      % ; J a F F 
		H	% +U !4T#7O2O-P(P#Q 2 
 ;T#s(^ ;S#X ; 
 ;	 1T#Y 149 1 
 1@T#s(^d3i/ @DcNT#Y4N @"@ @Fk/ k*#
#9 #
Li/ i$ 4
S 
T:T5U 
 
	4 	 	 	r!   