Prhub

#20543 fix: do not strip whitespace from GLM tool call values

sgl-project/sglang · 作者 lawrence-harmonic · 合并时间 2026-04-10 02:14

分析状态 已生成
文件变更 3提交数 3 · 评论 6
代码增减 +66 / -2
bugfix run-ci consistency

执行摘要

修复 GLM 工具调用参数值中重要空格被错误剥离的问题。

修复Issue #20542中报告的问题:GLM4和GLM47 MoE检测器的_parse_argument_pairs方法在解析工具调用参数值时调用了arg_value.strip(),这会剥离字符串参数值的前导和尾随空格。当参数值包含代码编辑工具调用中的源代码时,这种剥离会导致语义丢失,例如代码缩进被移除。Issue中提供了具体示例:包含4个前导空格的old_string参数值会被错误地剥离为def foo()

该PR值得快速浏览以理解工具调用解析中的空格处理陷阱。关注点:1. 为什么arg_key.strip()保留而arg_value.strip()移除的设计决策。2. 新增测试如何模拟真实场景(代码缩进)。3. 可扩展思考:其他检测器是否有类似问题。

讨论亮点

review讨论较少但明确:gemini-code-assist[bot]确认这是"正确且必要的修复",指出变更"最小化、目标明确且应用一致"。JustinTong0323直接批准合并。Issue评论中guapisolo提到这是"RL token in token out的重要功能"且"不侵入整体设计",表明修复的重要性。

实现拆解

实现方案分为两部分:1. 核心修复:在glm4_moe_detector.pyglm47_moe_detector.py_parse_argument_pairs方法中移除arg_value = arg_value.strip()行,保留arg_key.strip()(键名仍需要清理)。2. 测试验证:在test_function_call_parser.py中为两个检测器类分别添加test_whitespace_preserved_in_arg_values测试方法,验证包含前导空格的参数值能够正确保留。

文件 模块 状态 重要度
python/sglang/srt/function_call/glm4_moe_detector.py function_call modified 7.0
python/sglang/srt/function_call/glm47_moe_detector.py function_call modified 7.0
test/registered/unit/function_call/test_function_call_parser.py test modified 6.0

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

关键符号

_parse_argument_pairs test_whitespace_preserved_in_arg_values

评论区精华

空格剥离修复的正确性与必要性 正确性

gemini-code-assist[bot] 确认修复正确且必要,变更最小化且一致

结论:修复被批准并合并 · 已解决

修复对整体设计的影响 设计

guapisolo 在 Issue 评论中指出修复对 RL token in token out 重要且不侵入整体设计

结论:修复被认可为重要且非侵入性 · 已解决

风险与影响

风险较低但需注意:1. 回归风险:移除strip可能影响原本依赖空格清理的现有用例,但Issue指出下游parse_arguments函数已正确处理原始值(字符串类型通过json.dumps保留空格,其他类型通过json.loads空格不敏感)。2. 测试覆盖:新增测试仅验证了前导空格场景,未覆盖尾随空格、混合空格或非字符串类型参数,但现有测试套件应提供基础保障。3. 兼容性:修复针对GLM特定检测器,不影响其他工具调用解析器。

影响范围有限但重要:1. 用户影响:修复后,使用GLM模型进行代码编辑等工具调用的开发者将获得正确的参数值保留,避免语义丢失。2. 系统影响:仅修改两个检测器解析逻辑,不改变整体架构或性能特征。3. 团队影响:修复简单明确,易于理解和维护,新增测试提供了防护网。

潜在回归风险 测试覆盖有限

关联 Issue

#20542 [Bug] `Glm4MoeDetector` and `Glm47MoeDetector` strip significant whitespace from tool call argument values

完整报告

执行摘要

  • 一句话:修复GLM工具调用参数值中重要空格被错误剥离的问题。
  • 推荐动作:该PR值得快速浏览以理解工具调用解析中的空格处理陷阱。关注点:1. 为什么arg_key.strip()保留而arg_value.strip()移除的设计决策。2. 新增测试如何模拟真实场景(代码缩进)。3. 可扩展思考:其他检测器是否有类似问题。

功能与动机

修复Issue #20542中报告的问题:GLM4和GLM47 MoE检测器的_parse_argument_pairs方法在解析工具调用参数值时调用了arg_value.strip(),这会剥离字符串参数值的前导和尾随空格。当参数值包含代码编辑工具调用中的源代码时,这种剥离会导致语义丢失,例如代码缩进被移除。Issue中提供了具体示例:包含4个前导空格的old_string参数值会被错误地剥离为def foo()

实现拆解

实现方案分为两部分:1. 核心修复:在glm4_moe_detector.pyglm47_moe_detector.py_parse_argument_pairs方法中移除arg_value = arg_value.strip()行,保留arg_key.strip()(键名仍需要清理)。2. 测试验证:在test_function_call_parser.py中为两个检测器类分别添加test_whitespace_preserved_in_arg_values测试方法,验证包含前导空格的参数值能够正确保留。

关键文件:

  • python/sglang/srt/function_call/glm4_moe_detector.py(模块 function_call): GLM4 MoE检测器的核心修复文件,移除arg_value.strip()调用
  • python/sglang/srt/function_call/glm47_moe_detector.py(模块 function_call): GLM47 MoE检测器的核心修复文件,同步移除arg_value.strip()调用
  • test/registered/unit/function_call/test_function_call_parser.py(模块 test): 新增测试验证空格保留功能,提供回归防护

关键符号:_parse_argument_pairs, test_whitespace_preserved_in_arg_values

评论区精华

review讨论较少但明确:gemini-code-assist[bot]确认这是"正确且必要的修复",指出变更"最小化、目标明确且应用一致"。JustinTong0323直接批准合并。Issue评论中guapisolo提到这是"RL token in token out的重要功能"且"不侵入整体设计",表明修复的重要性。

  • 空格剥离修复的正确性与必要性 (correctness): 修复被批准并合并
  • 修复对整体设计的影响 (design): 修复被认可为重要且非侵入性

风险与影响

  • 风险:风险较低但需注意:1. 回归风险:移除strip可能影响原本依赖空格清理的现有用例,但Issue指出下游parse_arguments函数已正确处理原始值(字符串类型通过json.dumps保留空格,其他类型通过json.loads空格不敏感)。2. 测试覆盖:新增测试仅验证了前导空格场景,未覆盖尾随空格、混合空格或非字符串类型参数,但现有测试套件应提供基础保障。3. 兼容性:修复针对GLM特定检测器,不影响其他工具调用解析器。
  • 影响:影响范围有限但重要:1. 用户影响:修复后,使用GLM模型进行代码编辑等工具调用的开发者将获得正确的参数值保留,避免语义丢失。2. 系统影响:仅修改两个检测器解析逻辑,不改变整体架构或性能特征。3. 团队影响:修复简单明确,易于理解和维护,新增测试提供了防护网。
  • 风险标记:潜在回归风险, 测试覆盖有限

关联脉络

  • 暂无明显关联 PR

参与讨论