
    Wi#6                     N   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mZ d dlmZ d dlmZmZmZ  ej(                  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 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ef   ee   f   deeeef   ee   f   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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ovhcloud	replicate	sambanovascalewaytogether	wavespeedzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                      y N r   s    x/home/sietch6/trending-topics-pipeline/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%   3   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e   dee   deeeef      de	fdZ
	 d deeef   dee	   defdZdee   defdZdee   defdZdeeef   deeeef      dee   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e   fdZd	ed
ededee   dee   f
dZy)!TaskProviderHelperz.Base class for task-specific provider helpers.providerbase_urltaskr   Nc                 .    || _         || _        || _        y r!   )r4   r6   r5   )selfr4   r5   r6   s       r$   __init__zTaskProviderHelper.__init__G   s     	 r&   )extra_payloadinputs
parametersheadersmodelapi_keyr:   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.)urlr6   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   r6   )r8   r;   r<   r=   r>   r?   r:   rA   rB   payloadrD   normalized_headerss               r$   prepare_requestz"TaskProviderHelper.prepare_requestL   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"   )r8   rQ   rR   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-   r4   r8   r?   s     r$   rE   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-   r4   r   get!_fetch_inference_provider_mappingr6   statusloggerwarning)r8   r>   provider_mappingmappings       r$   rF   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&   rN   rD   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+   lowerr[   	mime_type)r8   r=   rN   rD   keyvaluerO   s          r$   rM   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   )r8   r=   r?   s      r$   rG   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)r8   r?   ri   r5   routes        r$   rH   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.)r4   z' provider directly.)
startswithr^   infor4   r   INFERENCE_PROXY_TEMPLATEformatr5   rV   s     r$   rl   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"   r8   ri   r?   s      r$   rm   z!TaskProviderHelper._prepare_route   s    
 r&   rA   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"   r8   r;   r<   rA   s       r$   rJ   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"   )r8   r;   r<   rA   r:   s        r$   rL   z,TaskProviderHelper._prepare_payload_as_bytes   s     r&   r!   )__name__
__module____qualname____doc__strr9   r   r*   r   r   rP   r   bytesrT   rE   r	   rF   r
   rM   rG   rH   rl   rm   rJ   rL   r"   r&   r$   r3   r3   D   s   8! ! !3 !4 ! 373
 3
 cN	3

 3
 }3
 #3
  S#X/3
 
3
p 7;	t$	 !!23	 
		
 
# 
# 8C= # =U # J"CH~"08c3h0H"PXYbPc"	c3h"> >s >tCH~ >=C =s =s =
! 
! 
!3   '+D\	$   8	
  ~ 
)	r&   r3   c            	       n     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	e
f      d
e	dedee	   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
    r4   r5   c                 *    t         |   ||d       y )Nconversationalr4   r5   r6   superr9   r8   r4   r5   	__class__s      r$   r9   zBaseConversationalTask.__init__  s    (XDTUr&   ri   r?   r   c                      y)Nz/v1/chat/completionsr"   rz   s      r$   rm   z%BaseConversationalTask._prepare_route  s    %r&   r;   r<   rA   c                 <    t        d|i|d|j                  i      S )Nmessagesr>   r%   rI   r|   s       r$   rJ   z/BaseConversationalTask._prepare_payload_as_dict  s'     Ji*igG\GhGhijjr&   )r~   r   r   r   r   r9   rm   r,   r   r*   r   r	   r   rJ   __classcell__r   s   @r$   r   r     s|    
V V V&3 & & &kU4!;;<=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e   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)r4   r5   r   )r8   r   s    r$   r9   z%AutoRouterConversationalTask.__init__$  s    &3RSr&   r?   r   c                 R    |j                  d      st        d      | j                  S )rr   rs   z>Cannot select auto-router when using non-Hugging Face API key.)rt   r-   r5   rV   s     r$   rl   z.AutoRouterConversationalTask._prepare_base_url'  s(    
 !!%(]^^== r&   r>   c                 <    |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   )r4   hf_model_id
providerIdr]   r6   )r-   r	   )r8   r>   s     r$   rF   z2AutoRouterConversationalTask._prepare_mapping_info1  s1    
 ==>>'!
 	
r&   )r~   r   r   r   r9   r   rl   r   r	   rF   r   r   s   @r$   r   r     s9    T! ! !
8C= 
=U 
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
e   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
    r4   r5   c                 *    t         |   ||d       y )Nztext-generationr   r   r   s      r$   r9   zBaseTextGenerationTask.__init__H  s    (XDUVr&   ri   r?   r   c                      y)Nz/v1/completionsr"   rz   s      r$   rm   z%BaseTextGenerationTask._prepare_routeK  s     r&   r;   r<   rA   c                 <    t        d|i|d|j                  i      S )Npromptr>   r   r|   s       r$   rJ   z/BaseTextGenerationTask._prepare_payload_as_dictN  s'     Hfg
gGEZEfEfghhr&   )r~   r   r   r   r   r9   rm   r   r*   r	   r   rJ   r   r   s   @r$   r   r   B  sf    
W W W!3 ! ! !ii'+iD\i	$ir&   r   N)maxsizer>   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-   )r>   r   ru   r`   s       r$   r\   r\   T  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*   rK   )r   r   re   rf   s       r$   rK   rK   b  sx    
 $kkm	
 U uE#J!=*UTXBY !sU3
 
s   AA)#	functoolsr   typingr   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_loggerr~   r^   r   r*   r   __annotations__r%   r,   r3   r   r   r   r\   rK   r"   r&   r$   <module>r      sE    1 1 % ; J a F F 
		H	%U U bU U bU BU BU BU "U  b!U" b#U$ %U& 'U( )U* +U, -U. /U0 r1U !4T#7O2O-P(P#Q 8 
 ;T#s(^ ;S#X ; 
 ;	 1T#Y 149 1 
 1@U4S>4945 @%S#XPTUXPY@Y:Z @"@ @Fk/ k*#
#9 #
Li/ i$ 4
S 
T:T5U 
 
	4 	 	 	r&   