from langchain.agents import create_xml_agent from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, PromptTemplate from langflow.base.agents.agent import LCToolsAgentComponent from langflow.inputs import MultilineInput from langflow.inputs.inputs import DataInput, HandleInput from langflow.schema import Data class XMLAgentComponent(LCToolsAgentComponent): display_name: str = "XML Agent" description: str = "Agent that uses tools formatting instructions as xml to the Language Model." icon = "LangChain" beta = True name = "XMLAgent" inputs = [ *LCToolsAgentComponent._base_inputs, HandleInput(name="llm", display_name="Language Model", input_types=["LanguageModel"], required=True), DataInput(name="chat_history", display_name="Chat History", is_list=True, advanced=True), MultilineInput( name="system_prompt", display_name="System Prompt", info="System prompt for the agent.", value="""You are a helpful assistant. Help the user answer any questions. You have access to the following tools: {tools} In order to use a tool, you can use and tags. You will then get back a response in the form For example, if you have a tool called 'search' that could run a google search, in order to search for the weather in SF you would respond: searchweather in SF 64 degrees When you are done, respond with a final answer between . For example: The weather in SF is 64 degrees Begin! Question: {input} {agent_scratchpad} """, # noqa: E501 ), MultilineInput( name="user_prompt", display_name="Prompt", info="This prompt must contain 'input' key.", value="{input}" ), ] def get_chat_history_data(self) -> list[Data] | None: return self.chat_history def create_agent_runnable(self): if "input" not in self.user_prompt: msg = "Prompt must contain 'input' key." raise ValueError(msg) messages = [ ("system", self.system_prompt), ("placeholder", "{chat_history}"), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=["input"], template=self.user_prompt)), ("ai", "{agent_scratchpad}"), ] prompt = ChatPromptTemplate.from_messages(messages) return create_xml_agent(self.llm, self.tools, prompt)