From d4f2a49a6803813eaf67e40562c2189d24053643 Mon Sep 17 00:00:00 2001 From: akshatvishu <33392262+akshatvishu@users.noreply.github.com> Date: Sat, 13 Jun 2026 07:07:57 +0530 Subject: [PATCH] [Bugfix] Ming-omni-tts: generalize dict checks to Mapping (#4397) Signed-off-by: akshatvishu --- tests/e2e/offline_inference/test_ming_tts.py | 20 ++++++++++--------- .../stage_input_processors/ming_tts.py | 15 +++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/tests/e2e/offline_inference/test_ming_tts.py b/tests/e2e/offline_inference/test_ming_tts.py index ca76c9afe..775942274 100644 --- a/tests/e2e/offline_inference/test_ming_tts.py +++ b/tests/e2e/offline_inference/test_ming_tts.py @@ -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") diff --git a/vllm_omni/model_executor/stage_input_processors/ming_tts.py b/vllm_omni/model_executor/stage_input_processors/ming_tts.py index 92f25eea0..0f2effdcb 100644 --- a/vllm_omni/model_executor/stage_input_processors/ming_tts.py +++ b/vllm_omni/model_executor/stage_input_processors/ming_tts.py @@ -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",