Prhub

#38847 [Bugfix]: Fix Gemma4ToolParser.__init__() missing `tools` parameter

原始 PR 作者 hospedales 合并时间 2026-04-03 05:35 文件变更 1 提交数 1 评论 7 代码增减 +3 / -3

执行摘要

修复 Gemma4 工具调用解析器构造函数签名不匹配导致的 400 错误

根据PR body和关联Issue #38837,当启用Gemma4模型的工具调用功能时,vLLM会尝试实例化Gemma4ToolParser并传递tokenizer和tools两个参数,但由于Gemma4ToolParser只接受tokenizer一个参数,导致出现'Gemma4ToolParser.init() takes 2 positional arguments but 3 were given'的400错误。根本原因是PR #38029为基类ToolParser添加了tools参数,但后续引入的Gemma4ToolParser(在PR #38826中添加)仍使用旧的构造函数签名。

该PR变更简单直接,是典型的接口对齐修复。对于大多数工程师,只需了解修复了Gemma4工具调用解析器的构造函数签名不匹配问题。值得关注的是:

  1. 这是一个典型的'新代码使用旧接口'问题,提醒在继承现有基类时需要注意接口变更
  2. 修复方案采用了与其他工具解析器完全一致的模式,保持了代码一致性
  3. 属于v0.19.0版本的重要补丁,需要确保包含在发布中
讨论亮点

review讨论非常简短,主要集中在流程方面:

  1. sfeng33在批准时提醒'Thanks! Please fix DCO.',作者hospedales随后回复'DCO Fixed.'确认已修复DCO签名问题
  2. sfeng33在Issue评论中催促'@ywang96 @Isotr0py Can we merge this hot fix for gemma 4 please',表明这是一个需要快速合并的热修复
  3. 两个bot评论(gemini-code-assist和copilot-pull-request-reviewer)都确认变更正确且无技术问题
  4. 在Issue评论中,Gregory-Pereira报告了可能相关的启动错误,但lucianommartins要求提供更多细节,未在PR讨论中深入

实现拆解

实现非常简单直接,只修改了一个文件vllm/tool_parsers/gemma4_tool_parser.py:

  1. 导入语句:添加Tool类型的导入,用于类型注解
  2. 构造函数:将__init__方法的签名从(self, tokenizer: TokenizerLike)改为(self, tokenizer: TokenizerLike, tools: list[Tool] | None = None)
  3. 父类调用:将super().init(tokenizer)改为super().init(tokenizer, tools)
    整个变更只有3行添加和3行删除,确保Gemma4ToolParser与所有其他工具解析器保持一致的接口。
文件 模块 状态 重要度
vllm/tool_parsers/gemma4_tool_parser.py tool_parsers modified 9.0

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

关键符号

Gemma4ToolParser.__init__

评论区精华

DCO 签名修复 other

sfeng33 在批准时提醒 'Thanks! Please fix DCO.',作者随后确认已修复

结论:作者修复了 DCO 签名问题,确保符合贡献者许可协议 · 已解决

紧急修复需求 正确性

sfeng33 在 Issue 评论中催促合并这个热修复,表明问题影响 Gemma4 工具调用功能

结论:这是一个需要快速合并的关键 bug 修复 · 已解决

风险与影响

技术风险极低:

  1. 回归风险:变更只是修复接口不匹配,不涉及核心逻辑修改,不会引入新bug
  2. 性能风险:无性能影响,只是参数传递
  3. 安全风险:无安全影响
  4. 兼容性风险:修复后确保Gemma4工具调用功能正常工作,与现有其他工具解析器保持接口一致
    唯一需要注意的是,如果用户之前通过某种方式绕过了这个错误,修复后可能会改变行为,但这种情况极不可能发生。

影响范围明确有限:

  1. 对用户:修复后,使用Gemma4模型并启用工具调用功能的用户将不再遇到400错误,能够正常进行工具调用
  2. 对系统:确保vLLM的Gemma4支持完整可用,特别是新引入的工具调用功能
  3. 对团队:这是一个简单的接口对齐修复,不需要额外的维护负担,但强调了在添加新功能时需要确保与现有接口一致的重要性
    影响程度:对使用Gemma4工具调用的用户是关键的修复,但对不使用该功能的用户无影响。
接口不匹配 新功能兼容性

关联 Issue

#38837 [Bug]: Gemma4ToolParser.__init__() missing `tools` parameter — 400 error on tool calls

完整报告

