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

news/2025/11/17 23:13:19/文章来源:https://www.cnblogs.com/wasp520/p/19234759

Interceptor 机制分析

请关注微信公众号:阿呆-bot

概述

本文档分析 Spring AI Alibaba Agent Framework 中的 Interceptor(拦截器)机制,包括 ModelInterceptorToolInterceptor 的设计、实现原理、链式调用机制以及具体实现类。

入口类说明

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 提供了强大的扩展能力,使开发者能够在不修改核心代码的情况下添加各种功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/968394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Swift 进行验证码识别

安装 Tesseract OCR首先,你需要通过 CocoaPods 来安装 Tesseract OCR 的 Swift 绑定库。首先在项目的根目录下创建一个 Podfile,并添加以下内容: platform :ios, 11.0 target YourAppName do use_frameworks! pod T…

今日复盘

完成了通过ffmpeg将电脑屏幕转为rtsp推流给mediatx服务器,并供给海康威视录像机拉流的实现:ffmpeg -f gdigrab -framerate 15 -video_size 1280x720 -i desktop -c:v libx264 -preset ultrafast -b:v 1500k -maxrate…

2025.11.16 萌熊

2025.11.16 萌熊打! T1 额,显然先手可以退来保留实力,我直接模拟博弈 发现 \(O(1)\) 的 然后每次算一遍就行了 显然有单调性 但没必要二分 T2 额,一眼,感觉我好像在哪见过 然后直接秒了 就是先扫一遍求出到每个点…

在 parse_model 函数中添加了自定义模块支持

第一段代码(已修改版本)在 parse_model 函数中添加了自定义模块支持:n = n_ = max(round(n * depth), 1) if n > 1 else n # depth gain# Custom modules support - Added for RFAConv, HSFPN, HATHead integra…

20232311 2025-2026-1 《网络与系统攻防技术》实验六实验报告

实验内容发现靶机Metasploitable2并进行端口扫描、版本扫描以及漏洞扫描等等 利用Vsftpd源码包后门漏洞进行攻击 利用SambaMS-RPC Shell命令注入漏洞 利用Java RMI SERVER命令执行漏洞 利用PHP CGI参数执行注入漏洞实验…

线程池的概念

线程池的概念核心线程数: 1.corePoolSize:线程池长期维持的线程数量,即使这些线程处于空闲状态,也不会被销毁,(除非设置了allowCoreThreadTimeOut). 2.maximumPolloSize(最大线程数): 线程池允许创建最大的线程…

android compose viewModel 传参数

android compose viewModel 传参数android compose viewModel 传参数 在MainActivity 里面可以用viewModelsval userDao = db.userDao()val viewModel by viewModels<MyArticleViewModel>(factoryProducer = {ob…

奶牛快传服务调整公告

奶牛快传服务调整公告 尊敬的奶牛快传用户 感谢您长期以来的信任与支持。为了更好地服务创作者,未来我们将专注于 稿定设计 的升级与创新。基于这一战略调整,奶牛快传将于 **2025 年 12 月 8 日 ** 正式停止服务。届…

从零实现 REINFORCE/GRPO —— 大模型推理强化微调实践

一文吃透:不依赖成熟 RL 库,如何实现 REINFORCE、REINFORCE-baseline 与 GRPO;数理推理模型的强化学习微调实践;训练/参考/采样模型的多卡调度。引言 你是否也遇到过:模型“会思考”,但少数题正确,格式还常常不…

java for linux 下载

在 Linux 系统上下载 Java,通常有以下几种常见方式:? 方法一:使用 yum(Debian/Ubuntu)安装 Java sudo apt update sudo apt install openjdk-17-jdkopenjdk-17-jdk 是 Java 17 的 JDK(Java Development Kit)。…

13 个 pytest 宝藏插件推荐!(存存存)

pytest-html 核心:一键生成直观的 HTML 测试报告,便于结果查看与分享。allure-pytest 核心:支持步骤描述、附件、分类等,比pytest-html更高级,让测试结果一目了然。pytest-xdist 核心:支持并行测试,通过将测试用…

java 1.8 linux

如果您是在使用 Java 1.8 在 Linux 系统上进行开发或运行,以下是一些常见的命令和脚本示例,帮助您管理 Java 1.8 环境:一、安装 Java 1.8 1. 使用 yum(适用于基于 RHEL/CentOS/Scientific Linux 的系统) sudo yum…

iOS开发Linux

你提到的“iOS开发Linux”可能是一个误解或混淆。iOS 是苹果公司开发的移动操作系统,主要用于苹果设备(如 iPhone、iPad、Apple Watch 等),而 Linux 是一个开源的操作系统,主要用于服务器、嵌入式系统、桌面计算机…

手撸大模型的分布式训练:深刻理解大模型训练的“起飞”原理

单卡不够?内存爆炸?训练太慢? 在大型语言模型(LLM)的训练过程中,单设备算力和内存往往成为性能瓶颈。如何高效地利用多GPU甚至多节点资源进行分布式训练,是每个LLM研究者和工程师必须面对的挑战。本文将深入剖析…

XHORSE XZBT42EN 2-Button HON.D PCBs for Honda Fit XR-V Jazz City 2018-2022 (5pcs/lot)

Solving Honda Remote Key PCB Issues: The XHORSE XZBT42EN Advantage Is your Honda Fit, XR-V, Jazz, or City struggling with unresponsive remote controls? For European and American automotive repair prof…

事件循环其实很简单!

一、概念 JavaScript 是单线程执行(基于执行栈 / 调用栈 call stack),事件循环负责不断地从各种任务队列里取任务执行——以保证异步任务的函数回调按规则有序运行,浏览器环境和 Node.js 环境都使用事件循环,尽管…

从0到1:揭秘LLM预训练前的海量数据清洗全流程

读完这篇文章,你将用监督微调(SFT)把一个 1.5B 规模的数学模型在 GSM8K 上的零样本推理正确率从 1.56% → 62.9%,同时把输出格式遵循率从 18.9% → 100%。我们将完整走通数据集下载、Prompt 架构、训练配置和评估方…

Upgrade Your Key Programming: New Style CG A22-3+1 Flip-4BTN Wire Remote for CGDI K2 (5pcs/lot)

The Frustration of Unreliable Key Remotes: A Problem for Mechanics and Car Owners Alike In the bustling world of automotive repair, few issues frustrate European and American mechanics more than unreli…

深入解析:使用 Triton 实现 Flash Attention2 - 让大模型训练飞起来

引言 你是否曾经在训练大型语言模型时,眼睁睁地看着 GPU 内存不断飙升,最终因为 OOM(Out of Memory)错误而前功尽弃?或者在处理长序列时,发现注意力机制的计算时间呈平方级增长,让人望而却步? 如果你有过这样的…

AI技术落地实践

好的,这是一个极具前瞻性的问题,充分体现了您对技术趋势的敏锐度。下面我将详细阐述我们在AI技术落地,特别是前端与AI结合方面的完整思考与实践。8. AI技术落地实践 第一部分:SQL编辑器集成LLM的完整实践 1. 技术选…