LangChain AgentExecutor wraps the ReAct loop — define @tool functions and pass them to the agent.
LangChain Agents
from langchain_anthropic import ChatAnthropic
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.tools import tool
# Define tools
@tool
def calculator(expression: str) -> str:
"""Evaluate a mathematical expression."""
return str(eval(expression))
@tool
def read_csv(path: str) -> str:
"""Read a CSV file and return summary stats."""
import pandas as pd
df = pd.read_csv(path)
return df.describe().to_string()
tools = [DuckDuckGoSearchRun(), calculator, read_csv]
llm = ChatAnthropic(model="claude-opus-4-5")
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful data analyst agent."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({"input":"Analyse the data in sales.csv and find top 3 products"})