U
    h                     @   s   d dl 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 d dlmZmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZmZm Z m!Z! d dl"m#Z# d dl$m%Z% eddddG dd deZ&dS )    )AnyListOptionalSequenceTuple)
deprecated)AgentAction)BaseCallbackManager)BaseLanguageModel)BasePromptTemplate)ChatPromptTemplateHumanMessagePromptTemplateSystemMessagePromptTemplate)Field)BaseTool)AgentAgentOutputParserChatOutputParser)FORMAT_INSTRUCTIONSHUMAN_MESSAGESYSTEM_MESSAGE_PREFIXSYSTEM_MESSAGE_SUFFIX)validate_tools_single_input)LLMChainz0.1.0Zcreate_react_agentz1.0)alternativeZremovalc                       sD  e Zd ZU dZeedZeed< e	e
dddZe	e
dddZeeee
f  e
d	 fd
dZeeedddZeee dd fddZe	ee
 dddZeeeeedfee e
e
e
e
eee
  edddZeddeeeedfeee ee  ee e
e
e
e
eee
  ee!dddZ"e	e
dddZ#  Z$S )	ChatAgentzChat Agent.)default_factoryoutput_parser)returnc                 C   s   dS )z&Prefix to append the observation with.zObservation:  selfr    r    >/tmp/pip-unpacked-wheel-bo69hh5q/langchain/agents/chat/base.pyobservation_prefix#   s    zChatAgent.observation_prefixc                 C   s   dS )z#Prefix to append the llm call with.zThought:r    r!   r    r    r#   
llm_prefix(   s    zChatAgent.llm_prefix)intermediate_stepsr   c                    s4   t  |}t|tstd|r,d| S |S d S )Nz*agent_scratchpad should be of type string.zhThis was your previous work (but I haven't seen any of it! I only see what you return as final answer):
)super_construct_scratchpad
isinstancestr
ValueError)r"   r&   agent_scratchpad	__class__r    r#   r(   -   s    
zChatAgent._construct_scratchpad)kwargsr   c                 K   s   t  S Nr   )clsr/   r    r    r#   _get_default_output_parser<   s    z$ChatAgent._get_default_output_parserN)toolsr   c                    s   t  | t| j|d d S )N)
class_namer3   )r'   _validate_toolsr   __name__)r1   r3   r-   r    r#   r5   @   s    zChatAgent._validate_toolsc                 C   s   dgS )NzObservation:r    r!   r    r    r#   _stopE   s    zChatAgent._stop)r3   system_message_prefixsystem_message_suffixhuman_messageformat_instructionsinput_variablesr   c                 C   sv   d dd |D }d dd |D }|j|d}d ||||g}	t|	t|g}
|dkrjd	d
g}t||
dS )ag  Create a prompt from a list of tools.

        Args:
            tools: A list of tools.
            system_message_prefix: The system message prefix.
                Default is SYSTEM_MESSAGE_PREFIX.
            system_message_suffix: The system message suffix.
                Default is SYSTEM_MESSAGE_SUFFIX.
            human_message: The human message. Default is HUMAN_MESSAGE.
            format_instructions: The format instructions.
                Default is FORMAT_INSTRUCTIONS.
            input_variables: The input variables. Default is None.

        Returns:
            A prompt template.
        
c                 S   s   g | ]}|j  d |j qS )z: )namedescription.0Ztoolr    r    r#   
<listcomp>d   s     z+ChatAgent.create_prompt.<locals>.<listcomp>z, c                 S   s   g | ]
}|j qS r    r>   r@   r    r    r#   rB   e   s     )
tool_namesz

Ninputr,   )r<   messages)joinformatr   Zfrom_templater   r   )r1   r3   r8   r9   r:   r;   r<   Ztool_stringsrD   templaterF   r    r    r#   create_promptI   s     	zChatAgent.create_prompt)llmr3   callback_managerr   r8   r9   r:   r;   r<   r/   r   c
                 K   s^   |  | | j||||||	d}t|||d}dd |D }|pF|  }| f |||d|
S )a=  Construct an agent from an LLM and tools.

        Args:
            llm: The language model.
            tools: A list of tools.
            callback_manager: The callback manager. Default is None.
            output_parser: The output parser. Default is None.
            system_message_prefix: The system message prefix.
                Default is SYSTEM_MESSAGE_PREFIX.
            system_message_suffix: The system message suffix.
                Default is SYSTEM_MESSAGE_SUFFIX.
            human_message: The human message. Default is HUMAN_MESSAGE.
            format_instructions: The format instructions.
                Default is FORMAT_INSTRUCTIONS.
            input_variables: The input variables. Default is None.
            kwargs: Additional keyword arguments.

        Returns:
            An agent.
        )r8   r9   r:   r;   r<   )rK   promptrL   c                 S   s   g | ]
}|j qS r    rC   r@   r    r    r#   rB      s     z0ChatAgent.from_llm_and_tools.<locals>.<listcomp>)	llm_chainZallowed_toolsr   )r5   rJ   r   r2   )r1   rK   r3   rL   r   r8   r9   r:   r;   r<   r/   rM   rN   rD   Z_output_parserr    r    r#   from_llm_and_toolsw   s.    "
zChatAgent.from_llm_and_toolsc                 C   s   t d S r0   )r+   r!   r    r    r#   _agent_type   s    zChatAgent._agent_type)%r6   
__module____qualname____doc__r   r   r   r   __annotations__propertyr*   r$   r%   r   r   r   r(   classmethodr   r2   r   r   r5   r7   r   r   r   r   r   r   rJ   r
   r	   r   rO   rP   __classcell__r    r    r-   r#   r      sj   

-
8r   N)'typingr   r   r   r   r   Zlangchain_core._apir   Zlangchain_core.agentsr   Zlangchain_core.callbacksr	   Zlangchain_core.language_modelsr
   Zlangchain_core.promptsr   Zlangchain_core.prompts.chatr   r   r   Zlangchain_core.pydantic_v1r   Zlangchain_core.toolsr   Zlangchain.agents.agentr   r   Z#langchain.agents.chat.output_parserr   Zlangchain.agents.chat.promptr   r   r   r   Zlangchain.agents.utilsr   Zlangchain.chains.llmr   r   r    r    r    r#   <module>   s   