diff --git a/tests/model_executor/test_qwen3_omni.py b/tests/model_executor/test_qwen3_omni.py index 54d2f2672f7b..708460c92c84 100644 --- a/tests/model_executor/test_qwen3_omni.py +++ b/tests/model_executor/test_qwen3_omni.py @@ -144,6 +144,7 @@ def test_qwen3_omni_get_updates_use_audio_in_video( # Create a mock context mock_ctx = Mock(spec=InputProcessingContext) + mock_ctx.tokenizer = mock_tokenizer # Create processing info info = Qwen3OmniMoeThinkerProcessingInfo(mock_ctx) diff --git a/vllm/model_executor/models/terratorch.py b/vllm/model_executor/models/terratorch.py index 78bd541b7aaf..7181680fe833 100644 --- a/vllm/model_executor/models/terratorch.py +++ b/vllm/model_executor/models/terratorch.py @@ -169,6 +169,9 @@ def get_dummy_mm_data( class TerratorchMultiModalProcessor(BaseMultiModalProcessor[TerratorchProcessingInfo]): + # Terratorch models, including Prithvi, consume tokenizer-free inputs. + requires_tokenizer = False + def _get_mm_fields_config( self, hf_inputs: BatchFeature, diff --git a/vllm/multimodal/processing/processor.py b/vllm/multimodal/processing/processor.py index afae85476246..3db820458880 100644 --- a/vllm/multimodal/processing/processor.py +++ b/vllm/multimodal/processing/processor.py @@ -8,6 +8,7 @@ from functools import lru_cache from typing import ( TYPE_CHECKING, + ClassVar, Generic, NamedTuple, Protocol, @@ -1033,6 +1034,8 @@ class BaseMultiModalProcessor(ABC, Generic[_I]): Not to be confused with `transformers.ProcessorMixin`. """ + requires_tokenizer: ClassVar[bool] = True + def __init__( self, info: _I, @@ -1042,6 +1045,13 @@ def __init__( ) -> None: super().__init__() + if self.requires_tokenizer and info.ctx.tokenizer is None: + raise ValueError( + f"{type(self).__name__} requires a tokenizer and cannot be " + "initialized when `skip_tokenizer_init=True`. Disable " + "`--skip-tokenizer-init`." + ) + self.info = info self.dummy_inputs = dummy_inputs self.cache = cache