
    g\                         d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlZd dl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 d dlmZ 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%m&Z&m'Z'm(Z( er	d dl)m*Z+ e+Z,neZ,da-da. G d de      Z/y)    N)deepcopy)TYPE_CHECKINGAnyDictListOptionalTupleUnion)convert_content_list_to_str)custom_promptprompt_factory)CustomStreamWrapper)
BaseConfigBaseLLMExceptionget_secret_str)AllMessageValues)ChoicesMessageModelResponseUsage)token_counter   )HuggingfaceErrorhf_task_listhf_tasksoutput_parser)Loggingc                   (    e Zd ZU dZdZee   ed<   dZee	   ed<   dZ
ee   ed<   dZee   ed<   dZee	   ed<   dZee   ed	<   d
Zee   ed<   dZee	   ed<   dZee   ed<   dZee	   ed<   dZee	   ed<   dZee	   ed<   dZee	   ed<   dZee   ed<   dZee   ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9dee	   dee   dee   dee	   d	ee   dee   dee	   dee   dee	   dee	   dee	   dee	   dee   dee   ddfdZe fd       Zd ZdefdZdededededef
dZ dee   fdZ!d Z"dede#eef   fd Z$ded!e%e&   de'd"e'd#e'de'fd$Z(d%ee   dedefd&Z)	 	 d:d#eded!e%e&   ded'ee   d%ee   defd(Z*d)ed*e	d#e+e'e,jZ                  f   de.fd+Z/	 d;d,e,j`                  d-e1ded.e'd'ee   de%eee2f      fd/Z3d0e+e%eee2f      eee2f   f   d1e4d2ee   de'd3e2d!e%e&   defd4Z5	 	 d:ded5e,j`                  d1e4d-e1d6ed!e%e&   ded"ed3e2d'ee   d7ee   de4fd8Z6 xZ7S )<HuggingfaceChatConfigz|
    Reference: https://huggingface.github.io/text-generation-inference/#/Text%20Generation%20Inference/compat_generate
    Nhf_taskbest_ofdecoder_input_detailsTdetailsmax_new_tokensrepetition_penaltyFreturn_full_textseedtemperaturetop_ktop_n_tokenstop_ptruncate	typical_p	watermarkreturnc                     t               }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y )Nself)localsitemssetattr	__class__)r2   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   locals_keyvalues                     a/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/huggingface/chat/transformation.py__init__zHuggingfaceChatConfig.__init__?   s;    " (!--/JCf}!2U3 *    c                      t         |          S N)super
get_config)clsr6   s    r:   r@   z HuggingfaceChatConfig.get_configU   s    w!##r<   c                 
    ddgS )N	use_cachewait_for_model r2   s    r:   get_special_options_paramsz0HuggingfaceChatConfig.get_special_options_paramsY   s    -..r<   modelc                 
    g dS )N)streamr)   
max_tokensmax_completion_tokensr,   stopnechorE   )r2   rH   s     r:   get_supported_openai_paramsz1HuggingfaceChatConfig.get_supported_openai_params\   s    	
 		
