Summary
Cannot deploy microsoft/VibeVoice-ASR via vLLM (any 0.10.x – 0.21.0 tested) using the bundled vllm_plugin. The plugin has multiple API drifts vs. published vLLM releases, and the deepest blocker is an IndexError: list index out of range inside vLLM's _merge_mm_kwargs during inference — this fires even after working around earlier issues with --skip-mm-profiling, a custom chat-template content format, and patching the plugin's get_data_parser method.
Filed in case there's a known-good combo / patch on your side, or as a heads-up for plugin maintenance work.
Environment
- Base image:
vllm/vllm-openai:v0.21.0 (also tested v0.14.1 which docs/vibevoice-vllm-asr.md mentions)
- Plugin:
git+https://github.com/microsoft/VibeVoice.git@main (commit pulled fresh)
- Model:
microsoft/VibeVoice-ASR
- GPU: NVIDIA H100 80GB
- Deployment platform: Baseten Truss (but the underlying
vllm serve command is canonical)
Repro
Run vllm serve microsoft/VibeVoice-ASR with Microsoft's documented flag set from vllm_plugin/scripts/start_server.py (--no-enable-prefix-caching, --enable-chunked-prefill, --chat-template-content-format openai, --allowed-local-media-path /app, --trust-remote-code, --dtype bfloat16).
POST /v1/chat/completions with the multimodal payload from vllm_plugin/tests/test_api.py:
{
"model": "vibevoice",
"messages": [
{"role": "system", "content": "You are a helpful assistant that transcribes audio input into text output in JSON format."},
{"role": "user", "content": [
{"type": "audio_url", "audio_url": {"url": "data:audio/mpeg;base64,<...>"}},
{"type": "text", "text": "This is a 10.26 seconds audio, please transcribe it..."}
]}
],
"max_tokens": 32768,
"temperature": 0.0
}
What we hit and how we (partially) worked around
| # |
Issue |
Workaround |
| 1 |
Startup: vLLM's automatic multimodal memory profiler crashes with IndexError in _initialize_kv_caches → determine_available_memory → profile_run → _merge_mm_kwargs. Triggered by plugin's audio encoder returning malformed output on synthetic dummy audio. |
--skip-mm-profiling |
| 2 |
Predict: chat template applies `'< |
im_start |
| 3 |
Predict: RuntimeError: Audio resampling is not supported when target_sr is not provided from vllm/multimodal/audio.py:AudioResampler.resample. Root cause: plugin defines _get_data_parser (underscored) on VibeVoiceMultiModalProcessor, but vLLM v0.21 calls info.get_data_parser() (no underscore) on the Info class. The plugin's method is dead code. |
Added get_data_parser to VibeVoiceProcessingInfo returning MultiModalDataParser(target_sr=24000) |
| 4 |
Predict: IndexError: list index out of range in vLLM's _merge_mm_kwargs at missing_updates_item = missing_prompt_updates[missing_next_idx]. Plugin's _get_prompt_updates returns a single PromptReplacement(modality=\"audio\", ...) — apparently the wrong shape for vLLM v0.21's prompt-update merging contract. |
Currently blocked. |
Item 4 is the remaining blocker. The single-PromptReplacement return shape worked for some earlier vLLM version but not v0.21.
Other API drift observations
vllm_plugin/model.py also uses APIs from different vLLM eras simultaneously:
ProcessorInputs(mm_data=...) — only in v0.10-v0.14.1; renamed to mm_data_items (with type MultiModalDataItems) in v0.15+
_get_dummy_audios(overrides=...) — only in v0.12+
The intersection where both work is v0.12-v0.14.1, but those minor versions have no published vllm/vllm-openai Docker image (the registry jumps from v0.10.1.1 directly to v0.15.0+). v0.14.1 is documented in docs/vibevoice-vllm-asr.md but produces the same Layer-1 startup IndexError without --skip-mm-profiling.
Asks
- Is there a known-good combination of vLLM version + plugin commit you ship internally that we're missing? (No Dockerfile is published in the repo, and
pyproject.toml doesn't pin vLLM.)
- Is the v0.21 prompt-update shape mismatch (item 4 above) something the maintainers are tracking? Happy to help test a fix.
- Would it be valuable for the repo to:
- Publish a Dockerfile + tested vLLM version pin (e.g. in
pyproject.toml [tool.vibevoice.compat] or a requirements-vllm.txt)
- Add a
docs/vibevoice-vllm-asr.md section noting which vllm/vllm-openai tag has been validated end-to-end
Summary
Cannot deploy
microsoft/VibeVoice-ASRvia vLLM (any 0.10.x – 0.21.0 tested) using the bundledvllm_plugin. The plugin has multiple API drifts vs. published vLLM releases, and the deepest blocker is anIndexError: list index out of rangeinside vLLM's_merge_mm_kwargsduring inference — this fires even after working around earlier issues with--skip-mm-profiling, a custom chat-template content format, and patching the plugin'sget_data_parsermethod.Filed in case there's a known-good combo / patch on your side, or as a heads-up for plugin maintenance work.
Environment
vllm/vllm-openai:v0.21.0(also testedv0.14.1which docs/vibevoice-vllm-asr.md mentions)git+https://github.com/microsoft/VibeVoice.git@main(commit pulled fresh)microsoft/VibeVoice-ASRvllm servecommand is canonical)Repro
Run
vllm serve microsoft/VibeVoice-ASRwith Microsoft's documented flag set fromvllm_plugin/scripts/start_server.py(--no-enable-prefix-caching,--enable-chunked-prefill,--chat-template-content-format openai,--allowed-local-media-path /app,--trust-remote-code,--dtype bfloat16).POST
/v1/chat/completionswith the multimodal payload fromvllm_plugin/tests/test_api.py:{ "model": "vibevoice", "messages": [ {"role": "system", "content": "You are a helpful assistant that transcribes audio input into text output in JSON format."}, {"role": "user", "content": [ {"type": "audio_url", "audio_url": {"url": "data:audio/mpeg;base64,<...>"}}, {"type": "text", "text": "This is a 10.26 seconds audio, please transcribe it..."} ]} ], "max_tokens": 32768, "temperature": 0.0 }What we hit and how we (partially) worked around
IndexErrorin_initialize_kv_caches → determine_available_memory → profile_run → _merge_mm_kwargs. Triggered by plugin's audio encoder returning malformed output on synthetic dummy audio.--skip-mm-profilingRuntimeError: Audio resampling is not supported when target_sr is not providedfromvllm/multimodal/audio.py:AudioResampler.resample. Root cause: plugin defines_get_data_parser(underscored) onVibeVoiceMultiModalProcessor, but vLLM v0.21 callsinfo.get_data_parser()(no underscore) on the Info class. The plugin's method is dead code.get_data_parsertoVibeVoiceProcessingInforeturningMultiModalDataParser(target_sr=24000)IndexError: list index out of rangein vLLM's_merge_mm_kwargsatmissing_updates_item = missing_prompt_updates[missing_next_idx]. Plugin's_get_prompt_updatesreturns a singlePromptReplacement(modality=\"audio\", ...)— apparently the wrong shape for vLLM v0.21's prompt-update merging contract.Item 4 is the remaining blocker. The single-
PromptReplacementreturn shape worked for some earlier vLLM version but not v0.21.Other API drift observations
vllm_plugin/model.pyalso uses APIs from different vLLM eras simultaneously:ProcessorInputs(mm_data=...)— only in v0.10-v0.14.1; renamed tomm_data_items(with typeMultiModalDataItems) in v0.15+_get_dummy_audios(overrides=...)— only in v0.12+The intersection where both work is v0.12-v0.14.1, but those minor versions have no published
vllm/vllm-openaiDocker image (the registry jumps from v0.10.1.1 directly to v0.15.0+).v0.14.1is documented indocs/vibevoice-vllm-asr.mdbut produces the same Layer-1 startup IndexError without--skip-mm-profiling.Asks
pyproject.tomldoesn't pin vLLM.)pyproject.toml[tool.vibevoice.compat]or arequirements-vllm.txt)docs/vibevoice-vllm-asr.mdsection noting whichvllm/vllm-openaitag has been validated end-to-end