
    wiU0                     p   U d dl mZ d dlmZmZ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 i i i i i i i i i i i 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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 ed          deded         fd            Z dededefdZ!dS )    )	lru_cache)AnyDictList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	replicate	sambanovascalewaytogetherzzai-org!HARDCODED_MODEL_INFERENCE_MAPPINGobjreturnc                     d S N r   s    /var/www/development/aibuddy-work/election-extract/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%   -   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>=   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%   1   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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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__E   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_requestJ   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 )z[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   r   rS   r   bytesrW   rH   r   rI   r   rP   rJ   rK   rq   rr   rM   rO   r"   r&   r$   r6   r6   B   s       88! ! !3 !4 ! ! ! ! 373
 3
 3
 3
 cN	3

 3
 }3
 #3
  S#X/3
 
3
 3
 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&   r6   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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
    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   c                 :    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   r   r   rM   __classcell__r   s   @r$   r   r     s         
V V V V V V V V&3 & & & & & &kU4!;;<=k k  8	k
 
$k k k k k k k kr&   r   c            	       d     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
    r7   r8   c                 P    t                                          ||d           d S )Nztext-generationr   r   r   s      r$   r<   zBaseTextGenerationTask.__init__   s)    (XDUVVVVVr&   rn   rB   r   c                     dS )Nz/v1/completionsr"   r~   s      r$   rr   z%BaseTextGenerationTask._prepare_route#  s      r&   r>   r?   rD   c                 :    t          d|i|d|j        i          S )NpromptrA   r   r   s       r$   rM   z/BaseTextGenerationTask._prepare_payload_as_dict&  s*     Hfg
gGEZEfgghhhr&   )r   r   r   r   r   r<   rr   r   r   r   r   rM   r   r   s   @r$   r   r     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   ry   rc   s       r$   r_   r_   ,  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>=  sr     
 
 
 U uE#J!=!=*UTXBYBY !sU333
 
 
r&   )r0   )r   r   s   ` r$   rN   rN   :  sJ    

 
 
 
 $kkmm	
 
 
 r&   )"	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   ra   r   r   __annotations__r%   r6   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 !4T#7O2O-P(P#Q   4 
 ;T#s(^ ;S#X ; ; ; 
 ;	 1T#Y 149 1 1 1 
 1@U4S>4945 @%S#XPTUXPY@Y:Z @ @ @ @"@ @ @ @ @ @ @ @Fk k k k k/ k k k*i i i i i/ i i i$ 4
S 
T:T5U 
 
 
 
	4 	 	 	 	 	 	 	 	r&   