Langchain Middleware Api
# LangChain Middleware API | Online Tutorial
* * *
## AgentMiddleware Base Class Hook Methods
| Method | Signature | Execution Frequency | Return Value |
| --- | --- | --- | --- |
| before_agent | (state, runtime) β dict or None | 1 time | State update or None |
| abefore_agent | (state, runtime) β dict or None | 1 time | State update or None |
| before_model | (state, runtime) β dict or None | Per loop | State update or None |
| abefore_model | (state, runtime) β dict or None | Per loop | State update or None |
| wrap_model_call | (request, handler) β ModelResponse or AIMessage | Per loop | Model call result |
| awrap_model_call | (request, handler) β ModelResponse or AIMessage | Per loop | Model call result |
| after_model | (state, runtime) β dict or None | Per loop | State update or None |
| aafter_model | (state, runtime) β dict or None | Per loop | State update or None |
| wrap_tool_call | (request, handler) β ToolMessage or Command | Per tool call | Tool execution result |
| awrap_tool_call | (request, handler) β ToolMessage or Command | Per tool call | Tool execution result |
| after_agent | (state, runtime) β dict or None | 1 time | State update or None |
| aafter_agent | (state, runtime) β dict or None | 1 time | State update or None |
## Middleware Registration
Middleware can be registered using the `middleware` parameter in `create_agent`:
```python
from langchain.agents import create_agent
from langchain_middleware import MyMiddleware
agent = create_agent(
llm,
tools,
middleware=[MyMiddleware()],
)
```
## Middleware Execution Order
Multiple middleware are executed in the order they are registered. Each middleware can:
- Modify the state
- Intercept and modify model/tool calls
- Perform logging, monitoring, etc.
## Example: Custom Middleware
```python
from langchain.agents import AgentMiddleware
from langchain_core.messages import HumanMessage
class LoggingMiddleware(AgentMiddleware):
def before_model(self, state, runtime):
print("Before model call")
return {}
def after_model(self, state, runtime):
print("After model call")
return {}
```
This example demonstrates how to create a simple logging middleware that prints messages before and after model calls.
YouTip