
    dh"                    $   S r SSKJr  SSK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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Jr  SS	KJr  SS
KJ r J!r!  SSK"J#r#  \(       a  SSK$r$\RJ                  " \&5      r'Sr(Sr) " S S\ 5      r*g)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                  J  ^  \ rS rSr% Sr\SS j5       r\SS j5       r\SS j5       r	\
" \" S5      S9rS	\S
'    \
" \SS9rS\S'    \
" \S9rS\S'    SrS\S'    SrS\S'    \S\4     SS j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$ )#ChatAnyscale+   ah  `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                    g)zReturn type of chat model.zanyscale-chat selfs    `/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/anyscale.py	_llm_typeChatAnyscale._llm_type>   s         c                
    SS0$ )Nanyscale_api_keyANYSCALE_API_KEYr   r   s    r    
lc_secretsChatAnyscale.lc_secretsC   s    "$677r#   c                    g)NFr   )clss    r    is_lc_serializable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                `    U =(       d    [         R                  S   n U S3n[        R
                  " USSU  30S9nUR                  S:w  a  [        S	U S
UR                   35      eUR                  5       S    Vs1 sH  oUS   iM	     sn$ ! [         a  n[        S5      UeSnAff = fs  snf )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%   r3   e
models_urlmodels_responser0   s         r    get_available_models!ChatAnyscale.get_available_modelsW   s    	/Q2::>P3Q **'2
",,7+;*<!=
 &&#-,ZL"../1 
 *9)=)=)?)GH)Gd)GHH)  	@ 	( Is   B =B+
B(B##B(before)modec                p   [        [        USS5      5      US'   [        USS[        S9US'   [        USSSS9US	'    S
SKn [        5       (       a  US   R                  5       US   S.nUR                  S5      (       d)  UR                  " S0 UD6R                  R                  US'   UR                  S5      (       d)  UR                  " S0 UD6R                  R                  US'   O.US   US'   US   R                  5       US'   UR                  US'    SUR                  5       ;  a	  [         US'   US   nU R#                  US   R                  5       US   5      nXg;  a  [        SU SU S35      eXqS'   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&   r3   ANYSCALE_API_BASEr.   r5   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`.r2   zModel name z  not found in available models: .r6   r   )r   r   DEFAULT_API_BASEopenaiImportErrorr   get_secret_valuerB   OpenAIchatcompletionsAsyncOpenAIChatCompletionAttributeErrorr@   keysDEFAULT_MODELrH   )r*   valuesrX   rE   client_paramsexcr2   r6   s           r    validate_environment!ChatAnyscale.validate_environmentu   s    &; ""&
!" ';$	'
"# "6	"
~		~~%&89JJL &': ;
! zz(++'-}}'E}'E'J'J'V'VF8$zz.11-3-?-? .'.d;; >* -33F,G()+12D+E+V+V+X'(#)#8#8x  v{{},#0F< L)
33%&779&'

 -j\)I#$A' 
 &6!"i  	? 	8  	7 		s6   E< B&F )-F <
FFF
F5$F00F5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_namer2   encoding_for_modelr?   loggerwarningget_encoding)r   	tiktoken_r0   encodings       r    _get_encoding_model ChatAnyscale._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.ipynb
zECounting tokens in tool schemas is not yet supported. Ignoring tools.         r   name)warningswarnsysversion_infosuperget_num_tokens_from_messagesrq   r   itemslenencoder   )r   messagestoolsr0   rp   tokens_per_messagetokens_per_name
num_tokensmmessages_dictmessagekeyvalue	__class__s                r    r}   )ChatAnyscale.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   )r   zDict[str, str])r   bool)r%   r4   r3   r   r   zSet[str])rc   dictr   r   )r   ztuple[str, tiktoken.Encoding])N)r   zlist[BaseMessage]r   zCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]r   int)__name__
__module____qualname____firstlineno____doc__propertyr!   r'   classmethodr+   r   r   r%   __annotations__rb   r2   rW   r3   r5   r6   staticmethodrH   r   rf   rq   r}   __static_attributes____classcell__)r   s   @r    r   r   +   s.   $   8 8   #(	"">i>&MAJA"+;<s<=$(NM(1+/(/-*.!1I'II 
I I: (#L  $L\( #
 
 r#   r   )+r   
__future__r   loggingr=   rz   rx   typingr   r   r   r   r   r	   r
   r   r   rA   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   rl   rW   rb   r   r   r#   r    <module>r      sv    D "  	 
 
 
 
  / ) L 6 6 G :			8	$: 5H: Hr#   