
    {bj7                        % S SK Jr  S SKJrJr  S SKJr  S SKJr  S SK	J
r
Jr  S SKJr  S SKJrJrJr  \R$                  " \5      r0 0 0 0 0 0 0 0 0 0 0 0 0 0 S.r\\\\\4   4   \S	'   \S
\\\4   S\\\4   4S j5       r\S
\\   S\\   4S j5       rS
\\\4   \\   -  S\\\4   \\   -  4S jr " S S5      r " S S\5      r " S S\5      r " S S\5      r\" SS9S\S\S   4S j5       rS\S\S\4S jr g)    )	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                     g N r   s    ڨ/tmp/claude-0/-home-danvics-docker-quiz/c1e0577a-e42c-4a3d-b1ea-3edd61103a4e/scratchpad/stt/lib/python3.13/site-packages/huggingface_hub/inference/_providers/_common.pyfilter_noner    *   s    8;    c                     g r   r   r   s    r   r    r    ,   s    .1r!   c                    [        U [        5      (       aL  0 nU R                  5        H4  u  p#Uc  M
  [        U[        [        45      (       a  [	        U5      nX1U'   M6     U$ [        U [        5      (       a9  U  Vs/ s H+  n[        U[        [        45      (       a  [	        U5      OUPM-     sn$ [        S[        U 5       35      es  snf )NzExpected dict or list, got )
isinstancedictitemslistr    
ValueErrortype)r   cleanedkvs       r   r    r    0   s    #t"$IIKDAy!dD\**NAJ   #tNQRc*Qt"="=A1DcRR
249+>
?? Ss   ;2Cc                      \ rS rSrSrS\S\S\SS4S jrSS	.S
\S\\\4   S\S\S-  S\S-  S\\\4   S-  S\	4S jjr
 S"S\\-  S\	S-  S\4S jjrS\S-  S\4S jrS\S-  S\4S jrS\\\4   S\\\4   S-  S\S-  S\\\4   4S jrS\S\S\\\4   4S jrS\S\S\4S jrS\S\4S jrS\S\S\4S jrS
\S\S\S\S-  4S jrS
\S\S\S\S-  S\S-  4
S  jrS!rg)#TaskProviderHelperA   z.Base class for task-specific provider helpers.providerbase_urltaskr   Nc                 (    Xl         X0l        X l        g r   )r0   r2   r1   )selfr0   r1   r2   s       r   __init__TaskProviderHelper.__init__D   s     	 r!   )extra_payloadinputs
parametersheadersmodelapi_keyr7   c          	         U R                  U5      nU R                  U5      nU R                  X55      nU R                  XWR                  5      nU R                  XUS9n	U	b  [        U	[        U=(       d    0 5      5      n	U R                  XXv5      n
U	b  U
b  [        S5      eU	c  U
c  [        S5      eU R                  X9U
5      n[        UU R                  UR                  U	U
US9$ )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.)urlr2   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	   r2   )r4   r8   r9   r:   r;   r<   r7   r>   r?   payloadrA   normalized_headerss               r   prepare_request"TaskProviderHelper.prepare_requestI   s     ''0 !% : :5 A ''9 )J)JK //Zo/p%g{=;NB/OPG --fBWg 4#3WXX?t|QRR "44WtL '33&
 	
r!   responserequest_paramsc                     U$ )zr
Return the response in the expected format.

Override this method in subclasses for customized response handling.r   )r4   rO   rP   s      r   get_responseTaskProviderHelper.get_response~   s	     r!   c                 X    Uc
  [        5       nUc  [        SU R                   S35      eU$ )zRReturn 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(   r0   r4   r<   s     r   rB   #TaskProviderHelper._prepare_api_key   s:     ?kG?;DMM?Jno  r!   c                    Uc  [        SU R                   S35      e[        R                  U R                  0 5      R                  U5      (       a  [        U R                     U   $ Sn[	        U5       H!  nUR                  U R                  :X  d  M  Un  O   Uc  [        SU SU R                   S35      eUR
                  U R
                  :w  a6  [        SU SU R
                   SU R                   SUR
                   S3	5      eUR                  S	:X  a&  [        R                  SU S
U R                   S35        UR                  S:X  a&  [        R                  SU SU R                   S35        U$ )zZReturn 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(   r0   r   get!_fetch_inference_provider_mappingr2   statusloggerwarning)r4   r;   provider_mappingmappings       r   rC   (TaskProviderHelper._prepare_mapping_info   s    =J4==/YZ[\\ -00CGGN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!   rK   rA   c                     UR                  5        VVs0 s H  u  pEUc  M
  UR                  5       U_M     nnnUR                  S5      c)  Ub  UR                  b  UR                  US'   U$ Ub  SUS'   U$ s  snnf )zjNormalize the headers to use for the request.

Override this method in subclasses for customized headers.
zcontent-typezapplication/json)r&   lowerr[   	mime_type)r4   r:   rK   rA   keyvaluerL   s          r   rJ   %TaskProviderHelper._normalize_headers   s     DK==?h?ZSV[0ciik50?h!!.19DNN$>59^^">2 "! $5G">2!! is
   	A6A6c                     0 [        US9EUE$ )zgReturn the headers to use for the request.

Override this method in subclasses for customized headers.
)token)r   )r4   r:   r<   s      r   rD   #TaskProviderHelper._prepare_headers   s    
 >"1=W==r!   mapped_modelc                     U R                  U5      nU R                  X!5      nUR                  S5       SUR                  S5       3$ )zNReturn the URL to use for the request.

Usually not overwritten in subclasses./)_prepare_base_url_prepare_routerstriplstrip)r4   r<   rl   r1   routes        r   rE   TaskProviderHelper._prepare_url   sI     ))'2##L://#&'qc):(;<<r!   c                     UR                  S5      (       aJ  [        R                  SU R                   S35        [        R
                  R                  U R                  S9$ [        R                  SU R                   S35        U R                  $ )SReturn the base URL to use for the request.

Usually not overwritten in subclasses.hf_z	Calling 'z'' provider through Hugging Face router.)r0   z' provider directly.)
startswithr^   infor0   r   INFERENCE_PROXY_TEMPLATEformatr1   rU   s     r   ro   $TaskProviderHelper._prepare_base_url   sq    
 e$$KK)DMM?2YZ[55<<dmm<TTKK)DMM?2FGH== r!   c                     g)zdReturn the route to use for the request.

Override this method in subclasses for customized routes.
 r   r4   rl   r<   s      r   rp   !TaskProviderHelper._prepare_route   s    
 r!   r>   c                     g)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   r4   r8   r9   r>   s       r   rG   +TaskProviderHelper._prepare_payload_as_dict   s     r!   c                     g)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   )r4   r8   r9   r>   r7   s        r   rI   ,TaskProviderHelper._prepare_payload_as_bytes   s     r!   )r1   r0   r2   r   )__name__
