Prhub

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

原始 PR 作者 karanb192 合并时间 2026-03-18 16:12 文件变更 4 提交数 2 评论 5 代码增减 +193 / -6

执行摘要

修复 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

关键符号

Glm47MoeModelToolParser.__init__ Glm4MoeModelToolParser.extract_tool_calls

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

评论区精华

整体审查意见 other

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

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

风险与影响

技术风险包括:

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

影响范围:

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

关联 Issue

#37277 [Bug]: GLM47 Tool Call Bug

完整报告

参与讨论