Prhub

#49073 [Bugfix][Frontend] Return transcription and translation verbose as float

原始 PR 作者 wskr00 合并时间 2026-07-29 21:16 文件变更 3 提交数 4 评论 5 代码增减 +4 / -4

执行摘要

修复 verbose 响应 duration 字段类型为 float

修复 issue #49068 报告的问题:verbose_json 响应的 duration 字段以字符串形式返回,违反 OpenAI 兼容 API 约定,导致类型化客户端(如 TypeScript SDK)无法正确解析。

值得快速合并。变更简单明确,已通过手动端到端验证。不建议精读代码,但值得关注的决策是 reviewer 坚持“直接改定义,不额外加测试”的务实风格。

讨论亮点

核心讨论围绕新增的测试文件展开。Reviewer DarkLight1337 认为测试“没那么有用,直接改定义就行”,作者 wskr00 同意并删除了文件。其他评论仅涉及简单的流程确认。

实现拆解

  1. 修改协议模型字段类型:在两个协议文件 transcription/protocol.pytranslation/protocol.py 中,将 TranscriptionResponseVerbose.durationTranslationResponseVerbose.duration 的类型从 str 改为 float
  2. 移除构造时的字符串转换:在 base/serving.py_create_speech_to_text 方法中,移除 duration=str(duration_s) 中的 str() 调用,直接传递浮点数 duration_s
  3. 移除冗余测试:最初提交中新增了测试文件 test_verbose_response_protocol.py,但 reviewer 认为用处不大,提议直接改定义,最终删除该测试。
文件 模块 状态 重要度
vllm/entrypoints/speech_to_text/base/serving.py 前端服务 modified 5.07
vllm/entrypoints/speech_to_text/transcription/protocol.py 前端协议 modified 4.89
vllm/entrypoints/speech_to_text/translation/protocol.py 前端协议 modified 4.89

关键符号

_create_speech_to_text

关键源码片段

vllm/entrypoints/speech_to_text/base/serving.py core-logic

核心逻辑变更:移除 duration 的 str() 转换,确保直接传入浮点数。

# vllm/entrypoints/speech_to_text/base/serving.py
# 在 _create_speech_to_text 方法中,构造 verbose 响应时
# 移除 str() 包装,使 JSON 序列化输出 number 而非 string
if request.response_format != "verbose_json":
    final_response = cast(
        T, TranscriptionResponse(text=text, usage=usage)
    )
else:
    final_response = cast(
        V,
        TranscriptionResponseVerbose(
            text=text,
            language=request.language,
            duration=duration_s, # 原为 str(duration_s)
            segments=total_segments,
        ),
    )
vllm/entrypoints/speech_to_text/transcription/protocol.py core-logic

类型定义变更:将 duration 字段类型从 str 改为 float,影响 JSON 序列化行为。

# vllm/entrypoints/speech_to_text/transcription/protocol.py
class TranscriptionResponseVerbose(OpenAIBaseModel):
    duration: float # 原为 str,改为 float 以符合 OpenAI 规范
    """The duration of the input audio."""
    language: str
    text: str
    segments: list[TranscriptionSegment] | None = None
    words: list[TranscriptionWord] | None = None
vllm/entrypoints/speech_to_text/translation/protocol.py core-logic

与 transcription 协议镜像修改:duration 字段类型从 str 改为 float。

# vllm/entrypoints/speech_to_text/translation/protocol.py
class TranslationResponseVerbose(OpenAIBaseModel):
    duration: float # 原为 str,改为 float 以符合 OpenAI 规范
    """The duration of the input audio."""
    language: str
    text: str
    segments: list[TranslationSegment] | None = None
    words: list[TranslationWord] | None = None

评论区精华

测试文件必要性 测试

DarkLight1337 认为新增的测试文件“没那么有用,直接改定义就行”;作者 wskr00 询问是否删除后获确认,最终删除了测试。

结论:确认移除测试文件,仅做协议定义修改。 · 已解决

风险与影响

风险极低。仅修改了字段类型和一处类型转换,改动范围小(共 4 行),且改动的逻辑位于非关键路径。不涉及性能、安全或兼容性问题。需确保下游消费者未依赖 duration 为字符串类型(理论上不符合规范,可能性低)。

影响范围仅限于使用 response_format=verbose_json/v1/audio/transcriptions/v1/audio/translations 端点。修复后 duration 字段将以 JSON number 返回,提升了 API 兼容性和客户端易用性。无负面兼容性影响。

低风险

关联 Issue

#49068 [Bug]: verbose_json returns duration as a string instead of a number

完整报告

参与讨论