Ë
    µŒj"  ã                  ó  — d Z ddlmZ ddl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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mZ dd	lmZ dd
lm Z m!Z! ddl"m#Z# erddl$Z$ ejJ                  e&«      Z'dZ(dZ) G d„ de «      Z*y)z>Anyscale 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Ú	SecretStrÚmodel_validator)Úconvert_message_to_dict)Ú
ChatOpenAIÚ_import_tiktoken)Úis_openai_v1z%https://api.endpoints.anyscale.com/v1z#meta-llama/Meta-Llama-3-8B-Instructc                  óF  ‡ — e Zd ZU dZedd„«       Zedd„«       Zedd„«       Z e	 e
d«      ¬«      Zded	<   	  e	ed
¬«      Zded<   	  e	e¬«      Zded<   	 dZded<   	 dZded<   	 edef	 	 	 	 	 dd„«       Z ed¬«      edd„«       «       Zdd„Z	 d	 	 	 	 	 d ˆ fd„Zˆ xZS )!ÚChatAnyscalea”  `Anyscale` Chat large language models.

    See https://www.anyscale.com/ for information about Anyscale.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``ANYSCALE_API_KEY`` set with your API key.
    Alternatively, you can use the anyscale_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 ChatAnyscale
            chat = ChatAnyscale(model_name="meta-llama/Llama-2-7b-chat-hf")
    Ústrc                 ó   — y)zReturn type of chat model.zanyscale-chat© ©Úselfs    úr/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/anyscale.pyÚ	_llm_typezChatAnyscale._llm_type>   s   € ð ó    c                ó
   — ddiS )NÚanyscale_api_keyÚANYSCALE_API_KEYr   r   s    r   Ú
lc_secretszChatAnyscale.lc_secretsC   s   € à"Ð$6Ð7Ð7r!   c                 ó   — y)NFr   )Úclss    r   Úis_lc_serializablezChatAnyscale.is_lc_serializableG   s   € àr!   Ú ©Údefaultr   r#   Úmodel)r+   ÚaliasÚ
model_nameÚanyscale_api_baseNúOptional[str]Úanyscale_proxyzOptional[Set[str]]Úavailable_modelsc                óT  — 	 | xs t         j                  d   } |› d�}t	        j
                  |dd| › �i¬«      }|j                  dk7  rt        d	|› d
|j                  › �«      ‚|j                  «       d   D �ch c]  }|d   ’Œ	 c}S # t        $ r}t        d«      |‚d}~ww xY wc c}w )z'Get available models from Anyscale API.r$   zdAnyscale API key must be passed as keyword argument or set in environment variable ANYSCALE_API_KEY.Nz/modelsÚAuthorizationzBearer )ÚheaderséÈ   zError getting models from z: ÚdataÚid)ÚosÚenvironÚKeyErrorÚ
ValueErrorÚrequestsÚgetÚstatus_codeÚjson)r#   r/   ÚeÚ
models_urlÚmodels_responser,   s         r   Úget_available_modelsz!ChatAnyscale.get_available_modelsW   sà   € ð	Ø/ÒQ´2·:±:Ð>PÑ3QÐð *Ð*¨'Ð2ˆ
Ü"Ÿ,™,Øà 7Ð+;Ð*<Ð!=ðô
ˆð ×&Ñ&¨#Ò-ÜØ,¨Z¨L¸Ø"×.Ñ.Ð/ð1óð ð
 *9×)=Ñ)=Ó)?ÀÒ)GÓHÑ)G ��d“Ð)GÑHÐHøô) ò 	Üð@óð ðûð	üò( Is   ‚B Á9B%Â	B"ÂBÂB"Úbefore)Úmodec                óT  — t        t        |dd«      «      |d<   t        |ddt        ¬«      |d<   t        |ddd¬«      |d	<   	 d
