|
from typing import Optional, 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 langchain_core.utils.function_calling import convert_to_openai_tool |
|
|
|
from langchain.agents.format_scratchpad.openai_tools import ( |
|
format_to_openai_tool_messages, |
|
) |
|
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser |
|
|
|
|
|
def create_openai_tools_agent( |
|
llm: BaseLanguageModel, |
|
tools: Sequence[BaseTool], |
|
prompt: ChatPromptTemplate, |
|
strict: Optional[bool] = None, |
|
) -> Runnable: |
|
"""Create an agent that uses OpenAI tools. |
|
|
|
Args: |
|
llm: LLM to use as the agent. |
|
tools: Tools this agent has access to. |
|
prompt: The prompt to use. See Prompt section below for more on the expected |
|
input variables. |
|
|
|
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. |
|
|
|
Raises: |
|
ValueError: If the prompt is missing required variables. |
|
|
|
Example: |
|
|
|
.. code-block:: python |
|
|
|
from langchain import hub |
|
from langchain_community.chat_models import ChatOpenAI |
|
from langchain.agents import AgentExecutor, create_openai_tools_agent |
|
|
|
prompt = hub.pull("hwchase17/openai-tools-agent") |
|
model = ChatOpenAI() |
|
tools = ... |
|
|
|
agent = create_openai_tools_agent(model, tools, prompt) |
|
agent_executor = AgentExecutor(agent=agent, tools=tools) |
|
|
|
agent_executor.invoke({"input": "hi"}) |
|
|
|
# Using with chat history |
|
from langchain_core.messages import AIMessage, HumanMessage |
|
agent_executor.invoke( |
|
{ |
|
"input": "what's my name?", |
|
"chat_history": [ |
|
HumanMessage(content="hi! my name is bob"), |
|
AIMessage(content="Hello Bob! How can I assist you today?"), |
|
], |
|
} |
|
) |
|
|
|
Prompt: |
|
|
|
The agent prompt must have an `agent_scratchpad` key that is a |
|
``MessagesPlaceholder``. Intermediate agent actions and tool output |
|
messages will be passed in here. |
|
|
|
Here's an example: |
|
|
|
.. code-block:: python |
|
|
|
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder |
|
|
|
prompt = ChatPromptTemplate.from_messages( |
|
[ |
|
("system", "You are a helpful assistant"), |
|
MessagesPlaceholder("chat_history", optional=True), |
|
("human", "{input}"), |
|
MessagesPlaceholder("agent_scratchpad"), |
|
] |
|
) |
|
""" |
|
missing_vars = {"agent_scratchpad"}.difference( |
|
prompt.input_variables + list(prompt.partial_variables) |
|
) |
|
if missing_vars: |
|
raise ValueError(f"Prompt missing required variables: {missing_vars}") |
|
|
|
llm_with_tools = llm.bind( |
|
tools=[convert_to_openai_tool(tool, strict=strict) for tool in tools] |
|
) |
|
|
|
agent = ( |
|
RunnablePassthrough.assign( |
|
agent_scratchpad=lambda x: format_to_openai_tool_messages( |
|
x["intermediate_steps"] |
|
) |
|
) |
|
| prompt |
|
| llm_with_tools |
|
| OpenAIToolsAgentOutputParser() |
|
) |
|
return agent |
|
|