From 8a728663c1c3eeace834a95f5654fa653cc1998c Mon Sep 17 00:00:00 2001 From: Luyi Xiao <81631911+luyixiao95@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:25:35 -0700 Subject: [PATCH] [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> --- tests/model_executor/test_qwen3_omni.py | 1 + vllm/model_executor/models/terratorch.py | 3 +++ vllm/multimodal/processing/processor.py | 10 ++++++++++ 3 files changed, 14 insertions(+) diff --git a/tests/model_executor/test_qwen3_omni.py b/tests/model_executor/test_qwen3_omni.py index 54d2f2672f..708460c92c 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 78bd541b7a..7181680fe8 100644 --- a/vllm/model_executor/models/terratorch.py +++ b/vllm/model_executor/models/terratorch.py @@ -169,6 +169,9 @@ class TerratorchInputBuilder(BaseDummyInputsBuilder[TerratorchProcessingInfo]): 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 afae854762..3db8204588 100644 --- a/vllm/multimodal/processing/processor.py +++ b/vllm/multimodal/processing/processor.py @@ -8,6 +8,7 @@ from enum import Enum 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 @@ class BaseMultiModalProcessor(ABC, Generic[_I]): ) -> 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