Spring AI 2.0.1 Available Now
TL;DR · AI 摘要
Spring AI 2.0.1修复了7个关键安全漏洞,包含升级注意事项与新增功能,适用于Java开发者。
核心要点
- 修复7个CVE漏洞,涉及PDF解析、缓存目录等安全问题
- 升级需注意Mistral模型弃用与Redis模块重命名
- 新增功能基于用户反馈优化工具调用与内存管理
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Spring AI 2.0.1发布
- 安全修复
- 7个CVE漏洞修复
- PDF解析安全加固
- 缓存目录路径安全优化
- 升级变更
- Mistral模型弃用
- Redis模块重命名
- 工具调用模式调整
- 功能增强
- 用户反馈驱动优化
- 80+ issue修复
金句 / Highlights
值得收藏与分享的关键句。
修复7个CVE漏洞,包括Unbounded recursion over attacker-controlled PDF outline tree(CVE-2026-47851)
OpenAI工具调用严格模式默认值从true改为false(#6755)
新增功能基于过去几周用户反馈实现,包含80+ issue修复
代表 Spring AI 团队及所有贡献者,我很高兴地宣布 Spring AI 2.0.1 已发布,现已通过 Maven Central 提供下载!
2.0.1 是在 2.0.0 GA 版本 基础上的首次维护版本。这是一个重大更新:修复了超过 80 个问题和拉取请求,其中大部分来自过去几周将应用迁移到 2.0 的团队反馈。除了修复内容,还新增了自 GA 发布以来用户多次请求的多项功能。
[本版本修复的 CVE](https://spring.io/blog/2026/08/21/spring-ai-2-0-1-available-now#cves-fixed-in-this-release)
- CVE-2026-47851 - Spring AI PDF Document Reader 中对攻击者控制的 PDF 大纲树的无限制递归
- CVE-2026-47852 - Spring AI 中可预测的缓存目录位置允许本地 ONNX 模型替换
- CVE-2026-59279 - 通过重复初始化请求实现无限制持久会话分配
- CVE-2026-59294 - ResourceCacheService 中的路径遍历导致任意文件写入
- CVE-2026-59308 - 通过 SHA-256 截断实现语义缓存跨租户隔离绕过
- CVE-2026-59319 - RedisChatMemoryRepository 中的 RediSearch 标签注入导致跨对话数据泄露
- CVE-2026-59318 - DefaultToolCallingManager 全局解析器回退允许通过提示注入实现未注册工具调用
[升级前请注意](https://spring.io/blog/2026/08/21/spring-ai-2-0-1-available-now#before-you-upgrade)
大多数应用只需通过升级版本号即可从 2.0.0 迁移到 2.0.1,但部分变更需要特别关注。升级说明 已详细说明相关内容,且此次发布已扩展了该文档:
- 已弃用的Mistral AI聊天模型已停用 (#6772)。如果仍然通过常量引用它们,请切换到当前支持的模型名称。
- Redis聊天内存自动配置模块已重命名 (#6416),以与其余
spring-ai-autoconfigure-*命名保持一致。请在构建文件中更新 artifact id。 - OpenAI工具调用严格模式现在默认为 `false` (#6755)。生成的工具模式通过从
required中省略参数来标记可选参数,而严格模式会拒绝这种做法——因此任何包含可选参数的工具都会因 400 错误而失败。严格模式现在需要显式启用,与 OpenAI API 默认值一致;如果您的模式符合其规则,请显式启用该模式。 - `Media` 构建器使用类型化 `data` 重载 (#6481),这使接受的负载类型更明确,而不是接受
Object。 - `DeepSeekApi` 已修订 (#6428),以符合其他 API 客户端遵循的惯例。
- Couchbase 向量存储现在使用 Spring Boot 管理的 Couchbase 客户端 (#6583),而不是创建自己的客户端,因此它会参与应用程序已声明的集群配置。
本次发布的新功能
工具调用限制
永不终止的代理循环是一种代价高昂的故障模式。ToolCallingAdvisor 现在接受每请求的工具调用数量的可配置限制,并在达到限制时抛出 ToolCallLimitExceededException。异常路径返回单个 `Generation`,因此错误处理与正常响应保持相同的结构。与此相关,工具解析回退现在可配置:您可以决定不可解析的工具名称是快速失败还是回退。
OpenAI 音频
OpenAiAudioSpeechModel支持音频流式传输,并暴露了 `instructions` 选项 以控制语音和表达方式。在转录方面,选项和响应已丰富,以覆盖更多 OpenAI API 的功能。
Google GenAI
Google GenAI 增加了 `ToolChoice` 支持,允许您强制、禁用或让模型选择工具,并通过标准 ImageModel 抽象提供图像生成支持。
文档阅读
PagePdfDocumentReader接受页面范围,因此您可以只摄入大型文档的一部分,而不是全部。TokenTextSplitter 现在验证其构建器参数,而不是稍后以令人困惑的错误失败。
AWS 区域解析
两个长期存在的问题报告终于得以解决:Spring AI 现在遵循 AWS SDK 的默认区域解析规则,并且不再在解析区域时记录令人困惑的 WARN 日志。如果你之前依赖环境或基于配置文件的区域配置来使用 Bedrock,现在其行为将与其他 AWS 堆栈组件保持一致。
可靠性
流式传输和工具调用
此次发布中,流式响应功能获得了大量关注。OpenAiChatModel 现在按索引合并流式工具调用增量,并处理空的 `tool_calls` 数据块,此前报告的OpenAI 流式模式下零令牌使用问题也已解决。取消流式传输操作不再会导致底层 HTTP 响应泄漏,此改进同时适用于聊天和音频转录场景。ToolCallingAdvisor 的流式传输循环不再丢失 `doBeforeStream` 修改操作,工具调用迭代过程中令牌使用量会累积统计(而非仅报告最后一次结果),并且在阻塞模式下工具调用观察会正确关联父级追踪跨度。
其他修复内容包括:聊天选项构建器 `clone()` 方法中的共享可变状态问题及其Anthropic 对应实现,`ToolContext` 参数检测,严格模式下的负载放置,`OpenAiChatModel` 中的 PDF 媒体映射,`OpenAiChatModel#buildGeneration` 中的 `Optional` 解包,通过 OpenAI API 调用 DeepSeek 时的 `reasoningContent` 元数据,AnthropicChatOptions.timeout(Duration) 在模型构建之外被忽略的问题,`OllamaChatModel` 提示选项未继承配置模型的问题,Google GenAI 的思考层级验证,Mistral AI 审查结果中的空字段,Microsoft Foundry 对代理主机的 URL 路径处理,以及在 TLS 检查代理后 Azure OpenAI 认证问题。
2.0.0 版本引入的工具搜索顾问现已包含在 BOM 中——此前该组件缺失导致依赖管理变得不便——同时修复了自动配置顺序和并行工具调用的引用提取问题。
聊天记忆
Redis 的 ChatMemoryRepository 在三个方面进行了强化:时间戳以原子方式保留[6784],从而防止并发写入者发生冲突;clear() 方法现在确实会清空数据[6783];查询中对元数据值进行了转义[6765],因此包含特殊字符的值不再破坏查询。文档现在也解释了对话 ID 的作用域[6651]。
向量存储
Milvus 获得了三个修复:过滤表达式转换器中的组优先级[6543];整数元数据值现在反序列化为 Long 而不是 Double[6517];针对自定义元数据字段的过滤器[6470]。其他方面,OpenSearchVectorStore 现在能正确反序列化文档[6550];PgVectorStore 在初始化后会验证其表结构,而不是在第一个查询时失败[6438];CouchbaseSearchVectorStore.Builder 不再断言错误的条件[6490]。
MCP
MCP 注解现在再次支持 GraalVM 原生镜像[6427]。@McpTool 的异常处理与 @Tool 合约保持一致[6534];无参数的 stdio 连接现在可以正常工作[6533];HTTP 客户端请求自定义 Bean 现在被正确应用[6716];流式 HTTP WebClient 传输现在可以接受没有 event 字段的 SSE 帧[5783],这符合规范要求。服务器现在可以通过 [maxSessions 和 sessionIdleTimeout](6760) 限制会话状态。
健壮性
多个修复使 Spring AI 在处理不可信或意外输入时表现更加稳定:已解析的资源路径现在会进行验证[6764];缓存现在使用临时目录[6754];完整长度的哈希值替代了截断的哈希值[6746];畸形 PDF 现在可以被正确处理,而不是传播原始解析器错误[6753];MarkdownCodeBlockCleaner 现在验证文本长度[6645],并且不再丢弃单行的围栏代码块[6423]。线上传输和协议值的字符串大小写转换现在使用 Locale.ROOT[6566],这修复了经典的土耳其语本地化 i 错误;TransformersEmbeddingModel 现在会关闭其本地资源[6572]。
文档、依赖和构建
https://spring.io/blog/2026/08/21/spring-ai-2-0-1-available-now#documentation-dependencies-and-build
结构化输出文档和工具调用文档进行了重构,CosmosDBChatMemoryRepository章节已恢复,Pinecone免费层级命名空间说明已更新至最新状态。
在依赖管理方面,Milvus升级至2.6.21版本,Pinecone升级至6.2.0版本,Qdrant升级至1.18.0版本。构建系统现在将Maven插件版本委托给Spring Boot BOM管理,并将gRPC版本管理交由Spring Boot BOM处理,同时移除了显式的`protobuf-java`版本属性——这减少了Spring AI与Spring Boot管理的版本产生冲突的可能性。`spring-ai-azure-store`模块已移除fastjson2依赖。
贡献者
感谢所有为本次发布做出贡献的人员:
@DragonFSKY,@EvanYao826,@JamesBLewis,@MKP999,@OneZero-Y,@OreOreDa,@Seol-JY,@TimurRakhmatullin86,@YashRL,@ZhangDT-sky,@angus-guo,@chaechaepower,@chemicL,@dimitarproynov,@ericbottard,@gaoxiaolei-s59,@gh7035,@guanxuc,@hutiefang76,@ilayaperumalg,@iuliiasobolevska,@jewoodev,@kamalcis,@kezhenxu94,@leeworms,@liushenling2001,@nicolaskrier,@prachipanditrao,@pyg410,@quaff,@rea9r,@sdeleuze,@sdudzin,@seeun0210,@sobychacko,@strogiyotec,@subhashpolisetti,@thjanssen,@tzolov,@ultramancode,和@yyyCode
快速入门
升级您的应用,或通过 start.spring.io 启动一个新项目。一如既往,我们很想听听您的使用体验 —— 如果发现功能异常,请 提交问题;如果对未来发展有建议,欢迎 发起讨论。
感谢支持!