§
    æ˜ºhÒ  ã                  óÒ   — d Z ddlmZ ddlZddlZddlmZmZ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 erddlZ ej        e¦  «        Zd
ZdZ G d„ de¦  «        ZdS )z>EverlyAI Endpoints chat wrapper. Relies heavily on ChatOpenAI.é    )ÚannotationsN)ÚTYPE_CHECKINGÚDictÚOptionalÚSet)ÚBaseMessage)ÚFieldÚroot_validator)Úget_from_dict_or_env©Ú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¬¦  «        d#d„¦   «         Zd$d„Z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")
    ÚreturnÚstrc                ó   — dS )zReturn type of chat model.zeverlyai-chat© ©Úselfs    úp/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/chat_models/everlyai.pyÚ	_llm_typezChatEverlyAI._llm_type-   s	   € ð ˆó    úDict[str, str]c                ó
   — ddiS )NÚeverlyai_api_keyÚEVERLYAI_API_KEYr   r   s    r   Ú
lc_secretszChatEverlyAI.lc_secrets2   s   € à"Ð$6Ð7Ð7r   Úboolc                ó   — dS )NFr   )Úclss    r   Úis_lc_serializablezChatEverlyAI.is_lc_serializable6   s   € àˆur   NzOptional[str]r   Úmodel)ÚdefaultÚaliasÚ
model_nameÚeverlyai_api_basezOptional[Set[str]]Úavailable_modelsúSet[str]c                 ó$   — 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_modelsC   s!   € õ à/Ø:ðñ
ô 
ð 	
r   T)ÚpreÚvaluesÚdictc                ó¤  — t          |dd¦  «        |d<   t          |d<   	 ddl}n"# t          $ r}t	          d¦  «        |‚d}~ww xY w	 |j        |d<   n"# t          $ r}t	          d	¦  «        |‚d}~ww xY wd
|                     ¦   «         vr
t          |d
<   |d
         }|  	                    ¦   «         }||vrt	          d|› d|› d�¦  «        ‚||d<   |S )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   ÚDEFAULT_API_BASEÚopenaiÚImportErrorÚ
ValueErrorÚChatCompletionÚAttributeErrorÚkeysÚDEFAULT_MODELr.   )r#   r0   r8   ÚeÚexcr(   r*   s          r   Úvalidate_environment_overridez*ChatEverlyAI.validate_environment_overrideN   sX  € õ $8ØØØñ$
ô $
ˆÐÑ õ
 %5ˆÐ Ñ!ð	ØˆMˆMˆMˆMøåð 	ð 	ð 	Ýð?ñô ð ðøøøøð	øøøð
	Ø%Ô4ˆF�8ÑÐøÝð 	ð 	ð 	Ýð7ñô ð ð	øøøøð	øøøð ˜vŸ{š{™}œ}Ð,Ð,Ý#0ˆF�<Ñ à˜LÔ)ˆ
à×3Ò3Ñ5Ô5ÐàÐ-Ð-Ð-Ýð'˜jð 'ð 'Ø#ð'ð 'ð 'ñô ð ð
 &6ˆÐ!Ñ"àˆs*    % ¥
A¯?¿AÁ
A Á
A2ÁA-Á-A2útuple[str, tiktoken.Encoding]c                ó  — t          ¦   «         }| j        �| j        }n| j        }	 |                     d¦  «        }nA# t          $ r4 t
                               d¦  «         d}|                     |¦  «        }Y nw xY w||fS )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_modelz   s˜   € Ý$Ñ&Ô&ˆ	ØÔ#Ð/ØÔ,ˆEˆEà”OˆEð	5Ø ×3Ò3Ð4HÑIÔIˆHˆHøÝð 	5ð 	5ð 	5Ý�NŠNÐRÑSÔSÐSØ!ˆEØ ×-Ò-¨eÑ4Ô4ˆHˆHˆHð	5øøøð �hˆÐs   ¦< ¼;A:Á9A:Úmessagesúlist[BaseMessage]Úintc           
     ó”  •— t           j        d         dk    r!t          ¦   «                              |¦  «        S |                      ¦   «         \  }}d}d}d}d„ |D ¦   «         }|D ]^}||z  }|                     ¦   «         D ]B\  }	}
|t          |                     t          |
¦  «        ¦  «        ¦  «        z  }|	dk    r||z  }ŒCŒ_|dz  }|S )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.ipynbé   é   é   r   c                ó,   — g | ]}t          |¦  «        ‘ŒS r   r   )Ú.0Úms     r   ú
<listcomp>z=ChatEverlyAI.get_num_tokens_from_messages.<locals>.<listcomp>”   s!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFr   Úname)	ÚsysÚversion_infoÚsuperÚget_num_tokens_from_messagesrM   ÚitemsÚlenÚencoder   )r   rN   r%   rL   Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmessages_dictÚmessageÚkeyÚvalueÚ	__class__s              €r   r]   z)ChatEverlyAI.get_num_tokens_from_messages‰   sí   ø€ õ
 Ô˜AÔ !Ò#Ð#Ý‘7”7×7Ò7¸ÑAÔAÐAØ×2Ò2Ñ4Ô4‰ˆˆxØÐØˆØˆ
ØFÐF¸XÐFÑFÔFˆØ$ð 	2ð 	2ˆGØÐ,Ñ,ˆJØ%Ÿmšm™oœoð 2ð 2‘
��Uð �c (§/¢/µ#°e±*´*Ñ"=Ô"=Ñ>Ô>Ñ>�
Ø˜&’=�=Ø /Ñ1�Jøð2ð 	�a‰ˆ
ØÐr   )r   r   )r   r   )r   r!   )r   r+   )r0   r1   r   r1   )r   rB   )rN   rO   r   rP   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r    Úclassmethodr$   r   Ú__annotations__r	   r>   r(   r7   r)   r*   Ústaticmethodr.   r
   rA   rM   r]   Ú__classcell__)rh   s   @r   r   r      sn  ø€ € € € € € ðð ð  ðð ð ñ „Xðð ð8ð 8ð 8ñ „Xð8ð ðð ð ñ „[ðð '+ÐÐ*Ð*Ð*Ñ*Ø&Ø�e M¸ÐAÑAÔA€JÐAÐAÐAÑAØØ-ÐÐ-Ð-Ð-Ñ-Ø)Ø+/ÐÐ/Ð/Ð/Ñ/Ø-àð
ð 
ð 
ñ „\ð
ð €^˜ÐÑÔð)ð )ð )ñ Ôð)ðVð ð ð ðð ð ð ð ð ð ð ð ð r   r   )rl   Ú
__future__r   ÚloggingrZ   Útypingr   r   r   r   Úlangchain_core.messagesr   Úlangchain_core.pydantic_v1r	   r
   Úlangchain_core.utilsr   Ú#langchain_community.adapters.openair   Ú&langchain_community.chat_models.openair   r   ÚtiktokenÚ	getLoggerri   rH   r7   r>   r   r   r   r   ú<module>r|      s9  ðØ DÐ DØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 
€
€
€
Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à /Ð /Ð /Ð /Ð /Ð /Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5à GÐ GÐ GÐ GÐ GÐ Gðð ð ð ð ð ð ð ð
 ð Ø€O€O€Oà	ˆÔ	˜8Ñ	$Ô	$€ð 1Ð Ø/€ðCð Cð Cð Cð C�:ñ Cô Cð Cð Cð Cr   