
    qi56                     V   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 di 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()0    )	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nvidiaovhcloud	replicate	sambanovascalewaytogether	wavespeedzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                      y N r   s    ^/opt/pipecat/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&   0   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&   4   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"   )r5   r7   r6   )selfr5   r6   r7   s       r%   __init__zTaskProviderHelper.__init__H   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.)urlr7   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   r7   )r9   r<   r=   r>   r?   r@   r;   rB   rC   payloadrE   normalized_headerss               r%   prepare_requestz"TaskProviderHelper.prepare_requestM   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#   )r9   rR   rS   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.   r5   r9   r@   s     r%   rF   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.   r5   r   get!_fetch_inference_provider_mappingr7   statusloggerwarning)r9   r?   provider_mappingmappings       r%   rG   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'   rO   rE   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)r9   r>   rO   rE   keyvaluerP   s          r%   rN   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   )r9   r>   r@   s      r%   rH   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)r9   r@   rj   r6   routes        r%   rI   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.)r5   z' provider directly.)
startswithr_   infor5   r   INFERENCE_PROXY_TEMPLATEformatr6   rW   s     r%   rm   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#   r9   rj   r@   s      r%   rn   z!TaskProviderHelper._prepare_route   s    
 r'   rB   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#   r9   r<   r=   rB   s       r%   rK   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#   )r9   r<   r=   rB   r;   s        r%   rM   z,TaskProviderHelper._prepare_payload_as_bytes   s     r'   r"   )__name__
__module____qualname____doc__strr:   r   r+   r   r   rQ   r   bytesrU   rF   r	   rG   r
   rN   rH   rI   rm   rn   rK   rM   r#   r'   r%   r4   r4   E   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'   r4   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
    r5   r6   c                 *    t         |   ||d       y )Nconversationalr5   r6   r7   superr:   r9   r5   r6   	__class__s      r%   r:   zBaseConversationalTask.__init__  s    (XDTUr'   rj   r@   r    c                      y)Nz/v1/chat/completionsr#   r{   s      r%   rn   z%BaseConversationalTask._prepare_route  s    %r'   r<   r=   rB   c                 <    t        d|i|d|j                  i      S )Nmessagesr?   r&   rJ   r}   s       r%   rK   z/BaseConversationalTask._prepare_payload_as_dict  s'     Ji*igG\GhGhijjr'   )r   r   r   r   r   r:   rn   r-   r   r+   r   r	   r   rK   __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)r5   r6   r   )r9   r   s    r%   r:   z%AutoRouterConversationalTask.__init__%  s    &3RSr'   r@   r    c                 R    |j                  d      st        d      | j                  S )rs   rt   z>Cannot select auto-router when using non-Hugging Face API key.)ru   r.   r6   rW   s     r%   rm   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   )r5   hf_model_id
providerIdr^   r7   )r.   r	   )r9   r?   s     r%   rG   z2AutoRouterConversationalTask._prepare_mapping_info2  s1    
 ==>>'!
 	
r'   )r   r   r   r   r:   r   rm   r   r	   rG   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
    r5   r6   c                 *    t         |   ||d       y )Nztext-generationr   r   r   s      r%   r:   zBaseTextGenerationTask.__init__I  s    (XDUVr'   rj   r@   r    c                      y)Nz/v1/completionsr#   r{   s      r%   rn   z%BaseTextGenerationTask._prepare_routeL  s     r'   r<   r=   rB   c                 <    t        d|i|d|j                  i      S )Npromptr?   r   r}   s       r%   rK   z/BaseTextGenerationTask._prepare_payload_as_dictO  s'     Hfg
gGEZEfEfghhr'   )r   r   r   r   r   r:   rn   r   r+   r	   r   rK   r   r   s   @r%   r   r   C  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   rv   ra   s       r%   r]   r]   U  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+   rL   )r   r   rf   rg   s       r%   rL   rL   c  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-   r4   r   r   r   r]   rL   r#   r'   r%   <module>r      sR    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$ b%U& 'U( )U* +U, -U. /U0 1U2 r3U !4T#7O2O-P(P#Q : 
 ;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'   