Spring AI 调 vLLM 报 400 错误?分块传输编码是坑,换 Jetty 客户端就通了
Spring AI 调 vLLM 报 400 错误分块传输编码是坑换 Jetty 客户端就通了【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai根因是 vLLM 不认分块传输编码Chunked Transfer Encoding而 Spring AI 默认 HTTP 客户端正按分块方式发请求体Request Body调用直接吃 400 错误。最简修复把 RestClient、WebClient 底下的客户端换成 Jetty。报错现场vLLM 回 400说 body 字段缺失控制台里第一条报错长这样400 - {object:error,message:[{type: missing, loc: (body,), msg: Field required, input: None}],type:BadRequestError,param:null,code:400}人话翻译vLLM 没收到任何一个字节的请求体input 是 None它把这次请求当成“空请求”按缺字段拒掉了。和模型参数无关——body 根本没送到。我们当时跑的就是这种 DeepSeek 多轮对话第一轮请求就 400第二轮根本没发出去。排查回放从 URL 密钥查到分块传输编码先怀疑的是配置。baseUrl、apiKey、模型名逐项核对都对得上。顺手用 curl 直连同一个 vLLM 端点完整响应回来了。配置排除。再改调用方式切非流式、调 temperature 这类参数400 依旧。请求参数也排除。转折点是 vLLM 那侧的日志input: None。服务端确实没收到 body。嫌疑挪到传输层我拉出 Wireshark 看了 Spring AI 发出的原始请求。绕了一圈发现请求头里是 Transfer-Encoding: chunked而不是 Content-Length。body 被拆成块发出去了。坑就在这vLLM 的解析器只认事先声明长度的请求chunked 这种它直接当空 body 处理报错发生在模型被调用之前。原理拆解Content-Length 与分块传输编码的传输层差异说白了两条路径差一行请求头。curl 的 body 是内存里现成的字节长度提前知道头里写 Content-Length: 312body 整包送达。Spring AI 的客户端边序列化边发长度不确定时就切到分块传输把 body 拆成一块块发末尾加结束符。类比一下快递整包直发封条上写了总重分块传输是一车车拉最后一车写“运完”。vLLM 只认封条见不到封条就当空包裹拒收。再看报错格式是 pydantic 的校验输出vLLM 的 API 层拿到空 body校验器按必填字段缺失处理。所以这个 400 不是“参数错”是“信封格式不同”——东西在对方没收到。动手修复RestClient 和 WebClient 换 Jetty 客户端第一步加 Jetty 客户端及其响应式适配器。后者是给 WebClient 复用 Jetty 连接池的dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-client/artifactId /dependency dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-reactive-httpclient/artifactId /dependency第二步把 RestClient 的请求工厂换成 JettyClientHttpRequestFactory。非流式 chat() 调用走的是同步 RestClient换完它会回到带 Content-Length 的发送方式。第三步把 WebClient 的连接器换成 JettyClientHttpConnector。流式调用走这条路两处都得换只换一处会在另一条链路再次 400。完整配置如下baseUrl 和 apiKey 按你的 vLLM 地址填OpenAiApi openAiApi OpenAiApi.builder() .baseUrl(http://localhost:8000/v1) .apiKey(EMPTY) .restClientBuilder(RestClient.builder() .requestFactory(new JettyClientHttpRequestFactory())) .webClientBuilder(WebClient.builder() .clientConnector(new JettyClientHttpConnector())) .build();避坑清单自部署 OpenAI 兼容服务的 400 排查检查项☐ 报错带 Field required 且 input: None先认定 body 没送达别去动模型参数 ☐ 同端点 curl 直连一次直连通、Spring AI 不通嫌疑收窄到客户端传输层 ☐ 抓包看请求头有没有 Transfer-Encoding: chunked这是确认根因的关键证据 ☐ 对接自部署服务vLLM、LM Studio 之类先试换 HTTP 客户端再回头调参数 ☐ 关注 vLLM 上游对分块传输的支持修复修复落地后 Jetty 这套依赖可以撤掉回归默认客户端【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

wagmi Vue 组合式函数 useWriteContract 实战:在 Vue 3 中安全地执行合约写交易

wagmi Vue 组合式函数 useWriteContract 实战:在 Vue 3 中安全地执行合约写交易

wagmi Vue 组合式函数 useWriteContract 实战:在 Vue 3 中安全地执行合约写交易 【免费下载链接】wagmi Reactive primitives for Ethereum apps 项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi useWriteContract 是 wagmi/vue 提供的核心组合式函…

2026/9/18 23:23:08 阅读更多 →
React Native切换Hermes引擎:性能优化实践与踩坑指南

React Native切换Hermes引擎:性能优化实践与踩坑指南

1. 为什么React Native项目最终要交给Hermes先把话说在前面:这个项目名字多少带点玩梗的意味。oh-my-hermes,熟悉命令行工具的朋友一眼就能看出这是在致敬oh-my-zsh——但和zsh配置集完全不同,oh-my-hermes本质上是围绕着Hermes引擎的一套工程…

2026/9/18 23:22:08 阅读更多 →
BIO/NIO/AIO

BIO/NIO/AIO

BIO (同步阻塞I/O):一个连接对应一个线程。线程在等待数据读写时被“挂起”,什么也不做,直到数据准备好。NIO (同步非阻塞I/O):一个线程可以管理多个连接。线程会不断地主动询问每个连接“数据准备好了吗?”&#xff0…

2026/9/18 23:22:08 阅读更多 →

最新新闻

first-contributions 实战指南:用 git revert 安全撤销已推送的提交

first-contributions 实战指南:用 git revert 安全撤销已推送的提交

first-contributions 实战指南:用 git revert 安全撤销已推送的提交 【免费下载链接】first-contributions 🚀✨ Help beginners to contribute to open source projects 项目地址: https://gitcode.com/gh_mirrors/fi/first-contributions 本篇技…

2026/9/19 0:56:03 阅读更多 →
智慧医院集成平台实战:HL7/FHIR、EMPI与消息中间件选型

智慧医院集成平台实战:HL7/FHIR、EMPI与消息中间件选型

简介:这份《智慧医院集成平台建设方案》PPT面向医院信息中心、医疗信息化厂商及HIT项目规划人员,针对系统不断增多、信息孤岛、标准不统一、接口无法监管等现实痛点,给出从问题梳理到整体架构的完整设计思路。内容围绕服务总线、统一数据中心…

2026/9/19 0:56:03 阅读更多 →
校园兼职Android APP开发实战:从数据模型到上架的全链路解析

校园兼职Android APP开发实战:从数据模型到上架的全链路解析

简介:该PDF文献围绕Android大学生校园兼职APP的系统设计展开,面向移动开发初学者、毕业设计学生及对Android与PHP后台交互感兴趣的研发人员。内容完整覆盖Android客户端与PHP服务器端两大部分:客户端涉及注册、登录、发布兼职、兼职信息列表、…

2026/9/19 0:56:03 阅读更多 →
GraphPad Prism 5科研绘图核心逻辑:数据表类型决定统计可视化成败

GraphPad Prism 5科研绘图核心逻辑:数据表类型决定统计可视化成败

简介:本资源是一份面向科研人员与研究生的GraphPad Prism 5统计作图实战指南,聚焦SCI论文投稿所需的8类核心图表制作——折线图、柱状图、折线比较图、柱状比较图、散点图、气泡图、热图(Heatmap)与雷达图。内容覆盖原始数据与已处…

2026/9/19 0:56:03 阅读更多 →
Keil 5暗色护眼主题配置:从配色到global.prop详解

Keil 5暗色护眼主题配置:从配色到global.prop详解

每次打开Keil 5,那个刺眼的白色窗口都让我怀疑自己是在写代码还是在做眼科测试。做单片机开发的朋友应该都有同感——默认的MDK界面实在谈不上舒服,白底黑字配上饱和度极高的语法高亮,白天看还行,一到晚上加班,盯上两个…

2026/9/19 0:56:03 阅读更多 →
智慧矿山数据中台建设:从编码统一到冷热分层实战

智慧矿山数据中台建设:从编码统一到冷热分层实战

简介:这套70页PPT是一份面向煤矿行业信息化建设者、智慧矿山项目规划人员与方案架构师的完整解决方案,系统梳理了智慧矿山数据中台及管控一体化平台的建设路径。内容从煤矿行业背景切入,列举神东、陕北等13个亿吨级煤炭能源基地,对…

2026/9/19 0:55:03 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →