a
    ~gA                     @  s"  d Z ddlmZ 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mZmZ dd	l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! ddl"m#Z#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dddG dd de#Z/dS )DAn agent designed to hold a conversation in addition to using tools.    )annotations)AnyListOptionalSequenceTuple)
deprecated)AgentAction)BaseCallbackManager)BaseLanguageModel)	AIMessageBaseMessageHumanMessage)BaseOutputParser)BasePromptTemplate)ChatPromptTemplateHumanMessagePromptTemplateMessagesPlaceholderSystemMessagePromptTemplate)BaseTool)Field)AgentAgentOutputParserConvoOutputParser)PREFIXSUFFIXTEMPLATE_TOOL_RESPONSE)validate_tools_single_input)LLMChainz0.1.0create_json_chat_agentz1.0)alternativeremovalc                      s   e Zd ZU dZeedZded< eZ	ded< e
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
ddd fddZe
eeddfdddddddddZddd d!d"Ze
ddeedfd#dd$d%ddddd&d'	d(d)Z  ZS )*ConversationalChatAgentr   )default_factoryr   output_parserstrtemplate_tool_responser   )kwargsreturnc                 K  s   t  S Nr   )clsr)    r-   n/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langchain/agents/conversational_chat/base.py_get_default_output_parser+   s    z2ConversationalChatAgent._get_default_output_parser)r*   c                 C  s   t d S r+   )NotImplementedErrorselfr-   r-   r.   _agent_type/   s    z#ConversationalChatAgent._agent_typec                 C  s   dS )z]Prefix to append the observation with.

        Returns:
            "Observation: "
        zObservation: r-   r1   r-   r-   r.   observation_prefix3   s    z*ConversationalChatAgent.observation_prefixc                 C  s   dS )zVPrefix to append the llm call with.

        Returns:
            "Thought: "
        zThought:r-   r1   r-   r-   r.   
llm_prefix<   s    z"ConversationalChatAgent.llm_prefixzSequence[BaseTool]None)toolsr*   c                   s   t  | t| j| d S r+   )super_validate_toolsr   __name__)r,   r7   	__class__r-   r.   r9   E   s    z'ConversationalChatAgent._validate_toolsNzOptional[List[str]]zOptional[BaseOutputParser]r   )r7   system_messagehuman_messageinput_variablesr&   r*   c                 C  s   d dd |D }d dd |D }|p2|  }|j| d}	|	j||d}
|du rbg d	}t|td
dt|
tddg}t||dS )a  Create a prompt for the agent.

        Args:
            tools: The tools to use.
            system_message: The system message to use.
                Defaults to the PREFIX.
            human_message: The human message to use.
                Defaults to the SUFFIX.
            input_variables: The input variables to use. Defaults to None.
            output_parser: The output parser to use. Defaults to None.

        Returns:
            A PromptTemplate.
        
c                 S  s    g | ]}d |j  d|j qS )z> z: )namedescription.0toolr-   r-   r.   
<listcomp>b       z9ConversationalChatAgent.create_prompt.<locals>.<listcomp>z, c                 S  s   g | ]
}|j qS r-   rA   rC   r-   r-   r.   rF   d   rG   )format_instructions)
tool_namesr7   N)inputchat_historyagent_scratchpadrL   )variable_namerM   )r?   messages)	joinr/   formatget_format_instructionsr   from_templater   r   r   )r,   r7   r=   r>   r?   r&   tool_stringsrJ   _output_parserrI   final_promptrO   r-   r-   r.   create_promptJ   s&    z%ConversationalChatAgent.create_promptzList[Tuple[AgentAction, str]]zList[BaseMessage])intermediate_stepsr*   c                 C  sF   g }|D ]8\}}| t|jd t| jj|dd}| | q|S )zJConstruct the scratchpad that lets the agent continue its thought process.)content)observation)appendr   logr   r(   rQ   )r2   rX   thoughtsactionrZ   r>   r-   r-   r.   _construct_scratchpadv   s    z-ConversationalChatAgent._construct_scratchpadr   zOptional[BaseCallbackManager]zOptional[AgentOutputParser]r   )	llmr7   callback_managerr&   r=   r>   r?   r)   r*   c                 K  s\   |  | |p|  }	| j|||||	d}
t||
|d}dd |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.
            system_message: The system message to use. Default is PREFIX.
            human_message: The human message to use. Default is SUFFIX.
            input_variables: The input variables to use. Default is None.
            **kwargs: Any additional arguments.

        Returns:
            An agent.
        )r=   r>   r?   r&   )r`   promptra   c                 S  s   g | ]
}|j qS r-   rH   rC   r-   r-   r.   rF      rG   z>ConversationalChatAgent.from_llm_and_tools.<locals>.<listcomp>)	llm_chainallowed_toolsr&   )r9   r/   rW   r    )r,   r`   r7   ra   r&   r=   r>   r?   r)   rU   rb   rc   rJ   r-   r-   r.   from_llm_and_tools   s,    
z*ConversationalChatAgent.from_llm_and_tools)r:   
__module____qualname____doc__r   r   r&   __annotations__r   r(   classmethodr/   propertyr3   r4   r5   r9   r   r   rW   r_   re   __classcell__r-   r-   r;   r.   r$   "   s6   
+r$   N)0rh   
__future__r   typingr   r   r   r   r   langchain_core._apir	   langchain_core.agentsr
   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.messagesr   r   r   langchain_core.output_parsersr   langchain_core.promptsr   langchain_core.prompts.chatr   r   r   r   langchain_core.toolsr   pydanticr   langchain.agents.agentr   r   Z2langchain.agents.conversational_chat.output_parserr   Z+langchain.agents.conversational_chat.promptr   r   r   langchain.agents.utilsr   langchain.chainsr    r$   r-   r-   r-   r.   <module>   s&   