[Bugfix] Ming-omni-tts: generalize dict checks to Mapping (#4397)

Signed-off-by: akshatvishu <akshatnayak197@gmail.com>
This commit is contained in:
akshatvishu authored and GitHub committed 2026-06-13 09:37:57 +08:00
1 parent 9bc8705c98
commit d4f2a49a68
2 files changed
+19 -16

No files matched your search

+11 -9
View File
@@ -5,6 +5,8 @@
import asyncio
import uuid
from collections.abc import Mapping
from typing import Any
import numpy as np
import pytest
@@ -102,8 +104,8 @@ def _flatten_audio(audio) -> torch.Tensor:
return torch.as_tensor(audio, dtype=torch.float32).reshape(-1).cpu()
def _extract_audio(multimodal_output: dict) -> torch.Tensor:
assert isinstance(multimodal_output, dict), f"Expected dict, got {type(multimodal_output)}"
def _extract_audio(multimodal_output: Mapping[str, Any]) -> torch.Tensor:
assert isinstance(multimodal_output, Mapping), f"Expected Mapping, got {type(multimodal_output)}"
audio = multimodal_output.get("audio", multimodal_output.get("model_outputs"))
assert audio is not None, f"No audio output found, keys={list(multimodal_output.keys())}"
waveform = _flatten_audio(audio)
@@ -112,7 +114,7 @@ def _extract_audio(multimodal_output: dict) -> torch.Tensor:
return waveform
def _extract_sample_rate(multimodal_output: dict) -> int:
def _extract_sample_rate(multimodal_output: Mapping[str, Any]) -> int:
sample_rate = multimodal_output.get("sr")
if sample_rate is None:
raise RuntimeError("Expected multimodal_output['sr']")
@@ -133,29 +135,29 @@ def _extract_final_audio_outputs(outputs):
if request_output is None:
continue
multimodal_output = getattr(request_output, "multimodal_output", None)
if isinstance(multimodal_output, dict):
if isinstance(multimodal_output, Mapping):
final_outputs.append(item)
continue
completions = getattr(request_output, "outputs", None) or []
if any(isinstance(getattr(completion, "multimodal_output", None), dict) for completion in completions):
if any(isinstance(getattr(completion, "multimodal_output", None), Mapping) for completion in completions):
final_outputs.append(item)
return final_outputs
def _extract_multimodal_output(output) -> dict:
def _extract_multimodal_output(output) -> Mapping[str, Any]:
multimodal_output = getattr(output, "multimodal_output", None)
if isinstance(multimodal_output, dict):
if isinstance(multimodal_output, Mapping):
return multimodal_output
request_output = getattr(output, "request_output", None)
if request_output is not None:
multimodal_output = getattr(request_output, "multimodal_output", None)
if isinstance(multimodal_output, dict):
if isinstance(multimodal_output, Mapping):
return multimodal_output
completions = getattr(request_output, "outputs", None) or []
for completion in completions:
multimodal_output = getattr(completion, "multimodal_output", None)
if isinstance(multimodal_output, dict):
if isinstance(multimodal_output, Mapping):
return multimodal_output
raise AssertionError("No multimodal audio output found in Ming generate results")
@@ -2,6 +2,7 @@
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
import torch
@@ -33,8 +34,8 @@ MING_FINAL_DECODE_STEP_KEY = "ming_final_decode_step"
MING_STOP_REASON_BY_CODE = {code: reason for reason, code in MING_STOP_REASON_CODES.items()}
def _extract_last_patch(pooling_output: dict[str, Any] | None) -> torch.Tensor | None:
if not isinstance(pooling_output, dict):
def _extract_last_patch(pooling_output: Mapping[str, Any] | None) -> torch.Tensor | None:
if not isinstance(pooling_output, Mapping):
return None
has_patch = pooling_output.get("ming_has_patch")
patch = pooling_output.get("ming_latent_patch")
@@ -54,8 +55,8 @@ def _extract_last_patch(pooling_output: dict[str, Any] | None) -> torch.Tensor |
return patch.to(torch.float32).cpu()
def _extract_all_patches(pooling_output: dict[str, Any] | None) -> torch.Tensor | None:
if not isinstance(pooling_output, dict):
def _extract_all_patches(pooling_output: Mapping[str, Any] | None) -> torch.Tensor | None:
if not isinstance(pooling_output, Mapping):
return None
has_patch = pooling_output.get("ming_has_patch")
patch = pooling_output.get("ming_latent_patch")
@@ -78,8 +79,8 @@ def _extract_all_patches(pooling_output: dict[str, Any] | None) -> torch.Tensor
return patch.to(torch.float32).cpu()
def _extract_last_value(pooling_output: dict[str, Any] | None, key: str) -> Any:
if not isinstance(pooling_output, dict):
def _extract_last_value(pooling_output: Mapping[str, Any] | None, key: str) -> Any:
if not isinstance(pooling_output, Mapping):
return None
value = pooling_output.get(key)
if value is None:
@@ -118,7 +119,7 @@ def _decode_stop_reason(value: Any) -> str | None:
def _get_async_chunk_config(transfer_manager: Any) -> tuple[int, int]:
connector = getattr(transfer_manager, "connector", None)
raw_cfg = getattr(connector, "config", {}) or {}
cfg = raw_cfg.get("extra", raw_cfg) if isinstance(raw_cfg, dict) else {}
cfg = raw_cfg.get("extra", raw_cfg) if isinstance(raw_cfg, Mapping) else {}
if "latent_chunk_size" not in cfg:
logger.warning(
"Ming async chunk config missing latent_chunk_size, using fallback value %s",