Prhub

#38909 [Bugfix][Frontend] Fix Gemma4 streaming HTML duplication after tool calls

原始 PR 作者 yoke233 合并时间 2026-04-08 11:03 文件变更 2 提交数 2 评论 7 代码增减 +64 / -2

执行摘要

修复 Gemma4 流式工具解析器中 HTML 内容重复的 bug。

根据 Issue #38910 描述,Gemma4 工具解析器在流式模式下会损坏普通文本,如将 <div> 变成 <<div>,或在 HTML 工具参数中重复标签前缀如 <<htmlhtml。PR body 指出根因是 current_text 被错误重建,导致无效中间状态。

对于处理工具解析或 Gemma4 模型的工程师值得精读,学习缓冲区管理在流式解析中的正确实践,并参考新增测试作为回归防护示例。

讨论亮点

Review 评论中没有技术争议,所有 review 者(gemini-code-assist[bot]、sfeng33、chaunceyjiang)都批准了 PR。gemini-code-assist[bot] 分析确认变更解决重复问题,Issue 评论中仅涉及合并冲突解决,无设计权衡讨论。结论是修复被接受并验证有效。

实现拆解

主要改动在 vllm/tool_parsers/gemma4_tool_parser.pyextract_tool_calls_streaming 方法中,移除了 current_text = previous_text + delta_text 行,改为直接使用上游的 current_text,避免缓冲 delta 污染累积文本。测试文件 tests/tool_parsers/test_gemma4_tool_parser.py 添加了两个回归测试:test_streaming_does_not_duplicate_plain_text_after_tool_calltest_streaming_html_argument_does_not_duplicate_tag_prefixes,覆盖普通文本和 HTML 参数场景。

文件 模块 状态 重要度
vllm/tool_parsers/gemma4_tool_parser.py tool_parsers modified 7.0
tests/tool_parsers/test_gemma4_tool_parser.py test modified 5.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

Gemma4ToolParser.extract_tool_calls_streaming

评论区精华

修复验证 正确性

Review 者 gemini-code-assist[bot] 分析变更并确认修复解决 bug,sfeng33 和 chaunceyjiang 快速批准。

结论:PR 被接受并合并,无争议。 · 已解决

风险与影响

风险较低:变更仅限于 Gemma4 工具解析器的流式路径,移除错误逻辑可能引入回归,但新增测试覆盖了关键场景。需注意其他解析器可能不受影响,但 PR 范围集中,且通过测试验证。

影响使用 Gemma4 模型进行流式工具调用的用户,修复了输出损坏问题,提升解析正确性和用户体验。对系统其他部分无直接影响,仅限于前端工具解析模块。

流式解析错误 回归测试添加

关联 Issue

#38910 [Bug]: Gemma4 tool parser duplicates HTML tag prefixes in streamed tool arguments

完整报告

执行摘要

  • 一句话:修复 Gemma4 流式工具解析器中 HTML 内容重复的 bug。
  • 推荐动作:对于处理工具解析或 Gemma4 模型的工程师值得精读,学习缓冲区管理在流式解析中的正确实践,并参考新增测试作为回归防护示例。

功能与动机

根据 Issue #38910 描述,Gemma4 工具解析器在流式模式下会损坏普通文本,如将 <div> 变成 <<div>,或在 HTML 工具参数中重复标签前缀如 <<htmlhtml。PR body 指出根因是 current_text 被错误重建,导致无效中间状态。

实现拆解

主要改动在 vllm/tool_parsers/gemma4_tool_parser.pyextract_tool_calls_streaming 方法中,移除了 current_text = previous_text + delta_text 行,改为直接使用上游的 current_text,避免缓冲 delta 污染累积文本。测试文件 tests/tool_parsers/test_gemma4_tool_parser.py 添加了两个回归测试:test_streaming_does_not_duplicate_plain_text_after_tool_calltest_streaming_html_argument_does_not_duplicate_tag_prefixes,覆盖普通文本和 HTML 参数场景。

关键文件:

  • vllm/tool_parsers/gemma4_tool_parser.py(模块 tool_parsers): 修复核心解析逻辑,移除错误的重建 current_text 代码,确保流式缓冲区正确处理。
  • tests/tool_parsers/test_gemma4_tool_parser.py(模块 test): 添加回归测试,验证普通文本和 HTML 参数不被重复,提供关键防护。

关键符号:Gemma4ToolParser.extract_tool_calls_streaming

评论区精华

Review 评论中没有技术争议,所有 review 者(gemini-code-assist[bot]、sfeng33、chaunceyjiang)都批准了 PR。gemini-code-assist[bot] 分析确认变更解决重复问题,Issue 评论中仅涉及合并冲突解决,无设计权衡讨论。结论是修复被接受并验证有效。

  • 修复验证 (correctness): PR 被接受并合并,无争议。

风险与影响

  • 风险:风险较低:变更仅限于 Gemma4 工具解析器的流式路径,移除错误逻辑可能引入回归,但新增测试覆盖了关键场景。需注意其他解析器可能不受影响,但 PR 范围集中,且通过测试验证。
  • 影响:影响使用 Gemma4 模型进行流式工具调用的用户,修复了输出损坏问题,提升解析正确性和用户体验。对系统其他部分无直接影响,仅限于前端工具解析模块。
  • 风险标记:流式解析错误, 回归测试添加

关联脉络

  • PR #38848 [Bugfix] Fix Qwen3 tool parser for Responses API tools: 同属工具解析器 bugfix,涉及相似模块和测试覆盖。
  • PR #38860 [Parser] Pass request.tools to tool parser: 涉及前端工具解析逻辑修复,显示工具调用解析的持续改进。

参与讨论