| from typing import Sequence | |
| from langchain_core.language_models import BaseLanguageModel | |
| from langchain_core.prompts.chat import ChatPromptTemplate | |
| from langchain_core.runnables import Runnable, RunnablePassthrough | |
| from langchain_core.tools import BaseTool | |
| from agents.format_scratchpad.functions import ( | |
| format_to_function_messages, | |
| ) | |
| from agents.output_parsers.functions import ( | |
| FunctionsAgentOutputParser, | |
| ) | |
| def create_functions_agent( | |
| llm: BaseLanguageModel, prompt: ChatPromptTemplate | |
| ) -> Runnable: | |
| """Create an agent that uses function calling. | |
| Args: | |
| llm: LLM to use as the agent. Should work with Nous Hermes function calling, | |
| so either be an Nous Hermes based model that supports that or a wrapper of | |
| a different model that adds in equivalent support. | |
| prompt: The prompt to use. See Prompt section below for more. | |
| Returns: | |
| A Runnable sequence representing an agent. It takes as input all the same input | |
| variables as the prompt passed in does. It returns as output either an | |
| AgentAction or AgentFinish. | |
| """ | |
| if "agent_scratchpad" not in ( | |
| prompt.input_variables + list(prompt.partial_variables) | |
| ): | |
| raise ValueError( | |
| "Prompt must have input variable `agent_scratchpad`, but wasn't found." | |
| f"Found {prompt.input_variables} instead." | |
| ) | |
| agent = ( | |
| RunnablePassthrough.assign( | |
| agent_scratchpad=lambda x: format_to_function_messages( | |
| x["intermediate_steps"] | |
| ) | |
| ) | |
| | prompt | |
| | llm | |
| | FunctionsAgentOutputParser() | |
| ) | |
| return agent | |