
    7|h                         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!y)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                   T    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                      y)zReturn type of chat model.zoctoai-chat selfs    e/var/www/html/test/engine/venv/lib/python3.12/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                      y)NFr$   )clss    r'   is_lc_serializablezChatOctoAI.is_lc_serializable=   s    r)   valuesc                 X   t        |ddt              |d<   t        t        |dd            |d<   t        |ddt              |d<   	 dd	l}t               r|d   j                         |d   d
}|j                  d      s) |j                  di |j                  j                  |d<   |j                  d      sY |j                  di |j                  j                  |d<   	 |S |d   |d<   |d   j                         |d<   |j                  |d<   |S # t        $ r t        d      w xY w)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.   r0   r;   client_paramss       r'   validate_environmentzChatOctoAI.validate_environmentA   sc    %9$	%
 ! &; );=OP&
!"  4!	 
|	~%&89JJL &'8 9! zz(+'4v}}'E}'E'J'J'V'VF8$zz.1-?V-?-? .'.d;; >*  -33D,E()+12D+E+V+V+X'(#)#8#8x    	? 	s   BD %-D D)N)tool_choicestricttoolsrF   )autononerequiredanyrG   kwargsc                   |D cg c]  }t        ||       }}rt        t              rdvrddiddk(  rodnlt        t              rdnYt        t              r;|D cg c]
  }|d   d    }}t        fd|D              s t        d	 d
| d      t        d       |d<   t        	|    dd|i|S c c}w c c}w )z;Imitating bind_tool method from langchain_openai.ChatOpenAI)rG   )rI   rJ   rL   rK   functionname)typerO   rL   rK   c              3   4   K   | ]  }|d    d   k(    yw)rO   rP   Nr$   ).0	tool_namerF   s     r'   	<genexpr>z(ChatOctoAI.bind_tools.<locals>.<genexpr>   s(      ! Z!8!@@s   zTool choice z1 was specified, but the only provided tools were .zEUnrecognized tool_choice type. Expected str, bool or dict. Received: rF   rH   r$   )	r   
isinstancestrbooldictrL   
ValueErrorsuperbind)
r&   rH   rF   rG   rM   toolformatted_toolsformatted_tool
tool_names	__class__s
     `      r'   
bind_toolszChatOctoAI.bind_toolsn   s.    EJ
<@"47
 
 +s+&II *%+[$9#K %'",KK.(K. +:& #:.v6
   %/  %&{m 4//9l!= 
 !!!,/  %0F=!w|</<V<<I
$s   C)C	)$__name__
__module____qualname____doc__r   r9   r   rX   __annotations__r   r   r:   r!   propertyr(   r   r,   classmethodrY   r/   r   rE   r   r
   r   r	   r   r   r   rZ   r   r   r   r   rc   __classcell__)rb   s   @r'   r   r      sC   $ !)9:OS:"'	"Y"OiOMAJA3   8DcN 8 8 4   *$ *4 * *d !%0=d38ndHhFGH0= $W%FGMN
	0= 0= 0= 
$k1	20= 0=r)   r   N)"rg   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   r9   r:   r   r$   r)   r'   <module>rv      sP    B	 	 	 > / - ) V V H % = 90 "A= A=r)   