
    _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 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            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 d(S )0    )	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                     d S N r   s    i/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/huggingface_hub/inference/_providers/_common.pyfilter_noner%   /   s    8;    c                     d S r!   r"   r#   s    r$   r%   r%   1   s    .1cr&   c                 N   t          | t                    rQi }|                                 D ]8\  }}|t          |t          t          f          rt	          |          }|||<   9|S t          | t                    rd | D             S t          dt          |                      )Nc                 h    g | ]/}t          |t          t          f          rt          |          n|0S r"   )
isinstancedictlistr%   ).0vs     r$   
<listcomp>zfilter_none.<locals>.<listcomp>A   s5    RRR*Qt"="=DA1RRRr&   zExpected dict or list, got )r*   r+   itemsr,   r%   
ValueErrortype)r   cleanedkr.   s       r$   r%   r%   5   s    #t "$IIKK 	 	DAqy!dD\** #NNGAJJ#t SRRcRRRR
>499>>
?
??r&   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dS )!TaskProviderHelperz.Base class for task-specific provider helpers.providerbase_urltaskr   Nc                 0    || _         || _        || _        d S r!   )r7   r9   r8   )selfr7   r8   r9   s       r$   __init__zTaskProviderHelper.__init__I   s     	 r&   )extra_payloadinputs
parametersheadersmodelapi_keyr=   c                   |                      |          }|                     |          }|                     ||          }|                     ||j                  }|                     |||          }	|	t          |	t          |pi                     }	|                     ||||          }
|	|
t          d          |	|
t          d          | 
                    ||	|
          }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_infoNz8Both payload and data cannot be set in the same request.z2Either payload or data must be set in the request.)urlr9   rA   jsondatar@   )_prepare_api_key_prepare_mapping_info_prepare_headers_prepare_urlprovider_id_prepare_payload_as_dictrecursive_merger%   _prepare_payload_as_bytesr1   _normalize_headersr	   r9   )r;   r>   r?   r@   rA   rB   r=   rD   rE   payloadrG   normalized_headerss               r$   prepare_requestz"TaskProviderHelper.prepare_requestN   s7     ''00 !% : :5 A A ''99 )>)JKK //
Zo/pp%g{=;NB/O/OPPG --fjBWYfgg 4#3WXXX?t|QRRR "44WgtLL '3&
 
 
 	
r&   responserequest_paramsc                     |S )z
        Return the response in the expected format.

        Override this method in subclasses for customized response handling.r"   )r;   rT   rU   s      r$   get_responsezTaskProviderHelper.get_response   s	     r&   c                 Z    |t                      }|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   r1   r7   r;   rB   s     r$   rH   z#TaskProviderHelper._prepare_api_key   s@     ?kkG?oDMooo   r&   c                    |t          d| j         d          t                              | j        i                               |          rt          | j                 |         S d}t	          |          D ]}|j        | j        k    r|} n|t          d| d| j         d          |j        | j        k    r+t          d| d| j         d| j         d|j         d	          |j        d	k    r&t                              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.)	r1   r7   r   get!_fetch_inference_provider_mappingr9   statusloggerwarning)r;   rA   provider_mappingmappings       r$   rI   z(TaskProviderHelper._prepare_mapping_info   s    =[4=[[[\\\ -00CCGGNN 	K4T]CEJJ8?? 	 	G4=00#*  1 #[e[[4=[[[\\\ DI--< < <49 < <TXTa < <#3#8< < <  
 "i//NNoooooo   "g--NN-u - -VZVc - - -    r&   rQ   rG   c                     d |                                 D             }|                    d          ||j        |j        |d<   n|d|d<   |S )zzNormalize the headers to use for the request.

        Override this method in subclasses for customized headers.
        c                 B    i | ]\  }}||                                 |S r!   )lower)r-   keyvalues      r$   
<dictcomp>z9TaskProviderHelper._normalize_headers.<locals>.<dictcomp>   s,    hhhZS%V[Vgciikk5VgVgVgr&   zcontent-typeNzapplication/json)r0   r^   	mime_type)r;   r@   rQ   rG   rR   s        r$   rP   z%TaskProviderHelper._normalize_headers   si     ih7==??hhh!!.119DN$>59^">22$5G">2!!r&   c                 *    i t          |          |S )zwReturn the headers to use for the request.

        Override this method in subclasses for customized headers.
        )token)r   )r;   r@   rB   s      r$   rJ   z#TaskProviderHelper._prepare_headers   s     
 >"111=W==r&   mapped_modelc                     |                      |          }|                     ||          }|                    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;   rB   rn   r8   routes        r$   rK   zTaskProviderHelper._prepare_url   sX     ))'22##L':://#&&<<c):):<<<r&   c                    |                     d          rHt                              d| j         d           t          j                            | j                  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.)r7   z' provider directly.)