__module____qualname____firstlineno____doc__strr5   r   r%   r	   rM   bytesrR   rB   r   rC   r   rJ   rD   rE   ro   rp   rG   rI   __static_attributes__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            	       z   ^  \ rS rSrSrS\S\4U 4S jjrS\S\S\4S	 jrS
\\	\
-     S\	S\S\	S-  4S jrSrU =r$ )BaseConversationalTaski  z
Base class for conversational (chat completion) tasks.
The schema follows the OpenAI API format defined here: https://platform.openai.com/docs/api-reference/chat
r0   r1   c                 "   > [         TU ]  XSS9  g )Nconversationalr0   r1   r2   superr5   r4   r0   r1   	__class__s      r   r5   BaseConversationalTask.__init__
  s    (DTUr!   rl   r<   r   c                     g)Nz/v1/chat/completionsr   r   s      r   rp   %BaseConversationalTask._prepare_route  s    %r!   r8   r9   r>   Nc           	          [        UR                  US.UR                  5        VVs0 s H  u  pEUS:w  d  M  XE_M     snnE5      $ s  snnf )N)r;   messagesr;   )r    rF   r&   )r4   r8   r9   r>   rf   rg   s         r   rG   /BaseConversationalTask._prepare_payload_as_dict  sX     .::" 1;0@0@0BU0B*#cWn:3:0BU
 	
 Vs
   AAr   )r   r   r   r   r   r   r5   rp   r'   r%   r
   r   rG   r   __classcell__r   s   @r   r   r     sw    
