Spring AI Alibaba 项目源码学习(十)-Interceptor
本文分析了Spring AI Alibaba Agent Framework中的拦截器机制,包括ModelInterceptor和ToolInterceptor接口设计及其链式调用实现。Interceptor是所有拦截器的基接口,ModelInterceptor负责模型调用拦截(如修改请求、处理响应),ToolInterceptor则处理工具调用。InterceptorChain采用责任链模式,通
Interceptor 机制分析
请关注微信公众号:阿呆-bot
概述
本文档分析 Spring AI Alibaba Agent Framework 中的 Interceptor(拦截器)机制,包括 ModelInterceptor 和 ToolInterceptor 的设计、实现原理、链式调用机制以及具体实现类。
入口类说明
Interceptor - 拦截器接口
Interceptor 是所有拦截器的基接口,定义了拦截器的基本能力。
关键代码:
public interface Interceptor {
String getName();
}
ModelInterceptor - 模型调用拦截器
ModelInterceptor 用于拦截和修改模型调用请求和响应。
核心职责:
- 拦截模型调用请求
- 修改请求参数
- 处理响应结果
- 实现重试、降级等功能
关键代码:
public abstract class ModelInterceptor implements Interceptor {
/**
* Wrap a model call with custom logic.
*
* Implementations can:
* - Modify the request before calling the handler
* - Call the handler multiple times (retry logic)
* - Modify the response after handler returns
* - Handle exceptions and provide fallbacks
*
* @param request The model request
* @param handler The next handler in the chain (or base handler)
* @return The model response
*/
public abstract ModelResponse interceptModel(ModelRequest request, ModelCallHandler handler);
/**
* Get tools provided by this interceptor.
* Interceptors can provide built-in tools that will be automatically added to the agent.
*
* @return List of tools provided by this interceptor, empty list by default
*/
public List<ToolCallback> getTools() {
return Collections.emptyList();
}
}
ToolInterceptor - 工具调用拦截器
ToolInterceptor 用于拦截和修改工具调用请求和响应。
核心职责:
- 拦截工具调用请求
- 修改工具参数
- 处理工具响应
- 实现重试、错误处理等功能
关键代码:
public abstract class ToolInterceptor implements Interceptor {
/**
* Wrap a tool call with custom logic.
*
* Implementations can:
* - Modify the request before calling the handler
* - Call the handler multiple times (retry logic)
* - Modify the response after handler returns
* - Add caching, logging, monitoring, etc.
*
* @param request The tool call request
* @param handler The next handler in the chain (or base handler)
* @return The tool call response
*/
public abstract ToolCallResponse interceptToolCall(ToolCallRequest request, ToolCallHandler handler);
}
InterceptorChain - 拦截器链
InterceptorChain 实现了责任链模式,将多个拦截器串联起来。
关键代码:
public class InterceptorChain {
/**
* Chain multiple ModelInterceptors into a single handler.
*
* The first interceptor wraps all others, creating a nested structure:
* interceptors[0] -> interceptors[1] -> ... -> base handler
*
* @param interceptors List of ModelInterceptors to chain
* @param baseHandler The base handler that executes the actual model call
* @return A composed handler, or the base handler if no interceptors
*/
public static ModelCallHandler chainModelInterceptors(
List<ModelInterceptor> interceptors,
ModelCallHandler baseHandler) {
if (interceptors == null || interceptors.isEmpty()) {
return baseHandler;
}
// Start with the base handler
ModelCallHandler current = baseHandler;
// Wrap from last to first (right-to-left composition)
// This ensures first interceptor is outermost
for (int i = interceptors.size() - 1; i >= 0; i--) {
ModelInterceptor interceptor = interceptors.get(i);
ModelCallHandler nextHandler = current;
// Create a wrapper that calls the interceptor's wrap method
current = request -> interceptor.interceptModel(request, nextHandler);
}
return current;
}
/**
* Chain multiple ToolInterceptors into a single handler.
*
* The first interceptor wraps all others, creating a nested structure:
* interceptors[0] -> interceptors[1] -> ... -> base handler
*
* @param interceptors List of ToolInterceptors to chain
* @param baseHandler The base handler that executes the actual tool call
* @return A composed handler, or the base handler if no interceptors
*/
public static ToolCallHandler chainToolInterceptors(
List<ToolInterceptor> interceptors,
ToolCallHandler baseHandler) {
if (interceptors == null || interceptors.isEmpty()) {
return baseHandler;
}
// Start with the base handler
ToolCallHandler current = baseHandler;
// Wrap from last to first (right-to-left composition)
// This ensures first interceptor is outermost
for (int i = interceptors.size() - 1; i >= 0; i--) {
ToolInterceptor interceptor = interceptors.get(i);
ToolCallHandler nextHandler = current;
// Create a wrapper that calls the interceptor's wrap method
current = request -> interceptor.interceptToolCall(request, nextHandler);
}
return current;
}
链式调用机制:
- 从最后一个拦截器开始包装
- 每个拦截器包装下一个处理器
- 第一个拦截器成为最外层
- 调用顺序:interceptor[0] → interceptor[1] → … → baseHandler
具体实现
ModelFallbackInterceptor - 模型降级拦截器
ModelFallbackInterceptor 实现模型调用的降级策略,当主模型失败时自动切换到备用模型。
解决的问题:
- 提高系统可用性
- 处理模型服务不可用的情况
- 自动故障转移
ToolRetryInterceptor - 工具重试拦截器
ToolRetryInterceptor 实现工具调用的重试机制,提高工具调用的成功率。
解决的问题:
- 处理临时性工具调用失败
- 提高系统可靠性
- 减少因网络波动导致的失败
ToolErrorInterceptor - 工具错误拦截器
ToolErrorInterceptor 处理工具调用错误,提供错误处理和恢复机制。
解决的问题:
- 统一错误处理
- 错误信息格式化
- 错误恢复策略
ToolSelectionInterceptor - 工具选择拦截器
ToolSelectionInterceptor 实现工具的动态选择,根据上下文选择最合适的工具。
解决的问题:
- 工具选择优化
- 上下文感知的工具选择
- 工具版本管理
ContextEditingInterceptor - 上下文编辑拦截器
ContextEditingInterceptor 实现上下文的动态编辑,在模型调用前修改上下文。
解决的问题:
- 上下文优化
- 上下文压缩
- 上下文过滤
关键类关系
以下 PlantUML 类图展示了 Interceptor 系统的类关系:
关键流程
以下 PlantUML 时序图展示了 Interceptor 链式调用的流程:
实现关键点说明
1. 责任链模式
Interceptor 使用责任链模式:
- 多个拦截器串联形成链
- 每个拦截器可以处理请求或传递给下一个
- 支持请求和响应的双向处理
2. 右到左包装
拦截器链从右到左包装:
- 最后一个拦截器最接近 baseHandler
- 第一个拦截器成为最外层
- 调用时从外到内,响应时从内到外
3. 请求/响应修改
拦截器可以修改请求和响应:
- 请求修改:在调用 handler 前修改请求
- 响应修改:在 handler 返回后修改响应
- 跳过调用:可以直接返回响应,不调用 handler
4. 错误处理
拦截器可以处理错误:
- 捕获异常
- 实现重试逻辑
- 提供降级方案
5. 工具提供
ModelInterceptor 可以提供工具:
- 通过
getTools()方法返回工具列表 - 工具自动添加到 Agent
- 支持拦截器内置功能
具体实现分析
ModelFallbackInterceptor
功能:当主模型调用失败时,自动切换到备用模型。
实现要点:
- 捕获主模型调用异常
- 使用备用模型重试
- 返回备用模型的响应
ToolRetryInterceptor
功能:工具调用失败时自动重试。
实现要点:
- 配置最大重试次数
- 捕获工具调用异常
- 指数退避重试策略
ContextEditingInterceptor
功能:在模型调用前编辑上下文。
实现要点:
- 修改消息列表
- 添加或删除消息
- 优化上下文长度
总结说明
核心设计理念
- 责任链模式:通过链式调用实现功能的组合
- 双向处理:支持请求和响应的双向拦截
- 可扩展性:通过接口支持自定义拦截器
- 解耦设计:拦截器与业务逻辑解耦
关键优势
- 灵活性:可以灵活组合多个拦截器
- 可扩展性:易于添加新的拦截器实现
- 可维护性:每个拦截器职责单一
- 可测试性:拦截器可以独立测试
解决的问题
- 可用性:通过降级提高系统可用性
- 可靠性:通过重试提高调用成功率
- 性能:通过上下文编辑优化性能
- 错误处理:统一错误处理和恢复
使用场景
- ModelFallbackInterceptor:需要高可用性的场景
- ToolRetryInterceptor:工具调用可能失败的场景
- ContextEditingInterceptor:需要优化上下文的场景
- ToolSelectionInterceptor:需要动态选择工具的场景
Interceptor 机制为 Agent Framework 提供了强大的扩展能力,使开发者能够在不修改核心代码的情况下添加各种功能。
更多推荐



所有评论(0)