langchain
bc862018 - feat: dynamic tool registration via middleware (#34842)

Commit
28 days ago
feat: dynamic tool registration via middleware (#34842) dependent upon https://github.com/langchain-ai/langgraph/pull/6711 1. relax constraint in `factory.py` to allow for tools not pre-registered in the `ModelRequest.tools` list 2. always add tool node if `wrap_tool_call` or `awrap_tool_call` is implemented 3. add tests confirming you can register new tools at runtime in `wrap_model_call` and execute them via `wrap_tool_call` allows for the following pattern ```py from langchain_core.messages import HumanMessage, ToolMessage from langchain_core.tools import tool from libs.langchain_v1.langchain.agents.factory import create_agent from libs.langchain_v1.langchain.agents.middleware.types import ( AgentMiddleware, ModelRequest, ToolCallRequest, ) @tool def get_weather(location: str) -> str: """Get the current weather for a location.""" return f"The weather in {location} is sunny and 72°F." @tool def calculate_tip(bill_amount: float, tip_percentage: float = 20.0) -> str: """Calculate the tip amount for a bill.""" tip = bill_amount * (tip_percentage / 100) return f"Tip: ${tip:.2f}, Total: ${bill_amount + tip:.2f}" class DynamicToolMiddleware(AgentMiddleware): """Middleware that adds and handles a dynamic tool.""" def wrap_model_call(self, request: ModelRequest, handler): updated = request.override(tools=[*request.tools, calculate_tip]) return handler(updated) def wrap_tool_call(self, request: ToolCallRequest, handler): if request.tool_call["name"] == "calculate_tip": return handler(request.override(tool=calculate_tip)) return handler(request) agent = create_agent(model="openai:gpt-4o-mini", tools=[get_weather], middleware=[DynamicToolMiddleware()]) result = agent.invoke({ "messages": [HumanMessage("What's the weather in NYC? Also calculate a 20% tip on a $85 bill")] }) for msg in result["messages"]: msg.pretty_print() ```
Author
Parents
Loading