vllm - 💡(How to fix) Fix “vLLM-deployed Qwen3.5 with Reasoning Parser Shows Empty reasoningContent in Spring AI OpenAI Model” [2 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
vllm-project/vllm#37558Fetched 2026-04-08 01:02:07
View on GitHub
Comments
2
Participants
2
Timeline
3
Reactions
0
Author
Participants
Timeline (top)
commented ×2labeled ×1
RAW_BUFFERClick to expand / collapse

Your current environment

When deploying the Qwen3.5 model using vLLM with reasoning mode enabled and configuring --reasoning-parser qwen3, I found that reasoningContent is empty when printing OverAllState. The OpenAI model from Spring AI Alibaba is being used.

🐛 Describe the bug

Raw NodeOutput: { "OverAllState": { "data": { "graph_execution_id": "c0646529-c46a-4839-a11c-68fba5e99df9", "input": "你好", "user_input": "你好", "has_images": false, "messages": [{ "messageType": "USER", "metadata": { "messageType": "USER" }, "rendered": false, "text": "你是一个专业的智能助手。\n每次响应前先调用 read_skill("text-fee-agent") 加载完整执行规范。\n最终输出必须严格按照该技能文档中定义的标题、顺序、表头和字段格式返回,不得增删、改名、重排或省略。\n重要:点击收费计算(用户直接点击通行记录触发,带 selected_id)和自然语言车牌计费(用户输入车牌号查询,先候选后确认)必须使用完全一致的输出模板与字段顺序,两种场景的"参考估算"模块中车牌号展示格式也必须一致,都必须参考 agent skills 里面的 text-fee-agent 的要求。\n" }, { "messageType": "ASSISTANT", "metadata": { "role": "ASSISTANT", "messageType": "ASSISTANT", "refusal": "", "finishReason": "TOOL_CALLS", "index": 0, "annotations": [], "id": "chatcmpl-bc600ca8b28e0131", "reasoningContent": "" }, "toolCalls": [{ "id": "call_af5b037dac144636b8b76745", "type": "function", "name": "read_skill", "arguments": "{"skill_name": "text-fee-agent"}" }], "media": [], "text": "\n\n" }, { "responses": [{ "id": "call_af5b037dac144636b8b76745", "name": "read_skill", "responseData": ""# 文本计费助手技能\n\n## 触发条件\n满足任一条件时必须启用本技能:\n- 用户询问通行费金额、优惠原因、计费逻辑、政策解释\n- 用户输入车牌号要求查询并计费\n- 当前请求中 selected_id 非空\n- 用户要求“继续/确认”某条候选记录后执行计费\n\n## 目标\n- 在最少轮次内完成“候选查询 -> 人工确认(如需)-> 计费解释”\n- 工具输出与前端解析格式严格一致,避免解析失败\n- 不篡改工具语义,不二次推导不存在的数据\n\n## 标准执行流程\n1. 读取上下文:仅以当前请求参数判断 selected_id 是否为空,同时识别用户是否在做计费问题或政策问答。\n2. 路由工具:\n - selected_id 非空:直接调用 calculate_highway_fee_by_id。\n - selected_id 为空且属于计费问题:先调用 find_vehicle_journey_candidates。\n - 属于政策条款、优惠条件、适用范围、依据引用问题:调用 search_policy_documents。\n3. 处理工具结果:\n - SUCCESS:根据工具返回内容输出结论。\n - NEED_HUMAN_APPROVAL:按固定候选模板输出并等待用户给 id。\n - NOT_FOUND / INVALID_INPUT:原义返回错误原因并提示下一步。\n4. 输出前自检:字段名、格式、状态码语义是否完全保持一致。\n\n## 工具调用强约束\n1. 当 selected_id 非空时,只能调用 calculate_highway_fee_by_id,禁止调用 find_vehicle_journey_candidates。\n2. 当 selected_id 为空时,涉及通行费测算必须先调用 find_vehicle_journey_candidates。\n3. 严禁复用历史轮次中的 id(包括历史候选、历史成功计费 id);除非用户在当前轮次明确给出并确认该 id。\n4. 用户在当前轮次未明确给出 id 时,不得直接调用 calculate_highway_fee_by_id。\n5. 若用户仅提出自然语言问题(如“这辆车怎么收费”)且 selected_id 为空,必须走候选查询与人工确认流程。\n6. 返回 NEED_HUMAN_APPROVAL 后,不得跳过人工确认直接计费。\n7. 任意工具同一参数最多重试一次,仍失败则反馈失败原因并结束本轮。\n8. 政策类回答必须先调用 search_policy_documents,禁止仅凭模型常识直接给结论。\n\n## 输出格式契约\n### 候选记录场景\n- 必须逐行输出,且每行保持如下格式:\n - 候选 1: id=xxx, enTime=yyyy-MM-dd HH:mm:ss, exTime=yyyy-MM-dd HH:mm:ss, enStation=xxx, exStation=xxx\n - 候选 2: id=xxx, enTime=yyyy-MM-dd HH:mm:ss, exTime=yyyy-MM-dd HH:mm:ss, enStation=xxx, exStation=xxx\n- 末行必须固定输出:请选择 id 后继续计费。\n\n### 成功计费场景\n- answer 字段现在是上下文数据包,禁止直接原样回传给用户。\n- 必须基于以下原字段自行生成最终解释:\n - status\n - selectionMode\n - answer\n - policyContext\n - auditFacts\n - retrievedContext\n - feeCalculationResult\n - bridgeTunnelStats\n - bridgeTunnelSummary\n - bridgeTunnelCountMap\n- 输出顺序固定为:参考估算 -> 桥隧统计 -> 分段详解。\n- 点击收费计算(selected_id 非空)与自然语言车牌计费(先候选后确认)必须使用完全一致的最终输出模板与字段顺序,尤其“参考估算”中的车牌号展示格式必须一致。\n- 必须在开头或结尾加免责声明:“以上金额仅为系统估算,实际费用以出口收费站为准,不作为结算依据。”\n- 除非用户明确问“多少钱”,金额段落可简述;金额必须直接引用工具结果,禁止二次计算改写。\n- L91 的 4 个金额占位符必须同口径取值,且必须满足:预计实收总额 = 道路里程费 + 引道里程费 + 桥隧叠加费(允许 0.01 元以内四舍五入误差)。\n- L91 金额字段取值优先级固定为:\n 1) 若 feeCalculationResult 同时存在 totalRoadFeetotalRampFeetotalBtFeetotalFee 且可对平,则全部取该组字段;\n 2) 否则,从 policyContext 中“预计实收金额: X 元 (含道路: A + 引道: B + 桥隧: C)”这一组原文提取 X/A/B/C 并整体填充 L91;\n 3) 禁止混用不同来源口径(例如 feeCalculationResult.totalFee + policyContext 的道路/引道/桥隧)。\n- 所有输出字段禁止简写,必须使用完整中文名称与完整信息表达。\n- “参考估算”必须完整展示:车牌号、入口收费站、出口收费站、入口时间、出口时间、车辆类型。\n- 桥隧统计必须先核对 bridgeTunnelSummary 六个类别,再输出表格;表格数字必须与该汇总值完全一致。\n- 桥隧统计必须优先使用 bridgeTunnelCountMap 作为唯一数值来源;bridgeTunnelSummary 仅用于交叉校验。\n- 如表格与 bridgeTunnelSummary 不一致,必须以 bridgeTunnelSummary 为准重写,禁止沿用旧数字。\n- “桥隧统计”小节必须逐字复用 bridgeTunnelStats 的类别顺序与单位格式,不得改写“座”、不得重排类别。\n- 分段详解只展示折扣率 < 1.0 的路段;若无折扣路段,表体固定输出“本次无享受折扣路段”。\n- 分段详解不需要展示“路段”列,按“优惠类型 + 优惠幅度 + 判定依据”分组输出。\n- 分段详解中同组的“对应的门架记录”必须聚合为该组全部门架记录总和,且必须完整列出,不允许省略、截断或简写。\n- 分段详解中每一行“判定依据”必须来自真实命中证据,优先引用 auditFacts 内该路段的“命中证据”和“非ETC优惠门架记录”。\n- 分段详解中每一行必须至少包含:1条命中条件 + 1条政策全称;缺任一项则该路段不允许写“已享受优惠”。\n- 严禁使用占位依据文本,如“符合XXX条件”“引用已命中事实与政策全称”“依据略”。\n- 若某优惠路段未提取到可验证命中证据,必须写“依据不足,无法确认优惠触发原因”,并在“优惠类型/优惠幅度”列保留工具原值,不得编造原因。\n- 文风必须自然,禁止输出“系统判定”“政策ID”“费率单元映射缺失”等实现术语。\n- 输出必须严格使用以下模板(标题名、顺序、表头不可变):\n\nmarkdown\\n以上金额仅为系统估算,实际费用以出口收费站为准,不作为结算依据。\\n\\n### 参考估算\\n车牌号:XX。\\n入口收费站:XX。\\n出口收费站:XX。\\n入口时间:yyyy-MM-dd HH:mm:ss。\\n出口时间:yyyy-MM-dd HH:mm:ss。\\n车辆类型:XX。\\n预计实收约 {预计实收总额} 元 =(道路里程费{道路里程费}元 + 引道里程费{引道里程费}元 + 桥隧叠加费{桥隧叠加费}元)。\\n最终费用 = Σ(各路段基础费 × 分时段折扣 × 分路段折扣 × 分方向折扣 × ETC折扣),其中各路段基础费 = 道路里程费 + 引道里程费 + 桥隧叠加费,且按路段逐段四舍五入到分后再汇总。\\n\\n### 桥隧统计\\n| 桥隧类别 | 数量(座) |\\n|---|---:|\\n| 半类桥隧 | XXX |\\n| 一类桥隧 | XXX |\\n| 二类桥隧 | XXX |\\n| 三类桥隧 | XXX |\\n| 四类桥隧 | XXX |\\n| 五类桥隧 | XXX |\\n\\n### 分段详解\\n| 优惠类型 | 优惠幅度 | 判定依据 | 对应的门架记录 |\\n|---|---|---|---|\\n| 分时段优惠 | 八折 | 命中“22:00-06:00 夜间通行”条件;依据《贵州省高速公路差异化收费实施方案》夜间分时段条款 | 清镇西门架(分时段优惠);石板门架(分时段优惠);贵阳西门架(分时段优惠) |\\n\n- 若无任一优惠路段,则“分段详解”保留表头并在表体写“本次无享受折扣路段”。\n\n### 知识库检索成功场景\n- 先输出“结论”,再输出“依据”,最后输出“边界说明”。\n- 依据必须引用 search_policy_documents 返回的来源信息,禁止伪造来源。\n- 当 hitCount=0status=NOT_FOUND 时,必须明确回复“知识库暂无相关信息”。\n- 输出模板:\n\nmarkdown\\n结论:...\\n\\n依据:\\n1. 《政策全称A》:...\\n2. 《政策全称B》:...\\n\\n边界说明:...\\n\n\n### 失败场景\n- 必须保留工具返回的 statusmessage 语义,不得弱化错误原因。\n- 输出模板:处理失败(status=XXX):YYY。\n\n## 禁止事项\n- 禁止编造任何收费数字、政策条款、候选记录 id。\n- 禁止输出“系统推测”“大概如此”等不确定结论替代工具结果。\n- 禁止泄露内部信息(密钥、数据库结构、服务地址、实现细节)。\n- 禁止执行破坏性或越权请求。\n- 禁止把 answer 原文数据包直接粘贴给用户。\n\n## 质量检查清单\n在返回用户前逐项确认:\n1. 工具选择是否符合 selected_id 规则。\n2. 是否误用了历史 id(当前轮次未明确给出时必须为否)。\n3. 候选格式是否满足前端可解析结构。\n4. 是否遗漏 NEED_HUMAN_APPROVAL 的人工确认步骤。\n5. 是否存在对工具结果的改名、重排、臆造。\n6. 政策类问题是否已调用 search_policy_documents 并给出来源依据。"" }], "metadata": { "messageType": "TOOL" }, "messageType": "TOOL", "text": "" }, { "messageType": "ASSISTANT", "metadata": { "role": "ASSISTANT", "messageType": "ASSISTANT", "refusal": "", "finishReason": "STOP", "index": 0, "annotations": [], "id": "chatcmpl-a7b2dd09d7df2564", "reasoningContent": "" }, "toolCalls": [], "media": [], "text": "\n\n您好!我是贵州省高速公路政策和收费智能助手。\n\n我已加载完整的执行规范(text-fee-agent 技能)。\n\n我可以为您提供以下服务:\n- 通行费查询与计算:输入车牌号,查询通行记录并估算费用\n- 政策解释:解答关于收费标准、差异化收费、ETC 优惠、节假日免费、绿通减免等问题\n- 桥隧统计说明:分析通行记录中的桥梁隧道费用构成\n- 分段优惠详解:解释各路段享受的具体优惠政策和依据\n\n请告诉我您需要查询哪辆车(输入车牌号),或者询问什么高速收费政策问题?" }], "route_target": "text", "selected_id": "" } } }

Before submitting a new issue...

  • Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the documentation page, which can answer lots of frequently asked questions.

extent analysis

Fix Plan

To address the issue of reasoningContent being empty, we need to ensure that the reasoning-parser is correctly configured and that the qwen3 model is properly integrated with the vLLM.

Here are the steps to fix the issue:

  • Verify that the --reasoning-parser flag is set to qwen3 when deploying the Qwen3.5 model.
  • Check the configuration of the vLLM to ensure that it is correctly set up to work with the Qwen3.5 model and the qwen3 reasoning parser.
  • Review the code that handles the reasoningContent to ensure that it is correctly populated and returned.

Example code to verify the reasoning-parser configuration:

import os

# Verify that the --reasoning-parser flag is set to qwen3
if os.environ.get('REASONING_PARSER') != 'qwen3':
    print("Error: --reasoning-parser flag is not set to qwen3")

Verification

To verify that the fix worked, you can check the reasoningContent field in the OverAllState response to ensure that it is no longer empty.

Example code to verify the fix:

import json

# Load the OverAllState response
response = json.loads('{"OverAllState": {"data": {"_graph_execution_id_": "...", "input": "...", "user_input": "...", "has_images": false, "messages": [...], "route_target": "text", "selected_id": ""}}')

# Check if the reasoningContent field is not empty
if response['OverAllState']['data']['messages'][1]['metadata']['reasoningContent'] != "":
    print("Fix verified: reasoningContent is not empty")

Extra Tips

  • Make sure to review the documentation for the vLLM and the Qwen3.5 model to ensure that you are using the correct configuration and integration.
  • If you are still experiencing issues, try checking the logs for any error messages that may indicate the cause of the problem.
  • Consider reaching out to the support team for further assistance if you are unable to resolve the issue on your own.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING