Prhub

#37386 fix(glm47): improve tool call parsing and content normalization

vllm-project/vllm · 作者 karanb192 · 合并时间 2026-03-18 16:12

分析状态 已生成
文件变更 4提交数 2 · 评论 5
代码增减 +193 / -6
bugfix test tool-calling model

执行摘要

修复 GLM-4.7 工具调用解析正则表达式,规范化内容为 None 以符合 OpenAI API。

Issue #37277 报告了 GLM-4.7 模型在工具调用时可能失败的问题。PR body 中指出需要改进解析逻辑以正确处理 GLM-4.7 的格式差异(如函数名后无换行符、零参数调用),并规范内容为空时的返回值为 None,以遵循 OpenAI API 约定。

对于处理工具调用或 GLM 模型的工程师,建议精读正则表达式修改和内容规范化逻辑,以理解解析细节和 API 兼容性设计。同时,关注测试用例以掌握边界场景。

讨论亮点

Review 中未出现具体技术讨论,整体评论肯定了改进的正确性和测试覆盖。gemini-code-assist[bot] 评论说:“改进增强了正确性和可维护性”,chaunceyjiang 批准。Issue 评论中,用户 xi1212 报告了类似问题,但后来澄清是自己的配置错误(tool_choice 设置),表明变更可能对用户环境有影响。

实现拆解

实现方案分三部分:

  1. vllm/tool_parsers/glm47_moe_tool_parser.py 中修改正则表达式:func_detail_regex 使用 \S+? 替换 .*? 以避免尾部空白,func_arg_regex 简化 \s* 处理。
  2. vllm/tool_parsers/glm4_moe_tool_parser.py 中修改 extract_tool_calls 方法,将空内容或仅空白内容规范化为 None。
  3. 新增测试文件 tests/tool_parsers/test_glm47_moe_tool_parser.py 覆盖零参数、内联参数、换行参数等多种场景,并更新 tests/tool_parsers/test_glm4_moe_tool_parser.py 中的期望值。
文件 模块 状态 重要度
tests/tool_parsers/test_glm47_moe_tool_parser.py tests/tool_parsers added 7.0
vllm/tool_parsers/glm47_moe_tool_parser.py tool_parsers modified 8.0
vllm/tool_parsers/glm4_moe_tool_parser.py tool_parsers modified 7.0

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

关键符号

Glm47MoeModelToolParser.__init__ Glm4MoeModelToolParser.extract_tool_calls

评论区精华

整体审查意见 other

Reviewer gemini-code-assist[bot] 评论说改进增强了正确性和可维护性,chaunceyjiang 批准,无具体技术争议。

结论:变更被批准,整体认为改进合理且测试充分。 · 已解决

风险与影响

技术风险包括:

  1. 正则表达式变更可能在边界情况下引入解析错误,例如处理特殊字符或嵌套标签时。
  2. 内容规范化从空字符串改为 None,可能影响下游代码逻辑,如果某些模块依赖空字符串进行判断。
  3. 测试覆盖虽全面,但未涉及所有可能的模型输出格式,可能存在未覆盖的边缘场景。

影响范围:

  • 对用户:修复了 GLM-4.7 工具调用失败的问题,提升了稳定性和 OpenAI API 兼容性,用户无需手动处理空内容。
  • 对系统:解析逻辑更健壮,减少了工具调用错误概率,内容规范化符合业界标准。
  • 对团队:新增测试用例有助于未来维护和回归测试,但需注意内容类型变更可能影响其他模块。
正则表达式变更 内容类型变更 测试覆盖可能不足

关联 Issue

#37277 [Bug]: GLM47 Tool Call Bug

完整报告

执行摘要

本 PR 修复了 GLM-4.7 模型工具调用解析的 bug,通过改进正则表达式以正确处理函数名和参数捕获,并将空内容规范化到 None 以符合 OpenAI API 标准。影响范围限于 GLM-4.7 和 GLM-4.5 模型的工具调用模块,提升了稳定性和兼容性。

功能与动机

本 PR 旨在解决 Issue #37277 报告的 GLM-4.7 工具调用失败问题。PR body 中明确表示:“需要改进 GLM-4.7 解析逻辑以处理格式差异(如函数名后无换行符、零参数调用),并规范内容为空时的返回值为 None,以遵循 OpenAI API 约定。” 关联的 Issue #32436 和 #33877 也涉及类似解析错误,表明这是一个持续性 bug。

实现拆解

关键改动点如下:

  • 正则表达式优化:在 vllm/tool_parsers/glm47_moe_tool_parser.py 中,func_detail_regexr"<tool_call>(.*?)(<arg_key>.*?)?</tool_call>" 改为 r"<tool_call>\s*(\S+?)\s*(<arg_key>.*)?</tool_call>",使用 \S+? 避免尾部空白,func_arg_regexr"<arg_key>(.*?)</arg_key>(?:\\n|\s)*<arg_value>(.*?)</arg_value>" 简化为 r"<arg_key>(.*?)</arg_key>\s*<arg_value>(.*?)</arg_value>"
  • 内容规范化:在 vllm/tool_parsers/glm4_moe_tool_parser.pyextract_tool_calls 方法中,添加逻辑:如果 content 为空或仅空白,则设置为 None
  • 测试覆盖:新增 tests/tool_parsers/test_glm47_moe_tool_parser.py 文件,包含测试用例如零参数调用、内联参数、换行参数等;更新 tests/tool_parsers/test_glm4_moe_tool_parser.py 中的 expected_content"" 改为 None

评论区精华

Review 讨论有限,主要结论为整体批准。gemini-code-assist[bot] 评论:“改进增强了正确性和可维护性”,chaunceyjiang 回复 “LGTM.”。Issue 评论中,用户 xi1212 报告了类似问题,但后来澄清是 tool_choice 配置错误,提示变更可能对用户环境敏感。

风险与影响

风险:正则表达式变更可能引入新的解析错误,例如处理嵌套标签时;内容类型从空字符串改为 None 可能破坏依赖空字符串的下游代码;测试虽全面,但未覆盖所有可能的模型输出变体。
影响:对用户,修复了工具调用失败,提升体验;对系统,解析更健壮,减少错误;对团队,新增测试有助于维护,但需关注内容类型变更的连锁反应。

关联脉络

本 PR 直接关联 Issue #37277、#32436 和 #33877,表明 GLM 模型工具调用解析是一个反复出现的问题。近期历史 PR 中无直接相关项,但工具调用模块的 bugfix 显示 vLLM 在持续优化模型兼容性和 API 标准化。

参与讨论