Spring AI 2.0.0-RC1 发布:重大工具调用重构与模型更新
代表 Spring AI 工程团队及所有贡献者,我很高兴地宣布 Spring AI 2.0.0-RC1 现已从 Maven Central 发布。
RC1 是通往 2.0.0 GA 版本的一个 API 稳定化里程碑。
工具调用改造
所有模型统一工具执行。 内置的调用/流式工具执行循环和 ToolExecutionEligibilityChecker 连接已从每个 ChatModel 中移除——包括 OpenAI、Ollama、Anthropic、MistralAI、DeepSeek、Bedrock Proxy 和 MiniMax。工具执行现在必须通过 ChatClient 配合 ToolCallingAdvisor(推荐)或用户控制的 DefaultToolCallingManager 循环在外部处理。作为此次整合的一部分,internalToolExecutionEnabled 已被移除。
移除 toolNames() API 和 SpringBeanToolCallbackResolver,改用显式的 ToolCallback Bean。 toolNames 和 toolBeanDefinitionNames API 已从 ChatOptions 实现、ToolCallingChatOptions、DefaultToolCallingManager 和 ChatClient 中移除。工具现在必须显式注册为 ToolCallback Bean,并通过 .tools() 传递,而非在请求时按 Bean 名称解析。
允许在 ChatClient.tools() 中直接传递工具回调和提供者。 ChatClient.prompt().tools(...) 现在直接接受 ToolCallback、ToolCallbackProvider、集合和数组。ToolSpec 消费者 API 已被移除,toolContext() 方法已提升为头等地位,并增强了验证。
ToolCallAdvisor 重命名为 ToolCallingAdvisor。 ToolCallAdvisor 保留为已废弃的子类,包含 builder() 工厂、Builder 内部类和 AdvisorParams 别名,以提供弃用警告而非编译错误。
用于按需工具发现的工具搜索顾问。 新增 ToolSearchToolCallingAdvisor,包含三个 ToolSearcher 实现(向量存储、Lucene、正则表达式),使 LLM 能够按需发现并调用工具,而无需预先加载所有定义。spring-ai-advisors-vector-store 已重命名为 spring-ai-vector-store-advisor,ToolSearchToolCallingAdvisor 已移入专用的 spring-ai-tool-search-advisor 模块。
默认将记忆顾问置于 ToolCallingAdvisor 之外。 DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER 已降低,使记忆顾问包裹工具调用循环,而非参与每次迭代。大多数 ChatMemoryRepository 实现不支持 AssistantMessage 工具调用内容或 ToolResponseMessage;ToolCallingAdvisor 在内部管理自己的中间对话历史。
简化 ToolCallingAdvisor 中的流式聚合。 基于 publish() 的双分支模式已替换为直接的顺序聚合:先聚合响应,再延迟工具调用递归。ChatClientMessageAggregator 被提取为静态字段,以防止每次流调用时重复实例化。
聊天记忆改进
MessageWindowChatMemory 中的回合边界对齐。 当消息窗口溢出时,驱逐切割点现在向前移动到最近的 USER 消息,而不是在中间停止,防止回合在驱逐边界处被分割。
避免工具提示中出现重复聊天记忆。 当当前提示已包含存储的记忆消息时,防止预置聊天记忆。工具调用继续提示不再重复先前的消息,同时仍保留最新的工具响应在记忆中。
允许编程访问 spring_ai_chat_memory 表中的 timestamp 字段。 当使用 JdbcChatMemoryRepository 时,timestamp 列现在可以像聊天记忆表中的任何其他列一样通过编程方式访问。
改进 JdbcChatMemoryRepositoryDialect 以使用默认方法。 方言接口现在使用默认方法,使自定义方言实现更简单,所需样板代码更少。
结构化输出增强
为 ChatClient.entity() 添加 EntityParamSpec,用于每次调用的结构化输出配置。 在 entity() 调用上启用提供程序原生的结构化输出或模式验证之前,需要单独的顾问参数或手动连接 StructuredOutputValidationAdvisor。EntityParamSpec 允许在 entity() 调用点直接配置两者。
API 与代码清理
完成从模型中移除默认值。 默认选项值现在在选项级别管理和公开。未设置的选项会委托给底层模型自身的默认值,消除了 Spring AI 默认值静默覆盖模型提供程序值的一类细微错误。
在选项构建器中将 N() 重命名为 n()。 *Options 和配置属性类中的 N() 构建器方法已重命名为 n(),以符合 Java 命名约定。
强制 ToolCallingAdvisor.Builder 非空并修复顾问链突变。 toolCallAdvisorBuilder 现在在 DefaultChatClientRequestSpec 中不可为空,空值默认移到 DefaultChatClientBuilder,在该处 observationRegistry 可以正确接入默认的 ToolCallingManager。
重构 JSON 工具。 对 JSON 工具及相关公共 API 进行了一次重要的重构(之前因依赖其他重构工作而推迟)。由模式工具共享的 SchemaGenerator 实例现在在通过结构化输出和工具模式路径时得到了正确的并发访问保护。
用 org.apache.commons.logging.LogFactory 替换 SLF4J。 Spring AI 现在使用 LogFactory.getLog(getClass()) 以与 Spring 其他项目保持一致。
弃用并重命名 ChatClient 定制器。 ChatClientCustomizer 已弃用;引入 ChatClientBuilderCustomizer 作为替代。
为基于 Micrometer 的可观测性定制 OkHttp 客户端。 引入 OkHttp 客户端定制,以恢复 OpenAI 和 Anthropic 模型的基于 Micrometer 的可观测性支持。
模型更新
更新 Mistral AI 聊天模型。 移除已弃用的 devstral-medium-latest,将 devstral-small-latest 替换为 devstral-latest,弃用其他几个模型,并根据 Mistral AI 的退役计划重新组织高级和免费模型产品。
添加 DeepSeek V4 聊天模型常量。 新增 DeepSeek V4 聊天模型常量,无需再硬编码模型标识符字符串。
移除 MiniMax 专用支持,改用 Anthropic 集成。 MiniMax 建议通过其 text-anthropic API 使用 Anthropic 支持。MiniMax 特有的代码路径已被移除,转而使用与 Anthropic 兼容的集成。
退役 Pixtral Large 模型。 根据 Mistral AI 的计划(2026 年 5 月 31 日),Pixtral Large 已退役并从 Spring AI 中移除。
Bug 修复
修复所有剩余聊天模型流式路径中的跨度层次结构问题。 将 Micrometer Tracing 父作用域修复应用于 Anthropic、Bedrock Converse、DeepSeek、Google GenAI、MiniMax、Mistral AI 和 Ollama。根本原因是 TracingObservationHandler.getParentSpan 使用 Spring MVC 线程上的跨度作为具有显式 parentObservation 的 Observation 的父级,导致跨度/观察层次结构不匹配。
修复 OpenAiChatModel.stream() 仅缓冲工具调用。 之前该实现缓冲了整个响应才返回令牌。现在它只缓冲工具调用段,允许其他令牌在生成时立即流出。
修复 DeepSeek V4 函数调用 400 Bad Request 错误。 修正了向 DeepSeek V4 模型发送函数调用请求时的请求构建。
修复 OpenAI 选项中的合并问题。 修复了多种选项类型中 customHeaders 的合并以及转录选项中 timestampGranularities 的合并。
文档更新
完善参考文档。 修复了指向音频和审核页面的损坏交叉引用,为这些部分添加了缺失的着陆页,并修正了 chatclient.adoc 中的拼写错误。
改进 Mistral AI 聊天文档,针对推理模型和 ReasoningEffort Javadoc。 澄清了可调整模型与原生推理模型类型,扩展了元数据使用说明,对思考内容元数据使用常量而非字符串,并在 Mistral Small 模型 application.properties 代码片段中添加了 latest 标签。
重新引入 OCI GenAI 和 Azure CosmosDB 的社区支持文档。 重新引入了 OCI GenAI 和 Azure CosmosDB 向量存储集成的社区支持文档及相应 URL。
修复 RAG 图中的“vector strore”拼写错误。 spring-ai-rag.jpg 中的标签显示为“Vector Strore”。已更正为“Vector Store”。
依赖升级
升级到 MCP SDK 2.0.0-RC1。 Spring AI 的模型上下文协议 Java SDK 依赖已升级到 2.0.0-RC1。
贡献者
感谢所有为本次发布做出贡献的贡献者:
@Baqirrizvidev,@Dream95,@EvanYao826,@ThomasVitale,@YunKuiLu,@chemicL,@dafriz,@ericbottard,@galenzo17,@goutamadwant,@guanxuc,@ilayaperumalg,@juanjuandog,@nicolaskrier,@quaff,@rajadilipkolli,@sdeleuze,@sobychacko,@stohirov,@symphony-enrico,@tzolov,和 @wolf8334
资源
项目主页 | GitHub | Issues | Stack Overflow
发布说明: 2.0.0-RC1 | 文档: 2.0.0-RC1 文档