执行摘要

  • 一句话:修复Gemma4工具调用解析器构造函数签名不匹配导致的400错误
  • 推荐动作:该PR变更简单直接,是典型的接口对齐修复。对于大多数工程师,只需了解修复了Gemma4工具调用解析器的构造函数签名不匹配问题。值得关注的是:
    1. 这是一个典型的'新代码使用旧接口'问题,提醒在继承现有基类时需要注意接口变更
    2. 修复方案采用了与其他工具解析器完全一致的模式,保持了代码一致性
    3. 属于v0.19.0版本的重要补丁,需要确保包含在发布中

功能与动机

根据PR body和关联Issue #38837,当启用Gemma4模型的工具调用功能时,vLLM会尝试实例化Gemma4ToolParser并传递tokenizer和tools两个参数,但由于Gemma4ToolParser只接受tokenizer一个参数,导致出现'Gemma4ToolParser.init() takes 2 positional arguments but 3 were given'的400错误。根本原因是PR #38029为基类ToolParser添加了tools参数,但后续引入的Gemma4ToolParser(在PR #38826中添加)仍使用旧的构造函数签名。

实现拆解

实现非常简单直接,只修改了一个文件vllm/tool_parsers/gemma4_tool_parser.py:

  1. 导入语句:添加Tool类型的导入,用于类型注解
  2. 构造函数:将__init__方法的签名从(self, tokenizer: TokenizerLike)改为(self, tokenizer: TokenizerLike, tools: list[Tool] | None = None)
  3. 父类调用:将super().init(tokenizer)改为super().init(tokenizer, tools)
    整个变更只有3行添加和3行删除,确保Gemma4ToolParser与所有其他工具解析器保持一致的接口。

关键文件:

  • vllm/tool_parsers/gemma4_tool_parser.py(模块 tool_parsers): 唯一修改的文件,修复了Gemma4ToolParser构造函数签名不匹配的核心问题

关键符号:Gemma4ToolParser.init

评论区精华

review讨论非常简短,主要集中在流程方面:

  1. sfeng33在批准时提醒'Thanks! Please fix DCO.',作者hospedales随后回复'DCO Fixed.'确认已修复DCO签名问题
  2. sfeng33在Issue评论中催促'@ywang96 @Isotr0py Can we merge this hot fix for gemma 4 please',表明这是一个需要快速合并的热修复
  3. 两个bot评论(gemini-code-assist和copilot-pull-request-reviewer)都确认变更正确且无技术问题
  4. 在Issue评论中,Gregory-Pereira报告了可能相关的启动错误,但lucianommartins要求提供更多细节,未在PR讨论中深入
  • DCO签名修复 (other): 作者修复了DCO签名问题,确保符合贡献者许可协议
  • 紧急修复需求 (correctness): 这是一个需要快速合并的关键bug修复

风险与影响

  • 风险:技术风险极低:

    1. 回归风险:变更只是修复接口不匹配,不涉及核心逻辑修改,不会引入新bug
    2. 性能风险:无性能影响,只是参数传递
    3. 安全风险:无安全影响
    4. 兼容性风险:修复后确保Gemma4工具调用功能正常工作,与现有其他工具解析器保持接口一致
      唯一需要注意的是,如果用户之前通过某种方式绕过了这个错误,修复后可能会改变行为,但这种情况极不可能发生。
  • 影响:影响范围明确有限:

    1. 对用户:修复后,使用Gemma4模型并启用工具调用功能的用户将不再遇到400错误,能够正常进行工具调用
    2. 对系统:确保vLLM的Gemma4支持完整可用,特别是新引入的工具调用功能
    3. 对团队:这是一个简单的接口对齐修复,不需要额外的维护负担,但强调了在添加新功能时需要确保与现有接口一致的重要性
      影响程度:对使用Gemma4工具调用的用户是关键的修复,但对不使用该功能的用户无影响。
  • 风险标记:接口不匹配, 新功能兼容性

关联脉络

  • PR #38029 [Tool Calling] Add tools parameter to ToolParser base class: 该PR为基类ToolParser添加了tools参数,导致Gemma4ToolParser需要相应更新
  • PR #38826 [Tool Calling] Add Gemma4ToolParser: 该PR引入了Gemma4ToolParser,但使用了旧的构造函数签名,导致本PR需要修复
  • PR #38837 [Bug]: Gemma4ToolParser.init() missing tools parameter — 400 error on tool calls: 直接关联的Issue,详细描述了bug现象和根本原因

参与讨论