[Bug]: GPT-OSS Harmony json_schema/json_object constraints apply from token 0 and drop reasoning

该报错描述的是:在使用 GPT-OSS / Harmony 模型并通过 Chat Completions 传入 response_format ( json_schema 或 json_object )时,JSON 语法约束从第 0 个 token 开始生效,模型不再输出 an

快速结论:该报错描述的是:在使用 GPT-OSS / Harmony 模型并通过 Chat Completions 传入 response_format(json_schema 或 json_object)时,JSON 语法约束从第 0 个 token 开始生效,模型不再输出 <|channel|>analysis / <|channel|>final 结构标签,导致 reasoning 内容丢失、剩余文本被塞进 JSON 字段。优先排查你的 vLLM 构建是否带有 Harmony 感知的结构化输出改写,以及 --structured-outputs-config.backend 的取值。

适用环境:报告中出问题的环境是 dynamo-vllm worker(0.30.0+crwv.2,镜像 dynamo-vllm:v2.51.7),服务 openai/gpt-oss-120b,启动参数包含 --reasoning-parser openai_gptoss 和 --structured-outputs-config.backend guidance(xgrammar 与 auto 也报同样问题),CUDA 13.0.3、PyTorch 2.13.0。复现者使用的是不带 Dynamo 的 vllm serve,环境为 1 × NVIDIA B200、驱动 615.71.09、CUDA 13.4,镜像 vllm/vllm-openai:nightly-81198e97ba7eee2a22540caaa756b7fdddcb4d93(vLLM 0.31.1rc1.dev88+g81198e97b),torch 2.13.0+cu130、llguidance 1.7.6、xgrammar 0.2.8。collect_env.py 未在问题机器上运行。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中并未复现出所报告的 reasoning 丢失现象,同时发现 guidance 后端在 json_schema/json_object 请求上存在另一个独立缺陷(HTTP 400 Invalid grammar specification: 'triggers')。可优先尝试:在受影响构建上改用 --structured-outputs-config.backend xgrammar 或 auto,并检查是否已包含 Harmony 感知的结构标签改写(对应 #45560);同时关注上游 ai-dynamo/dynamo #16787 的跟进。

注意事项:上述“改用 xgrammar / auto”仅在复现环境中被验证能保留 reasoning 并返回合法 JSON,但不能证明能消除原报告环境中(dynamo-vllm 构建)的症状;复现测试每个后端每类请求只跑了一次,样本有限,且不含 Dynamo,差异可能被掩盖。使用 guidance 时 B/C 请求会直接 400 失败,这属于另一个缺陷,不能据此判断原症状是否会消失。Issue 已关闭,但原症状未在该 Issue 内被复现确认。

问题场景

用户通过 vllm serve(dynamo-vllm worker 构建)部署 openai/gpt-oss-120b,使用 --reasoning-parser openai_gptoss,并在 Chat Completions 请求中同时启用 reasoning(reasoning_effort: high、chat_template_kwargs 中的 thinking/enable_thinking)与 response_format(json_schema 或 json_object)。不传 response_format 的对照请求能正常产生 delta.reasoning 和大于 0 的 reasoning_tokens;一旦加上 response_format,JSON 语法似乎从第 0 个 token 就开始约束,reasoning 归零,多余内容被塞进 JSON 的最后一个字符串字段(如 conditions,出现 "......" 这类内容,temperature 出现 120120 这类异常值)。问题被定位为该 Issue 类别:#35873(从 0 个 token 起应用 grammar bitmask,覆盖 reasoning;已关闭未合并)与 #45560(对 json_object/json_schema 做 Harmony 感知的结构标签改写;2026-08-01 已合并)所描述的一类。

报错原文

[Bug]: GPT-OSS Harmony json_schema/json_object constraints apply from token 0 and drop reasoning

# 症状表现(报告中)
reasoning_tokens: 0
no `reasoning` deltas

# 复现者使用 guidance 后端时遇到的独立错误
data: {"error": {"message": "Invalid grammar specification: 'triggers'", "type": "BadRequestError", "param": null, "code": 400}}

File "/usr/local/lib/python3.12/dist-packages/vllm/v1/structured_output/backend_guidance.py", line 307, in serialize_guidance_grammar
    triggers: list[str] = s_tag["triggers"]
KeyError: 'triggers'

原因分析

报告者的判断是:在 GPT-OSS / Harmony 模型上,Chat Completions 的 response_format 会把 JSON 语法从 token 0 开始应用,导致模型没有机会先输出 <|channel|>analysis / <|channel|>final 这些结构标签,reasoning 通道因此被跳过,原本属于 reasoning 的 token 被强行塑形进 JSON 字段。Issue 中引用的 #45560 正是为解决这类问题而对 json_object/json_schema 做 Harmony 感知的结构标签改写,但报告者称在 v2.51.7 worker 的 Chat Completions 路径上仍然复现。

需要说明的是:复现者在普通 vllm serve(不含 Dynamo)上使用报告中的原命令和请求,xgrammar 与 auto 均未出现 reasoning 丢失,B/C 请求 reasoning_tokens 分别为 527 和 919,返回合法 JSON;guidance 后端则在生成前直接 400,traceback 显示 guidance 后端拿到的 structural tag 缺少 triggers 键。因此可能原因包括:问题与 dynamo-vllm 特定构建、版本或 Dynamo 集成有关;或与 guidance 后端的结构化标签序列化路径有关。上述均未被 Issue 内证据完全确认。

环境排查

  • 确认 vLLM 版本与构建来源:报告环境为 dynamo-vllm worker 0.30.0+crwv.2(镜像 dynamo-vllm:v2.51.7);复现环境为 0.31.1rc1.dev88+g81198e97b(不带 Dynamo)。两者差异是否是关键,尚未确认。
  • 确认 --structured-outputs-config.backend 取值:报告称 guidance、xgrammar、auto 都会触发;复现中 xgrammar/auto 正常,guidance 报 KeyError: 'triggers'。
  • 确认 --reasoning-parser openai_gptoss 是否生效。
  • 确认 CUDA 与 PyTorch 版本:报告为 CUDA 13.0.3、PyTorch 2.13.0;复现为 CUDA 13.4、torch 2.13.0+cu130。
  • 确认结构化输出依赖版本:复现环境为 llguidance 1.7.6、xgrammar 0.2.8。
  • 确认是否部署在 Dynamo 之上;复现者指出 Dynamo 或该构建的差异可能隐藏症状。
  • 确认 SDK/客户端是否真的发出了 response_format 字段(对照请求 A 与 B/C 的请求体差异)。

解决步骤

  1. 先用对照请求复测:在不带 response_format 的情况下,确认 stream_options.include_usage 返回的 usage.completion_tokens_details.reasoning_tokens 大于 0、流中有 delta.reasoning。若对照也异常,问题不在 response_format 路径。
  2. 在受影响环境上切换结构化输出后端,分别用 --structured-outputs-config.backend xgrammar 和 auto 重启服务,重复同一组 B(json_schema)和 C(json_object)请求。复现环境中这两种后端均保留了 reasoning 并返回合法 JSON,可优先尝试。
  3. 若必须使用 guidance,先检查服务端日志是否出现 backend_guidance.py 中的 KeyError: 'triggers'。出现该错误说明命中的是另一个独立缺陷,此时与 reasoning 是否丢失无关。
  4. 核对部署框架:如果是 dynamo-vllm 构建,尝试用不带 Dynamo 的同版本 vllm serve 复测同一组请求,以确认症状是否与构建/集成相关。
  5. 核对版本:确认所用镜像/构建是否已包含 #45560 提及的 Harmony 感知结构标签改写;报告者称其 v2.51.7 worker 上仍存在,说明仅升级到某版本不一定能解决。
  6. 跟踪上游进展:按 Issue 关闭说明,可到 ai-dynamo/dynamo #16787 查看后续修复。

验证方法

对带 response_format 的请求(B 和 C),检查三点:流中是否出现 delta.reasoning;usage.completion_tokens_details.reasoning_tokens 是否大于 0;返回内容是否为符合 schema 的 JSON,且没有把剩余文本塞进最后一个字符串字段、没有额外键。对照环境下 xgrammar/auto 的参考结果为 B 约 527、C 约 919 个 reasoning token,可作为基线的参考,不必强求数值一致。若使用 guidance,还应确认不再出现 HTTP 400 Invalid grammar specification: 'triggers' 及相关 KeyError。

参考来源

vllm-project/vllm #60664

ai-dynamo/dynamo #16787(Issue 关闭说明中给出的跟踪链接)

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29425

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注