快速结论:该报错通常发生在 vLLM 0.23.0 与 0.24.0 版本使用 Qwen3.6-35B-A3B-FP8 模型生成代码类内容时,服务端返回 400 Unterminated string starting at 错误。优先排查生成参数中的 stop 参数是否包含非法转义字符或未闭合字符串。
适用环境:Ubuntu 22.04.5 LTS,Python 3.12.13,PyTorch 2.11.0+cu130,CUDA 13.0,NVIDIA A100-PCIE-40GB(双卡),vLLM 0.23.0 / 0.24.0 版本。
最快修复方案:暂无确认的一步修复方案。Issue 讨论中未给出已经验证的修复方法,以下解决步骤均为基于报错特征的可能原因排查方向。
注意事项:该报错并非模型权重损坏或 GPU 资源不足导致,问题更集中在请求参数或服务端对生成内容的解析环节。由于 Issue 关闭时未明确最终修复方案,以下排查步骤需要结合实际情况验证。
问题场景
用户通过 vLLM 启动的 OpenAI 兼容 API 服务(/v1/chat/completions 端点)调用 Qwen3.6-35B-A3B-FP8 模型生成代码。服务在生成过程中持续输出正常的吞吐量日志,但随后收到 POST /v1/chat/completions HTTP/1.1" 400 Bad Request,并在 ASGI 应用层抛出 Unterminated string starting at 异常。该错误在 vLLM 0.23.0 和 0.24.0 两个版本中均可复现,且只在生成代码类内容时触发。
报错原文
[Bug]: vllm 0.23.0 and 0.24.0 - Qwen3.6-35B-A3B-FP8 - Fails generating code- "400 Unterminated string starting at"
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) INFO: 172.16.27.254:59562 - "POST /v1/chat/completions HTTP/1.1" 400 Bad Request
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) ERROR: Exception in ASGI application
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) Traceback (most recent call last):
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) File "/usr/local/lib/python3.12/dist-packages/uvicorn/protocols/http/httptools_impl.py", line 421, in run_asgi
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) result = await app( # type: ignore[func-returns-value]
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) File "/usr/local/lib/python3.12/dist-packages/uvicorn/middleware/proxy_headers.py", line 62, in __call__
vllm-Qwen3.6-35B-A3B-FP8 | (APIServer pid=1) return await self.app(scope, receive, send)
原因分析
可能原因如下:
1. 生成内容包含未闭合的 JSON 字符串(最可能):模型在生成代码时,输出内容中可能包含未转义的引号或未闭合的字符串,导致服务端在解析或序列化响应时抛出 Unterminated string starting at 异常。这通常发生在模型输出的代码中包含特殊字符(如制表符、换行符、反斜杠)且未被正确转义时。
2. 请求参数中的 stop 序列配置不当:如果请求中设置了 stop 参数,且该参数包含未闭合的字符串或非法转义符,FastAPI/Starlette 层在解析请求体时就会直接返回 400。虽然报错堆栈显示异常发生在 ASGI 中间件层,但并不能完全排除请求参数解析问题。
3. vLLM 0.23.0 / 0.24.0 版本特定回归问题:该问题仅出现在 0.23.0 和 0.24.0 版本中,暗示可能是 vLLM 在这两个版本引入的与 FP8 模型解码或响应格式化相关的回归缺陷。Issue 标题明确指向版本范围,但关闭时未提供具体修复 commit。
环境排查
- 确认 vLLM 版本是否为 0.23.0 或 0.24.0,可尝试升级到更新版本(≥0.25.0)验证是否修复。
- 确认 PyTorch 版本是否为 2.11.0+cu130,CUDA 是否 13.0。
- 确认模型权重文件为 Qwen3.6-35B-A3B-FP8,且已正确下载至本地目录。
- 检查 API 调用请求体中的
stop参数是否包含\n、\\等需要转义的字符串,建议使用 JSON 序列化时进行合法性校验。 - 确认使用双卡 A100-PCIE-40GB 时,张量并行(tensor_parallel_size)配置是否与模型结构匹配。
- 如使用 Docker 部署,确认容器内 vLLM 版本与宿主机 CUDA 驱动兼容。
解决步骤
- 检查请求参数(可优先尝试):审查发送到
/v1/chat/completions的请求体,重点检查stop参数。确保每个 stop 字符串都是合法的、完全闭合的 JSON 字符串。例如,不要直接传入"\n"以外的未转义字符,建议使用json.dumps()生成请求体,避免手工拼接。 - 简化生成参数:暂时移除请求中的
stop参数,或将其替换为单个常见分隔符(如),观察是否仍触发 400 错误。 - 限制生成长度:在请求中将
max_tokens调低(如 512),确认是否与超长代码生成有关。如果较短输出不报错,则问题更可能集中在模型输出解析环节。 - 更换 vLLM 版本:尝试降级到 0.22.x 或升级到最新版本,确认是否为 0.23.0 / 0.24.0 的版本回归问题。升级前建议先查看 vLLM release notes 中关于 FP8 模型支持或响应格式化的修复说明。
- 检查服务端日志完整堆栈:展开 ASGI 异常堆栈的尾部,定位具体抛出
Unterminated string的代码行(通常在 JSON 解析或序列化模块中),根据堆栈指向的模块进一步缩小排查范围。 - 使用 curl 进行最小化复现:构造一个最简单的 chat completion 请求,仅包含 system + user 消息,让模型生成简短代码(如
print("hello")),排除复杂 prompt 的影响。
验证方法
重新发起相同的代码生成请求,观察服务端日志是否仍返回 400 Bad Request,以及客户端是否收到正常的 HTTP 200 响应与完整的生成结果。如果请求能正常返回,说明问题已解决;如果仍返回 400,请收集完整的 ASGI 异常堆栈(尤其是 traceback 最后 10 行)并提交到 vLLM GitHub issue 中进一步排查。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Using DeepSeek with LlamaIndex causes a 400 Bad Request because LlamaIndex calls the deprecated /v1/completions text endpoint instead](https://www.chat-gpts.plus/wp-content/uploads/2026/08/22846-c859ce1c-768x403.jpg)

