Ë
    µŒjÝ  ã                  óú   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	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mZ dd	lmZ dd
lmZmZ erddlZ ej@                  e!«      Z"dZ#dZ$ G d„ de«      Z%y)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                  óþ   ‡ — e Zd ZU dZedd„«       Zedd„«       Zedd„«       ZdZ	de
d<   	  eed	¬
«      Zde
d<   	 eZde
d<   	 dZde
d<   	 edd„«       Z ed¬«      edd„«       «       Zdd„Z	 d	 	 	 	 	 dˆ fd„Zˆ xZS )ÚChatEverlyAIaQ  `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                 ó   — y)zReturn type of chat model.zeverlyai-chat© ©Úselfs    úr/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/everlyai.pyÚ	_llm_typezChatEverlyAI._llm_type:   s   € ð ó    c                ó
   — ddiS )NÚeverlyai_api_keyÚEVERLYAI_API_KEYr   r   s    r   Ú
lc_secretszChatEverlyAI.lc_secrets?   s   € à"Ð$6Ð7Ð7r    c                 ó   — y)NFr   )Úclss    r   Úis_lc_serializablezChatEverlyAI.is_lc_serializableC   s   € àr    NzOptional[str]r"   Úmodel)ÚdefaultÚaliasÚ
model_nameÚeverlyai_api_basezOptional[Set[str]]Úavailable_modelsc                 ó   — t        ddg«      S )z'Get available models from EverlyAI API.r   z(meta-llama/Llama-2-13b-chat-hf-quantized)Úsetr   r    r   Úget_available_modelsz!ChatEverlyAI.get_available_modelsP   s   € ô à/Ø:ðó
ð 	
r    Úbefore)Úmodec                ó~  — t        t        |dd«      «      |d<   t        |d<   	 ddl}	 |j
                  |d<   d
|j                  «       vr	t        |d
<   |d
   }| j                  «       }||vrt        d|› d|› d�«      ‚||d<   |S # t        $ r}t	        d«      |‚d}~ww xY w# t        $ r}t        d	«      |‚d}~ww xY w)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: Ú.r-   )r   r   ÚDEFAULT_API_BASEÚopenaiÚImportErrorÚChatCompletionÚAttributeErrorÚ
ValueErrorÚkeysÚDEFAULT_MODELr0   )r&   Úvaluesr9   ÚeÚexcr+   r-   s          r   Úvalidate_environment_overridez*ChatEverlyAI.validate_environment_override[   s  € ô $9Ü ØØ"Ø"óó$
ˆÐÑ ô %5ˆÐ Ñ!ð	Ûð	Ø%×4Ñ4ˆF�8Ñð ˜vŸ{™{›}Ñ,Ü#0ˆF�<Ñ à˜LÑ)ˆ
à×3Ñ3Ó5ÐàÐ-Ñ-ÜØ˜j˜\Ð)IØ#Ð$ Að'óð ð
 &6ˆÐ!Ñ"àˆøô; ò 	Üð?óð ðûð	ûô ò 	Üð7óð ð	ûð	ús.   ¤B ©B" Â	BÂBÂBÂ"	B<Â+B7Â7B<c                ó   — t        «       }| j                  �| j                  }n| j                  }	 |j                  d«      }||fS # t        $ r. t
        j                  d«       d}|j                  |«      }Y ||fS w xY w)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_modelz ChatEverlyAI._get_encoding_modelŠ   s‰   € Ü$Ó&ˆ	Ø×#Ñ#Ð/Ø×,Ñ,‰Eà—O‘OˆEð	5Ø ×3Ñ3Ð4HÓIˆHð
 �hˆÐøô	 ò 	5Ü�N‰NÐRÔSØ!ˆEØ ×-Ñ-¨eÓ4‰HØ�hˆÐð		5ús   ±A Á1A=Á<A=c           
     ó   •— |�t        j                  d«       t        j                  d   dk  rt        ‰| �  |«      S | j                  «       \  }}d}d}d}|D �cg c]  }t        |«      ‘Œ }	}|	D ]P  }
||z  }|
j                  «       D ]6  \  }}|t        |j                  t        |«      «      «      z  }|dk(  sŒ2||z  }Œ8 ŒR |dz  }|S c c}w )z¿Calculate 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_messagesrN   r   ÚitemsÚlenÚencoder   )r   ÚmessagesÚtoolsr(   rM   Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmÚmessages_dictÚmessageÚkeyÚvalueÚ	__class__s                €r   rY   z)ChatEverlyAI.get_num_tokens_from_messages™   sê   ø€ ð ÐÜ�M‰MØWôô ×Ñ˜AÑ !Ò#Ü‘7Ñ7¸ÓAÐAØ×2Ñ2Ó4‰ˆˆxØÐØˆØˆ
Ù=EÓF¹X¸Ô0°Õ3¸XˆÐFÛ$ˆGØÐ,Ñ,ˆJØ%Ÿm™mžo‘
��Uð œc (§/¡/´#°e³*Ó"=Ó>Ñ>�
Ø˜&“=Ø /Ñ1‘Jñ .ð %ð 	�a‰ˆ
ØÐùò Gs   ÁC)Úreturnr   )rh   zDict[str, str])rh   Úbool)rh   zSet[str])r@   Údictrh   r   )rh   ztuple[str, tiktoken.Encoding])N)r]   zlist[BaseMessage]r^   zCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]rh   Úint)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r$   Úclassmethodr'   r"   Ú__annotations__r   r?   r+   r8   r,   r-   Ústaticmethodr0   r   rC   rN   rY   Ú__classcell__)rg   s   @r   r   r   )   sé   ø… ñð  òó ðð ò8ó ð8ð òó ðð '+Ð�mÓ*Ø&Ù M¸ÔA€J�ÓAØØ-Ð�sÓ-Ø)Ø+/ÐÐ(Ó/Ø-àò
ó ð
ñ ˜(Ô#Øò+ó ó $ð+óZð( ð à#ð ð
ð ð 
÷ ñ  r    r   )&ro   Ú
__future__r   ÚloggingrV   rT   Ú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Ú	getLoggerrl   rI   r8   r?   r   r   r    r   Ú<module>r€      sn   ðÙ Då "ã Û 
Û ÷
÷ 
õ 
õ 0Ý )ß Lß +å G÷ñ
 Ûà	ˆ×	Ñ	˜8Ó	$€ð 1Ð Ø/€ôP�:õ Pr    