Prhub

#42188 [Bugfix] Gemma 4 chat template crash with missing tool name and tool id

原始 PR 作者 yzong-rh 合并时间 2026-05-11 11:07 文件变更 1 提交数 1 评论 4 代码增减 +2 / -2

执行摘要

修复 Gemma 4 聊天模板工具名称为空时崩溃

Gemma 4 的聊天模板在工具结果缺少名称时本应默认使用 "unknown" 但保留了 None,导致后续 format_tool_response_blockstrNone 拼接而崩溃。这在遗留 tool_responses 路径和 OpenAI Chat Completions 路径(当消息缺少 nametool_call_id 不匹配时)都会触发。

该 PR 简单但关键,建议直接合并。同时建议与 HuggingFace 上游团队(@lucianommartins)协调将相同修复合入 HF 官方模板,以覆盖使用 HF 默认模板的用户。

讨论亮点

Review 中无实质性争议。Gemini Code Assist 确认了变更意图(使空字符串和未定义值都回退为 "unknown"),Chauncey Jiang 直接批准。PR 作者指出该问题是在调试 PR #42189 时发现的边角情况,并提到需要与 HuggingFace 上游同步修复。

实现拆解

  1. examples/tool_chat_template_gemma4.jinja 的第 266 行,将 tool_response['name'] | default('unknown') 改为 tool_response['name'] | default('unknown', true),使 tool_responses 路径中即使 nameNone 或空字符串也能安全回退。
  2. 在同文件的第 280 行,将 follow.get('name') | default('unknown') 改为 follow.get('name') | default('unknown', true),使消息路径中 name 缺失或为空时同样正确回退。
文件 模块 状态 重要度
examples/tool_chat_template_gemma4.jinja 示例模板 modified 3.12

关键源码片段

examples/tool_chat_template_gemma4.jinja core-logic

唯一变更文件,修复了 Gemma 4 聊天模板中两处 Jinja `default` 过滤器缺少 `true` 参数的问题,防止工具名称为空时崩溃。

{#- 第 266 行:tool_responses 路径 -#}
{% if message.get('tool_responses') %}
    {% for tool_response in message['tool_responses'] %}
        {{ format_tool_response_block(
            tool_response['name'] | default('unknown', true), # 修复前为 default('unknown')None 导致崩溃
            tool_response['response']
        ) }}
    {% endfor %}
{% endif %}{#- 第 280 行:消息路径 -#}
{% set ns_tname = namespace(
    name=follow.get('name') | default('unknown', true) # 同样修复,确保 name 缺失时安全回退
) %}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

变更仅涉及两处 Jinja 模板中的 default 过滤器参数,逻辑极其简单。风险极低,不会影响其他模型或功能。但需注意上游 HF 模板仍有相同 bug,用户若使用 HF 默认模板而非仓库内置模板仍会触发崩溃,需要单独通知用户或与上游协同修复。

直接影响使用 Gemma 4 模型且工具调用结果可能缺少名称或 tool_call_id 不匹配的用户。修复后这些场景不再崩溃,而是正确回退为 "unknown"。影响范围窄,仅针对 Gemma 4 的聊天模板。

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论