§
    æ˜ºh	  ã                  óö   — 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
 ddlZddlmZ ddlmZmZ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 erddlZ ej        e¦  «        ZdZ dZ! G d„ de¦  «        Z"dS )z>Anyscale Endpoints chat wrapper. Relies heavily on ChatOpenAI.é    )ÚannotationsN)ÚTYPE_CHECKINGÚDictÚOptionalÚSet)ÚBaseMessage)ÚFieldÚ	SecretStrÚroot_validator)Úconvert_to_secret_strÚget_from_dict_or_env©Úconvert_message_to_dict)Ú
ChatOpenAIÚ_import_tiktoken)Úis_openai_v1z%https://api.endpoints.anyscale.com/v1zmeta-llama/Llama-2-7b-chat-hfc                  ó6  ‡ — e Zd ZU dZed"d„¦   «         Zed#d„¦   «         Zed$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¬¦  «        d&d„¦   «         Zd'd„Z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")
    ÚreturnÚstrc                ó   — dS )zReturn type of chat model.zanyscale-chat© ©Úselfs    úp/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/chat_models/anyscale.pyÚ	_llm_typezChatAnyscale._llm_type2   s	   € ð ˆó    úDict[str, str]c                ó
   — ddiS )NÚanyscale_api_keyÚANYSCALE_API_KEYr   r   s    r   Ú
lc_secretszChatAnyscale.lc_secrets7   s   € à"Ð$6Ð7Ð7r   Úboolc                ó   — dS )NFr   )Úclss    r   Úis_lc_serializablezChatAnyscale.is_lc_serializable;   s   € àˆur   r
   r    Úmodel)ÚdefaultÚaliasÚ
model_name©r(   Úanyscale_api_baseNúOptional[str]Úanyscale_proxyzOptional[Set[str]]Úavailable_modelsúSet[str]c                óD  — 	 | pt           j        d         } n"# t          $ r}t          d¦  «        |‚d}~ww xY w|› d�}t	          j        |dd| › �i¬¦  «        }|j        dk    rt          d	|› d
|j        › �¦  «        ‚d„ |                     ¦   «         d         D ¦   «         S )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: c                ó   — h | ]
}|d          ’ŒS )Úidr   )Ú.0r'   s     r   ú	<setcomp>z4ChatAnyscale.get_available_models.<locals>.<setcomp>g   s   € ÐHÐHÐH ��d”ÐHÐHÐHr   Údata)ÚosÚenvironÚKeyErrorÚ
ValueErrorÚrequestsÚgetÚstatus_codeÚjson)r    r,   ÚeÚ
models_urlÚmodels_responses        r   Úget_available_modelsz!ChatAnyscale.get_available_modelsK   s  € ð	Ø/ÐQµ2´:Ð>PÔ3QÐÐøÝð 	ð 	ð 	Ýð@ñô ð ðøøøøð	øøøð *Ð2Ð2Ð2ˆ
Ý"œ,ØàÐ!=Ð+;Ð!=Ð!=ðð
ñ 
ô 
ˆð Ô&¨#Ò-Ð-Ýð1¨Zð 1ð 1Ø"Ô.ð1ð 1ñô ð ð
 IÐH¨×)=Ò)=Ñ)?Ô)?ÀÔ)GÐHÑHÔHÐHs   ‚ —
6¡1±6T)ÚpreÚvaluesÚdictc                óÄ  — t          |dd¦  «        |d<   t          t          |dd¦  «        ¦  «        |d<   t          |ddt          ¬¦  «        |d<   t          |dd	d
¬¦  «        |d<   	 ddl}n"# t          $ r}t          d¦  «        |‚d}~ww xY w	 t          ¦   «         r,|d         |d         dœ} |j        di |¤Žj        j	        |d<   n
|j
        |d<   n"# t          $ r}t          d¦  «        |‚d}~ww xY wd|                     ¦   «         vr
