Prhub

#43414 [Bugfix][Frontend] Fix input_audio parsing when uuid is present

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

执行摘要

修复 input_audio 含 uuid 时的解析错误

用户在 Issue #43415 中报告,当 input_audio 内容部分包含 uuid 时,OpenAI 兼容的 /v1/chat/completions 端点返回 HTTP 500,错误信息为 AssertionError: Expected code to be unreachable, but got: None。此问题是因为 uuid 路径进入了多模态兼容解析分支,而该分支直接将整个 part 传递给音频解析器,导致无法从顶层读取 dataformat。PR 作者修改后,uuid 路径与非 uuid 路径行为一致,均提取 part["input_audio"]

该 PR 值得快速合并,是一个典型的一行 bugfix,修复了多模态 API 的兼容性问题。对于关注多模态前端实现的开发者,可以精读 _InputAudioParser 类的实现(不在本次变更中但位于同文件中),了解 uuid 处理的设计模式。

讨论亮点

没有实质性 review 讨论。PR 作者请求了 reviewer @DarkLight1337 的审核,最终 reviewer 批准并合并。gemini-code-assist[bot] 的自动代码审查确认了变更逻辑。

实现拆解

修复在 vllm/entrypoints/chat_utils.py_parse_chat_message_content_mm_part 函数中,input_audio 处理逻辑的第 1520 行:

  1. 定位问题:原代码 input_audio_params = cast(dict[str, str], part) 将整个多模态内容部分(可能包含 uuid 和嵌套的 input_audio)强制类型转换为字典,然后直接返回。当下游解析器期望从顶层获取 dataformat 时,如果 part 结构为 {"type": "input_audio", "uuid": "...", "input_audio": {...}},顶层不含 data/format,导致断言失败。

  2. 修复方案:将这一行替换为 input_audio_params = _InputAudioParser(part).get("input_audio", None),其中 _InputAudioParser 是一个内部类,其 __init__ 方法负责从 part 中提取 input_audio 字段并返回可调用的字典对象(文档中提及 _InputAudioParser 兼容携带 uuid 的分支)。这样无论 part 中是否包含 uuid,都正确返回嵌套的 input_audio 字典。

  3. 影响范围:只修改了 1 行代码,没有新增测试文件。现有测试覆盖了不带 uuid 的 input_audio 路径,确保回归安全。

文件 模块 状态 重要度
vllm/entrypoints/chat_utils.py 前端解析 modified 4.89

关键符号

_parse_chat_message_content_mm_part

关键源码片段

vllm/entrypoints/chat_utils.py core-logic

包含 `_parse_chat_message_content_mm_part` 函数,修复了 input_audio 含 uuid 时的解析逻辑(第 1520 行从 `cast(dict[str, str], part)` 改为 `_InputAudioParser(part).get("input_audio", None)`),是本次变更的唯一文件。

# vllm/entrypoints/chat_utils.py 第 1519-1521 行(修复后)
if part.get("input_audio") is not None:
    # 之前是 `cast(dict[str, str], part)`,当 part 包含 uuid 时
    # 整个 part 被传递,导致下游无法读取 data/format。
    # 现在使用 _InputAudioParser 提取嵌套的 input_audio 对象。
    input_audio_params = _InputAudioParser(part).get("input_audio", None)
    return "input_audio", input_audio_params

评论区精华

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

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

风险与影响

该修复仅改动一行代码,风险极低。主要风险是 _InputAudioParser 类可能在某些边缘条件下返回 None(例如 part 中缺少 input_audio 键),但现有逻辑中该分支仅在 part.get("input_audio") is not None 条件下进入,因此不会发生。回归测试应覆盖不带 uuid 的 input_audio 和带 uuid 的 input_audio 两种场景。

直接影响:修复了 OpenAPI 兼容 input_audio 请求携带 uuid 时的 HTTP 500 错误。间接影响:无,因为修改范围极小。用户无需升级配置或修改调用代码即可受益。

缺少测试覆盖

关联 Issue

#43415 [Bug]: input_audio content with uuid is parsed incorrectly

完整报告

参与讨论