Prhub

#20700 fix(serving_chat): catch TypeError from tojson on Jinja2 Undefined variables

原始 PR 作者 fanghao566 合并时间 2026-05-23 00:43 文件变更 1 提交数 3 评论 3 代码增减 +2 / -1

执行摘要

修复 Jinja2 模板 tojson 未定义变量错误处理

当聊天模板对 Jinja2 Undefined 变量使用 tojson 过滤器时(例如 SGLang 的 fallback 机制移除工具函数的包装器后,模板仍期望 tool.function),json.dumps 会抛出 TypeError 而非 jinja2.TemplateError。现有的 except jinja2.TemplateError 无法捕获 TypeError,导致异常传播到 serving_base.py 的通用 except Exception 处理器,返回 500 内部服务器错误,而不是预期的 400 请求错误。

该 PR 值不值得精读取决于是否负责聊天模板或错误处理模块。对于其他开发者而言,这是一个教科书级的防御性错误处理改进,值得了解但不必须深入。

讨论亮点

无技术争辩。Gemini Code Assist 的自动审查确认该修复正确,JustinTong0323 直接批准合并。

实现拆解

  1. 修改异常捕获类型:在 python/sglang/srt/entrypoints/openai/serving_chat.py_apply_jinja_template 方法中,将第 758 行的 except jinja2.TemplateError as template_error 改为 except (jinja2.TemplateError, TypeError) as template_error
  2. 更新注释:同步修改注释,说明新增的 TypeError 场景(例如 tojson 过滤器作用于 Jinja2 Undefined 变量)。
  3. 保持后续逻辑不变:捕获到异常后仍然抛出 ValueError,由上层统一处理为 400 Bad Request。
文件 模块 状态 重要度
python/sglang/srt/entrypoints/openai/serving_chat.py 请求路由 modified 5.16

关键符号

_apply_jinja_template

关键源码片段

python/sglang/srt/entrypoints/openai/serving_chat.py core-logic

核心文件:修改了 _apply_jinja_template 方法的异常捕获类型,增加 TypeError 以覆盖 tojson 过滤器在 Undefined 变量上的错误。

# python/sglang/srt/entrypoints/openai/serving_chat.py
# 在 _apply_jinja_template 方法的 fallback 分支中
                except (jinja2.TemplateError, TypeError) as template_error:
                    # 模板错误(如 Jinja 模板中的 raise_exception)
                    # 以及 TypeError(如 tojson 过滤器作用于 Jinja2 Undefined 变量)
                    # 都应视为客户端错误,返回 400 BadRequest
                    raise ValueError(str(template_error)) from template_error

评论区精华

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

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

风险与影响

风险极低。仅修改异常捕获路径,不涉及正常请求处理、模型推理或性能关键路径。唯一潜在风险是误抓了预期之外的其他 TypeError,但该 except 块仅在第一次 apply_chat_template 失败后的 fallback 尝试中,且 TypeError 在此上下文中极大概率来源于模板错误,整体可控。

影响范围:仅影响聊天模板处理中的异常路径。对于使用 tojson 过滤器的模板(如 MiniMax-M2.5)且因 fallback 导致变量未定义时,返回状态码从 500 变为 400,用户体验更准确。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论