
    Ng%"                       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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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                  t    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")
    returnstrc                    dS )zReturn type of chat model.zanyscale-chat selfs    d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/anyscale.py	_llm_typezChatAnyscale._llm_type>   s	         Dict[str, str]c                
    ddiS )Nanyscale_api_keyANYSCALE_API_KEYr   r   s    r!   
lc_secretszChatAnyscale.lc_secretsC   s    "$677r#   boolc                    dS )NFr   )clss    r!   is_lc_serializablezChatAnyscale.is_lc_serializableG   s    ur#    defaultr   r&   model)r/   alias
model_name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   ).0r0   s     r!   	<setcomp>z4ChatAnyscale.get_available_models.<locals>.<setcomp>s   s    HHHdHHHr#   data)osenvironKeyError
ValueErrorrequestsgetstatus_codejson)r&   r3   e
models_urlmodels_responses        r!   get_available_modelsz!ChatAnyscale.get_available_modelsW   s   	/Q2:>P3Q 	 	 	@  	 *222
",!=+;!=!=
 
 
 &#--1Z 1 1".1 1  
 IH)=)=)?)?)GHHHHs    
616before)modevaluesdictr   c                   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}|                    d          s |j        di |j	        j
        |d<   |                    d          s |j        di |j	        j
        |d<   n2|d         |d<   |d                                         |d<   |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'   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_valuerF   OpenAIchatcompletionsAsyncOpenAIChatCompletionAttributeErrorrD   keysDEFAULT_MODELrL   )r+   rO   r]   rI   client_paramsexcr2   r6   s           r!   validate_environmentz!ChatAnyscale.validate_environmentu   s    &; "" &
 &
!" ';$	'
 '
 '
"# "6	"
 "
 "
~	MMMM 	 	 	?  	
	~~ 9%&89JJLL &': ;
! 
! zz(++ W'4v}'E'E}'E'E'J'VF8$zz.11 '-?V-? . .'. .; >* -33F,G()+12D+E+V+V+X+X'(#)#8x  	 	 	7  		 v{{}},,#0F< L)
33%&7799&'
 

 ---'j ' '#' ' '  
 &6!"s1   A 
A8#A33A8<CD? ?
E	EE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_namer2   encoding_for_modelrC   loggerwarningget_encoding)r    	tiktoken_r0   encodings       r!   _get_encoding_modelz ChatAnyscale._get_encoding_model   s    $&&	#/,EEOE	5 334HIIHH 	5 	5 	5NNRSSS!E --e44HHH	5 hs   < ;A:9A:messageslist[BaseMessage]toolsCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]intc           
        |t          j        d           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 )	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
        NzECounting tokens in tool schemas is not yet supported. Ignoring tools.         r   c                ,    g | ]}t          |          S r   r   )r>   ms     r!   
<listcomp>z=ChatAnyscale.get_num_tokens_from_messages.<locals>.<listcomp>   s!    FFF033FFFr#   name)warningswarnsysversion_infosuperget_num_tokens_from_messagesru   itemslenencoder   )r    rv   rx   r0   rt   tokens_per_messagetokens_per_name
num_tokensmessages_dictmessagekeyvalue	__class__s               r!   r   z)ChatAnyscale.get_num_tokens_from_messages   s    MW   A!##7777AAA2244x
FFXFFF$ 	2 	2G,,J%mmoo 2 2
U c(//#e**"="=>>>
&==/1J2 	a
r#   )r   r   )r   r$   )r   r)   )r&   r4   r3   r   r   r7   )rO   rP   r   r   )r   rk   )N)rv   rw   rx   ry   r   rz   )__name__
__module____qualname____doc__propertyr"   r(   classmethodr,   r   r   r&   __annotations__rg   r2   r\   r3   r5   r6   staticmethodrL   r   rj   ru   r   __classcell__)r   s   @r!   r   r   +   s         $    X 8 8 8 X8    [ #(%		"">">">>>>>&eMAAAJAAAA"U+;<<<<<<<=$(N((((1+/////-*.!1I I I I \I: _(###L L L [ $#L\   (           r#   r   )+r   
__future__r   loggingrA   r   r   typingr   r   r   r   r   r	   r
   r   r   rE   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   rp   r\   rg   r   r   r#   r!   <module>r      s   D D " " " " " "  				 



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  / / / / / / ) ) ) ) ) ) L L L L L L L L 6 6 6 6 6 6 6 6 6 6 G G G G G G        : 9 9 9 9 9 OOO		8	$	$: 5H H H H H: H H H H Hr#   