r<   non_default_paramsoptional_paramsdrop_paramsc                     |j                         D ]i  \  }}|dk(  r|dk(  s|dk(  rd}||d<   |dk(  r||d<   |dk(  r
||d<   d|d	<   |d
k(  r||d
<   |dk(  r||d<   |dk(  s|dk(  r|dk(  rd}||d<   |dk(  sed|d<   k |S )Nr)   g        r   g{Gz?r,   rN   r"   T	do_samplerJ   rM   rK   rL      r%   rO   r#   )r4   )r2   rQ   rR   rH   rS   paramr9   s          r:   map_openai_paramsz'HuggingfaceChatConfig.map_openai_paramsh   s     /446LE5%C<5A: !E16.+0(|-2	*  ,  ,1)*/'$1H(H A:E49 01 <@ 789 7< r<   c                     t        d      S )NHUGGINGFACE_API_KEYr   rF   s    r:   get_hf_api_keyz$HuggingfaceChatConfig.get_hf_api_key   s    344r<   c                    	 t         t        t         t        fS t               }t        j                  j                  t        j                  j                  t                    }t        j                  j                  |      }t        j                  j                  |dd      }t        |d      5 }|D ]!  }|j                  |j                                # 	 d d d        |a t        j                  j                  |dd      }t               }t        |d      5 }|D ]!  }|j                  |j                                # 	 d d d        |a||fS # 1 sw Y   xxY w# 1 sw Y   xY w# t        $ r t               t               fcY S w xY w)Nhuggingface_llms_metadatazhf_text_generation_models.txtrzhf_conversational_models.txt)tgi_models_cacheconv_models_cachesetospathdirnameabspath__file__joinopenaddstrip	Exception)r2   
tgi_modelsscript_directory	file_pathfilelineconv_modelss          r:   read_tgi_conv_modelsz*HuggingfaceChatConfig.read_tgi_conv_models   sD   &	  !,3D3P'):::J!wwrwwx/HI!ww/?@ +/I i% DNN4::<0 ! &
  *  +.I
 %Ki% DOODJJL1 ! & !,{**' &% &%  	 5#%<	 sH   E' BE' 0'EAE' 'EE' EE' E$ E' 'FFc                     |j                  d      d   t        v r|j                  dd      }|d   |d   fS | j                         \  }}||v rd|fS ||v rd|fS d|v rd|fS d|fS )N/r   rV   text-generation-inferenceconversationalzroneneldan/TinyStoriesztext-generation)splitr   rr   )r2   rH   split_modelrl   conversational_modelss        r:   get_hf_task_for_modelz+HuggingfaceChatConfig.get_hf_task_for_model   s     ;;sA,.++c1-Kq>;q>11,0,E,E,G)
)J.55++#U**%.$e++.55r<   messageslitellm_paramsheadersc           
      t   |j                  dd       }|t        |t              r|t        vrt	        dj                  |t                    t        j                  j                         }|j                         D ]  \  }}	||vs|	||<    | j                         }
i }g }|j                         D ]   \  }}	||
v s|	||<   |j                  |       " |D ]  }|j                  |        |dk(  rt        |      }|j                  d       |j                  d       g }g }d}|D ]W  }|d   dk(  r"|dk7  r|j                  |       t        |      }-|d   d	k(  s	|d   d
k(  s>|j                  t        |             Y |||d|d}n|dk(  r|t        j                   v rSt        j                   |   }t#        |j                  dd       |j                  dd      |j                  dd      |      }nt%        ||      }||d|v rt        |d   t&              r	|d   du rdndd}n|t        j                   v rut        j                   |   }t#        |j                  di       |j                  dd      |j                  dd      |j                  dd      |j                  dd      |      }nt%        ||      }t        |      }|j                  d       |j                  d       d|i}|dk(  r||d<   d|v r	|d   du rdnd|d<   t)        |j+                               dkD  r|j-                  d|i       |S )Ntaskz)Invalid hf task - {}. Valid formats - {}.rv   r$   r'    roleuser	assistantsystem)textpast_user_inputsgenerated_responses)inputs
parametersru   rolesinitial_prompt_valuefinal_prompt_value)	role_dictr   r   r{   rH   r{   rJ   TF)r   r   rJ   	bos_token	eos_token)r   r   r   r   r   r{   r   r   r   options)get
isinstancestrr   rk   formatr   litellmHuggingfaceConfigr@   r4   rG   appendpopr   r   custom_prompt_dictr   r   boollenkeysupdate)r2   rH   r{   rR   r|   r}   r   configkvspecial_paramsspecial_params_dictkeys_to_popinference_paramsr   r   r   messagedatamodel_prompt_detailsprompts                        r:   transform_requestz'HuggingfaceChatConfig.transform_request   s    !!&$/<z$4L8P;BB4R 
 **557LLNDAq(%&"	 # 88: #))+DAqN")*#A&""1% , A" ##'8  +  !34!"$D#6?f,rz(//56w?DV_3wv(7R'../J7/ST $ !(8+>
 /D 00222'.'A'A%'H$&266wE)=)A)A.* (<'?'?,b( &	 (ehG -  ?2"?8#<dC'1T9  
D 222'.'A'A%'H$&266wC)=)A)A.* (<'?'?,b( 366{BG266{BG% (ehG'8  +  !34&D 22%5\"  ?2x7PTX7X  X "'')*Q.KK$789r<   api_basec                     d|v r|}|S ||}|S dt         j                  v rt        j                  dd      }|S dt         j                  v rt        j                  dd      }|S d| }|S )z
        Get the API base for the Huggingface API.

        Do not add the chat/embedding/rerank extension here. Let the handler do this.
        httpsHF_API_BASEr   HUGGINGFACE_API_BASEz,https://api-inference.huggingface.co/models/)rb   environgetenv)r2   r   rH   completion_urls       r:   get_api_basez"HuggingfaceChatConfig.get_api_baseM  s     e"N  !%N  bjj(YY}b9N  $rzz1YY'=rBN   LE7SNr<   api_keyc                 .    ddi}|d| |d<   i ||}|S )Nzcontent-typezapplication/jsonzBearer AuthorizationrE   )r2   r}   rH   r{   rR   r   r   default_headerss           r:   validate_environmentz*HuggingfaceChatConfig.validate_environment`  sC     .
 '# O, 1W00r<   error_messagestatus_codec                     t        |||      S )Nr   r   r}   )r   )r2   r   r   r}   s       r:   get_error_classz%HuggingfaceChatConfig.get_error_classt  s      #]G
 	
r<   responselogging_objr   c                     t        |j                         |d|      }d}|D ]  }||d   d   d   d   z  } d|ig}	|j                  |||	d	|i
       |	S )Nhuggingface)completion_streamrH   custom_llm_providerr   r   choicesr   deltacontentgenerated_textcomplete_input_dictinputr   original_responseadditional_args)r   
