[Bugfix] Reject tokenizer-less Qwen VL processor init (#54886)

Signed-off-by: Luyi Xiao <81631911+luyixiao95@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

Luyi Xiao committed Sep 3, 2026 at 21:25 UTC 8a728663c1c3eeace834a95f5654fa653cc1998c
3 files changed +14
tests/model_executor/test_qwen3_omni.py
+1
@@ -144,6 +144,7 @@ def test_qwen3_omni_get_updates_use_audio_in_video(
144
145 # Create a mock context
146 mock_ctx = Mock(spec=InputProcessingContext)
147 + mock_ctx.tokenizer = mock_tokenizer
148
149 # Create processing info
150 info = Qwen3OmniMoeThinkerProcessingInfo(mock_ctx)
vllm/model_executor/models/terratorch.py
+3
@@ -169,6 +169,9 @@ class TerratorchInputBuilder(BaseDummyInputsBuilder[TerratorchProcessingInfo]):
169
170
171 class TerratorchMultiModalProcessor(BaseMultiModalProcessor[TerratorchProcessingInfo]):
172 + # Terratorch models, including Prithvi, consume tokenizer-free inputs.
173 + requires_tokenizer = False
174 +
175 def _get_mm_fields_config(
176 self,
177 hf_inputs: BatchFeature,
vllm/multimodal/processing/processor.py
+10
@@ -8,6 +8,7 @@ from enum import Enum
8 from functools import lru_cache
9 from typing import (
10 TYPE_CHECKING,
11 + ClassVar,
12 Generic,
13 NamedTuple,
14 Protocol,
@@ -1033,6 +1034,8 @@ class BaseMultiModalProcessor(ABC, Generic[_I]):
1034 Not to be confused with `transformers.ProcessorMixin`.
1035 """
1036
1037 + requires_tokenizer: ClassVar[bool] = True
1038 +
1039 def __init__(
1040 self,
1041 info: _I,
@@ -1042,6 +1045,13 @@ class BaseMultiModalProcessor(ABC, Generic[_I]):
1045 ) -> None:
1046 super().__init__()
1047
1048 + if self.requires_tokenizer and info.ctx.tokenizer is None:
1049 + raise ValueError(
1050 + f"{type(self).__name__} requires a tokenizer and cannot be "
1051 + "initialized when `skip_tokenizer_init=True`. Disable "
1052 + "`--skip-tokenizer-init`."
1053 + )
1054 +
1055 self.info = info
1056 self.dummy_inputs = dummy_inputs
1057 self.cache = cache