
    Ng                         d Z ddlmZmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddl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 ddlmZ dZdZ  G d de          Z!dS )z<OctoAI Endpoints chat wrapper. Relies heavily on ChatOpenAI.    )AnyCallableDictLiteralOptionalSequenceTypeUnion)LanguageModelInput)BaseMessage)Runnable)BaseTool)convert_to_secret_strget_from_dict_or_envpre_initconvert_to_openai_tool)Field	SecretStr)
ChatOpenAI)is_openai_v1zhttps://text.octoai.run/v1/zllama-2-13b-chatc                       e Zd ZU dZ ee          Zeed<    e e	d          d          Z
e	ed<    eed          Zeed	<   ed
efd            Zed
eeef         fd            Zed
efd            Zeded
efd            Zddddeeeeef         eeef                  deeeeed         ef                  dee         ded
ee e!f         f
 fdZ" xZ#S )
ChatOctoAIaz  OctoAI Chat large language models.

    See https://octo.ai/ for information about OctoAI.

    To use, you should have the ``openai`` python package installed and the
    environment variable ``OCTOAI_API_TOKEN`` set with your API token.
    Alternatively, you can use the octoai_api_token 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 ChatOctoAI
            chat = ChatOctoAI(model_name="mixtral-8x7b-instruct")
    defaultoctoai_api_base api_key)r   aliasoctoai_api_tokenmodel
model_namereturnc                     dS )zReturn type of chat model.zoctoai-chat selfs    b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/octoai.py	_llm_typezChatOctoAI._llm_type4   s	     }    c                 
    ddiS )Nr    OCTOAI_API_TOKENr%   r&   s    r(   
lc_secretszChatOctoAI.lc_secrets9   s    "$677r*   c                     dS )NFr%   )clss    r(   is_lc_serializablezChatOctoAI.is_lc_serializable=   s    ur*   valuesc                 ~   t          |ddt                    |d<   t          t          |dd                    |d<   t          |ddt                    |d<   	 dd	l}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          w xY w|S )z?Validate that api key and python package exists in environment.r   OCTOAI_API_BASEr   r    r,   r"   
MODEL_NAMEr   N)r   base_urlclientasync_clientopenai_api_baseopenai_api_keyzTCould not import openai python package. Please install it with `pip install openai`.r%   )r   DEFAULT_API_BASEr   DEFAULT_MODELopenair   get_secret_valuegetOpenAIchatcompletionsAsyncOpenAIChatCompletionImportError)r/   r1   r<   client_paramss       r(   validate_environmentzChatOctoAI.validate_environmentA   s    %9$	%
 %
 %
 ! &; );=OPP&
 &
!"  4!	 
  
  
|	MMM~~ 9%&89JJLL &'8 9! ! zz(++ W'4v}'E'E}'E'E'J'VF8$zz.11 '-?V-? . .'. .; >* -33D,E()+12D+E+V+V+X+X'(#)#8x  	 	 	?  	 s   CD   D:N)tool_choicestricttoolsrG   )autononerequiredanyrH   kwargsc                   fd|D             }rt          t                    rdvrddiddk    rdn}t          t                    rdnet          t                    r>d |D             }t	          fd	|D                       st          d
 d| d          nt          d           |d<    t                      j        dd|i|S )z;Imitating bind_tool method from langchain_openai.ChatOpenAIc                 2    g | ]}t          |           S ))rH   r   ).0toolrH   s     r(   
<listcomp>z)ChatOctoAI.bind_tools.<locals>.<listcomp>z   s4     
 
 
<@"4777
 
 
r*   )rJ   rK   rM   rL   functionname)typerT   rM   rL   c                 *    g | ]}|d          d         S )rT   rU   r%   )rQ   formatted_tools     r(   rS   z)ChatOctoAI.bind_tools.<locals>.<listcomp>   s2       & #:.v6  r*   c              3   <   K   | ]}|d          d         k    V  dS )rT   rU   Nr%   )rQ   	tool_namerG   s     r(   	<genexpr>z(ChatOctoAI.bind_tools.<locals>.<genexpr>   sF        ! Z!8!@@     r*   zTool choice z1 was specified, but the only provided tools were .zEUnrecognized tool_choice type. Expected str, bool or dict. Received: rG   rI   r%   )
isinstancestrbooldictrM   
ValueErrorsuperbind)r'   rI   rG   rH   rN   formatted_tools
tool_names	__class__s     ``   r(   
bind_toolszChatOctoAI.bind_toolsn   s   
 
 
 
DI
 
 
   	0+s++ &III *%+[$9# #K %''",KK.. (K..  *9  
     %/      %={ = =/9= = =  	 !/!,/ /   %0F=!uww|<</<V<<<r*   )$__name__
__module____qualname____doc__r   r:   r   r^   __annotations__r   r    r;   r"   propertyr)   r   r-   classmethodr_   r0   r   rF   r   r
   r   r	   r   r   r   r`   r   r   r   r   rg   __classcell__)rf   s   @r(   r   r      s         $ !5)9:::OS:::"'%		"Y"O"O"OiOOOeMAAAJAAA3    X 8DcN 8 8 8 X8 4    [ *$ *4 * * * X*d !%0= 0= 0=d38ndHhFGH0= $W%FGMN
	0= 0= 0= 
$k1	20= 0= 0= 0= 0= 0= 0= 0= 0= 0=r*   r   N)"rk   typingr   r   r   r   r   r   r	   r
   langchain_core.language_modelsr   langchain_core.messagesr   langchain_core.runnablesr   langchain_core.toolsr   langchain_core.utilsr   r   r   %langchain_core.utils.function_callingr   pydanticr   r   &langchain_community.chat_models.openair    langchain_community.utils.openair   r:   r;   r   r%   r*   r(   <module>rz      sn   B B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 > = = = = = / / / / / / - - - - - - ) ) ) ) ) ) V V V V V V V V V V H H H H H H % % % % % % % % = = = = = = 9 9 9 9 9 90 "A= A= A= A= A= A= A= A= A= A=r*   