
    7|h%"                       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    g/var/www/html/test/engine/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    	/Q2::>P3Q **'2
",,7+;*<!=
 &&#-,ZL"../1 
 *9)=)=)?)GHd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 &': ;
! zz(+'4v}}'E}'E'J'J'V'VF8$zz.1-?V-?-? .'.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 		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OOE	5 334HIH
 h	  	5NNRS!E --e4Hh		5s   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 )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_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     MMW A!#77AA224x
=EF03FF$ 	2G,,J%mmo 2
U c(//#e*"=>>
&=/1J2	2 	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AJA"+;<s<=$(NM(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!   