Prhub

#22175 fix: server crash when stop_token_ids contains null

原始 PR 作者 KrishnanPrash 合并时间 2026-04-11 02:42 文件变更 1 提交数 5 评论 4 代码增减 +2 / -1

执行摘要

修复 stop_token_ids 包含 null 时服务器崩溃问题,过滤 None 值防止下游 torch.tensor 异常。

修复Issue #22144中报告的服务器崩溃问题。当客户端发送包含"stop_token_ids": [null]的JSON请求时,null值会传播到torch.tensor()调用中,导致调度器崩溃。PR body明确指出需要过滤SamplingParams.__init__中的None值。

该PR值得快速浏览以了解防御性输入验证的模式。虽然变更简单,但展示了如何处理JSON null值在Python中的传播问题。关注点:

  1. 从提交历史看代码如何从复杂实现简化为最终简洁版本。
  2. review中提到的未修复的类似漏洞(stop和stop_regex)值得后续关注。
讨论亮点

review中只有gemini-code-assist[bot]的一条评论,建议将类似的防御性过滤扩展到stopstop_regex参数,因为这些参数同样可能从JSON负载接收null值,在normalize()方法中处理时可能导致崩溃。但PR作者没有回应此建议,最终只修复了stop_token_ids

实现拆解

核心改动在python/sglang/srt/sampling/sampling_params.py文件的__init__方法中:

  1. 修改stop_token_ids处理逻辑,从set(stop_token_ids)改为{int(t) for t in stop_token_ids if t is not None},过滤None值并强制转换为int。
  2. 当过滤后集合为空时,将self.stop_token_ids设为None。
  3. 提交历史显示代码经过多次简化:从最初的复杂过滤逻辑简化为最终的单行推导式,并移除了额外的token ID范围检查。
文件 模块 状态 重要度
python/sglang/srt/sampling/sampling_params.py sampling modified 8.0

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

关键符号

SamplingParams.__init__

评论区精华

防御性过滤应扩展到 stop 和 stop_regex 参数 正确性

gemini-code-assist[bot] 建议将类似的 None 值过滤扩展到 stop 和 stop_regex 参数,防止 JSON null 值在 normalize() 方法中导致崩溃。

结论:PR 作者未回应此建议,最终只修复了 stop_token_ids。 · 未解决

风险与影响

风险较低:

  1. 回归风险:修改范围极小(仅3行变更),逻辑简单直接,不太可能引入新bug。
  2. 兼容性:过滤None值不会影响正常整数token ID的处理,但可能改变行为:原本包含null的列表会导致崩溃,现在会被静默忽略。这符合防御性编程原则,但可能掩盖客户端错误。
  3. 未修复的潜在风险:如review评论指出,stopstop_regex参数仍有类似漏洞,可能在未来导致崩溃。

影响范围有限但重要:

  1. 用户影响:修复了特定JSON输入导致的服务器崩溃,提升了API鲁棒性,防止恶意或错误请求导致服务中断。
  2. 系统影响:避免了调度器异常退出,提高了服务稳定性。
  3. 团队影响:这是一个简单的输入验证修复,不涉及核心算法或架构变更,维护成本低。
输入验证不完整 潜在类似漏洞未修复

关联 Issue

#22144 [Bug] "stop_token_ids": [null] causes server to crash

完整报告

执行摘要

  • 一句话:修复stop_token_ids包含null时服务器崩溃问题,过滤None值防止下游torch.tensor异常。
  • 推荐动作:该PR值得快速浏览以了解防御性输入验证的模式。虽然变更简单,但展示了如何处理JSON null值在Python中的传播问题。关注点:
    1. 从提交历史看代码如何从复杂实现简化为最终简洁版本。
    2. review中提到的未修复的类似漏洞(stop和stop_regex)值得后续关注。

功能与动机

修复Issue #22144中报告的服务器崩溃问题。当客户端发送包含"stop_token_ids": [null]的JSON请求时,null值会传播到torch.tensor()调用中,导致调度器崩溃。PR body明确指出需要过滤SamplingParams.__init__中的None值。

实现拆解

核心改动在python/sglang/srt/sampling/sampling_params.py文件的__init__方法中:

  1. 修改stop_token_ids处理逻辑,从set(stop_token_ids)改为{int(t) for t in stop_token_ids if t is not None},过滤None值并强制转换为int。
  2. 当过滤后集合为空时,将self.stop_token_ids设为None。
  3. 提交历史显示代码经过多次简化:从最初的复杂过滤逻辑简化为最终的单行推导式,并移除了额外的token ID范围检查。

关键文件:

  • python/sglang/srt/sampling/sampling_params.py(模块 sampling): 唯一修改的文件,修复了stop_token_ids中None值过滤的核心逻辑。

关键符号:SamplingParams.init

评论区精华

review中只有gemini-code-assist[bot]的一条评论,建议将类似的防御性过滤扩展到stopstop_regex参数,因为这些参数同样可能从JSON负载接收null值,在normalize()方法中处理时可能导致崩溃。但PR作者没有回应此建议,最终只修复了stop_token_ids

  • 防御性过滤应扩展到stop和stop_regex参数 (correctness): PR作者未回应此建议,最终只修复了stop_token_ids。

风险与影响

  • 风险:风险较低:
    1. 回归风险:修改范围极小(仅3行变更),逻辑简单直接,不太可能引入新bug。
    2. 兼容性:过滤None值不会影响正常整数token ID的处理,但可能改变行为:原本包含null的列表会导致崩溃,现在会被静默忽略。这符合防御性编程原则,但可能掩盖客户端错误。
    3. 未修复的潜在风险:如review评论指出,stopstop_regex参数仍有类似漏洞,可能在未来导致崩溃。
  • 影响:影响范围有限但重要:
    1. 用户影响:修复了特定JSON输入导致的服务器崩溃,提升了API鲁棒性,防止恶意或错误请求导致服务中断。
    2. 系统影响:避免了调度器异常退出,提高了服务稳定性。
    3. 团队影响:这是一个简单的输入验证修复,不涉及核心算法或架构变更,维护成本低。
  • 风险标记:输入验证不完整, 潜在类似漏洞未修复

关联脉络

  • PR #22144 [Bug] "stop_token_ids": [null] causes server to crash: 这是本PR要修复的Issue,直接关联。
  • PR #22312 Make GDN support non-continuous B/A Tensor input to fix the accuracy regression of Qwen3.5-27B: 同为bugfix标签,涉及输入验证和鲁棒性改进。
  • PR #22495 Add page_size to admission token budget check: 同为bugfix标签,涉及调度器相关修复。

参与讨论