Overview
GalileoMiddleware is a middleware component that integrates with LangGraph agents to provide comprehensive tracing and logging. Unlike the callback-based approach, middleware automatically intercepts agent execution at key points:
- Agent lifecycle: Tracks when an agent starts and completes
- Model calls: Logs all LLM invocations with prompts, responses, and metadata
- Tool calls: Captures tool invocations including function names, arguments, and outputs
- Async support: Full support for both synchronous and asynchronous agent execution
Basic usage
To useGalileoMiddleware, simply add it to the middleware parameter when creating a LangChain agent:
In the TypeScript SDK,
GalileoMiddleware is not available. Use GalileoCallback with the same constructor options to achieve equivalent functionality.- An agent node is created to track the overall execution
- Each model call creates an LLM node with prompt and response details
- Each tool call creates a tool node with function name, arguments, and output
- All nodes are linked hierarchically under the agent node
Configuration options
GalileoMiddleware accepts the following parameters:
galileo_logger(optional): A customGalileoLoggerinstance. If not provided, a default logger is created.start_new_trace(default:True): Whether to start a new trace on agent invocation. Set toFalseto add to an existing trace.flush_on_chain_end(default:True): Whether to flush logs to Galileo when the agent completes.ingestion_hook(optional): A callback function that receivesTracesIngestRequestobjects before they’re sent to Galileo.
Custom logger
You can provide a custom logger instance to integrate with existing logging infrastructure:Trace management
By default, each agent invocation creates a new trace. You can control trace behavior:Add to existing trace
To add agent execution to an existing trace, use a shared logger withstart_new_trace set to False (Python) or false (TypeScript):
Manual flush control
If you want to control when logs are flushed (e.g., for batch processing):What gets logged
GalileoMiddleware captures the following information:
Agent node
- Input state (messages)
- Output state (final messages)
- Execution time
Model call nodes
- Model name and configuration (temperature, etc.)
- Input messages (including system message if present)
- Output response
- Tools available to the model
- Timing metrics (start time, time to first token if available)
Tool call nodes
- Tool/function name
- Tool arguments (serialized)
- Tool output
- Execution time
Comparison with GalileoCallback
GalileoMiddleware (Python) and GalileoCallback (Python and TypeScript) provide similar functionality but use different approaches:
| Feature | GalileoMiddleware (Python only) | GalileoCallback (Python and TypeScript) |
|---|---|---|
| Integration point | LangGraph agents via middleware parameter | LangChain components via callbacks parameter |
| Setup complexity | Simple - add to middleware list | Manual - pass to each component |
| Agent support | Native support for LangGraph agents | Requires callback setup |
| Flexibility | Automatic agent-level tracing | Fine-grained control over individual components |
| Language support | Python only | Python and TypeScript |
| Use case | LangGraph agents with minimal setup | Complex LangChain applications with custom needs |
GalileoMiddleware when:
- You’re building LangGraph agents in Python
- You want automatic, drop-in logging
- You prefer simpler setup
GalileoCallback when:
- You’re using TypeScript (middleware is not available)
- You need fine-grained control over logging
- You’re working with complex LangChain applications
- You want to log specific components selectively
Async support
GalileoMiddleware (Python) fully supports asynchronous execution. The middleware automatically handles both sync and async contexts. In TypeScript, GalileoCallback handles async natively.
GalileoBaseHandler or GalileoAsyncBaseHandler) based on the execution context. In TypeScript, GalileoCallback works with both sync and async invocations.
Best practices
- Use middleware for LangGraph agents: For LangGraph-based agents, middleware provides the simplest integration
- Add meaningful metadata: Include relevant project and session information in your logger configuration
- Configure flush behavior: For high-volume applications, consider disabling auto-flush and batch your logs
- Share loggers: Use the same logger instance across middleware for unified trace management
- Monitor execution: Review the hierarchical traces in Galileo to understand agent behavior
Example
You can find a complete example of usingGalileoMiddleware with a LangGraph agent in the LangChain Middleware Example.
Next steps
Related documentation
GalileoCallback
Use callbacks for fine-grained LangChain logging control.
Experiments
Learn how to run and track experiments with LangChain.
Cookbooks
Monitor LangChain Agents with Galileo
Learn how to build and monitor a LangChain AI Agent using Galileo for tracing and observability.
Add evaluations to a multi-agent LangGraph application
Learn how to add evaluations to a multi-agent LangGraph chat bot using Galileo