# PR #44009 完整报告

- 仓库：`vllm-project/vllm`
- 标题：[Frontend] Clean up stop_token_ids override for Harmony
- 合并时间：2026-05-30 04:28
- 原文链接：http://prhub.com.cn/vllm-project/vllm/pull/44009

---

# 执行摘要

- 一句话：移除 Harmony 模型 stop_token_ids 覆盖逻辑
- 推荐动作：值得合入。这是一个高质量的死代码清理 PR，设计上依赖上游模型配置而非运行时注入。建议相关团队关注 Responses API 中 `ignore_eos=True` 的行为变化，并在必要时更新文档或用户指南。

# 功能与动机

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

# 实现拆解

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 工具；类别 source；类型 core-logic；符号 get_stop_tokens_for_assistant_actions）: 删除了 `get_stop_tokens_for_assistant_actions` 函数，这是该功能的核心入口，被其他文件引用。
- `vllm/entrypoints/openai/chat_completion/serving.py`（模块 Chat 服务；类别 source；类型 core-logic）: 移除了 Chat Completions 端口中 Harmony 模型的 stop_token_ids 注入逻辑及相关 import，是主要行为变化点之一。
- `vllm/entrypoints/openai/responses/serving.py`（模块 Responses 服务；类别 source；类型 core-logic）: 移除了 Responses API 端口中 Harmony 模型的 stop_token_ids 注入逻辑及相关 import，是另一个主要行为变化点。
- `vllm/entrypoints/openai/responses/protocol.py`（模块 Responses 协议；类别 source；类型 core-logic）: 在 to_sampling_params 方法中移除了从 default_sampling_params 读取 stop_token_ids 的逻辑，确保协议层不再依赖该字段。

关键符号：get_stop_tokens_for_assistant_actions

## 关键源码片段

### `vllm/entrypoints/openai/parser/harmony_utils.py`

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

```python
# 删除前（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)

```

# 评论区精华

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

- 暂无高价值评论线程

# 风险与影响

- 风险：**兼容性风险**：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 语义）

# 关联脉络

- PR #22519 [Bug]: [gpt oss 20b] [tool_call] Unexpected token 12606 while expecting start token 200006: 本 PR 清理了此 Issue 的临时修复代码，该 Issue 已由上游模型更新解决。