From 2b009b3cefcdcdebd55cd3260150d83d89c05f21 Mon Sep 17 00:00:00 2001 From: tzhouam Date: Fri, 30 Jan 2026 10:00:14 +0000 Subject: [PATCH] Fix audio tensor extraction in end2end.py files across multiple examples - Updated the audio tensor extraction logic to access the correct output structure in Qwen2.5 Omni, Qwen3 Omni, and Qwen3 TTS implementations. - Ensured consistency in handling audio outputs for improved functionality. Signed-off-by: tzhouam --- examples/offline_inference/qwen2_5_omni/end2end.py | 2 +- examples/offline_inference/qwen3_omni/end2end.py | 2 +- examples/offline_inference/qwen3_tts/end2end.py | 2 +- vllm_omni/entrypoints/openai/api_server.py | 10 ++++++---- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/offline_inference/qwen2_5_omni/end2end.py b/examples/offline_inference/qwen2_5_omni/end2end.py index 22f2161c2..63b08202a 100644 --- a/examples/offline_inference/qwen2_5_omni/end2end.py +++ b/examples/offline_inference/qwen2_5_omni/end2end.py @@ -410,7 +410,7 @@ def main(args): elif stage_outputs.final_output_type == "audio": for output in stage_outputs.request_output: request_id = output.request_id - audio_tensor = output.multimodal_output["audio"] + audio_tensor = output.outputs[0].multimodal_output["audio"] output_wav = os.path.join(output_dir, f"output_{request_id}.wav") sf.write(output_wav, audio_tensor.detach().cpu().numpy(), samplerate=24000) print(f"Request ID: {request_id}, Saved audio to {output_wav}") diff --git a/examples/offline_inference/qwen3_omni/end2end.py b/examples/offline_inference/qwen3_omni/end2end.py index 3cd891820..0b484c507 100644 --- a/examples/offline_inference/qwen3_omni/end2end.py +++ b/examples/offline_inference/qwen3_omni/end2end.py @@ -418,7 +418,7 @@ def main(args): elif stage_outputs.final_output_type == "audio": for output in stage_outputs.request_output: request_id = output.request_id - audio_tensor = output.multimodal_output["audio"] + audio_tensor = output.outputs[0].multimodal_output["audio"] output_wav = os.path.join(output_dir, f"output_{request_id}.wav") # Convert to numpy array and ensure correct format diff --git a/examples/offline_inference/qwen3_tts/end2end.py b/examples/offline_inference/qwen3_tts/end2end.py index 7bdd0ae7d..a250eb247 100644 --- a/examples/offline_inference/qwen3_tts/end2end.py +++ b/examples/offline_inference/qwen3_tts/end2end.py @@ -244,7 +244,7 @@ def main(args): for stage_outputs in omni_generator: for output in stage_outputs.request_output: request_id = output.request_id - audio_tensor = output.multimodal_output["audio"] + audio_tensor = output.outputs[0].multimodal_output["audio"] output_wav = os.path.join(output_dir, f"output_{request_id}.wav") audio_samplerate = output.multimodal_output["sr"].item() # Convert to numpy array and ensure correct format diff --git a/vllm_omni/entrypoints/openai/api_server.py b/vllm_omni/entrypoints/openai/api_server.py index b9807734f..ce290279d 100644 --- a/vllm_omni/entrypoints/openai/api_server.py +++ b/vllm_omni/entrypoints/openai/api_server.py @@ -26,6 +26,7 @@ from vllm.entrypoints.launcher import serve_http from vllm.entrypoints.logger import RequestLogger from vllm.entrypoints.mcp.tool_server import DemoToolServer, MCPToolServer, ToolServer from vllm.entrypoints.openai.api_server import build_app as build_openai_app +from vllm.entrypoints.openai.api_server import load_log_config from vllm.entrypoints.openai.api_server import setup_server as setup_openai_server from vllm.entrypoints.openai.chat_completion.protocol import ( ChatCompletionRequest, @@ -46,7 +47,6 @@ from vllm.entrypoints.openai.models.protocol import BaseModelPath from vllm.entrypoints.openai.models.serving import OpenAIServingModels from vllm.entrypoints.openai.orca_metrics import metrics_header from vllm.entrypoints.openai.responses.serving import OpenAIServingResponses -from vllm.entrypoints.openai.server_utils import get_uvicorn_log_config from vllm.entrypoints.openai.translations.serving import ( OpenAIServingTranscription, OpenAIServingTranslation, @@ -184,7 +184,7 @@ async def omni_run_server_worker(listen_address, sock, args, client_config=None, ReasoningParserManager.import_reasoning_parser(args.reasoning_parser_plugin) # Load logging config for uvicorn if specified - log_config = get_uvicorn_log_config(args) + log_config = load_log_config(getattr(args, "log_config_file", None)) if log_config is not None: uvicorn_kwargs["log_config"] = log_config @@ -200,8 +200,10 @@ async def omni_run_server_worker(listen_address, sock, args, client_config=None, if not supported_tasks: supported_tasks = ("generate",) - app = build_openai_app(args, supported_tasks) + app = build_openai_app(args) + # OMNI: Remove upstream routes that we override with omni-specific handlers _remove_route_from_app(app, "/v1/chat/completions", {"POST"}) + _remove_route_from_app(app, "/v1/models", {"GET"}) # Remove upstream /v1/models to use omni's handler app.include_router(router) await omni_init_app_state(engine_client, app.state, args) @@ -457,10 +459,10 @@ async def omni_init_app_state( tokenizer = await engine_client.get_tokenizer() if tokenizer is not None: # Initialize input_processor + # OMNI: OmniInputProcessor creates tokenizer internally from vllm_config if not hasattr(engine_client, "input_processor") or engine_client.input_processor is None: engine_client.input_processor = OmniInputProcessor( vllm_config=vllm_config, - tokenizer=tokenizer, ) logger.info("Initialized input_processor for AsyncOmni")