V V V&3 & & &
T667
 
  8	

 

 
r!   r   c                   V   ^  \ rS rSrSrU 4S jrS\S\4S jrS\S-  S\4S	 jr	S
r
U =r$ )AutoRouterConversationalTaski$  a  
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U ]  SSS9  g )Nautozhttps://router.huggingface.co)r0   r1   r   )r4   r   s    r   r5   %AutoRouterConversationalTask.__init__,  s    &3RSr!   r<   r   c                 \    UR                  S5      (       d  [        S5      eU R                  $ )rv   rw   z>Cannot select auto-router when using non-Hugging Face API key.)rx   r(   r1   rU   s     r   ro   .AutoRouterConversationalTask._prepare_base_url/  s+    
 !!%((]^^== r!   r;   Nc                 8    Uc  [        S5      e[        SUUSSS9$ )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   )r0   hf_model_id
providerIdr]   r2   )r(   r   )r4   r;   s     r   rC   2AutoRouterConversationalTask._prepare_mapping_info9  s1    
 ==>>'!
 	
r!   r   )r   r   r   r   r   r5   r   ro   r   rC   r   r   r   s   @r   r   r   $  s>    T! ! !
3: 
:R 
 
r!   r   c            	       n   ^  \ rS rSrSrS\S\4U 4S jjrS\S\S\4S	 jrS
\S\	S\
S\	S-  4S jrSrU =r$ )BaseTextGenerationTaskiJ  z
Base class for text-generation (completion) tasks.
The schema follows the OpenAI API format defined here: https://platform.openai.com/docs/api-reference/completions
r0   r1   c                 "   > [         TU ]  XSS9  g )Nztext-generationr   r   r   s      r   r5   BaseTextGenerationTask.__init__P  s    (DUVr!   rl   r<   r   c                     g)Nz/v1/completionsr   r   s      r   rp   %BaseTextGenerationTask._prepare_routeS  s     r!   r8   r9   r>   Nc                 <    [        SU0UESUR                  0E5      $ )Npromptr;   )r    rF   r   s       r   rG   /BaseTextGenerationTask._prepare_payload_as_dictV  s'     Hfg
gGEZEfEfghhr!   r   )r   r   r   r   r   r   r5   rp   r   r%   r   rG   r   r   r   s   @r   r   r   J  sl    
W W W!3 ! ! !ii'+iD\i	i ir!   r   N)maxsizer;   r   c                 x    SSK Jn  U" 5       R                  U S/S9nUR                  nUc  [	        SU  35      eU$ )z3
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   ry   r`   s       r   r\   r\   \  sM    
 -7e-G,HID66?wGHHr!   dict1dict2c           
          0 U EUR                  5        VVs0 s HG  u  p#UX ;   a:  [        X   [        5      (       a#  [        U[        5      (       a  [        X   U5      OU_MI     snnE$ s  snnf r   )r&   r$   r%   rH   )r   r   rf   rg   s       r   rH   rH   j  s}    
 $kkm	
 ,
 EJ!=!=*UTXBYBY !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_loggerr   r^   r   r%   r   __annotations__r    r'   r.   r   r   r   r\   rH   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
/ 
@#
#9 #
Li/ i$ 4
S 
T:T5U 
 
	4 	 	 	r!   