dl}	 t        «       rŽ|d   j                  «       |d   dœ}|j                  d«      s) |j                  di |¤Žj                  j                  |d<   |j                  d«      sW |j                  di |¤Žj                  j                  |d<   n-|d   |d<   |d   j                  «       |d<   |j                  |d<   d|j                  «       vr	t         |d<   |d   }| j#                  |d   j                  «       |d   «      }||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$   r/   ÚANYSCALE_API_BASEr*   r1   ÚANYSCALE_PROXYr)   Úopenai_proxyr   NzTCould not import openai python package. Please install it with `pip install openai`.)Úapi_keyÚbase_urlÚclientÚasync_clientÚopenai_api_baseÚopenai_api_keyz�`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: Ú.r2   r   )r   r   ÚDEFAULT_API_BASEÚopenaiÚImportErrorr   Úget_secret_valuer>   ÚOpenAIÚchatÚcompletionsÚAsyncOpenAIÚChatCompletionÚAttributeErrorr<   ÚkeysÚDEFAULT_MODELrD   )r'   ÚvaluesrS   rA   Úclient_paramsÚexcr.   r2   s           r   Úvalidate_environmentz!ChatAnyscale.validate_environmentu   s  € ô &;Ü ØØ"Ø"óó&
ˆÐ!Ñ"ô ';ØØØÜ$ô	'
ˆÐ"Ñ#ô "6ØØØØô	"
ˆˆ~Ñð	Ûð	ÜŒ~à%Ð&8Ñ9×JÑJÓLØ &Ð':Ñ ;ñ
!�ð —z‘z (Ô+Ø'4 v§}¡}Ñ'E°}Ñ'E×'JÑ'J×'VÑ'V�F˜8Ñ$Ø—z‘z .Ô1Ø-?¨V×-?Ñ-?ñ .Ø'ñ.ç‘dŸ;™;ð ˜>Ò*ð -3Ð3FÑ,G�Ð(Ñ)Ø+1Ð2DÑ+E×+VÑ+VÓ+X�Ð'Ñ(Ø#)×#8Ñ#8��xÑ ð ˜vŸ{™{›}Ñ,Ü#0ˆF�<Ñ à˜LÑ)ˆ
Ø×3Ñ3ØÐ%Ñ&×7Ñ7Ó9ØÐ&Ñ'ó
Ðð
 Ð-Ñ-ÜØ˜j˜\Ð)IØ#Ð$ Að'óð ð
 &6ˆÐ!Ñ"àˆøôi ò 	Üð?óð ðûð	ûô8 ò 	Üð7óð ð	ûð	ús1   ÁE0 ÁCF Å0	F
Å9FÆF
Æ	F'ÆF"Æ"F'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_modelr;   ÚloggerÚwarningÚget_encoding)r   Ú	tiktoken_r,   Úencodings       r   Ú_get_encoding_modelz ChatAnyscale._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.ipynb
        zECounting tokens in tool schemas is not yet supported. Ignoring tools.é   é   é   r   Úname)ÚwarningsÚwarnÚsysÚversion_infoÚsuperÚget_num_tokens_from_messagesrk   r   ÚitemsÚlenÚencoder   )r   ÚmessagesÚtoolsr,   rj   Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmÚmessages_dictÚmessageÚkeyÚvalueÚ	__class__s                €r   rv   z)ChatAnyscale.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   )r…   zDict[str, str])r…   Úbool)r#   r0   r/   r   r…   zSet[str])r^   Údictr…   r   )r…   ztuple[str, tiktoken.Encoding])N)rz   zlist[BaseMessage]r{   zCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]r…   Úint)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr    r%   Úclassmethodr(   r   r   r#   Ú__annotations__r]   r.   rR   r/   r1   r2   ÚstaticmethodrD   r   ra   rk   rv   Ú__classcell__)r„   s   @r   r   r   +   s.  ø… ñð$ òó ðð ò8ó ð8ð òó ðñ #(±	¸"³Ô">Ð�iÓ>Ø&Ù M¸ÔA€J�ÓAØÙ"Ð+;Ô<Ð�sÓ<ð=à$(€N�MÓ(Ø1Ø+/ÐÐ(Ó/Ø-àà*.Ø!1ðIØ'ðIàðIð 
òIó ðIñ: ˜(Ô#ØòLó ó $ðLó\ð( ðà#ðð
ðð 
÷ñ r!   r   )+rŒ   Ú
__future__r   Úloggingr9   rs   rq   Útypingr   r   r   r   r   r	   r
   r   r   r=   Úlangchain_core.messagesr   Úlangchain_core.toolsr   Úlangchain_core.utilsr   r   Úpydanticr   r   r   Ú#langchain_community.adapters.openair   Ú&langchain_community.chat_models.openair   r   Ú langchain_community.utils.openair   ÚtiktokenÚ	getLoggerr‰   rf   rR   r]   r   r   r!   r   Ú<module>rž      sx   ðÙ Då "ã Û 	Û 
Û ÷
÷ 
õ 
ó Ý /Ý )ß Lß 6Ñ 6å G÷õ :áÛà	ˆ×	Ñ	˜8Ó	$€à:Ð Ø5€ôH�:õ Hr!   