iter_lines	post_call)
r2   r   r   rH   r   r   streamed_responser   chunkcompletion_responses
             r:   /_convert_streamed_response_to_complete_responsezEHuggingfaceChatConfig._convert_streamed_response_to_complete_response{  s     0&113 -#	
 &EuY'*73I>>G '6F5P4Q12D9	 	 	
 #"r<   r   model_responser   encodingc                    |d}|dk(  r5t        |d         dkD  rp|d   |j                  d   j                  _        nM|dk(  rt	        |t
              rt	        |d   t              rd|d   vrt        dd| d       t        |d   d         dkD  r-t        |d   d         |j                  d   j                  _        d|d   v rkd	|d   d   v ra|d   d   d
   |j                  d   _	        d}|d   d   d	   D ]  }	|	d   	||	d   z  } t        |j                  d   j                  d|       d|v rT|d   dkD  rKd|d   v rCd|d   d   v r8g }
t        |d   d   d         D ]{  \  }}d}|d	   D ]  }	|	d   	||	d   z  } t        |d         dkD  rt        t        |d         |      }nt        d       }t        |d
   |dz   |      }|
j                  |       } |j                  j                  |
       n|dk(  r2t!        j"                  |      |j                  d   j                  _        nQt	        |t
              rAt        |d   d         dkD  r-t        |d   d         |j                  d   j                  _        d}	 t%        ||      }|d   d   d   j)                  dd      }|Et        |      dkD  r7d}	 t        |j+                  |d   d   d   j)                  dd                  }nd}t-        t/        j.                               |_        ||_        t5        ||||z         }t        |d|       ||j6                  d<   |S # t&        $ r Y w xY w# t&        $ r Y rw xY w)Nru   rv   r   r   i  z%response is not in expected format - r   r$   tokensfinish_reasonlogprob_logprobr"   rV   best_of_sequences)r   logprobs)r   )r   indexr   ztext-classificationr   r   r   r   r   )prompt_tokenscompletion_tokenstotal_tokensusager   )r   r   r   r   r   listdictr   r   r   r5   	enumerater   r   r   extendjsondumpsr   rk   r   encodeinttimecreatedrH   r   _hidden_params)r2   r   r   r   rR   r   r{   rH   sum_logprobtokenchoices_listidxitemmessage_obj
