尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Spring AI Alibaba 项目源码学习(十)-Interceptor

Spring AI Alibaba 项目源码学习(十)-Interceptor
📅 发布时间:2026/6/20 0:31:33

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 handlerModelCallHandler current = baseHandler;// Wrap from last to first (right-to-left composition)// This ensures first interceptor is outermostfor (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 methodcurrent = 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 handlerToolCallHandler current = baseHandler;// Wrap from last to first (right-to-left composition)// This ensures first interceptor is outermostfor (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 methodcurrent = request -> interceptor.interceptToolCall(request, nextHandler);}return current;}

链式调用机制:

  • 从最后一个拦截器开始包装
  • 每个拦截器包装下一个处理器
  • 第一个拦截器成为最外层
  • 调用顺序:interceptor[0] → interceptor[1] → ... → baseHandler

具体实现

ModelFallbackInterceptor - 模型降级拦截器

ModelFallbackInterceptor 实现模型调用的降级策略,当主模型失败时自动切换到备用模型。

解决的问题:

  • 提高系统可用性
  • 处理模型服务不可用的情况
  • 自动故障转移

ToolRetryInterceptor - 工具重试拦截器

ToolRetryInterceptor 实现工具调用的重试机制,提高工具调用的成功率。

解决的问题:

  • 处理临时性工具调用失败
  • 提高系统可靠性
  • 减少因网络波动导致的失败

ToolErrorInterceptor - 工具错误拦截器

ToolErrorInterceptor 处理工具调用错误,提供错误处理和恢复机制。

解决的问题:

  • 统一错误处理
  • 错误信息格式化
  • 错误恢复策略

ToolSelectionInterceptor - 工具选择拦截器

ToolSelectionInterceptor 实现工具的动态选择,根据上下文选择最合适的工具。

解决的问题:

  • 工具选择优化
  • 上下文感知的工具选择
  • 工具版本管理

ContextEditingInterceptor - 上下文编辑拦截器

ContextEditingInterceptor 实现上下文的动态编辑,在模型调用前修改上下文。

解决的问题:

  • 上下文优化
  • 上下文压缩
  • 上下文过滤

关键类关系

以下 PlantUML 类图展示了 Interceptor 系统的类关系:
cc.png

关键流程

以下 PlantUML 时序图展示了 Interceptor 链式调用的流程:
image.png

实现关键点说明

1. 责任链模式

Interceptor 使用责任链模式:

  • 多个拦截器串联形成链
  • 每个拦截器可以处理请求或传递给下一个
  • 支持请求和响应的双向处理

2. 右到左包装

拦截器链从右到左包装:

  • 最后一个拦截器最接近 baseHandler
  • 第一个拦截器成为最外层
  • 调用时从外到内,响应时从内到外

3. 请求/响应修改

拦截器可以修改请求和响应:

  • 请求修改:在调用 handler 前修改请求
  • 响应修改:在 handler 返回后修改响应
  • 跳过调用:可以直接返回响应,不调用 handler

4. 错误处理

拦截器可以处理错误:

  • 捕获异常
  • 实现重试逻辑
  • 提供降级方案

5. 工具提供

ModelInterceptor 可以提供工具:

  • 通过 getTools() 方法返回工具列表
  • 工具自动添加到 Agent
  • 支持拦截器内置功能

具体实现分析

ModelFallbackInterceptor

功能:当主模型调用失败时,自动切换到备用模型。

实现要点:

  • 捕获主模型调用异常
  • 使用备用模型重试
  • 返回备用模型的响应

ToolRetryInterceptor

功能:工具调用失败时自动重试。

实现要点:

  • 配置最大重试次数
  • 捕获工具调用异常
  • 指数退避重试策略

ContextEditingInterceptor

功能:在模型调用前编辑上下文。

实现要点:

  • 修改消息列表
  • 添加或删除消息
  • 优化上下文长度

总结说明

核心设计理念

  1. 责任链模式:通过链式调用实现功能的组合
  2. 双向处理:支持请求和响应的双向拦截
  3. 可扩展性:通过接口支持自定义拦截器
  4. 解耦设计:拦截器与业务逻辑解耦

关键优势

  • 灵活性:可以灵活组合多个拦截器
  • 可扩展性:易于添加新的拦截器实现
  • 可维护性:每个拦截器职责单一
  • 可测试性:拦截器可以独立测试

解决的问题

  • 可用性:通过降级提高系统可用性
  • 可靠性:通过重试提高调用成功率
  • 性能:通过上下文编辑优化性能
  • 错误处理:统一错误处理和恢复

使用场景

  • ModelFallbackInterceptor:需要高可用性的场景
  • ToolRetryInterceptor:工具调用可能失败的场景
  • ContextEditingInterceptor:需要优化上下文的场景
  • ToolSelectionInterceptor:需要动态选择工具的场景

Interceptor 机制为 Agent Framework 提供了强大的扩展能力,使开发者能够在不修改核心代码的情况下添加各种功能。

相关新闻

  • 今日复盘
  • 13 个 pytest 宝藏插件推荐!(存存存)
  • java 1.8 linux

最新新闻

  • 推荐系统(十三)阿里深度兴趣网络(三):DIEN实战解析与工程优化
  • 飞思卡尔MC68HC908RC24 CMT模块:嵌入式无线信号生成的硬件利器
  • MC9S12HY/HA电气特性深度解析:ADC精度、Flash时序与SPI速率实战
  • 智能体(AI Agent)是一种具备感知、决策与执行能力的自主软件系统,能够基于目标理解任务
  • Godot 4开源回合制RPG实战指南:构建专业级战斗与对话系统
  • 论文写作进阶:构建清晰一致的数学符号系统

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号