t          |d<   |d         }|                      |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_keyr,   ÚANYSCALE_API_BASEr+   Úopenai_api_baser.   ÚANYSCALE_PROXYÚ Úopenai_proxyr   NzTCould not import openai python package. Please install it with `pip install openai`.)Úapi_keyÚbase_urlÚ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   r   ÚDEFAULT_API_BASEÚopenaiÚImportErrorr=   r   ÚOpenAIÚchatÚcompletionsÚChatCompletionÚAttributeErrorÚkeysÚDEFAULT_MODELrE   )r%   rG   rU   rB   Úclient_paramsÚexcr*   r/   s           r   Úvalidate_environment_overridez*ChatAnyscale.validate_environment_overridei   s.  € õ $8ØØØñ$
ô $
ˆÐÑ õ
 &;Ý ØØ"Ø"ñô ñ&
ô &
ˆÐ!Ñ"õ %9ØØØÝ$ð	%
ñ %
ô %
ˆÐ Ñ!õ "6ØØØØð	"
ñ "
ô "
ˆˆ~Ñð	ØˆMˆMˆMˆMøåð 	ð 	ð 	Ýð?ñô ð ðøøøøð	øøøð
	Ý‰~Œ~ð 9à%Ð&6Ô7Ø &Ð'8Ô 9ð
!ð 
!�ð $1 6¤=Ð#AÐ#A°=Ð#AÐ#AÔ#FÔ#R��xÑ Ð à#)Ô#8��xÑ øøÝð 	ð 	ð 	Ýð7ñô ð ð	øøøøð	øøøð ˜vŸ{š{™}œ}Ð,Ð,Ý#0ˆF�<Ñ à˜LÔ)ˆ
à×3Ò3ØÐ#Ô$ØÐ$Ô%ñ
ô 
Ðð
 Ð-Ð-Ð-Ýð'˜jð 'ð 'Ø#ð'ð 'ð 'ñô ð ð
 &6ˆÐ!Ñ"àˆs1   Á(A- Á-
BÁ7BÂBÂAC Ã
C4ÃC/Ã/C4ú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_modelr<   ÚloggerÚwarningÚget_encoding)r   Ú	tiktoken_r'   Úencodings       r   Ú_get_encoding_modelz ChatAnyscale._get_encoding_model·   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   )r7   Úms     r   ú
<listcomp>z=ChatAnyscale.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_messagesrk   ÚitemsÚlenÚencoder   )r   rl   r'   rj   Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmessages_dictÚmessageÚkeyÚvalueÚ	__class__s              €r   rz   z)ChatAnyscale.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-   r,   r   r   r0   )rG   rH   r   rH   )r   ra   )rl   rm   r   rn   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r"   Úclassmethodr&   Ú__annotations__r	   r]   r*   rT   r,   r.   r/   ÚstaticmethodrE   r   r`   rk   rz   Ú__classcell__)r…   s   @r   r   r      s   ø€ € € € € € ðð ð$ ðð ð ñ „Xðð ð8ð 8ð 8ñ „Xð8ð ðð ð ñ „[ðð  ÐÐÑØ&Ø�e M¸ÐAÑAÔA€JÐAÐAÐAÑAØØ"˜UÐ+;Ð<Ñ<Ô<ÐÐ<Ð<Ð<Ñ<ð=à$(€NÐ(Ð(Ð(Ñ(Ø1Ø+/ÐÐ/Ð/Ð/Ñ/Ø-àà*.Ø!1ðIð Ið Ið Iñ „\ðIð: €^˜ÐÑÔðKð Kð Kñ ÔðKðZð ð ð ðð ð ð ð ð ð ð ð ð r   r   )#r‰   Ú
__future__r   Úloggingr:   rw   Útypingr   r   r   r   r>   Úlangchain_core.messagesr   Úlangchain_core.pydantic_v1r	   r
   r   Úlangchain_core.utilsr   r   Ú#langchain_community.adapters.openair   Ú&langchain_community.chat_models.openair   r   Ú langchain_community.utils.openair   ÚtiktokenÚ	getLoggerr†   rf   rT   r]   r   r   r   r   ú<module>rš      si  ðØ DÐ DØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à €€€Ø /Ð /Ð /Ð /Ð /Ð /Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Là GÐ GÐ GÐ GÐ GÐ Gðð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9àð Ø€O€O€Oà	ˆÔ	˜8Ñ	$Ô	$€ð ;Ð Ø/€ð}ð }ð }ð }ð }�:ñ }ô }ð }ð }ð }r   