startswithra   infor7   r   INFERENCE_PROXY_TEMPLATEformatr8   rY   s     r$   rq   z$TaskProviderHelper._prepare_base_url   s~    
 e$$ 	!KKZDMZZZ[[[5<<dm<TTTKKGDMGGGHHH= r&   c                     dS )ztReturn the route to use for the request.

        Override this method in subclasses for customized routes.
         r"   r;   rn   rB   s      r$   rr   z!TaskProviderHelper._prepare_route   s	    
 rr&   rD   c                     dS )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?   rD   s       r$   rM   z+TaskProviderHelper._prepare_payload_as_dict   s	     tr&   c                     dS )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?   rD   r=   s        r$   rO   z,TaskProviderHelper._prepare_payload_as_bytes   s	     tr&   r!   )__name__
__module____qualname____doc__strr<   r   r+   r	   rS   bytesrW   rH   r   rI   r   rP   rJ   rK   rq   rr   rM   rO   r"   r&   r$   r6   r6   F   s       88! ! !3 !4 ! ! ! ! 043
 3
 3
 3
 cN	3

 3
 Tz3
 t3
 CH~,3
 
3
 3
 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&   r6   c            	       p     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
    r7   r8   c                 P    t                                          ||d           d S )Nconversationalr7   r8   r9   superr<   r;   r7   r8   	__class__s      r$   r<   zBaseConversationalTask.__init__  s)    (XDTUUUUUr&   rn   rB   r   c                     dS )Nz/v1/chat/completionsr"   r   s      r$   rr   z%BaseConversationalTask._prepare_route  s    %%r&   r>   r?   rD   Nc                 :    t          d|i|d|j        i          S )NmessagesrA   r%   rL   r   s       r$   rM   z/BaseConversationalTask._prepare_payload_as_dict  s*     Ji*igG\Ghiijjjr&   )r   r   r   r   r   r<   rr   r,   r+   r
   r   rM   __classcell__r   s   @r$   r   r   	  s         
V V V V V V V V&3 & & & & & &kT667k k  8	k
 
k k k k k k 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                 N    t                                          dd           d S )Nautozhttps://router.huggingface.co)r7   r8   r   )r;   r   s    r$   r<   z%AutoRouterConversationalTask.__init__&  s'    &3RSSSSSr&   rB   r   c                 X    |                     d          st          d          | j        S )rw   rx   z>Cannot select auto-router when using non-Hugging Face API key.)ry   r1   r8   rY   s     r$   rq   z.AutoRouterConversationalTask._prepare_base_url)  s1    
 !!%(( 	!]^^^= r&   rA   Nc                 L    |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.
        NzPlease provide an HF model ID.r   liver   )r7   hf_model_id
providerIdr`   r9   )r1   r   )r;   rA   s     r$   rI   z2AutoRouterConversationalTask._prepare_mapping_info3  s>    
 ==>>>'!
 
 
 	
r&   )
r   r   r   r   r<   r   rq   r   rI   r   r   s   @r$   r   r     s         T T T T 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
    r7   r8   c                 P    t                                          ||d           d S )Nztext-generationr   r   r   s      r$   r<   zBaseTextGenerationTask.__init__J  s)    (XDUVVVVVr&   rn   rB   r   c                     dS )Nz/v1/completionsr"   r   s      r$   rr   z%BaseTextGenerationTask._prepare_routeM  s      r&   r>   r?   rD   Nc                 :    t          d|i|d|j        i          S )NpromptrA   r   r   s       r$   rM   z/BaseTextGenerationTask._prepare_payload_as_dictP  s*     Hfg
gGEZEfgghhhr&   )r   r   r   r   r   r<   rr   r   r+   r   rM   r   r   s   @r$   r   r   D  s         
W W W W W W W W!3 ! ! ! ! ! !ii'+iD\i	i i i i i i i ir&   r   N)maxsizerA   r   c                     ddl m}  |                                | dg          }|j        }|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_mappingr1   )rA   r   rz   rc   s       r$   r_   r_   V  sd    
 -,,,,,577e-G,HIID6GGGHHHr&   dict1dict2c                 L     i   fd|                                 D             S )Nc                     i | ]R\  }}||v rFt          |         t                    r+t          |t                    rt          |         |          n|SS r"   )r*   r+   rN   )r-   rh   ri   r   s      r$   rj   z#recursive_merge.<locals>.<dictcomp>g  sr     
 
 
 U uE#J!=!=*UTXBYBY !sU333
 
 
r&   )r0   )r   r   s   ` r$   rN   rN   d  sJ    

 
 
 
 $kkmm	
 
 
 r&   )!	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_loggerr   ra   r   r+   r   __annotations__r%   r,   r6   r   r   r   r_   rN   r"   r&   r$   <module>r      s                          % % % % % % ; ; ; ; ; ; J J J J J J J J a a a a a a F F F F F F F F F F 
	H	%	%U U bU U U bU BU BU BU  "!U" b#U$ b%U& b'U( )U* +U, -U. /U0 1U2 5U U U !4T#7O2O-P(P#Q   < 
 ;T#s(^ ;S#X ; ; ; 
 ;	 1T#Y 149 1 1 1 
 1@T#s(^d3i/ @DcNT#Y4N @ @ @ @"@ @ @ @ @ @ @ @Fk k k k k/ k k k*#
 #
 #
 #
 #
#9 #
 #
 #
Li i i i i/ i i i$ 4
S 
T:T5U 
 
 
 
	4 	 	 	 	 	 	 	 	r&   