
    ^hA0                        % S SK Jr  S SKJrJrJrJr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   \\   4   S\\\\4   \\   4   4S j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DictListOptionalUnionoverload)	constants)InferenceProviderMapping)	MimeBytesRequestParameters)ChatCompletionInputMessage)build_hf_headers	get_tokenlogging)cerebrascoherezfal-aizfireworks-aigroqzhf-inference
hyperbolicnebiusnscale	replicate	sambanovascalewaytogetherzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                     g N r   s    f/home/james-whalen/.local/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\	\\\4      S\
4S jjr S"S\\\4   S\	\
   S\4S jjrS\	\   S\4S jrS\	\   S\4S jrS\\\4   S\	\\\4      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\	\   4S jr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    )r4   r6   r5   )selfr4   r5   r6   s       r#   __init__TaskProviderHelper.__init__D   s     	 r%   )extra_payloadinputs
parametersheadersmodelapi_keyr;   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.)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;   rB   rC   payloadrE   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!   )r8   rS   rT   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,   r4   r8   r@   s     r#   rF   #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,   r4   r   get!_fetch_inference_provider_mappingr6   statusloggerwarning)r8   r?   provider_mappingmappings       r#   rG   (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%   rO   rE   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)r8   r>   rO   rE   keyvaluerP   s          r#   rN   %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   )r8   r>   r@   s      r#   rH   #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)r8   r@   rp   r5   routes        r#   rI   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                  $ )zSReturn 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.)
startswithrb   infor4   r
   INFERENCE_PROXY_TEMPLATEformatr5   rY   s     r#   rs   $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!   r8   rp   r@   s      r#   rt   !TaskProviderHelper._prepare_route   s    
 r%   rB   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!   r8   r<   r=   rB   s       r#   rK   +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!   )r8   r<   r=   rB   r;   s        r#   rM   ,TaskProviderHelper._prepare_payload_as_bytes   s     r%   )r5   r4   r6   r    )__name__
__module____qualname____firstlineno____doc__strr9   r   r   r   r   rQ   r   bytesrV   rF   r   rG   r   rN   rH   rI   rs   rt   rK   rM   __static_attributes__r!   r%   r#   r2   r2   A   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%   r2   c            	       ~   ^  \ rS rSrSrS\S\4U 4S jjrS\S\S\4S	 jrS
\\	\
\4      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
r4   r5   c                 "   > [         TU ]  XSS9  g )Nconversationalr4   r5   r6   superr9   r8   r4   r5   	__class__s      r#   r9   BaseConversationalTask.__init__
  s    (DTUr%   rp   r@   r   c                     g)Nz/v1/chat/completionsr!   r   s      r#   rt   %BaseConversationalTask._prepare_route  s    %r%   r<   r=   rB   c                 <    [        SU0UESUR                  0E5      $ )Nmessagesr?   r$   rJ   r   s       r#   rK   /BaseConversationalTask._prepare_payload_as_dict  s'     Ji*igG\GhGhijjr%   r!   )r   r   r   r   r   r   r9   rt   r   r   r   r   r   r   rK   r   __classcell__r   s   @r#   r   r     s    
V V V&3 & & &kU4!;;<=k k  8	k
 
$k k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\\	   4S jrSrU =r$ )BaseTextGenerationTaski  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
r4   r5   c                 "   > [         TU ]  XSS9  g )Nztext-generationr   r   r   s      r#   r9   BaseTextGenerationTask.__init__  s    (DUVr%   rp   r@   r   c                     g)Nz/v1/completionsr!   r   s      r#   rt   %BaseTextGenerationTask._prepare_route"  s     r%   r<   r=   rB   c                 <    [        SU0UESUR                  0E5      $ )Npromptr?   r   r   s       r#   rK   /BaseTextGenerationTask._prepare_payload_as_dict%  s'     Hfg
gGEZEfEfghhr%   r!   )r   r   r   r   r   r   r9   rt   r   r   r   r   rK   r   r   r   s   @r#   r   r     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   r|   rd   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)   rL   )r   r   rj   rk   s       r#   rL   rL   9  s}    
 $kkm	
 ,
 EJ!=!=*UTXBYBY !U3 ,	
 
s   AA*)"	functoolsr   typingr   r   r   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   rb   r   r   __annotations__r$   r2   r   r   r`   rL   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@U4S>4945 @%S#XPTUXPY@Y:Z @"@ @Fk/ k*i/ i$ 4
S 
T:T5U 
 
	4 	 	 	r%   