Prhub

#50257 [Frontend] Migrate Responses API validation errors to VLLMValidationError

原始 PR 作者 AdaAibaby 合并时间 2026-09-07 17:33 文件变更 4 提交数 3 评论 22 代码增减 +27 / -10

执行摘要

将 Responses API 验证错误从 ValueError 迁移到 VLLMValidationError,修复 param=None 问题。

根据 Issue #50256 描述,PR #49665 标准化了请求错误处理,但遗漏了 Responses API 路径中的 4 处验证错误。这些错误被 api_server.py 的 fallback handler 捕获,导致响应中的 param 字段为 null,丢失了结构化错误上下文。api_server.py 中的 TODO 注释明确要求完成此迁移。

该 PR 是一个直接、低风险的 bugfix,完成了上一次重构的收尾工作。它修复了用户体验问题,并提升了 API 的一致性。值得精读,以理解错误处理模式的迁移。

讨论亮点

CodeRabbit AI 审核机器人提出了一个改进建议,要求在所有更新的验证测试中同时断言 parameter 属性,以确保结构化参数契约。该建议被采纳,体现在最终提交中。维护者 DarkLight1337 最终批准了 PR。

实现拆解

  1. 导入 VLLMValidationError:在 vllm/entrypoints/openai/parser/harmony_utils.py 和 vllm/entrypoints/openai/responses/utils.py 文件中,添加对 vllm.exceptions.VLLMValidationError 的导入。
  2. 迁移 harmony_utils.py 中的验证错误:
    • 在 get_system_message 函数中,将 reasoning_effort 不支持时抛出的 ValueError 替换为 VLLMValidationError,并设置 parameter="reasoning_effort"。
    • 在 get_developer_message 函数中,将不支持的工具类型错误从 ValueError 替换为 VLLMValidationError,并设置 parameter="tools"。
    • 在 extract_instructions_from_messages 函数中,将未知消息类型错误从 ValueError 替换为 VLLMValidationError,并设置 parameter="input"。
  3. 迁移 responses/utils.py 中的验证错误:在 _construct_message_from_response_item 函数中,将 ResponseReasoningItem 包含加密内容时抛出的 ValueError 替换为 VLLMValidationError,并设置 parameter="input"。
  4. 更新测试用例:更新 tests/entrypoints/openai/parser/test_harmony_utils.py 和 tests/entrypoints/openai/responses/test_responses_utils.py 中的相关测试,将期望的异常类型从 ValueError 改为 VLLMValidationError,并验证异常对象上的 parameter 属性。
文件 模块 状态 重要度
vllm/entrypoints/openai/parser/harmony_utils.py 前端入口 modified 6.23
vllm/entrypoints/openai/responses/utils.py 前端入口 modified 5.92
tests/entrypoints/openai/responses/test_responses_utils.py 响应工具测试 modified 4.81
tests/entrypoints/openai/parser/test_harmony_utils.py Harmony 工具测试 modified 4.68

关键符号

get_system_message get_developer_message extract_instructions_from_messages _construct_message_from_response_item

关键源码片段

vllm/entrypoints/openai/parser/harmony_utils.py dependency-wiring

主要的源码修改文件,包含 3 处验证错误的迁移,是本次变更的核心。

# 在 harmony_utils.py 中,关键变更之一是迁移 get_system_message 函数中的验证错误。
# 变更前抛出 ValueError,变更后抛出 VLLMValidationError 并附带参数名。
​
# --- 变更后代码片段 ---
if reasoning_effort is not None:
    if reasoning_effort not in REASONING_EFFORT:
        supported_values = ", ".join(REASONING_EFFORT)
        # 抛出结构化验证错误,客户端可从 'parameter' 字段得知错误来源
        raise VLLMValidationError(
            f"reasoning_effort={reasoning_effort!r} is not supported by "
            f"Harmony. Supported values are: {supported_values}.",
            parameter="reasoning_effort", # 明确指向出错的请求参数
        )
    sys_msg_content = sys_msg_content.with_reasoning_effort(
        REASONING_EFFORT[reasoning_effort]
    )
vllm/entrypoints/openai/responses/utils.py dependency-wiring

包含另一处关键验证错误的迁移,处理加密推理内容的错误。

# 在 responses/utils.py 的 _construct_message_from_response_item 函数中,
# 处理 ResponseReasoningItem 时,对加密内容的验证错误进行了迁移。
​
# --- 变更后代码片段 ---
elif isinstance(item, ResponseReasoningItem):
    reasoning = ""
    if item.encrypted_content:
        # 抛出结构化验证错误,参数名 'input' 指向请求的输入内容
        raise VLLMValidationError(
            "Encrypted content is not supported.",
            parameter="input",
        )
    elif item.content and len(item.content) >= 1:
        reasoning = item.content[0].text
    # ... 后续逻辑保持不变

评论区精华

测试应验证 parameter 属性 测试

CodeRabbit AI 审核机器人指出,更新后的测试虽然检查了新的异常类型 VLLMValidationError,但没有验证其携带的 parameter 属性,而这正是本次 PR 的核心改进。

结论:维护者接受了该建议,作者在后续提交中为所有相关测试添加了对 exc_info.value.parameter 的断言。 · 已解决

风险与影响

变更范围小且具体,主要风险在于异常类型变更可能影响外部依赖这些特定错误的客户端。但由于变更后的异常类型 VLLMValidationError 提供了更丰富的结构化信息,且错误消息内容保持不变,实际风险较低。测试覆盖良好,验证了异常类型和参数属性。

直接影响使用 /v1/responses API 的客户端,使其能收到包含正确 param 字段的 400 错误响应,提升了 API 的可用性和调试体验。对系统其他部分无影响。

异常类型变更可能影响外部依赖

关联 Issue

#50256 [Bug]: Responses API validation errors bypass VLLMValidationError — 4 sites in harmony_utils.py and responses/utils.py

完整报告

参与讨论