a
    ~g                     @  s   d 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 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 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$ e	deddG dd deZ%dS )zDAn agent designed to hold a conversation in addition to using tools.    )annotations)AnyListOptionalSequence)
deprecated)BaseCallbackManager)BaseLanguageModel)PromptTemplate)BaseTool)Field)AGENT_DEPRECATION_WARNING)AgentAgentOutputParser)	AgentTypeConvoOutputParser)FORMAT_INSTRUCTIONSPREFIXSUFFIX)validate_tools_single_input)LLMChainz0.1.0z1.0)messageremovalc                      s  e Zd ZU dZdZded< eedZded< e	d&dddd	d
dZ
eddddZeddddZeddddZe	eeedddfdddddddddddZe	ddd fddZe	ddeeedddfddd d!dddddddd"d#d$d%Z  ZS )'ConversationalAgentz>An agent that holds a conversation in addition to using tools.AIstr	ai_prefix)default_factoryr   output_parserr   )r   kwargsreturnc                 K  s
   t |dS )Nr   r   )clsr   r     r$   i/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langchain/agents/conversational/base.py_get_default_output_parser$   s    z.ConversationalAgent._get_default_output_parser)r!   c                 C  s   t jS )z Return Identifier of agent type.)r    CONVERSATIONAL_REACT_DESCRIPTIONselfr$   r$   r%   _agent_type*   s    zConversationalAgent._agent_typec                 C  s   dS )z]Prefix to append the observation with.

        Returns:
            "Observation: "
        zObservation: r$   r(   r$   r$   r%   observation_prefix/   s    z&ConversationalAgent.observation_prefixc                 C  s   dS )zVPrefix to append the llm call with.

        Returns:
            "Thought: "
        zThought:r$   r(   r$   r$   r%   
llm_prefix8   s    zConversationalAgent.llm_prefixHumanNzSequence[BaseTool]zOptional[List[str]]r
   )toolsprefixsuffixformat_instructionsr   human_prefixinput_variablesr!   c                 C  sf   d dd |D }d dd |D }	|j|	||d}d ||||g}
|du rZg d	}t|
|d
S )au  Create prompt in the style of the zero-shot agent.

        Args:
            tools: List of tools the agent will have access to, used to format the
                prompt.
            prefix: String to put before the list of tools. Defaults to PREFIX.
            suffix: String to put after the list of tools. Defaults to SUFFIX.
            format_instructions: Instructions on how to use the tools. Defaults to
                FORMAT_INSTRUCTIONS
            ai_prefix: String to use before AI output. Defaults to "AI".
            human_prefix: String to use before human output.
                Defaults to "Human".
            input_variables: List of input variables the final prompt will expect.
                Defaults to ["input", "chat_history", "agent_scratchpad"].

        Returns:
            A PromptTemplate with the template assembled from the pieces here.
        
c                 S  s    g | ]}d |j  d|j qS )z> z: )namedescription.0toolr$   r$   r%   
<listcomp>_       z5ConversationalAgent.create_prompt.<locals>.<listcomp>z, c                 S  s   g | ]
}|j qS r$   r5   r7   r$   r$   r%   r:   a   r;   )
tool_namesr   r2   z

N)inputchat_historyagent_scratchpad)templater3   )joinformatr
   )r#   r.   r/   r0   r1   r   r2   r3   tool_stringsr=   rA   r$   r$   r%   create_promptA   s    z!ConversationalAgent.create_promptNone)r.   r!   c                   s   t  | t| j| d S )N)super_validate_toolsr   __name__)r#   r.   	__class__r$   r%   rH   j   s    z#ConversationalAgent._validate_toolsr	   zOptional[BaseCallbackManager]zOptional[AgentOutputParser]r   )llmr.   callback_managerr   r/   r0   r1   r   r2   r3   r    r!   c              	   K  sf   |  | | j|||	||||
d}t|||d}dd |D }|pL| j|d}| f ||||d|S )a  Construct an agent from an LLM and tools.

        Args:
            llm: The language model to use.
            tools: A list of tools to use.
            callback_manager: The callback manager to use. Default is None.
            output_parser: The output parser to use. Default is None.
            prefix: The prefix to use in the prompt. Default is PREFIX.
            suffix: The suffix to use in the prompt. Default is SUFFIX.
            format_instructions: The format instructions to use.
                Default is FORMAT_INSTRUCTIONS.
            ai_prefix: The prefix to use before AI output. Default is "AI".
            human_prefix: The prefix to use before human output.
                Default is "Human".
            input_variables: The input variables to use. Default is None.
            **kwargs: Any additional keyword arguments to pass to the agent.

        Returns:
            An agent.
        )r   r2   r/   r0   r1   r3   )rL   promptrM   c                 S  s   g | ]
}|j qS r$   r<   r7   r$   r$   r%   r:      r;   z:ConversationalAgent.from_llm_and_tools.<locals>.<listcomp>r"   )	llm_chainallowed_toolsr   r   )rH   rE   r   r&   )r#   rL   r.   rM   r   r/   r0   r1   r   r2   r3   r    rN   rO   r=   _output_parserr$   r$   r%   from_llm_and_toolso   s6    #
	z&ConversationalAgent.from_llm_and_tools)r   )rI   
__module____qualname____doc__r   __annotations__r   r   r   classmethodr&   propertyr*   r+   r,   r   r   r   rE   rH   rR   __classcell__r$   r$   rJ   r%   r      s@   
  (r   N)&rU   
__future__r   typingr   r   r   r   langchain_core._apir   langchain_core.callbacksr   langchain_core.language_modelsr	   langchain_core.promptsr
   langchain_core.toolsr   pydanticr   Zlangchain._api.deprecationr   langchain.agents.agentr   r   langchain.agents.agent_typesr   Z-langchain.agents.conversational.output_parserr   Z&langchain.agents.conversational.promptr   r   r   langchain.agents.utilsr   langchain.chainsr   r   r$   r$   r$   r%   <module>   s*   