Prhub

#44009 [Frontend] Clean up stop_token_ids override for Harmony

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

执行摘要

移除 Harmony 模型 stop_token_ids 覆盖逻辑

关联 Issue #22519 中 GPT-OSS 20B 模型出现 token 解析错误,根因是模型特殊 token(如 <|return|><|call|>)未被正确识别。该问题已在模型侧的 generation_config.json 中修复,因此 PR 作者认为不再需要 OpenAI 层的额外逻辑,需清理遗留的临时修复代码。

值得合入。这是一个高质量的死代码清理 PR,设计上依赖上游模型配置而非运行时注入。建议相关团队关注 Responses API 中 ignore_eos=True 的行为变化,并在必要时更新文档或用户指南。

讨论亮点

无实质讨论,仅 reviewer sfeng33 表达感谢。

实现拆解

  1. 删除 get_stop_tokens_for_assistant_actions 函数vllm/entrypoints/openai/parser/harmony_utils.py):该函数从 Harmony 编码器获取 stop token 列表,已无调用者,整体移除。
  2. 从 Chat Completions serving 移除注入逻辑vllm/entrypoints/openai/chat_completion/serving.py):移除 import 语句及 OpenAIServingChat.__init__ 中根据 use_harmony 标志将 stop_token_ids 写入 default_sampling_params 的代码块。
  3. 从 Responses API serving 移除注入逻辑vllm/entrypoints/openai/responses/serving.py):同样移除 import 语句及 OpenAIServingResponses.__init__ 中对应的注入代码。
  4. 从 Responses API 协议层移除读取逻辑vllm/entrypoints/openai/responses/protocol.py):在 ResponsesRequest.to_sampling_params 方法中删除从 default_sampling_params 读取 stop_token_ids 并传递给 SamplingParams.from_optional 的代码。
文件 模块 状态 重要度
vllm/entrypoints/openai/parser/harmony_utils.py Harmony 工具 modified 5.69
vllm/entrypoints/openai/chat_completion/serving.py Chat 服务 modified 5.27
vllm/entrypoints/openai/responses/serving.py Responses 服务 modified 5.27
vllm/entrypoints/openai/responses/protocol.py Responses 协议 modified 4.59

关键符号

get_stop_tokens_for_assistant_actions

关键源码片段

vllm/entrypoints/openai/parser/harmony_utils.py core-logic

删除了 `get_stop_tokens_for_assistant_actions` 函数,这是该功能的核心入口,被其他文件引用。

# 删除前(base):
# def get_stop_tokens_for_assistant_actions() -> list[int]:
# return get_encoding().stop_tokens_for_assistant_actions()
#
# 删除后(head): 函数完全移除,该功能由模型自身的
# generation_config.json 中的 stop_token_ids 配置覆盖
# 不再需要手动从 Harmony 编码器读取。def get_streamable_parser_for_assistant() -> StreamableParser:
    return StreamableParser(get_encoding(), role=Role.ASSISTANT)

评论区精华

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

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

风险与影响

兼容性风险:Responses API 中 Harmony 模型在 ignore_eos=True 时,原本会因注入的 stop_token_ids 仍然停止,但现在不再注射,因此 ignore_eos=True 会忽略 <|return|><|call|> 等 token,可能导致生成不结束。PR 描述已明确指出此行为变化,但若用户依赖旧行为,可能产生意外。
回归风险:低。移除的代码为写入后从未被读取的死代码(Chat Completions 路径),以及通过 generation_config.json 已覆盖的重复逻辑。

  • 影响范围:仅影响 GPT-OSS Harmony 模型(gpt_oss 类型)的两种 API 端点。
  • 正向影响:减少无意义的内存写入和未使用配置,简化代码,使 Harmony 模型行为与非 Harmony 模型一致。
  • 负向影响:上述 ignore_eos=True 行为的微妙变化,需确认用户真实使用场景。
  • 影响程度:中等可控。
行为变化(ignore_eos 语义)

关联 Issue

#22519 [Bug]: [gpt oss 20b] [tool_call] Unexpected token 12606 while expecting start token 200006

完整报告

参与讨论