
    dh                       S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	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Jr  SS	KJr  SS
KJrJr  \(       a  SSKr\R@                  " \!5      r"Sr#Sr$ " S S\5      r%g)z>EverlyAI Endpoints chat wrapper. Relies heavily on ChatOpenAI.    )annotationsN)	TYPE_CHECKINGAnyCallableDictOptionalSequenceSetTypeUnion)BaseMessage)BaseTool)convert_to_secret_strget_from_dict_or_env)Fieldmodel_validator)convert_message_to_dict)
ChatOpenAI_import_tiktokenzhttps://everlyai.xyz/hostedmeta-llama/Llama-2-7b-chat-hfc                    ^  \ rS rSr% Sr\SS j5       r\SS j5       r\SS j5       r	Sr
S\S	'    \" \S
S9rS\S'    \rS\S'    SrS\S'    \SS j5       r\" SS9\SS j5       5       rSS jr S     SU 4S jjjrSrU =r$ )ChatEverlyAI)   a)  `EverlyAI` Chat large language models.

To use, you should have the ``openai`` python package installed, and the
environment variable ``EVERLYAI_API_KEY`` set with your API key.
Alternatively, you can use the everlyai_api_key keyword argument.

Any parameters that are valid to be passed to the `openai.create` call can be passed
in, even if not explicitly saved on this class.

Example:
    .. code-block:: python

        from langchain_community.chat_models import ChatEverlyAI
        chat = ChatEverlyAI(model_name="meta-llama/Llama-2-7b-chat-hf")
strc                    g)zReturn type of chat model.zeverlyai-chat selfs    `/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/everlyai.py	_llm_typeChatEverlyAI._llm_type:   s         c                
    SS0$ )Neverlyai_api_keyEVERLYAI_API_KEYr   r   s    r   
lc_secretsChatEverlyAI.lc_secrets?   s    "$677r"   c                    g)NFr   )clss    r   is_lc_serializableChatEverlyAI.is_lc_serializableC   s    r"   NzOptional[str]r$   model)defaultalias
model_nameeverlyai_api_basezOptional[Set[str]]available_modelsc                     [        SS/5      $ )z'Get available models from EverlyAI API.r   z(meta-llama/Llama-2-13b-chat-hf-quantized)setr   r"   r   get_available_models!ChatEverlyAI.get_available_modelsP   s     /:
 	
r"   before)modec                   [        [        USS5      5      US'   [        US'    SSKn UR
                  US'   S
UR                  5       ;  a	  [        US
'   US
   nU R                  5       nXV;  a  [        SU SU S35      eXaS'   U$ ! [         a  n[	        S5      UeSnAff = f! [         a  n[        S	5      UeSnAff = f)z?Validate that api key and python package exists in environment.r$   r%   openai_api_keyopenai_api_baser   NzTCould not import openai python package. Please install it with `pip install openai`.clientz`openai` has no `ChatCompletion` attribute, this is likely due to an old version of the openai package. Try upgrading it with `pip install --upgrade openai`.r/   zModel name z  not found in available models: .r1   )r   r   DEFAULT_API_BASEopenaiImportErrorChatCompletionAttributeError
ValueErrorkeysDEFAULT_MODELr4   )r)   valuesr>   eexcr/   r1   s          r   validate_environment_override*ChatEverlyAI.validate_environment_override[   s    $9 ""$
  %5 !		%44F8 v{{},#0F< L)
335-j\)I#$A' 
 &6!";  	? 	  	7 		s.   B B% 
B"BB"%
C /B;;C c                    [        5       nU R                  b  U R                  nOU R                  n UR                  S5      nX#4$ ! [         a-    [
        R                  S5        SnUR                  U5      n X#4$ f = f)Nzgpt-3.5-turbo-0301z5Warning: model not found. Using cl100k_base encoding.cl100k_base)r   tiktoken_model_namer/   encoding_for_modelKeyErrorloggerwarningget_encoding)r   	tiktoken_r,   encodings       r   _get_encoding_model ChatEverlyAI._get_encoding_model   s    $&	##/,,EOOE	5 334HIH
 	  	5NNRS!E --e4H		5s   A 2A=<A=c           
       > Ub  [         R                  " S5        [        R                  S   S::  a  [        TU ]  U5      $ U R                  5       u  p4SnSnSnU Vs/ sH  n[        U5      PM     n	nU	 HR  n
Xu-  nU
R                  5        H7  u  pU[        UR                  [        U5      5      5      -  nUS:X  d  M3  Xv-  nM9     MT     US-  nU$ s  snf )zCalculate num tokens with tiktoken package.

Official documentation: https://github.com/openai/openai-cookbook/blob/
main/examples/How_to_format_inputs_to_ChatGPT_models.ipynbzECounting tokens in tool schemas is not yet supported. Ignoring tools.         r   name)warningswarnsysversion_infosuperget_num_tokens_from_messagesrT   r   itemslenencoder   )r   messagestoolsr,   rS   tokens_per_messagetokens_per_name
num_tokensmmessages_dictmessagekeyvalue	__class__s                r   r`   )ChatEverlyAI.get_num_tokens_from_messages   s     MMW A!#77AA224
=EFX03XF$G,J%mmo
 c(//#e*"=>>
&=1J . % 	a
 Gs   Cr   )returnr   )rp   zDict[str, str])rp   bool)rp   zSet[str])rE   dictrp   r   )rp   ztuple[str, tiktoken.Encoding])N)rd   zlist[BaseMessage]re   zCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]rp   int)__name__
__module____qualname____firstlineno____doc__propertyr    r&   classmethodr*   r$   __annotations__r   rD   r/   r=   r0   r1   staticmethodr4   r   rH   rT   r`   __static_attributes____classcell__)rn   s   @r   r   r   )   s        8 8   '+m*&MAJA-s-)+/(/-
 
 (#+  $+Z(  # 
  
   r"   r   )&rx   
__future__r   loggingr]   r[   typingr   r   r   r   r   r	   r
   r   r   langchain_core.messagesr   langchain_core.toolsr   langchain_core.utilsr   r   pydanticr   r   #langchain_community.adapters.openair   &langchain_community.chat_models.openair   r   tiktoken	getLoggerrt   rO   r=   rD   r   r   r"   r   <module>r      sl    D "  
 
 
 
 0 ) L + G
 			8	$ 1 /P: Pr"   