choice_objr   output_textr   r   s                      r:    convert_to_model_response_objectz6HuggingfaceChatConfig.convert_to_model_response_object  s.    <.D##&'789A=<O$=&&q)119 002D9!"5a"8$?#+>q+AA& #CDWCXY   &q)*:;<q@<I'*+;<=&&q)119
 033 3A 6y AA:Ma:P;!;#&&q)7  03I>xHEY'3#uY'77 I ..q199:{SO+	0JQ0N!4Q!77+/B1/Ei/PP#%L%.+A.y9:MN&	T '(%)(^E$Y/; +uY/? ? &4 t$456:*1(5d;K6L(M)4+K
 +2$*?K%,*.*?"%'$/&

 %++J7'&( #**11,?**8<

#9N""1%--5
 .5+A./?@AAE<I'*+;<=&&q)119 	)IM %Y/29=AA)RP"s;'7!'; !$'OO&y1!4Y?CCIrR%! !"!$TYY[!1$'/&)::

 	/=P%%&9:7  		  s$   M 
3M' 	M$#M$'	M32M3raw_responserequest_data	json_modec           	      4   |j                  dd       }d}|j                  d   j                  dd      dk(  rd}|r| j                  |||||
      }nE|j                  ||
|j                  d	|i
       	 |j                         }t        |t              r|g}t        |t              rd|v rt        |d   |j                        | j                  |||
|t        v r|nd ||	||      S # t        $ r% t        d|j                   |j                        w xY w)Nr   Fr}   zContent-Typer   ztext/event-streamT)r   r   rH   r   r   r   r   zOriginal Response received: )r   r   error)r   r   r   rR   r   r{   rH   )r   __dict__r   r   r   r   r   r   rk   r   r   r   r   )r2   rH   r   r   r   r   r{   rR   r|   r   r   r   r   is_streamedr   s                  r:   transform_responsez(HuggingfaceChatConfig.transform_response  sl    !!&$/!!),00D"# K "&"V"V%'! #W # !!""."3"3!6 E	 " &2&7&7&9#148+>*?' )40W@S5S"+G4(44  44 3))dl.B+ 5 
 	
  &:<;L;L:MN , 8 8 s   4#C) ).D)NNNNNNNNNNNNNN)NNr>   )8__name__
__module____qualname____doc__r!   r   r   __annotations__r"   r   r#   r   r$   r%   r&   floatr'   r(   r)   r*   r+   r,   r-   r.   r/   r;   classmethodr@   rG   r   rP   r   rX   r[   rr   r	   rz   r   r   r   r   r   r   r
   httpxHeadersr   r   ResponseLoggingClassr   r   r   r   r   __classcell__)r6   s   @r:   r    r    &   s   
 	 Xh  "GXc]!,08D>0"GXd^"$(NHSM(*.. htn  D(3-#'K%'E8C="&L(3-&E8C="Hhsm"!%Ix% $Ix~$ "&04"&(,.2+/"'+#&*#"&%)$(4#4  (~4 $	4
 !4 %UO4 #4.4 sm4 e_4 }4 sm4 }4 3-4 E?4 D>4  
!4, $ $/

 

% % % 	%
 % 
%N5 5' R63 6533G 6" '( 	
   
BXc] 3 3 2 "&"&  '(	
  # 3- 
(
 
/2
=B4CV=W
	
 "&#..# "# 	#
 # ## 
d38n	#6u"4S#X#7c3h#GHu &u x 	u
 u u '(u uD "&$(@
@
 nn@
 &	@

 "@
 @
 '(@
 @
 @
 @
 #@
 D>@
 
@
r<   r    )0r   rb   r   copyr   typingr   r   r   r   r   r	   r
   r  r   8litellm.litellm_core_utils.prompt_templates.common_utilsr   3litellm.litellm_core_utils.prompt_templates.factoryr   r   ,litellm.litellm_core_utils.streaming_handlerr   )litellm.llms.base_llm.chat.transformationr   r   litellm.secret_managers.mainr   litellm.types.llms.openair   litellm.types.utilsr   r   r   r   litellm.utilsr   common_utilsr   r   r   r   *litellm.litellm_core_utils.litellm_loggingr   LiteLLMLoggingObjr  r_   r`   r    rE   r<   r:   <module>r     st     	   I I I   M R 7 6 F F ' R RW$LL   g
J g
r<   