A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 6, 00:45 UTC
[Misc] Reorganize inputs (#35182)
Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
Cyrus Leung committed
Mar 26, 2026 at 01:22 UTC
ba2f0acc2d69cb11f2c1bce895521550fa73bcc3
142 files changed
+1212
-1342
docs/api/README.md
+3
-12
@@ -27,11 +27,9 @@ LLM Class.
27
28
- [vllm.LLM][]
29
30
-LLM Inputs.
30
+Prompt schema for LLM APIs.
31
32
-- [vllm.inputs.PromptType][]
33
-- [vllm.inputs.TextPrompt][]
34
-- [vllm.inputs.TokensPrompt][]
32
+- [vllm.inputs.llm][]
33
34
## vLLM Engines
35
@@ -58,13 +56,7 @@ Looking to add your own multi-modal model? Please follow the instructions listed
56
57
- [vllm.multimodal.MULTIMODAL_REGISTRY][]
58
61
-### Inputs
62
-
63
-User-facing inputs.
64
-
65
-- [vllm.multimodal.inputs.MultiModalDataDict][]
66
-
67
-Internal data structures.
59
+### Internal data structures
60
61
- [vllm.multimodal.inputs.PlaceholderRange][]
62
- [vllm.multimodal.inputs.NestedTensors][]
@@ -72,7 +64,6 @@ Internal data structures.
64
- [vllm.multimodal.inputs.MultiModalFieldConfig][]
65
- [vllm.multimodal.inputs.MultiModalKwargsItem][]
66
- [vllm.multimodal.inputs.MultiModalKwargsItems][]
75
-- [vllm.multimodal.inputs.MultiModalInputs][]
67
68
### Data Parsing
69
docs/contributing/model/transcription.md
+2
-2
@@ -23,7 +23,7 @@ Declare supported languages and capabilities:
23
from torch import nn
24
25
from vllm.config import ModelConfig, SpeechToTextConfig
26
- from vllm.inputs.data import PromptType
26
+ from vllm.inputs import PromptType
27
from vllm.model_executor.models.interfaces import SupportsTranscription
28
29
class YourASRModel(nn.Module, SupportsTranscription):
@@ -66,7 +66,7 @@ This is for controlling general behavior of the API when serving your model:
66
67
See [Audio preprocessing and chunking](#audio-preprocessing-and-chunking) for what each field controls.
68
69
-Implement the prompt construction via [get_generation_prompt][vllm.model_executor.models.interfaces.SupportsTranscription.get_generation_prompt]. The server passes you the resampled waveform and task parameters; you return a valid [PromptType][vllm.inputs.data.PromptType]. There are two common patterns:
69
+Implement the prompt construction via [get_generation_prompt][vllm.model_executor.models.interfaces.SupportsTranscription.get_generation_prompt]. The server passes you the resampled waveform and task parameters; you return a valid [PromptType][vllm.inputs.llm.PromptType]. There are two common patterns:
70
71
#### Multimodal LLM with audio embeddings (e.g., Voxtral, Gemma3n)
72
docs/features/multimodal_inputs.md
+1
-1
@@ -18,7 +18,7 @@ This page teaches you how to pass multi-modal inputs to [multi-modal models](../
18
To input multi-modal data, follow this schema in [vllm.inputs.PromptType][]:
19
20
- `prompt`: The prompt should follow the format that is documented on HuggingFace.
21
-- `multi_modal_data`: This is a dictionary that follows the schema defined in [vllm.multimodal.inputs.MultiModalDataDict][].
21
+- `multi_modal_data`: This is a dictionary that follows the schema defined in [vllm.inputs.MultiModalDataDict][].
22
23
### Image Inputs
24
examples/pooling/token_embed/jina_embeddings_v4_offline.py
+1
-1
@@ -4,7 +4,7 @@
4
import torch
5
6
from vllm import LLM
7
-from vllm.inputs.data import TextPrompt
7
+from vllm.inputs import TextPrompt
8
from vllm.multimodal.utils import fetch_image
9
10
# Initialize model
tests/entrypoints/openai/chat_completion/test_chat_error.py
+1
-1
@@ -105,7 +105,7 @@ def _build_serving_chat(engine: AsyncLLM) -> OpenAIServingChat:
105
)
106
107
async def _fake_preprocess_chat(*args, **kwargs):
108
- # return conversation, engine_prompts
108
+ # return conversation, engine_inputs
109
return (
110
[{"role": "user", "content": "Test"}],
111
[{"prompt_token_ids": [1, 2, 3]}],
tests/entrypoints/openai/chat_completion/test_serving_chat.py
+8
-8
@@ -958,14 +958,14 @@ async def test_serving_chat_did_set_correct_cache_salt(model_type):
958
serving_chat = _build_serving_chat(mock_engine)
959
960
orig_render_chat_request = serving_chat.render_chat_request
961
- captured_prompts = []
961
+ captured_inputs = []
962
963
async def render_chat_request(request):
964
result = await orig_render_chat_request(request)
965
966
assert isinstance(result, tuple)
967
- conversation, engine_prompts = result
968
- captured_prompts.extend(engine_prompts)
967
+ conversation, engine_inputs = result
968
+ captured_inputs.extend(engine_inputs)
969
970
return result
971
@@ -981,18 +981,18 @@ async def test_serving_chat_did_set_correct_cache_salt(model_type):
981
with suppress(Exception):
982
await serving_chat.create_chat_completion(req)
983
984
- assert len(captured_prompts) == 1
985
- assert "cache_salt" not in captured_prompts[0]
984
+ assert len(captured_inputs) == 1
985
+ assert "cache_salt" not in captured_inputs[0]
986
987
- captured_prompts.clear()
987
+ captured_inputs.clear()
988
989
# Test with certain cache_salt
990
req.cache_salt = "test_salt"
991
with suppress(Exception):
992
await serving_chat.create_chat_completion(req)
993
994
- assert len(captured_prompts) == 1
995
- assert captured_prompts[0]["cache_salt"] == "test_salt"
994
+ assert len(captured_inputs) == 1
995
+ assert captured_inputs[0]["cache_salt"] == "test_salt"
996
997
998
@pytest.mark.asyncio
tests/entrypoints/openai/responses/test_serving_responses.py
+5
-5
@@ -37,7 +37,7 @@ from vllm.entrypoints.openai.responses.serving import (
37
from vllm.entrypoints.openai.responses.streaming_events import (
38
StreamingState,
39
)
40
-from vllm.inputs.data import TokensPrompt
40
+from vllm.inputs import tokens_input
41
from vllm.outputs import CompletionOutput, RequestOutput
42
from vllm.sampling_params import SamplingParams
43
@@ -258,20 +258,20 @@ class TestValidateGeneratorInput:
258
"""Test _validate_generator_input with valid prompt length"""
259
# Create an engine prompt with valid length (less than max_model_len)
260
valid_prompt_token_ids = list(range(5)) # 5 tokens < 100 max_model_len
261
- engine_prompt = TokensPrompt(prompt_token_ids=valid_prompt_token_ids)
261
+ engine_input = tokens_input(valid_prompt_token_ids)
262
263
# Call the method
264
- result = serving_responses_instance._validate_generator_input(engine_prompt)
264
+ result = serving_responses_instance._validate_generator_input(engine_input)
265
266
# Should return None for valid input
267
assert result is None
268
269
# create an invalid engine prompt
270
invalid_prompt_token_ids = list(range(200)) # 100 tokens >= 100 max_model_len
271
- engine_prompt = TokensPrompt(prompt_token_ids=invalid_prompt_token_ids)
271
+ engine_input = tokens_input(invalid_prompt_token_ids)
272
273
# Call the method
274
- result = serving_responses_instance._validate_generator_input(engine_prompt)
274
+ result = serving_responses_instance._validate_generator_input(engine_input)
275
276
# Should return an ErrorResponse
277
assert result is not None
tests/entrypoints/serve/render/test_launch_render.py
-14
@@ -73,20 +73,6 @@ async def test_chat_render_multi_turn(client):
73
assert len(data["token_ids"]) > 0
74
75
76
-@pytest.mark.asyncio
77
-async def test_chat_render_invalid_model(client):
78
- response = await client.post(
79
- "/v1/chat/completions/render",
80
- json={
81
- "model": "nonexistent-model",
82
- "messages": [{"role": "user", "content": "Hello"}],
83
- },
84
- )
85
-
86
- assert response.status_code == 404
87
- assert "error" in response.json()
88
-
89
-
76
# -- Completion Render --
77
78
tests/entrypoints/test_chat_utils.py
+1
-1
@@ -16,7 +16,7 @@ from vllm.entrypoints.chat_utils import (
16
parse_chat_messages,
17
parse_chat_messages_async,
18
)
19
-from vllm.multimodal import MultiModalDataDict, MultiModalUUIDDict
19
+from vllm.inputs import MultiModalDataDict, MultiModalUUIDDict
20
from vllm.multimodal.utils import (
21
encode_audio_url,
22
encode_image_url,
tests/models/multimodal/generation/test_pixtral.py
+1
-1
@@ -13,8 +13,8 @@ from mistral_common.tokens.tokenizers.multimodal import image_from_chunk
13
from transformers import AutoProcessor
14
15
from vllm import SamplingParams, TextPrompt, TokensPrompt
16
+from vllm.inputs import MultiModalDataBuiltins
17
from vllm.logprobs import Logprob, SampleLogprobs
17
-from vllm.multimodal import MultiModalDataBuiltins
18
from vllm.platforms import current_platform
19
20
from ....utils import VLLM_PATH, large_gpu_test
tests/models/multimodal/processing/test_common.py
+6
-8
@@ -15,13 +15,11 @@ from vllm.config.multimodal import (
15
ImageDummyOptions,
16
VideoDummyOptions,
17
)
18
-from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalDataDict
18
+from vllm.inputs import MultiModalDataDict, MultiModalInput
19
+from vllm.multimodal import MULTIMODAL_REGISTRY
20
from vllm.multimodal.cache import MultiModalProcessorOnlyCache
20
-from vllm.multimodal.inputs import MultiModalInputs, batched_tensors_equal
21
-from vllm.multimodal.processing import (
22
- BaseMultiModalProcessor,
23
- InputProcessingContext,
24
-)
21
+from vllm.multimodal.inputs import batched_tensors_equal
22
+from vllm.multimodal.processing import BaseMultiModalProcessor, InputProcessingContext
23
from vllm.tokenizers import TokenizerLike, cached_tokenizer_from_config
24
from vllm.utils.mistral import is_mistral_tokenizer
25
@@ -420,8 +418,8 @@ def test_processing_correctness(
418
419
420
def _assert_inputs_equal(
423
- a: MultiModalInputs,
424
- b: MultiModalInputs,
421
+ a: MultiModalInput,
422
+ b: MultiModalInput,
423
*,
424
ignore_mm_keys: set[str] | None = None,
425
msg: str = "",
tests/plugins/bge_m3_sparse_plugin/bge_m3_sparse_processor/sparse_embeddings_processor.py
+2
-4
@@ -6,11 +6,9 @@ from collections.abc import Sequence
6
from vllm.config import ModelConfig, PoolerConfig, VllmConfig
7
from vllm.entrypoints.openai.engine.protocol import UsageInfo
8
from vllm.entrypoints.pooling.base.protocol import EmbedRequestMixin
9
-from vllm.inputs.data import PromptType
9
+from vllm.inputs import PromptType
10
from vllm.outputs import PoolingRequestOutput
11
-from vllm.plugins.io_processors.interface import (
12
- IOProcessor,
13
-)
11
+from vllm.plugins.io_processors.interface import IOProcessor
12
from vllm.pooling_params import PoolingParams
13
from vllm.renderers import BaseRenderer
14
from vllm.tokenizers.detokenizer_utils import convert_ids_list_to_tokens
tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py
+1
-1
@@ -18,7 +18,7 @@ from einops import rearrange
18
from terratorch.datamodules import Sen1Floods11NonGeoDataModule
19
20
from vllm.config import VllmConfig
21
-from vllm.inputs.data import PromptType
21
+from vllm.inputs import PromptType
22
from vllm.logger import init_logger
23
from vllm.outputs import PoolingRequestOutput
24
from vllm.plugins.io_processors.interface import IOProcessor
tests/plugins_tests/test_io_processor_plugins.py
+1
-1
@@ -6,7 +6,7 @@ from unittest.mock import MagicMock, patch
6
import pytest
7
8
from vllm.config import VllmConfig
9
-from vllm.inputs.data import PromptType
9
+from vllm.inputs import PromptType
10
from vllm.outputs import PoolingRequestOutput
11
from vllm.plugins.io_processors import get_io_processor
12
from vllm.plugins.io_processors.interface import IOProcessor
tests/renderers/inputs/test_preprocess.py
+2
-2
@@ -15,13 +15,13 @@ def test_text_input():
15
assert prompt_to_seq(["foo", "bar"]) == ["foo", "bar"]
16
17
18
-def test_token_input():
18
+def test_tokens_input():
19
assert prompt_to_seq([1, 2]) == [[1, 2]]
20
assert prompt_to_seq([[1, 2]]) == [[1, 2]]
21
assert prompt_to_seq([[1, 2], [3, 4]]) == [[1, 2], [3, 4]]
22
23
24
-def test_text_token_input():
24
+def test_text_tokens_input():
25
assert prompt_to_seq([[1, 2], "foo"]) == [[1, 2], "foo"]
26
assert prompt_to_seq(["foo", [1, 2]]) == ["foo", [1, 2]]
27
tests/renderers/test_completions.py
+2
-2
@@ -129,7 +129,7 @@ class TestValidatePrompt:
129
130
131
class TestRenderPrompt:
132
- def test_token_input(self):
132
+ def test_tokens_input(self):
133
renderer = _build_renderer(MockModelConfig())
134
135
tokens = [101, 7592, 2088]
@@ -339,7 +339,7 @@ class TestRenderPrompt:
339
TokenizeParams(max_total_tokens=100),
340
)
341
342
- def test_token_input_with_needs_detokenization(self):
342
+ def test_tokens_input_with_needs_detokenization(self):
343
renderer = _build_renderer(MockModelConfig())
344
345
tokens = [1, 2, 3, 4]
tests/v1/shutdown/test_processor_error.py
+1
-1
@@ -9,7 +9,7 @@ import pytest
9
from tests.v1.shutdown.utils import SHUTDOWN_TEST_TIMEOUT_SEC
10
from vllm import SamplingParams
11
from vllm.engine.arg_utils import AsyncEngineArgs
12
-from vllm.inputs.data import TokensPrompt
12
+from vllm.inputs import TokensPrompt
13
from vllm.sampling_params import RequestOutputKind
14
from vllm.v1.engine.async_llm import AsyncLLM
15
from vllm.v1.engine.exceptions import EngineGenerateError
vllm/beam_search.py
+18
-13
@@ -3,11 +3,16 @@
3
4
from dataclasses import dataclass
5
6
-from vllm.inputs import EncoderDecoderInputs, TokenInputs, token_inputs
7
-from vllm.inputs.data import DecoderInputs
6
+from vllm.inputs import (
7
+ DecoderOnlyEngineInput,
8
+ EncoderDecoderInput,
9
+ MultiModalInput,
10
+ TokensInput,
11
+ mm_input,
12
+ tokens_input,
13
+)
14
from vllm.logprobs import Logprob
15
from vllm.lora.request import LoRARequest
10
-from vllm.multimodal.inputs import MultiModalInputs, mm_inputs
16
17
18
@dataclass
@@ -18,7 +23,7 @@ class BeamSearchSequence:
23
about to be returned to the user.
24
"""
25
21
- orig_prompt: TokenInputs | MultiModalInputs | EncoderDecoderInputs
26
+ orig_prompt: TokensInput | MultiModalInput | EncoderDecoderInput
27
28
# NOTE: Tokens represents decoder tokens in the encoder / decoder case
29
tokens: list[int]
@@ -40,13 +45,13 @@ class BeamSearchSequence:
45
cache_salt = prompt.get("cache_salt")
46
47
if prompt["type"] == "token":
43
- return token_inputs(
48
+ return tokens_input(
49
self.tokens,
50
prompt=prompt_text,
51
cache_salt=cache_salt,
52
)
53
49
- return mm_inputs(
54
+ return mm_input(
55
prompt_token_ids=self.tokens,
56
mm_kwargs=prompt["mm_kwargs"],
57
mm_hashes=prompt["mm_hashes"],
@@ -56,8 +61,8 @@ class BeamSearchSequence:
61
)
62
63
def _build_encoder_decoder_inputs(
59
- self, prompt: EncoderDecoderInputs
60
- ) -> EncoderDecoderInputs:
64
+ self, prompt: EncoderDecoderInput
65
+ ) -> EncoderDecoderInput:
66
"""Rebuild the encoder-decoder inputs with the current beam search
67
sequence's tokens.
68
@@ -70,9 +75,9 @@ class BeamSearchSequence:
75
76
# Rebuild decoder prompt with updated tokens,
77
# but keep everything else the same.
73
- new_dec_prompt: DecoderInputs
78
+ new_dec_prompt: DecoderOnlyEngineInput
79
if dec_prompt["type"] == "multimodal":
75
- new_dec_prompt = mm_inputs(
80
+ new_dec_prompt = mm_input(
81
self.tokens,
82
mm_kwargs=dec_prompt["mm_kwargs"],
83
mm_hashes=dec_prompt["mm_hashes"],
@@ -81,13 +86,13 @@ class BeamSearchSequence:
86
cache_salt=dec_prompt.get("cache_salt"),
87
)
88
else:
84
- new_dec_prompt = token_inputs(
89
+ new_dec_prompt = tokens_input(
90
self.tokens,
91
prompt=dec_prompt.get("prompt"),
92
cache_salt=dec_prompt.get("cache_salt"),
93
)
94
90
- return EncoderDecoderInputs(
95
+ return EncoderDecoderInput(
96
type="enc_dec",
97
encoder_prompt=prompt["encoder_prompt"],
98
decoder_prompt=new_dec_prompt,
@@ -107,7 +112,7 @@ class BeamSearchOutput:
112
class BeamSearchInstance:
113
def __init__(
114
self,
110
- prompt: TokenInputs | MultiModalInputs | EncoderDecoderInputs,
115
+ prompt: TokensInput | MultiModalInput | EncoderDecoderInput,
116
lora_request: LoRARequest | None = None,
117
logprobs: list[dict[int, Logprob]] | None = None,
118
**kwargs,
vllm/benchmarks/datasets.py
+1
-1
@@ -35,9 +35,9 @@ from huggingface_hub import snapshot_download
35
from PIL import Image
36
from typing_extensions import deprecated
37
38
+from vllm.inputs import MultiModalDataDict
39
from vllm.lora.request import LoRARequest
40
from vllm.lora.utils import get_adapter_absolute_path
40
-from vllm.multimodal import MultiModalDataDict
41
from vllm.multimodal.audio import get_audio_duration
42
from vllm.multimodal.image import convert_image_mode
43
from vllm.tokenizers import TokenizerLike
vllm/engine/protocol.py
+4
-4
@@ -11,7 +11,7 @@ from vllm.distributed.weight_transfer.base import (
11
WeightTransferInitRequest,
12
WeightTransferUpdateRequest,
13
)
14
-from vllm.inputs.data import ProcessorInputs, PromptType
14
+from vllm.inputs import EngineInput, PromptType
15
from vllm.lora.request import LoRARequest
16
from vllm.outputs import PoolingRequestOutput, RequestOutput
17
from vllm.plugins.io_processors import IOProcessor
@@ -34,7 +34,7 @@ class StreamingInput:
34
where inputs are provided via an async generator.
35
"""
36
37
- prompt: ProcessorInputs
37
+ prompt: EngineInput
38
sampling_params: SamplingParams | None = None
39
40
@@ -68,7 +68,7 @@ class EngineClient(ABC):
68
self,
69
prompt: EngineCoreRequest
70
| PromptType
71
- | ProcessorInputs
71
+ | EngineInput
72
| AsyncGenerator[StreamingInput, None],
73
sampling_params: SamplingParams,
74
request_id: str,
@@ -87,7 +87,7 @@ class EngineClient(ABC):
87
@abstractmethod
88
def encode(
89
self,
90
- prompt: PromptType | ProcessorInputs,
90
+ prompt: PromptType | EngineInput,
91
pooling_params: PoolingParams,
92
request_id: str,
93
lora_request: LoRARequest | None = None,
vllm/entrypoints/anthropic/serving.py
+4
-4
@@ -797,12 +797,12 @@ class AnthropicServingMessages(OpenAIServingChat):
797
if isinstance(result, ErrorResponse):
798
return result
799
800
- _, engine_prompts = result
800
+ _, engine_inputs = result
801
802
input_tokens = sum( # type: ignore
803
- len(prompt["prompt_token_ids"]) # type: ignore[typeddict-item, misc]
804
- for prompt in engine_prompts
805
- if "prompt_token_ids" in prompt
803
+ len(engine_input["prompt_token_ids"]) # type: ignore[typeddict-item, misc]
804
+ for engine_input in engine_inputs
805
+ if "prompt_token_ids" in engine_input
806
)
807
808
response = AnthropicCountTokensResponse(
vllm/entrypoints/chat_utils.py
+2
-1
@@ -40,9 +40,10 @@ from typing_extensions import Required, TypedDict
40
41
from vllm import envs
42
from vllm.config import ModelConfig
43
+from vllm.inputs import MultiModalDataDict, MultiModalUUIDDict
44
from vllm.logger import init_logger
45
from vllm.model_executor.models import SupportsMultiModal
45
-from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalDataDict, MultiModalUUIDDict
46
+from vllm.multimodal import MULTIMODAL_REGISTRY
47
from vllm.multimodal.inputs import (
48
MultiModalBatchedField,
49
MultiModalFlatField,
vllm/entrypoints/llm.py
+22
-22
@@ -57,9 +57,9 @@ from vllm.entrypoints.pooling.score.utils import (
57
validate_score_input,
58
)
59
from vllm.entrypoints.utils import log_non_default_args
60
-from vllm.inputs.data import (
60
+from vllm.inputs import (
61
DataPrompt,
62
- ProcessorInputs,
62
+ EngineInput,
63
PromptType,
64
SingletonPrompt,
65
TextPrompt,
@@ -589,7 +589,7 @@ class LLM:
589
590
def _resolve_mm_lora(
591
self,
592
- prompt: ProcessorInputs,
592
+ prompt: EngineInput,
593
lora_request: LoRARequest | None,
594
) -> LoRARequest | None:
595
if prompt["type"] != "multimodal":
@@ -716,8 +716,8 @@ class LLM:
716
eos_token_id = tokenizer.eos_token_id
717
sort_beams_key = create_sort_beams_key_function(eos_token_id, length_penalty)
718
719
- engine_prompts = self._preprocess_cmpl(prompts)
720
- lora_requests = self._lora_request_to_seq(lora_request, len(engine_prompts))
719
+ engine_inputs = self._preprocess_cmpl(prompts)
720
+ lora_requests = self._lora_request_to_seq(lora_request, len(engine_inputs))
721
722
if use_tqdm and concurrency_limit is not None:
723
logger.warning(
@@ -727,7 +727,7 @@ class LLM:
727
use_tqdm = False
728
729
if concurrency_limit is None:
730
- concurrency_limit = len(engine_prompts)
730
+ concurrency_limit = len(engine_inputs)
731
732
# generate 2 * beam_width candidates at each step
733
# following the huggingface transformers implementation
@@ -740,7 +740,7 @@ class LLM:
740
)
741
instances: list[BeamSearchInstance] = []
742
743
- for lora_req, prompt in zip(lora_requests, engine_prompts):
743
+ for lora_req, prompt in zip(lora_requests, engine_inputs):
744
if prompt["type"] == "embeds":
745
raise NotImplementedError(
746
"Embedding prompt not supported for beam search"
@@ -845,7 +845,7 @@ class LLM:
845
self,
846
prompts: Sequence[PromptType],
847
tokenization_kwargs: dict[str, Any] | None = None,
848
- ) -> Sequence[ProcessorInputs]:
848
+ ) -> Sequence[EngineInput]:
849
"""
850
Convert prompt inputs from LLM APIs (other than [LLM.chat][]) into
851
a format that can be passed to `_add_request`.
@@ -853,7 +853,7 @@ class LLM:
853
Refer to [LLM.generate][] for a complete description of the arguments.
854
855
Returns:
856
- A list of `ProcessorInputs` objects ready to be passed into LLMEngine.
856
+ A list of `EngineInput` objects ready to be passed into LLMEngine.
857
"""
858
renderer = self.renderer
859
model_config = self.model_config
@@ -871,9 +871,9 @@ class LLM:
871
self,
872
prompt: PromptType,
873
tokenization_kwargs: dict[str, Any] | None = None,
874
- ) -> ProcessorInputs:
875
- (engine_prompt,) = self._preprocess_cmpl([prompt], tokenization_kwargs)
876
- return engine_prompt
874
+ ) -> EngineInput:
875
+ (engine_input,) = self._preprocess_cmpl([prompt], tokenization_kwargs)
876
+ return engine_input
877
878
def _preprocess_chat(
879
self,
@@ -886,7 +886,7 @@ class LLM:
886
tools: list[dict[str, Any]] | None = None,
887
tokenization_kwargs: dict[str, Any] | None = None,
888
mm_processor_kwargs: dict[str, Any] | None = None,
889
- ) -> Sequence[ProcessorInputs]:
889
+ ) -> Sequence[EngineInput]:
890
"""
891
Convert a list of conversations into prompts so that they can then
892
be used as input for other LLM APIs.
@@ -894,7 +894,7 @@ class LLM:
894
Refer to [LLM.chat][] for a complete description of the arguments.
895
896
Returns:
897
- A list of `ProcessorInputs` objects ready to be passed into LLMEngine.
897
+ A list of `EngineInput` objects ready to be passed into LLMEngine.
898
"""
899
renderer = self.renderer
900
@@ -915,14 +915,14 @@ class LLM:
915
**(tokenization_kwargs or {})
916
)
917
918
- _, engine_prompts = renderer.render_chat(
918
+ _, engine_inputs = renderer.render_chat(
919
conversations,
920
chat_params,
921
tok_params,
922
prompt_extras={"mm_processor_kwargs": mm_processor_kwargs},
923
)
924
925
- return engine_prompts
925
+ return engine_inputs
926
927
def _preprocess_chat_one(
928
self,
@@ -935,8 +935,8 @@ class LLM:
935
tools: list[dict[str, Any]] | None = None,
936
tokenization_kwargs: dict[str, Any] | None = None,
937
mm_processor_kwargs: dict[str, Any] | None = None,
938
- ) -> ProcessorInputs:
939
- (engine_prompt,) = self._preprocess_chat(
938
+ ) -> EngineInput:
939
+ (engine_input,) = self._preprocess_chat(
940
[conversation],
941
chat_template=chat_template,
942
chat_template_content_format=chat_template_content_format,
@@ -948,7 +948,7 @@ class LLM:
948
mm_processor_kwargs=mm_processor_kwargs,
949
)
950
951
- return engine_prompt
951
+ return engine_input
952
953
def chat(
954
self,
@@ -1909,7 +1909,7 @@ class LLM:
1909
1910
def _render_and_run_requests(
1911
self,
1912
- prompts: Iterable[ProcessorInputs],
1912
+ prompts: Iterable[EngineInput],
1913
params: Sequence[SamplingParams | PoolingParams],
1914
output_type: type[_O],
1915
*,
@@ -1938,7 +1938,7 @@ class LLM:
1938
1939
def _render_and_add_requests(
1940
self,
1941
- prompts: Iterable[ProcessorInputs],
1941
+ prompts: Iterable[EngineInput],
1942
params: Sequence[SamplingParams | PoolingParams],
1943
*,
1944
lora_requests: Sequence[LoRARequest | None] | None = None,
@@ -1967,7 +1967,7 @@ class LLM:
1967
1968
def _add_request(
1969
self,
1970
- prompt: ProcessorInputs,
1970
+ prompt: EngineInput,
1971
params: SamplingParams | PoolingParams,
1972
lora_request: LoRARequest | None = None,
1973
priority: int = 0,
vllm/entrypoints/openai/chat_completion/serving.py
+11
-11
@@ -63,7 +63,7 @@ from vllm.entrypoints.openai.parser.harmony_utils import (
63
)
64
from vllm.entrypoints.openai.utils import maybe_filter_parallel_tool_calls
65
from vllm.entrypoints.utils import get_max_tokens, should_include_usage
66
-from vllm.inputs.data import ProcessorInputs
66
+from vllm.inputs import EngineInput
67
from vllm.logger import init_logger
68
from vllm.logprobs import Logprob
69
from vllm.outputs import CompletionOutput, RequestOutput
@@ -177,7 +177,7 @@ class OpenAIServingChat(OpenAIServing):
177
async def render_chat_request(
178
self,
179
request: ChatCompletionRequest,
180
- ) -> tuple[list[ConversationMessage], list[ProcessorInputs]] | ErrorResponse:
180
+ ) -> tuple[list[ConversationMessage], list[EngineInput]] | ErrorResponse:
181
"""
182
Validate the model and preprocess a chat completion request.
183
@@ -185,7 +185,7 @@ class OpenAIServingChat(OpenAIServing):
185
engine-aware checks (LoRA model validation, engine health).
186
187
Returns:
188
- A tuple of (conversation, engine_prompts) on success,
188
+ A tuple of (conversation, engine_inputs) on success,
189
or an ErrorResponse on failure.
190
"""
191
error_check_ret = await self._check_model(request)
@@ -231,7 +231,7 @@ class OpenAIServingChat(OpenAIServing):
231
if isinstance(result, ErrorResponse):
232
return result
233
234
- conversation, engine_prompts = result
234
+ conversation, engine_inputs = result
235
236
request_id = (
237
f"chatcmpl-{self._base_request_id(raw_request, request.request_id)}"
@@ -251,13 +251,13 @@ class OpenAIServingChat(OpenAIServing):
251
# Schedule the request and get the result generator.
252
max_model_len = self.model_config.max_model_len
253
generators: list[AsyncGenerator[RequestOutput, None]] = []
254
- for i, engine_prompt in enumerate(engine_prompts):
255
- prompt_token_ids = self._extract_prompt_components(engine_prompt).token_ids
254
+ for i, engine_input in enumerate(engine_inputs):
255
+ prompt_token_ids = self._extract_prompt_components(engine_input).token_ids
256
257
# If we are creating sub requests for multiple prompts, ensure that they
258
# have unique request ids.
259
sub_request_id = (
260
- request_id if len(engine_prompts) == 1 else f"{request_id}_{i}"
260
+ request_id if len(engine_inputs) == 1 else f"{request_id}_{i}"
261
)
262
263
max_tokens = get_max_tokens(
@@ -265,7 +265,7 @@ class OpenAIServingChat(OpenAIServing):
265
request.max_completion_tokens
266
if request.max_completion_tokens is not None
267
else request.max_tokens,
268
- self._extract_prompt_len(engine_prompt),
268
+ self._extract_prompt_len(engine_input),
269
self.default_sampling_params,
270
self.override_max_tokens,
271
)
@@ -283,7 +283,7 @@ class OpenAIServingChat(OpenAIServing):
283
284
self._log_inputs(
285
sub_request_id,
286
- engine_prompt,
286
+ engine_input,
287
params=sampling_params,
288
lora_request=lora_request,
289
)
@@ -296,7 +296,7 @@ class OpenAIServingChat(OpenAIServing):
296
297
if isinstance(sampling_params, BeamSearchParams):
298
generator = self.beam_search(
299
- prompt=engine_prompt,
299
+ prompt=engine_input,
300
request_id=sub_request_id,
301
params=sampling_params,
302
lora_request=lora_request,
@@ -313,7 +313,7 @@ class OpenAIServingChat(OpenAIServing):
313
reasoning_ended = None
314
315
generator = self.engine_client.generate(
316
- engine_prompt,
316
+ engine_input,
317
sampling_params,
318
sub_request_id,
319
lora_request=lora_request,
vllm/entrypoints/openai/completion/serving.py
+15
-17
@@ -33,7 +33,7 @@ from vllm.entrypoints.openai.engine.serving import (
33
from vllm.entrypoints.openai.models.serving import OpenAIServingModels
34
from vllm.entrypoints.utils import get_max_tokens, should_include_usage
35
from vllm.exceptions import VLLMValidationError
36
-from vllm.inputs.data import ProcessorInputs
36
+from vllm.inputs import EngineInput
37
from vllm.logger import init_logger
38
from vllm.logprobs import Logprob
39
from vllm.outputs import RequestOutput
@@ -82,7 +82,7 @@ class OpenAIServingCompletion(OpenAIServing):
82
async def render_completion_request(
83
self,
84
request: CompletionRequest,
85
- ) -> list[ProcessorInputs] | ErrorResponse:
85
+ ) -> list[EngineInput] | ErrorResponse:
86
"""
87
Validate the model and preprocess a completion request.
88
@@ -90,8 +90,7 @@ class OpenAIServingCompletion(OpenAIServing):
90
engine-aware checks (LoRA model validation, engine health).
91
92
Returns:
93
- A list of engine_prompts on success,
94
- or an ErrorResponse on failure.
93
+ A list of engine_inputs on success, or an ErrorResponse on failure.
94
"""
95
error_check_ret = await self._check_model(request)
96
if error_check_ret is not None:
@@ -128,7 +127,7 @@ class OpenAIServingCompletion(OpenAIServing):
127
if isinstance(result, ErrorResponse):
128
return result
129
131
- engine_prompts = result
130
+ engine_inputs = result
131
132
request_id = f"cmpl-{self._base_request_id(raw_request, request.request_id)}"
133
created_time = int(time.time())
@@ -145,11 +144,11 @@ class OpenAIServingCompletion(OpenAIServing):
144
# Schedule the request and get the result generator.
145
max_model_len = self.model_config.max_model_len
146
generators: list[AsyncGenerator[RequestOutput, None]] = []
148
- for i, engine_prompt in enumerate(engine_prompts):
147
+ for i, engine_input in enumerate(engine_inputs):
148
max_tokens = get_max_tokens(
149
max_model_len,
150
request.max_tokens,
152
- self._extract_prompt_len(engine_prompt),
151
+ self._extract_prompt_len(engine_input),
152
self.default_sampling_params,
153
self.override_max_tokens,
154
)
@@ -169,7 +168,7 @@ class OpenAIServingCompletion(OpenAIServing):
168
169
self._log_inputs(
170
request_id_item,
172
- engine_prompt,
171
+ engine_input,
172
params=sampling_params,
173
lora_request=lora_request,
174
)
@@ -182,7 +181,7 @@ class OpenAIServingCompletion(OpenAIServing):
181
182
if isinstance(sampling_params, BeamSearchParams):
183
generator = self.beam_search(
185
- prompt=engine_prompt,
184
+ prompt=engine_input,
185
request_id=request_id,
186
params=sampling_params,
187
lora_request=lora_request,
@@ -190,7 +189,7 @@ class OpenAIServingCompletion(OpenAIServing):
189
)
190
else:
191
generator = self.engine_client.generate(
193
- engine_prompt,
192
+ engine_input,
193
sampling_params,
194
request_id_item,
195
lora_request=lora_request,
@@ -204,7 +203,7 @@ class OpenAIServingCompletion(OpenAIServing):
203
result_generator = merge_async_iterators(*generators)
204
205
model_name = self.models.model_name(lora_request)
207
- num_prompts = len(engine_prompts)
206
+ num_prompts = len(engine_inputs)
207
208
# Streaming response
209
tokenizer = self.renderer.tokenizer
@@ -212,7 +211,7 @@ class OpenAIServingCompletion(OpenAIServing):
211
if request.stream:
212
return self.completion_stream_generator(
213
request,
215
- engine_prompts,
214
+ engine_inputs,
215
result_generator,
216
request_id,
217
created_time,
@@ -235,8 +234,7 @@ class OpenAIServingCompletion(OpenAIServing):
234
# We did not pass it into vLLM engine to avoid being redundant
235
# with the inputs token IDs
236
if final_res.prompt is None:
238
- engine_prompt = engine_prompts[i]
239
- final_res.prompt = self._extract_prompt_text(engine_prompt)
237
+ final_res.prompt = self._extract_prompt_text(engine_inputs[i])
238
239
final_res_batch_checked = cast(list[RequestOutput], final_res_batch)
240
@@ -268,7 +266,7 @@ class OpenAIServingCompletion(OpenAIServing):
266
async def completion_stream_generator(
267
self,
268
request: CompletionRequest,
271
- engine_prompts: list[ProcessorInputs],
269
+ engine_inputs: list[EngineInput],
270
result_generator: AsyncIterator[tuple[int, RequestOutput]],
271
request_id: str,
272
created_time: int,
@@ -301,8 +299,8 @@ class OpenAIServingCompletion(OpenAIServing):
299
300
prompt_text = res.prompt
301
if prompt_text is None:
304
- engine_prompt = engine_prompts[prompt_idx]
305
- prompt_text = self._extract_prompt_text(engine_prompt)
302
+ engine_input = engine_inputs[prompt_idx]
303
+ prompt_text = self._extract_prompt_text(engine_input)
304
305
# Prompt details are excluded from later streamed outputs
306
if prompt_token_ids is not None:
vllm/entrypoints/openai/engine/serving.py
+13
-17
@@ -72,11 +72,7 @@ from vllm.entrypoints.serve.tokenize.protocol import (
72
)
73
from vllm.entrypoints.utils import create_error_response
74
from vllm.exceptions import VLLMValidationError
75
-from vllm.inputs.data import (
76
- ProcessorInputs,
77
- PromptType,
78
- TokensPrompt,
79
-)
75
+from vllm.inputs import EngineInput, PromptType, TokensPrompt
76
from vllm.logger import init_logger
77
from vllm.logprobs import Logprob, PromptLogprobs
78
from vllm.lora.request import LoRARequest
@@ -163,7 +159,7 @@ class ServeContext(Generic[RequestT]):
159
request_id: str
160
created_time: int = field(default_factory=lambda: int(time.time()))
161
lora_request: LoRARequest | None = None
166
- engine_prompts: list[ProcessorInputs] | None = None
162
+ engine_inputs: list[EngineInput] | None = None
163
164
result_generator: AsyncGenerator[tuple[int, PoolingRequestOutput], None] | None = (
165
None
@@ -202,7 +198,7 @@ class OpenAIServing:
198
199
async def beam_search(
200
self,
205
- prompt: ProcessorInputs,
201
+ prompt: EngineInput,
202
request_id: str,
203
params: BeamSearchParams,
204
lora_request: LoRARequest | None = None,
@@ -493,21 +489,21 @@ class OpenAIServing:
489
if isinstance(pooling_params, ErrorResponse):
490
return pooling_params
491
496
- if ctx.engine_prompts is None:
492
+ if ctx.engine_inputs is None:
493
return self.create_error_response("Engine prompts not available")
494
499
- for i, engine_prompt in enumerate(ctx.engine_prompts):
495
+ for i, engine_input in enumerate(ctx.engine_inputs):
496
request_id_item = f"{ctx.request_id}-{i}"
497
498
self._log_inputs(
499
request_id_item,
504
- engine_prompt,
500
+ engine_input,
501
params=pooling_params,
502
lora_request=ctx.lora_request,
503
)
504
505
generator = self.engine_client.encode(
510
- engine_prompt,
506
+ engine_input,
507
pooling_params,
508
request_id_item,
509
lora_request=ctx.lora_request,
@@ -526,10 +522,10 @@ class OpenAIServing:
522
ctx: ServeContext,
523
) -> ErrorResponse | None:
524
"""Collect batch results from the result generator."""
529
- if ctx.engine_prompts is None:
525
+ if ctx.engine_inputs is None:
526
return self.create_error_response("Engine prompts not available")
527
532
- num_prompts = len(ctx.engine_prompts)
528
+ num_prompts = len(ctx.engine_inputs)
529
final_res_batch: list[PoolingRequestOutput | None]
530
final_res_batch = [None] * num_prompts
531
@@ -806,19 +802,19 @@ class OpenAIServing:
802
# Apply server defaults first, then request kwargs override.
803
return default_chat_template_kwargs | request_chat_template_kwargs
804
809
- def _extract_prompt_components(self, prompt: PromptType | ProcessorInputs):
805
+ def _extract_prompt_components(self, prompt: PromptType | EngineInput):
806
return extract_prompt_components(self.model_config, prompt)
807
812
- def _extract_prompt_text(self, prompt: ProcessorInputs):
808
+ def _extract_prompt_text(self, prompt: PromptType | EngineInput):
809
return self._extract_prompt_components(prompt).text
810
815
- def _extract_prompt_len(self, prompt: ProcessorInputs):
811
+ def _extract_prompt_len(self, prompt: EngineInput):
812
return extract_prompt_len(self.model_config, prompt)
813
814
def _log_inputs(
815
self,
816
request_id: str,
821
- inputs: PromptType | ProcessorInputs,
817
+ inputs: PromptType | EngineInput,
818
params: SamplingParams | PoolingParams | BeamSearchParams | None,
819
lora_request: LoRARequest | None,
820
) -> None:
vllm/entrypoints/openai/realtime/serving.py
+3
-3
@@ -12,7 +12,7 @@ from vllm.engine.protocol import EngineClient, StreamingInput
12
from vllm.entrypoints.logger import RequestLogger
13
from vllm.entrypoints.openai.engine.serving import OpenAIServing
14
from vllm.entrypoints.openai.models.serving import OpenAIServingModels
15
-from vllm.inputs.data import PromptType
15
+from vllm.inputs import PromptType
16
from vllm.logger import init_logger
17
from vllm.model_executor.models.interfaces import SupportsRealtime
18
from vllm.renderers.inputs.preprocess import parse_model_prompt
@@ -83,6 +83,6 @@ class OpenAIServingRealtime(OpenAIServing):
83
84
async for prompt in stream_input_iter:
85
parsed_prompt = parse_model_prompt(model_config, prompt)
86
- (engine_prompt,) = await renderer.render_cmpl_async([parsed_prompt])
86
+ (engine_input,) = await renderer.render_cmpl_async([parsed_prompt])
87
88
- yield StreamingInput(prompt=engine_prompt)
88
+ yield StreamingInput(prompt=engine_input)
vllm/entrypoints/openai/responses/serving.py
+22
-26
@@ -110,7 +110,7 @@ from vllm.entrypoints.openai.responses.utils import (
110
from vllm.entrypoints.serve.render.serving import OpenAIServingRender
111
from vllm.entrypoints.utils import get_max_tokens
112
from vllm.exceptions import VLLMValidationError
113
-from vllm.inputs.data import ProcessorInputs, token_inputs
113
+from vllm.inputs import EngineInput, tokens_input
114
from vllm.logger import init_logger
115
from vllm.logprobs import Logprob as SampleLogprob
116
from vllm.logprobs import SampleLogprobs
@@ -269,10 +269,10 @@ class OpenAIServingResponses(OpenAIServing):
269
270
def _validate_generator_input(
271
self,
272
- engine_prompt: ProcessorInputs,
272
+ engine_input: EngineInput,
273
) -> ErrorResponse | None:
274
"""Add validations to the input to the generator here."""
275
- prompt_len = self._extract_prompt_len(engine_prompt)
275
+ prompt_len = self._extract_prompt_len(engine_input)
276
max_model_len = self.model_config.max_model_len
277
278
if prompt_len >= max_model_len:
@@ -369,11 +369,11 @@ class OpenAIServingResponses(OpenAIServing):
369
model_name = self.models.model_name(lora_request)
370
371
if self.use_harmony:
372
- messages, engine_prompts = self._make_request_with_harmony(
372
+ messages, engine_inputs = self._make_request_with_harmony(
373
request, prev_response
374
)
375
else:
376
- messages, engine_prompts = await self._make_request(request, prev_response)
376
+ messages, engine_inputs = await self._make_request(request, prev_response)
377
378
request_metadata = RequestResponseMetadata(request_id=request.request_id)
379
if raw_request:
@@ -413,15 +413,15 @@ class OpenAIServingResponses(OpenAIServing):
413
available_tools = []
414
tokenizer = self.renderer.get_tokenizer()
415
416
- for engine_prompt in engine_prompts:
417
- maybe_error = self._validate_generator_input(engine_prompt)
416
+ for engine_input in engine_inputs:
417
+ maybe_error = self._validate_generator_input(engine_input)
418
if maybe_error is not None:
419
return maybe_error
420
421
default_max_tokens = get_max_tokens(
422
max_model_len,
423
request.max_output_tokens,
424
- self._extract_prompt_len(engine_prompt),
424
+ self._extract_prompt_len(engine_input),
425
self.default_sampling_params,
426
self.override_max_tokens,
427
)
@@ -480,7 +480,7 @@ class OpenAIServingResponses(OpenAIServing):
480
)
481
generator = self._generate_with_builtin_tools(
482
request_id=request.request_id,
483
- engine_prompt=engine_prompt,
483
+ engine_input=engine_input,
484
sampling_params=sampling_params,
485
context=context,
486
lora_request=lora_request,
@@ -586,7 +586,7 @@ class OpenAIServingResponses(OpenAIServing):
586
prev_response_output=prev_response.output if prev_response else None,
587
)
588
589
- _, engine_prompts = await self.openai_serving_render.preprocess_chat(
589
+ _, engine_inputs = await self.openai_serving_render.preprocess_chat(
590
request,
591
messages,
592
default_template=self.chat_template,
@@ -595,7 +595,7 @@ class OpenAIServingResponses(OpenAIServing):
595
tool_dicts=tool_dicts,
596
tool_parser=self.parser.tool_parser_cls if self.parser else None,
597
)
598
- return messages, engine_prompts
598
+ return messages, engine_inputs
599
600
async def _render_next_turn(
601
self,
@@ -610,7 +610,7 @@ class OpenAIServingResponses(OpenAIServing):
610
request_input=messages,
611
)
612
613
- _, engine_prompts = await self.openai_serving_render.preprocess_chat(
613
+ _, engine_inputs = await self.openai_serving_render.preprocess_chat(
614
request,
615
new_messages,
616
default_template=chat_template,
@@ -619,12 +619,12 @@ class OpenAIServingResponses(OpenAIServing):
619
tool_dicts=tool_dicts,
620
tool_parser=tool_parser,
621
)
622
- return engine_prompts
622
+ return engine_inputs
623
624
async def _generate_with_builtin_tools(
625
self,
626
request_id: str,
627
- engine_prompt: ProcessorInputs,
627
+ engine_input: EngineInput,
628
sampling_params: SamplingParams,
629
context: ConversationContext,
630
lora_request: LoRARequest | None = None,
@@ -641,13 +641,13 @@ class OpenAIServingResponses(OpenAIServing):
641
642
self._log_inputs(
643
sub_request_id,
644
- engine_prompt,
644
+ engine_input,
645
params=sampling_params,
646
lora_request=lora_request,
647
)
648
649
generator = self.engine_client.generate(
650
- engine_prompt,
650
+ engine_input,
651
sampling_params,
652
sub_request_id,
653
lora_request=lora_request,
@@ -675,11 +675,11 @@ class OpenAIServingResponses(OpenAIServing):
675
# Render the next prompt token ids and update sampling_params.
676
if isinstance(context, (HarmonyContext, StreamingHarmonyContext)):
677
token_ids = context.render_for_completion()
678
- engine_prompt = token_inputs(token_ids)
678
+ engine_input = tokens_input(token_ids)
679
680
sampling_params.max_tokens = max_model_len - len(token_ids)
681
elif isinstance(context, ParsableContext):
682
- (engine_prompt,) = await self._render_next_turn(
682
+ (engine_input,) = await self._render_next_turn(
683
context.request,
684
context.parser.response_messages,
685
context.tool_dicts,
@@ -691,7 +691,7 @@ class OpenAIServingResponses(OpenAIServing):
691
sampling_params.max_tokens = get_max_tokens(
692
max_model_len,
693
context.request.max_output_tokens,
694
- self._extract_prompt_len(engine_prompt),
694
+ self._extract_prompt_len(engine_input),
695
self.default_sampling_params, # type: ignore
696
self.override_max_tokens, # type: ignore
697
)
@@ -713,14 +713,10 @@ class OpenAIServingResponses(OpenAIServing):
713
arrival_time = time.time()
714
messages = self._construct_input_messages_with_harmony(request, prev_response)
715
prompt_token_ids = render_for_completion(messages)
716
- engine_prompt = token_inputs(prompt_token_ids)
717
- engine_prompt["arrival_time"] = arrival_time
716
+ engine_input = tokens_input(prompt_token_ids, cache_salt=request.cache_salt)
717
+ engine_input["arrival_time"] = arrival_time
718
719
- # Add cache_salt if provided in the request
720
- if request.cache_salt is not None:
721
- engine_prompt["cache_salt"] = request.cache_salt
722
-
723
- return messages, [engine_prompt]
719
+ return messages, [engine_input]
720
721
async def _initialize_tool_sessions(
722
self,
vllm/entrypoints/openai/speech_to_text/speech_to_text.py
+17
-16
@@ -38,7 +38,7 @@ from vllm.entrypoints.openai.speech_to_text.protocol import (
38
)
39
from vllm.entrypoints.utils import get_max_tokens
40
from vllm.exceptions import VLLMValidationError
41
-from vllm.inputs import EncoderDecoderInputs, ProcessorInputs
41
+from vllm.inputs import EncoderDecoderInput, EngineInput
42
from vllm.logger import init_logger
43
from vllm.logprobs import FlatLogprobs, Logprob
44
from vllm.model_executor.models import SupportsTranscription
@@ -171,7 +171,7 @@ class OpenAISpeechToText(OpenAIServing):
171
request: SpeechToTextRequest,
172
audio_data: bytes,
173
request_id: str,
174
- ) -> tuple[list[ProcessorInputs], float]:
174
+ ) -> tuple[list[EngineInput], float]:
175
# Validate request
176
language = self.model_cls.validate_language(request.language)
177
# Skip to_language validation to avoid extra logging for Whisper.
@@ -250,9 +250,9 @@ class OpenAISpeechToText(OpenAIServing):
250
251
parsed_prompts.append(parsed_prompt)
252
253
- engine_prompts = await self.renderer.render_cmpl_async(parsed_prompts)
253
+ engine_inputs = await self.renderer.render_cmpl_async(parsed_prompts)
254
255
- return engine_prompts, duration
255
+ return engine_inputs, duration
256
257
def _preprocess_verbose_prompt(self, prompt: EncoderDecoderDictPrompt):
258
dec_prompt = prompt["decoder_prompt"]
@@ -271,7 +271,7 @@ class OpenAISpeechToText(OpenAIServing):
271
return prompt
272
273
@staticmethod
274
- def _get_decoder_prompt_len(engine_prompts: list[ProcessorInputs]) -> int:
274
+ def _get_decoder_prompt_len(engine_inputs: list[EngineInput]) -> int:
275
"""Get the length of the decoder prompt. Currently we need to offset
276
by the decoder prompt length when running beam search because the mm
277
encoder is not currently cached and runs on decode calls; because of
@@ -282,12 +282,13 @@ class OpenAISpeechToText(OpenAIServing):
282
encoder/decoder caching is implemented.
283
"""
284
input_len = 0
285
- assert len(engine_prompts) > 0
286
- first_eng_prompt = engine_prompts[0]
285
+ assert len(engine_inputs) > 0
286
+ first_input = engine_inputs[0]
287
+
288
+ if first_input.get("type") == "enc_dec":
289
+ first_input = cast(EncoderDecoderInput, first_input)
290
+ input_len = len(first_input["decoder_prompt"]["prompt_token_ids"])
291
288
- if first_eng_prompt.get("type") == "enc_dec":
289
- first_eng_prompt = cast(EncoderDecoderInputs, first_eng_prompt)
290
- input_len = len(first_eng_prompt["decoder_prompt"]["prompt_token_ids"])
292
return input_len
293
294
def _get_verbose_segments(
@@ -409,7 +410,7 @@ class OpenAISpeechToText(OpenAIServing):
410
411
lora_request = self._maybe_get_adapters(request)
412
412
- engine_prompts, duration_s = await self._preprocess_speech_to_text(
413
+ engine_inputs, duration_s = await self._preprocess_speech_to_text(
414
request=request,
415
audio_data=audio_data,
416
request_id=request_id,
@@ -420,7 +421,7 @@ class OpenAISpeechToText(OpenAIServing):
421
list_result_generator: list[AsyncGenerator[RequestOutput, None]] | None = None
422
423
input_len = (
423
- OpenAISpeechToText._get_decoder_prompt_len(engine_prompts)
424
+ OpenAISpeechToText._get_decoder_prompt_len(engine_inputs)
425
if request.use_beam_search
426
else 0
427
)
@@ -450,12 +451,12 @@ class OpenAISpeechToText(OpenAIServing):
451
sampling_params.logprobs = 1
452
453
list_result_generator = []
453
- for i, engine_prompt in enumerate(engine_prompts):
454
+ for i, engine_input in enumerate(engine_inputs):
455
request_id_item = f"{request_id}_{i}"
456
457
self._log_inputs(
458
request_id_item,
458
- engine_prompt,
459
+ engine_input,
460
params=sampling_params,
461
lora_request=lora_request,
462
)
@@ -468,7 +469,7 @@ class OpenAISpeechToText(OpenAIServing):
469
470
if isinstance(sampling_params, BeamSearchParams):
471
generator = self.beam_search(
471
- prompt=engine_prompt,
472
+ prompt=engine_input,
473
params=sampling_params,
474
request_id=request_id_item,
475
lora_request=lora_request,
@@ -476,7 +477,7 @@ class OpenAISpeechToText(OpenAIServing):
477
)
478
else:
479
generator = self.engine_client.generate(
479
- engine_prompt,
480
+ engine_input,
481
sampling_params,
482
request_id_item,
483
lora_request=lora_request,
vllm/entrypoints/pooling/base/io_processor.py
+10
-10
@@ -18,7 +18,7 @@ from vllm.entrypoints.pooling.typing import (
18
PoolingCompletionLikeRequest,
19
PoolingServeContext,
20
)
21
-from vllm.inputs.data import ProcessorInputs, SingletonPrompt
21
+from vllm.inputs import EngineInput, SingletonPrompt
22
from vllm.renderers import BaseRenderer, merge_kwargs
23
from vllm.renderers.inputs.preprocess import parse_model_prompt, prompt_to_seq
24
from vllm.tool_parsers import ToolParser
@@ -60,7 +60,7 @@ class PoolingIOProcessor:
60
chat_template_kwargs=request.chat_template_kwargs,
61
trust_request_chat_template=self.trust_request_chat_template,
62
)
63
- _, engine_prompts = self._preprocess_chat_online(
63
+ _, engine_inputs = self._preprocess_chat_online(
64
request,
65
request.messages,
66
default_template=self.chat_template,
@@ -68,7 +68,7 @@ class PoolingIOProcessor:
68
default_template_kwargs=None,
69
)
70
elif isinstance(request, PoolingCompletionLikeRequest):
71
- engine_prompts = self._preprocess_completion_online(
71
+ engine_inputs = self._preprocess_completion_online(
72
request,
73
prompt_input=request.input,
74
prompt_embeds=None,
@@ -76,7 +76,7 @@ class PoolingIOProcessor:
76
else:
77
raise ValueError(f"Invalid {self.name} request type")
78
79
- ctx.engine_prompts = engine_prompts
79
+ ctx.engine_inputs = engine_inputs
80
81
async def pre_process_online_async(self, ctx: PoolingServeContext):
82
self.pre_process_online(ctx)
@@ -100,7 +100,7 @@ class PoolingIOProcessor:
100
self,
101
prompts: PromptType | Sequence[PromptType],
102
tokenization_kwargs: dict[str, Any] | None = None,
103
- ) -> Sequence[ProcessorInputs]:
103
+ ) -> Sequence[EngineInput]:
104
return self._preprocess_completion_offline(
105
prompts=prompts, tokenization_kwargs=tokenization_kwargs
106
)
@@ -128,7 +128,7 @@ class PoolingIOProcessor:
128
request: RendererRequest,
129
prompt_input: str | list[str] | list[int] | list[list[int]] | None,
130
prompt_embeds: bytes | list[bytes] | None,
131
- ) -> list[ProcessorInputs]:
131
+ ) -> list[EngineInput]:
132
renderer = self.renderer
133
model_config = self.model_config
134
@@ -167,7 +167,7 @@ class PoolingIOProcessor:
167
default_template_kwargs: dict[str, Any] | None,
168
tool_dicts: list[dict[str, Any]] | None = None,
169
tool_parser: type[ToolParser] | None = None,
170
- ) -> tuple[list[ConversationMessage], list[ProcessorInputs]]:
170
+ ) -> tuple[list[ConversationMessage], list[EngineInput]]:
171
renderer = self.renderer
172
173
default_template_kwargs = merge_kwargs(
@@ -188,7 +188,7 @@ class PoolingIOProcessor:
188
default_media_io_kwargs=(mm_config.media_io_kwargs if mm_config else None),
189
)
190
191
- (conversation,), (engine_prompt,) = renderer.render_chat(
191
+ (conversation,), (engine_input,) = renderer.render_chat(
192
[messages],
193
chat_params,
194
tok_params,
@@ -199,13 +199,13 @@ class PoolingIOProcessor:
199
},
200
)
201
202
- return conversation, [engine_prompt]
202
+ return conversation, [engine_input]
203
204
def _preprocess_completion_offline(
205
self,
206
prompts: PromptType | Sequence[PromptType],
207
tokenization_kwargs: dict[str, Any] | None = None,
208
- ) -> Sequence[ProcessorInputs]:
208
+ ) -> Sequence[EngineInput]:
209
renderer = self.renderer
210
model_config = self.model_config
211
vllm/entrypoints/pooling/base/serving.py
+8
-8
@@ -20,7 +20,7 @@ from vllm.entrypoints.openai.engine.protocol import ErrorResponse
20
from vllm.entrypoints.openai.models.serving import OpenAIServingModels
21
from vllm.entrypoints.pooling.typing import AnyPoolingRequest, PoolingServeContext
22
from vllm.exceptions import VLLMNotFoundError
23
-from vllm.inputs.data import ProcessorInputs
23
+from vllm.inputs import EngineInput
24
from vllm.lora.request import LoRARequest
25
from vllm.renderers.base import BaseRenderer
26
from vllm.renderers.inputs.preprocess import extract_prompt_components
@@ -106,7 +106,7 @@ class PoolingServing:
106
self,
107
ctx: PoolingServeContext,
108
):
109
- if ctx.engine_prompts is None:
109
+ if ctx.engine_inputs is None:
110
raise ValueError("Engine prompts not available")
111
112
generators: list[AsyncGenerator[PoolingRequestOutput, None]] = []
@@ -120,7 +120,7 @@ class PoolingServing:
120
pooling_params = self.io_processor.create_pooling_params(ctx.request)
121
pooling_params.verify(self.model_config)
122
123
- for i, engine_prompt in enumerate(ctx.engine_prompts):
123
+ for i, engine_input in enumerate(ctx.engine_inputs):
124
prompt_request_id = (
125
f"{ctx.request_id}-{i}"
126
if ctx.prompt_request_ids is None
@@ -129,13 +129,13 @@ class PoolingServing:
129
130
self._log_inputs(
131
prompt_request_id,
132
- engine_prompt,
132
+ engine_input,
133
params=pooling_params,
134
lora_request=ctx.lora_request,
135
)
136
137
generator = self.engine_client.encode(
138
- engine_prompt,
138
+ engine_input,
139
pooling_params,
140
prompt_request_id,
141
lora_request=ctx.lora_request,
@@ -151,13 +151,13 @@ class PoolingServing:
151
self,
152
ctx: PoolingServeContext,
153
):
154
- if ctx.engine_prompts is None:
154
+ if ctx.engine_inputs is None:
155
raise ValueError("Engine prompts not available")
156
157
if ctx.result_generator is None:
158
raise ValueError("Result generator not available")
159
160
- num_inputs = len(ctx.engine_prompts)
160
+ num_inputs = len(ctx.engine_inputs)
161
final_res_batch: list[PoolingRequestOutput | None]
162
final_res_batch = [None] * num_inputs
163
@@ -317,7 +317,7 @@ class PoolingServing:
317
def _log_inputs(
318
self,
319
request_id: str,
320
- inputs: ProcessorInputs,
320
+ inputs: EngineInput,
321
params: PoolingParams,
322
lora_request: LoRARequest | None,
323
) -> None:
vllm/entrypoints/pooling/embed/io_processor.py
+20
-20
@@ -24,7 +24,7 @@ from vllm.entrypoints.pooling.embed.protocol import (
24
EmbeddingCompletionRequest,
25
)
26
from vllm.entrypoints.pooling.typing import PoolingServeContext
27
-from vllm.inputs.data import ProcessorInputs, token_inputs
27
+from vllm.inputs import EngineInput, tokens_input
28
from vllm.logger import init_logger
29
from vllm.outputs import PoolingOutput, PoolingRequestOutput
30
from vllm.renderers import merge_kwargs
@@ -83,20 +83,20 @@ class EmbedIOProcessor(PoolingIOProcessor):
83
#################################################################
84
85
def _pre_process_chunked(self, ctx: PoolingServeContext) -> None:
86
- if ctx.engine_prompts is None:
86
+ if ctx.engine_inputs is None:
87
raise ValueError("Engine prompts not available")
88
89
- ctx.intermediates = ctx.engine_prompts
89
+ ctx.intermediates = ctx.engine_inputs
90
request_id = ctx.request_id
91
max_model_len = self.model_config.max_model_len
92
- chunked_engine_prompts: list[ProcessorInputs] = []
92
+ chunked_engine_inputs: list[EngineInput] = []
93
prompt_request_ids: list[str] = []
94
- for prompt_idx, engine_prompt in enumerate(ctx.engine_prompts):
95
- token_ids = engine_prompt.get("prompt_token_ids", None)
94
+ for prompt_idx, engine_input in enumerate(ctx.engine_inputs):
95
+ token_ids = engine_input.get("prompt_token_ids", None)
96
if token_ids is None:
97
raise NotImplementedError(
98
"Long Text Embedding with Chunked Processing does "
99
- "not support EmbedsPrompt and EncoderDecoderInputs."
99
+ "not support EmbedsPrompt and EncoderDecoderInput."
100
)
101
102
prompt_token_ids = cast(list[int], token_ids)
@@ -104,14 +104,14 @@ class EmbedIOProcessor(PoolingIOProcessor):
104
for chunk_idx, chunk_tokens in enumerate(
105
chunk_list(prompt_token_ids, max_model_len)
106
):
107
- chunked_engine_prompts.append(
108
- token_inputs(prompt_token_ids=chunk_tokens)
107
+ chunked_engine_inputs.append(
108
+ tokens_input(prompt_token_ids=chunk_tokens)
109
)
110
prompt_request_ids.append(
111
f"{request_id}-prompt-{prompt_idx}-chunk-{chunk_idx}"
112
)
113
114
- ctx.engine_prompts = chunked_engine_prompts
114
+ ctx.engine_inputs = chunked_engine_inputs
115
ctx.prompt_request_ids = prompt_request_ids
116
117
return None
@@ -184,8 +184,8 @@ class EmbedIOProcessor(PoolingIOProcessor):
184
if ctx.intermediates is None:
185
raise ValueError("Original prompts inputs not available")
186
187
- original_engine_prompts = cast(list[ProcessorInputs], ctx.intermediates)
188
- num_prompts = len(original_engine_prompts)
187
+ original_engine_inputs = cast(list[EngineInput], ctx.intermediates)
188
+ num_prompts = len(original_engine_inputs)
189
190
# Finalize aggregated results
191
final_res_batch: list[PoolingRequestOutput] = []
@@ -211,12 +211,12 @@ class EmbedIOProcessor(PoolingIOProcessor):
211
pooling_output_data = PoolingOutput(data=final_embedding)
212
213
# Get original prompt token IDs for this prompt
214
- original_prompt = original_engine_prompts[prompt_idx]
214
+ original_prompt = original_engine_inputs[prompt_idx]
215
token_ids = original_prompt.get("prompt_token_ids", None)
216
if token_ids is None:
217
raise NotImplementedError(
218
"Long Text Embedding with Chunked Processing does "
219
- "not support EmbedsPrompt and EncoderDecoderInputs."
219
+ "not support EmbedsPrompt and EncoderDecoderInput."
220
)
221
222
original_token_ids = cast(list[int], token_ids)
@@ -372,7 +372,7 @@ class EmbedIOProcessor(PoolingIOProcessor):
372
]
373
for uri in request.images
374
]
375
- ctx.engine_prompts = self._batch_render_chat(
375
+ ctx.engine_inputs = self._batch_render_chat(
376
request, all_messages, truncate_prompt_tokens, truncation_side
377
)
378
@@ -382,7 +382,7 @@ class EmbedIOProcessor(PoolingIOProcessor):
382
self._mixed_input_to_messages(inp, task_prefix=task_prefix)
383
for inp in request.inputs
384
]
385
- ctx.engine_prompts = self._batch_render_chat(
385
+ ctx.engine_inputs = self._batch_render_chat(
386
request, all_messages, truncate_prompt_tokens, truncation_side
387
)
388
@@ -396,7 +396,7 @@ class EmbedIOProcessor(PoolingIOProcessor):
396
truncate_prompt_tokens=truncate_prompt_tokens,
397
truncation_side=truncation_side,
398
)
399
- ctx.engine_prompts = self._preprocess_completion_online(
399
+ ctx.engine_inputs = self._preprocess_completion_online(
400
proxy, prompt_input=proxy.input, prompt_embeds=None
401
)
402
@@ -406,7 +406,7 @@ class EmbedIOProcessor(PoolingIOProcessor):
406
all_messages: Sequence[list[ChatCompletionMessageParam]],
407
truncate_prompt_tokens: int | None,
408
truncation_side: Literal["left", "right"] | None,
409
- ) -> list[ProcessorInputs]:
409
+ ) -> list[EngineInput]:
410
"""Batch-render multiple conversations through the chat template."""
411
if not all_messages:
412
return []
@@ -438,8 +438,8 @@ class EmbedIOProcessor(PoolingIOProcessor):
438
default_media_io_kwargs=(mm_config.media_io_kwargs if mm_config else None),
439
)
440
441
- _, engine_prompts = renderer.render_chat(all_messages, chat_params, tok_params)
442
- return engine_prompts
441
+ _, engine_inputs = renderer.render_chat(all_messages, chat_params, tok_params)
442
+ return engine_inputs
443
444
def _validate_input_type(self, input_type: str | None) -> None:
445
"""Raise if *input_type* is not supported by this model."""
vllm/entrypoints/pooling/pooling/serving.py
+9
-9
@@ -33,7 +33,7 @@ from vllm.entrypoints.pooling.utils import (
33
encode_pooling_output_float,
34
)
35
from vllm.entrypoints.serve.render.serving import OpenAIServingRender
36
-from vllm.inputs import ProcessorInputs
36
+from vllm.inputs import EngineInput
37
from vllm.logger import init_logger
38
from vllm.outputs import PoolingRequestOutput
39
from vllm.renderers.inputs.preprocess import prompt_to_seq
@@ -110,7 +110,7 @@ class OpenAIServingPooling(OpenAIServing):
110
request.task,
111
)
112
113
- engine_prompts: Sequence[ProcessorInputs]
113
+ engine_inputs: Sequence[EngineInput]
114
if use_io_processor := isinstance(request, IOProcessorRequest):
115
if self.io_processor is None:
116
raise ValueError(
@@ -125,7 +125,7 @@ class OpenAIServingPooling(OpenAIServing):
125
raw_prompts = await self.io_processor.pre_process_async(
126
prompt=validated_prompt, request_id=request_id
127
)
128
- engine_prompts = await self.openai_serving_render.preprocess_cmpl(
128
+ engine_inputs = await self.openai_serving_render.preprocess_cmpl(
129
request,
130
prompt_to_seq(raw_prompts),
131
)
@@ -138,7 +138,7 @@ class OpenAIServingPooling(OpenAIServing):
138
if error_check_ret is not None:
139
return error_check_ret
140
141
- _, engine_prompts = await self.openai_serving_render.preprocess_chat(
141
+ _, engine_inputs = await self.openai_serving_render.preprocess_chat(
142
request,
143
request.messages,
144
default_template=self.chat_template,
@@ -146,7 +146,7 @@ class OpenAIServingPooling(OpenAIServing):
146
default_template_kwargs=None,
147
)
148
elif isinstance(request, PoolingCompletionRequest):
149
- engine_prompts = await self.openai_serving_render.preprocess_completion(
149
+ engine_inputs = await self.openai_serving_render.preprocess_completion(
150
request,
151
prompt_input=request.input,
152
prompt_embeds=None,
@@ -165,12 +165,12 @@ class OpenAIServingPooling(OpenAIServing):
165
else:
166
pooling_params = request.to_pooling_params() # type: ignore
167
168
- for i, engine_prompt in enumerate(engine_prompts):
168
+ for i, engine_input in enumerate(engine_inputs):
169
request_id_item = f"{request_id}-{i}"
170
171
self._log_inputs(
172
request_id_item,
173
- engine_prompt,
173
+ engine_input,
174
params=pooling_params,
175
lora_request=lora_request,
176
)
@@ -182,7 +182,7 @@ class OpenAIServingPooling(OpenAIServing):
182
)
183
184
generator = self.engine_client.encode(
185
- engine_prompt,
185
+ engine_input,
186
pooling_params,
187
request_id_item,
188
lora_request=lora_request,
@@ -221,7 +221,7 @@ class OpenAIServingPooling(OpenAIServing):
221
return IOProcessorResponse(request_id=request_id, data=output)
222
223
assert isinstance(request, (PoolingCompletionRequest, PoolingChatRequest))
224
- num_prompts = len(engine_prompts)
224
+ num_prompts = len(engine_inputs)
225
226
# Non-streaming response
227
final_res_batch: list[PoolingRequestOutput | None]
vllm/entrypoints/pooling/score/serving.py
+36
-45
@@ -35,7 +35,7 @@ from vllm.entrypoints.pooling.score.utils import (
35
parse_score_data_single,
36
validate_score_input,
37
)
38
-from vllm.inputs.data import ProcessorInputs, TokensPrompt, token_inputs
38
+from vllm.inputs import EngineInput, TokensPrompt, tokens_input
39
from vllm.logger import init_logger
40
from vllm.lora.request import LoRARequest
41
from vllm.outputs import PoolingRequestOutput, ScoringRequestOutput
@@ -110,12 +110,12 @@ class ServingScores(OpenAIServing):
110
*(encode_async(t, **tokenization_kwargs) for t in input_texts)
111
)
112
113
- engine_prompts: list[ProcessorInputs] = []
113
+ engine_inputs: list[EngineInput] = []
114
for tok_result, input_text in zip(tokenized_prompts, input_texts):
115
text_token_prompt = self._validate_input(request, tok_result, input_text)
116
117
- engine_prompts.append(
118
- token_inputs(
117
+ engine_inputs.append(
118
+ tokens_input(
119
text_token_prompt["prompt_token_ids"],
120
prompt=input_text,
121
)
@@ -125,19 +125,19 @@ class ServingScores(OpenAIServing):
125
generators: list[AsyncGenerator[PoolingRequestOutput, None]] = []
126
pooling_params = request.to_pooling_params("embed")
127
128
- for i, engine_prompt in enumerate(engine_prompts):
128
+ for i, engine_input in enumerate(engine_inputs):
129
request_id_item = f"{request_id}-{i}"
130
131
self._log_inputs(
132
request_id_item,
133
- engine_prompt,
133
+ engine_input,
134
params=pooling_params,
135
lora_request=lora_request,
136
)
137
138
generators.append(
139
self.engine_client.encode(
140
- engine_prompt,
140
+ engine_input,
141
pooling_params,
142
request_id_item,
143
lora_request=lora_request,
@@ -151,7 +151,7 @@ class ServingScores(OpenAIServing):
151
# Non-streaming response
152
final_res_batch: list[PoolingRequestOutput] = []
153
154
- embeddings: list[PoolingRequestOutput | None] = [None] * len(engine_prompts)
154
+ embeddings: list[PoolingRequestOutput | None] = [None] * len(engine_inputs)
155
156
async for i, res in result_generator:
157
embeddings[i] = res
@@ -183,7 +183,7 @@ class ServingScores(OpenAIServing):
183
request: RerankRequest | ScoreRequest,
184
tokenizer: TokenizerLike,
185
tokenization_kwargs: dict[str, Any],
186
- ) -> tuple[str, TokensPrompt]:
186
+ ) -> TokensPrompt:
187
"""Parse a single ScoreData into a text + optional multimodal
188
TokensPrompt for late-interaction encoding.
189
@@ -197,21 +197,22 @@ class ServingScores(OpenAIServing):
197
else:
198
text, mm_data, mm_uuids = parse_score_data_single(data, role, model_config)
199
200
- prompt_inputs = tokenizer(text, **tokenization_kwargs)
201
- self._validate_input(request, prompt_inputs["input_ids"], text)
200
+ prompt_ids = tokenizer.encode(text, **tokenization_kwargs)
201
+ self._validate_input(request, prompt_ids, text)
202
203
- engine_prompt = TokensPrompt(
204
- prompt_token_ids=prompt_inputs["input_ids"],
203
+ tok_prompt = TokensPrompt(
204
+ prompt_token_ids=prompt_ids,
205
+ prompt=text,
206
)
207
208
if mm_data is not None:
208
- engine_prompt["multi_modal_data"] = mm_data
209
+ tok_prompt["multi_modal_data"] = mm_data
210
if mm_uuids is not None:
210
- engine_prompt["multi_modal_uuids"] = mm_uuids
211
+ tok_prompt["multi_modal_uuids"] = mm_uuids
212
if request.mm_processor_kwargs is not None:
212
- engine_prompt["mm_processor_kwargs"] = request.mm_processor_kwargs
213
+ tok_prompt["mm_processor_kwargs"] = request.mm_processor_kwargs
214
214
- return text, engine_prompt
215
+ return tok_prompt
216
217
async def _late_interaction_score(
218
self,
@@ -240,7 +241,7 @@ class ServingScores(OpenAIServing):
241
executor=self._tokenizer_executor,
242
)
243
243
- preprocessed = await asyncio.gather(
244
+ tok_prompts = await asyncio.gather(
245
*(
246
preprocess_async(
247
data=d,
@@ -253,12 +254,8 @@ class ServingScores(OpenAIServing):
254
)
255
)
256
256
- query_prompts: list[TokensPrompt] = [
257
- prompt for _, prompt in preprocessed[: len(data_1)]
258
- ]
259
- doc_prompts: list[TokensPrompt] = [
260
- prompt for _, prompt in preprocessed[len(data_1) :]
261
- ]
257
+ query_prompts = tok_prompts[: len(data_1)]
258
+ doc_prompts = tok_prompts[len(data_1) :]
259
260
default_pooling_params = request.to_pooling_params("token_embed")
261
@@ -268,7 +265,7 @@ class ServingScores(OpenAIServing):
265
query_prompts
266
)
267
query_generators: list[AsyncGenerator[PoolingRequestOutput, None]] = []
271
- for i, engine_prompt in enumerate(query_prompts):
268
+ for i, tok_prompt in enumerate(query_prompts):
269
request_id_item = f"{request_id}-query-{i}"
270
pooling_params = default_pooling_params.clone()
271
pooling_params.late_interaction_params = (
@@ -280,14 +277,14 @@ class ServingScores(OpenAIServing):
277
278
self._log_inputs(
279
request_id_item,
283
- engine_prompt,
280
+ tok_prompt,
281
params=pooling_params,
282
lora_request=lora_request,
283
)
284
285
query_generators.append(
286
self.engine_client.encode(
290
- engine_prompt,
287
+ tok_prompt,
288
pooling_params,
289
request_id_item,
290
lora_request=lora_request,
@@ -306,7 +303,7 @@ class ServingScores(OpenAIServing):
303
304
# stage 2: encode docs and return scalar scores from workers.
305
doc_generators: list[AsyncGenerator[PoolingRequestOutput, None]] = []
309
- for i, engine_prompt in enumerate(doc_prompts):
306
+ for i, tok_prompt in enumerate(doc_prompts):
307
request_id_item = f"{request_id}-doc-{i}"
308
query_idx = 0 if len(query_prompts) == 1 else i
309
pooling_params = default_pooling_params.clone()
@@ -316,14 +313,14 @@ class ServingScores(OpenAIServing):
313
314
self._log_inputs(
315
request_id_item,
319
- engine_prompt,
316
+ tok_prompt,
317
params=pooling_params,
318
lora_request=lora_request,
319
)
320
321
doc_generators.append(
322
self.engine_client.encode(
326
- engine_prompt,
323
+ tok_prompt,
324
pooling_params,
325
request_id_item,
326
lora_request=lora_request,
@@ -404,28 +401,22 @@ class ServingScores(OpenAIServing):
401
)
402
)
403
407
- request_prompts: list[str] = []
408
- engine_prompts: list[TokensPrompt] = []
409
- for full_prompt, engine_prompt in preprocessed_prompts:
410
- request_prompts.append(full_prompt)
411
- engine_prompts.append(engine_prompt)
412
-
404
# Schedule the request and get the result generator.
405
generators: list[AsyncGenerator[PoolingRequestOutput, None]] = []
406
407
default_pooling_params = request.to_pooling_params("classify")
408
418
- for i, engine_prompt in enumerate(engine_prompts):
409
+ for i, (full_prompt, tok_prompt) in enumerate(preprocessed_prompts):
410
request_id_item = f"{request_id}-{i}"
411
412
self._log_inputs(
413
request_id_item,
423
- request_prompts[i],
414
+ full_prompt,
415
params=default_pooling_params,
416
lora_request=lora_request,
417
)
418
428
- if token_type_ids := engine_prompt.pop("token_type_ids", None):
419
+ if token_type_ids := tok_prompt.pop("token_type_ids", None):
420
pooling_params = default_pooling_params.clone()
421
compressed = compress_token_type_ids(token_type_ids)
422
pooling_params.extra_kwargs = {"compressed_token_type_ids": compressed}
@@ -433,7 +424,7 @@ class ServingScores(OpenAIServing):
424
pooling_params = default_pooling_params
425
426
generator = self.engine_client.encode(
436
- engine_prompt,
427
+ tok_prompt,
428
pooling_params,
429
request_id_item,
430
lora_request=lora_request,
@@ -447,7 +438,7 @@ class ServingScores(OpenAIServing):
438
439
# Non-streaming response
440
final_res_batch: list[PoolingRequestOutput | None] = [None] * len(
450
- engine_prompts
441
+ preprocessed_prompts
442
)
443
444
async for i, res in result_generator:
@@ -464,7 +455,7 @@ class ServingScores(OpenAIServing):
455
data_2: ScoreData,
456
) -> tuple[str, TokensPrompt]:
457
model_config = self.model_config
467
- full_prompt, engine_prompt = get_score_prompt(
458
+ full_prompt, engine_input = get_score_prompt(
459
model_config=model_config,
460
data_1=data_1,
461
data_2=data_2,
@@ -472,11 +463,11 @@ class ServingScores(OpenAIServing):
463
tokenization_kwargs=tokenization_kwargs,
464
score_template=self.score_template,
465
)
475
- self._validate_input(request, engine_prompt["prompt_token_ids"], full_prompt)
466
+ self._validate_input(request, engine_input["prompt_token_ids"], full_prompt)
467
if request.mm_processor_kwargs is not None:
477
- engine_prompt["mm_processor_kwargs"] = request.mm_processor_kwargs
468
+ engine_input["mm_processor_kwargs"] = request.mm_processor_kwargs
469
479
- return full_prompt, engine_prompt
470
+ return full_prompt, engine_input
471
472
async def _run_scoring(
473
self,
vllm/entrypoints/pooling/score/utils.py
+7
-3
@@ -20,10 +20,14 @@ from vllm.entrypoints.chat_utils import (
20
MultiModalItemTracker,
21
_parse_chat_message_content_parts,
22
)
23
-from vllm.inputs import TokensPrompt
24
-from vllm.inputs.data import PromptType, TextPrompt
23
+from vllm.inputs import (
24
+ MultiModalDataDict,
25
+ MultiModalUUIDDict,
26
+ PromptType,
27
+ TextPrompt,
28
+ TokensPrompt,
29
+)
30
from vllm.model_executor.models.interfaces import supports_score_template
26
-from vllm.multimodal.inputs import MultiModalDataDict, MultiModalUUIDDict
31
from vllm.outputs import PoolingRequestOutput
32
from vllm.renderers.hf import safe_apply_chat_template
33
from vllm.tokenizers import TokenizerLike
vllm/entrypoints/pooling/typing.py
+2
-2
@@ -32,7 +32,7 @@ from vllm.entrypoints.pooling.score.protocol import (
32
ScoreRequest,
33
ScoreResponse,
34
)
35
-from vllm.inputs import ProcessorInputs
35
+from vllm.inputs import EngineInput
36
from vllm.lora.request import LoRARequest
37
38
PoolingCompletionLikeRequest: TypeAlias = (
@@ -74,7 +74,7 @@ class PoolingServeContext(Generic[PoolingRequestT]):
74
created_time: int = field(default_factory=lambda: int(time.time()))
75
lora_request: LoRARequest | None = None
76
77
- engine_prompts: list[ProcessorInputs] | None = None
77
+ engine_inputs: list[EngineInput] | None = None
78
prompt_request_ids: list[str] | None = None
79
intermediates: Any | None = None
80
vllm/entrypoints/serve/disagg/protocol.py
+9
-8
@@ -33,19 +33,20 @@ class MultiModalFeatures(BaseModel):
33
"""Lightweight multimodal metadata produced by the render step.
34
35
Carries hashes (for cache lookup / identification) and placeholder
36
- positions so the downstream ``/generate`` service knows *where* in
36
+ positions so the downstream `/generate` service knows *where* in
37
the token sequence each multimodal item lives.
38
39
- .. note:: Phase 1 — metadata only.
40
- Phase 2 should add ``mm_kwargs`` (processed tensor data) using a
41
- binary transport so the ``/generate`` side can skip re-processing.
42
- The ``/generate`` endpoint must also be updated to inject these
43
- features into ``ProcessorInputs`` before passing to
44
- ``InputProcessor.process_inputs``.
39
+ Note:
40
+ Phase 1 — metadata only.
41
+ Phase 2 should add `mm_kwargs` (processed tensor data) using a
42
+ binary transport so the ``/generate` side can skip re-processing.
43
+ The `/generate` endpoint must also be updated to inject these
44
+ features into `EngineInput` before passing to
45
+ `InputProcessor.process_inputs`.
46
"""
47
48
mm_hashes: dict[str, list[str]]
48
- """Per-modality item hashes, e.g. ``{"image": ["abc", "def"]}``."""
49
+ """Per-modality item hashes, e.g. `{"image": ["abc", "def"]}`."""
50
51
mm_placeholders: dict[str, list[PlaceholderRangeInfo]]
52
"""Per-modality placeholder ranges in the token sequence."""
vllm/entrypoints/serve/disagg/serving.py
+3
-5
@@ -99,13 +99,11 @@ class ServingTokens(OpenAIServing):
99
if raw_request:
100
raw_request.state.request_metadata = request_metadata
101
102
- engine_prompts = await self.openai_serving_render.preprocess_completion(
102
+ (engine_input,) = await self.openai_serving_render.preprocess_completion(
103
request,
104
prompt_input=request.token_ids,
105
prompt_embeds=None,
106
)
107
- assert len(engine_prompts) == 1
108
- engine_prompt = engine_prompts[0]
107
108
# Schedule the request and get the result generator.
109
result_generator: AsyncGenerator[RequestOutput, None] | None = None
@@ -115,7 +113,7 @@ class ServingTokens(OpenAIServing):
113
114
self._log_inputs(
115
request_id,
118
- engine_prompt,
116
+ engine_input,
117
params=sampling_params,
118
lora_request=lora_request,
119
)
@@ -127,7 +125,7 @@ class ServingTokens(OpenAIServing):
125
)
126
127
result_generator = self.engine_client.generate(
130
- engine_prompt,
128
+ engine_input,
129
sampling_params,
130
request_id,
131
lora_request=lora_request,
vllm/entrypoints/serve/render/serving.py
+38
-37
@@ -34,9 +34,15 @@ from vllm.entrypoints.utils import (
34
create_error_response,
35
get_max_tokens,
36
)
37
-from vllm.inputs.data import ProcessorInputs, PromptType, SingletonPrompt, TokensPrompt
37
+from vllm.inputs import (
38
+ EngineInput,
39
+ MultiModalHashes,
40
+ MultiModalPlaceholders,
41
+ PromptType,
42
+ SingletonPrompt,
43
+ tokens_input,
44
+)
45
from vllm.logger import init_logger
39
-from vllm.multimodal.inputs import MultiModalHashes, MultiModalPlaceholderDict
46
from vllm.parser import ParserManager
47
from vllm.renderers import BaseRenderer, merge_kwargs
48
from vllm.renderers.inputs.preprocess import (
@@ -127,22 +133,22 @@ class OpenAIServingRender:
133
if isinstance(result, ErrorResponse):
134
return result
135
130
- _, engine_prompts = result
136
+ _, engine_inputs = result
137
132
- if len(engine_prompts) != 1:
138
+ if len(engine_inputs) != 1:
139
return self.create_error_response(
134
- f"Expected exactly 1 engine prompt, got {len(engine_prompts)}"
140
+ f"Expected exactly 1 engine prompt, got {len(engine_inputs)}"
141
)
142
137
- engine_prompt = engine_prompts[0]
143
+ engine_input = engine_inputs[0]
144
139
- prompt_components = extract_prompt_components(self.model_config, engine_prompt)
145
+ prompt_components = extract_prompt_components(self.model_config, engine_input)
146
token_ids = prompt_components.token_ids
147
if not token_ids:
148
return self.create_error_response("No token_ids rendered")
149
token_ids = list(token_ids)
150
145
- input_length = extract_prompt_len(self.model_config, engine_prompt)
151
+ input_length = extract_prompt_len(self.model_config, engine_input)
152
max_tokens = get_max_tokens(
153
self.model_config.max_model_len,
154
request.max_completion_tokens
@@ -159,7 +165,7 @@ class OpenAIServingRender:
165
return GenerateRequest(
166
request_id=request_id,
167
token_ids=token_ids,
162
- features=self._extract_mm_features(engine_prompt),
168
+ features=self._extract_mm_features(engine_input),
169
sampling_params=params,
170
model=request.model,
171
stream=bool(request.stream),
@@ -171,7 +177,7 @@ class OpenAIServingRender:
177
async def render_chat(
178
self,
179
request: ChatCompletionRequest,
174
- ) -> tuple[list[ConversationMessage], list[ProcessorInputs]] | ErrorResponse:
180
+ ) -> tuple[list[ConversationMessage], list[EngineInput]] | ErrorResponse:
181
"""Core preprocessing logic for chat requests (no model/engine check).
182
183
Called directly by render_chat_request and delegated to by
@@ -184,7 +190,6 @@ class OpenAIServingRender:
190
if is_mistral_tokenizer(tokenizer):
191
# because of issues with pydantic we need to potentially
192
# re-serialize the tool_calls field of the request
187
- # for more info: see comment in `maybe_serialize_tool_calls`
193
_mt.maybe_serialize_tool_calls(request) # type: ignore[arg-type]
194
_mt.truncate_tool_call_ids(request) # type: ignore[arg-type]
195
_mt.validate_request_params(request)
@@ -232,7 +237,7 @@ class OpenAIServingRender:
237
if error_check_ret is not None:
238
return error_check_ret
239
235
- conversation, engine_prompts = await self.preprocess_chat(
240
+ conversation, engine_inputs = await self.preprocess_chat(
241
request,
242
request.messages,
243
default_template=self.chat_template,
@@ -244,11 +249,11 @@ class OpenAIServingRender:
249
else:
250
# For GPT-OSS.
251
should_include_tools = tool_dicts is not None
247
- conversation, engine_prompts = self._make_request_with_harmony(
252
+ conversation, engine_inputs = self._make_request_with_harmony(
253
request, should_include_tools
254
)
255
251
- return conversation, engine_prompts
256
+ return conversation, engine_inputs
257
258
async def render_completion_request(
259
self,
@@ -266,16 +271,16 @@ class OpenAIServingRender:
271
if isinstance(result, ErrorResponse):
272
return result
273
generate_requests: list[GenerateRequest] = []
269
- for engine_prompt in result:
274
+ for engine_input in result:
275
prompt_components = extract_prompt_components(
271
- self.model_config, engine_prompt
276
+ self.model_config, engine_input
277
)
278
token_ids = prompt_components.token_ids
279
if not token_ids:
280
return self.create_error_response("No token_ids rendered")
281
token_ids = list(token_ids)
282
278
- input_length = extract_prompt_len(self.model_config, engine_prompt)
283
+ input_length = extract_prompt_len(self.model_config, engine_input)
284
max_tokens = get_max_tokens(
285
self.model_config.max_model_len,
286
request.max_tokens,
@@ -293,7 +298,7 @@ class OpenAIServingRender:
298
GenerateRequest(
299
request_id=request_id,
300
token_ids=token_ids,
296
- features=self._extract_mm_features(engine_prompt),
301
+ features=self._extract_mm_features(engine_input),
302
sampling_params=params,
303
model=request.model,
304
stream=bool(request.stream),
@@ -308,7 +313,7 @@ class OpenAIServingRender:
313
async def render_completion(
314
self,
315
request: CompletionRequest,
311
- ) -> list[ProcessorInputs] | ErrorResponse:
316
+ ) -> list[EngineInput] | ErrorResponse:
317
"""Core preprocessing logic for completion requests (no model/engine check).
318
319
Called directly by render_completion_request and delegated to by
@@ -326,28 +331,28 @@ class OpenAIServingRender:
331
"prompt_logprobs is not compatible with prompt embeds."
332
)
333
329
- engine_prompts = await self.preprocess_completion(
334
+ engine_inputs = await self.preprocess_completion(
335
request,
336
prompt_input=request.prompt,
337
prompt_embeds=request.prompt_embeds,
338
)
339
335
- return engine_prompts
340
+ return engine_inputs
341
342
@staticmethod
343
def _extract_mm_features(
339
- engine_prompt: ProcessorInputs,
344
+ engine_input: EngineInput,
345
) -> MultiModalFeatures | None:
346
"""Extract multimodal metadata from a rendered engine prompt.
347
348
Returns ``None`` for text-only prompts.
349
"""
345
- if engine_prompt.get("type") != "multimodal":
350
+ if engine_input.get("type") != "multimodal":
351
return None
352
348
- # At this point engine_prompt is a MultiModalInputs TypedDict.
349
- mm_hashes: MultiModalHashes = engine_prompt["mm_hashes"] # type: ignore[typeddict-item]
350
- raw_placeholders: MultiModalPlaceholderDict = engine_prompt["mm_placeholders"] # type: ignore[typeddict-item]
353
+ # At this point engine_input is a MultiModalInputs TypedDict.
354
+ mm_hashes: MultiModalHashes = engine_input["mm_hashes"] # type: ignore[typeddict-item]
355
+ raw_placeholders: MultiModalPlaceholders = engine_input["mm_placeholders"] # type: ignore[typeddict-item]
356
357
mm_placeholders = {
358
modality: [
@@ -401,13 +406,9 @@ class OpenAIServingRender:
406
407
# Render prompt token ids.
408
prompt_token_ids = render_for_completion(messages)
404
- engine_prompt = TokensPrompt(prompt_token_ids=prompt_token_ids)
405
-
406
- # Add cache_salt if provided in the request
407
- if request.cache_salt is not None:
408
- engine_prompt["cache_salt"] = request.cache_salt
409
+ engine_input = tokens_input(prompt_token_ids, cache_salt=request.cache_salt)
410
410
- return messages, [engine_prompt]
411
+ return messages, [engine_input]
412
413
def create_error_response(
414
self,
@@ -450,7 +451,7 @@ class OpenAIServingRender:
451
request: Any,
452
prompt_input: str | list[str] | list[int] | list[list[int]] | None,
453
prompt_embeds: bytes | list[bytes] | None,
453
- ) -> list[ProcessorInputs]:
454
+ ) -> list[EngineInput]:
455
"""Copied from OpenAIServing._preprocess_completion."""
456
prompts = list[SingletonPrompt | bytes]()
457
if prompt_embeds is not None: # embeds take higher priority
@@ -463,7 +464,7 @@ class OpenAIServingRender:
464
self,
465
request: Any,
466
prompts: Sequence[PromptType | bytes],
466
- ) -> list[ProcessorInputs]:
467
+ ) -> list[EngineInput]:
468
"""Copied from OpenAIServing._preprocess_cmpl."""
469
renderer = self.renderer
470
model_config = self.model_config
@@ -497,7 +498,7 @@ class OpenAIServingRender:
498
default_template_kwargs: dict[str, Any] | None,
499
tool_dicts: list[dict[str, Any]] | None = None,
500
tool_parser: type[ToolParser] | None = None,
500
- ) -> tuple[list[ConversationMessage], list[ProcessorInputs]]:
501
+ ) -> tuple[list[ConversationMessage], list[EngineInput]]:
502
"""Copied from OpenAIServing._preprocess_chat."""
503
renderer = self.renderer
504
mm_config = self.model_config.multimodal_config
@@ -519,7 +520,7 @@ class OpenAIServingRender:
520
default_mm_processor_kwargs=getattr(request, "mm_processor_kwargs", None),
521
)
522
522
- (conversation,), (engine_prompt,) = await renderer.render_chat_async(
523
+ (conversation,), (engine_input,) = await renderer.render_chat_async(
524
[messages],
525
chat_params,
526
tok_params,
@@ -546,4 +547,4 @@ class OpenAIServingRender:
547
tokenizer = renderer.get_tokenizer()
548
request = tool_parser(tokenizer).adjust_request(request=request) # type: ignore[arg-type]
549
549
- return conversation, [engine_prompt]
550
+ return conversation, [engine_input]
vllm/entrypoints/serve/tokenize/serving.py
+9
-9
@@ -20,7 +20,7 @@ from vllm.entrypoints.serve.tokenize.protocol import (
20
TokenizeResponse,
21
TokenizerInfoResponse,
22
)
23
-from vllm.inputs import TokensPrompt, token_inputs
23
+from vllm.inputs import TokensPrompt, tokens_input
24
from vllm.logger import init_logger
25
from vllm.tokenizers import TokenizerLike
26
@@ -79,7 +79,7 @@ class OpenAIServingTokenization(OpenAIServing):
79
if error_check_ret is not None:
80
return error_check_ret
81
82
- _, engine_prompts = await self.openai_serving_render.preprocess_chat(
82
+ _, engine_inputs = await self.openai_serving_render.preprocess_chat(
83
request,
84
request.messages,
85
default_template=self.chat_template,
@@ -88,22 +88,22 @@ class OpenAIServingTokenization(OpenAIServing):
88
tool_dicts=tool_dicts,
89
)
90
else:
91
- engine_prompts = await self.openai_serving_render.preprocess_completion(
91
+ engine_inputs = await self.openai_serving_render.preprocess_completion(
92
request,
93
prompt_input=request.prompt,
94
prompt_embeds=None,
95
)
96
97
input_ids: list[int] = []
98
- for engine_prompt in engine_prompts:
98
+ for engine_input in engine_inputs:
99
self._log_inputs(
100
request_id,
101
- engine_prompt,
101
+ engine_input,
102
params=None,
103
lora_request=lora_request,
104
)
105
106
- prompt_components = self._extract_prompt_components(engine_prompt)
106
+ prompt_components = self._extract_prompt_components(engine_input)
107
if prompt_components.token_ids is not None:
108
input_ids.extend(prompt_components.token_ids)
109
@@ -134,16 +134,16 @@ class OpenAIServingTokenization(OpenAIServing):
134
135
self._log_inputs(
136
request_id,
137
- token_inputs(request.tokens),
137
+ tokens_input(request.tokens),
138
params=None,
139
lora_request=lora_request,
140
)
141
142
- engine_prompt = await self.renderer.tokenize_prompt_async(
142
+ tok_prompt = await self.renderer.tokenize_prompt_async(
143
TokensPrompt(prompt_token_ids=request.tokens),
144
request.build_tok_params(self.model_config),
145
)
146
- prompt_text = engine_prompt["prompt"] # type: ignore[typeddict-item]
146
+ prompt_text = tok_prompt["prompt"] # type: ignore[typeddict-item]
147
148
return DetokenizeResponse(prompt=prompt_text)
149
vllm/inputs/__init__.py
+43
-17
@@ -1,38 +1,64 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
-from .data import (
4
+from .engine import (
5
+ DecoderOnlyEngineInput,
6
+ EmbedsInput,
7
+ EncoderDecoderInput,
8
+ EngineInput,
9
+ MultiModalEncDecInput,
10
+ MultiModalHashes,
11
+ MultiModalInput,
12
+ MultiModalPlaceholders,
13
+ SingletonInput,
14
+ TokensInput,
15
+ build_enc_dec_input,
16
+ embeds_input,
17
+ mm_enc_dec_input,
18
+ mm_input,
19
+ split_enc_dec_input,
20
+ tokens_input,
21
+)
22
+from .llm import (
23
DataPrompt,
6
- DecoderOnlyInputs,
7
- EmbedsInputs,
24
EmbedsPrompt,
9
- EncoderDecoderInputs,
25
ExplicitEncoderDecoderPrompt,
11
- ProcessorInputs,
26
+ ModalityData,
27
+ MultiModalDataBuiltins,
28
+ MultiModalDataDict,
29
+ MultiModalUUIDDict,
30
PromptType,
13
- SingletonInputs,
31
SingletonPrompt,
32
TextPrompt,
16
- TokenInputs,
33
TokensPrompt,
18
- embeds_inputs,
19
- token_inputs,
34
)
35
36
__all__ = [
37
+ "ModalityData",
38
+ "MultiModalDataBuiltins",
39
+ "MultiModalDataDict",
40
+ "MultiModalUUIDDict",
41
"DataPrompt",
42
"TextPrompt",
43
"TokensPrompt",
44
"PromptType",
45
"SingletonPrompt",
46
"ExplicitEncoderDecoderPrompt",
29
- "TokenInputs",
30
- "EmbedsInputs",
47
"EmbedsPrompt",
32
- "token_inputs",
33
- "embeds_inputs",
34
- "DecoderOnlyInputs",
35
- "EncoderDecoderInputs",
36
- "ProcessorInputs",
37
- "SingletonInputs",
48
+ "MultiModalHashes",
49
+ "MultiModalPlaceholders",
50
+ "TokensInput",
51
+ "EmbedsInput",
52
+ "MultiModalInput",
53
+ "MultiModalEncDecInput",
54
+ "tokens_input",
55
+ "embeds_input",
56
+ "mm_input",
57
+ "mm_enc_dec_input",
58
+ "build_enc_dec_input",
59
+ "split_enc_dec_input",
60
+ "DecoderOnlyEngineInput",
61
+ "EncoderDecoderInput",
62
+ "SingletonInput",
63
+ "EngineInput",
64
]
vllm/inputs/data.py
deleted
-413
@@ -1,413 +0,0 @@
1
-# SPDX-License-Identifier: Apache-2.0
2
-# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
-from typing import TYPE_CHECKING, Any, Literal, TypeAlias
4
-
5
-import torch
6
-from typing_extensions import NotRequired, TypedDict, assert_never
7
-
8
-if TYPE_CHECKING:
9
- from vllm.multimodal.inputs import (
10
- MultiModalDataDict,
11
- MultiModalEncDecInputs,
12
- MultiModalInputs,
13
- MultiModalUUIDDict,
14
- )
15
-else:
16
- MultiModalDataDict = object
17
- MultiModalEncDecInputs = object
18
- MultiModalInputs = object
19
- MultiModalUUIDDict = object
20
-
21
-
22
-# Inputs to LLM API
23
-class _PromptOptions(TypedDict):
24
- """
25
- Additional options available to all
26
- [`SingletonPrompt`][vllm.inputs.data.SingletonPrompt].
27
- """
28
-
29
- multi_modal_data: NotRequired[MultiModalDataDict | None]
30
- """
31
- Optional multi-modal data to pass to the model,
32
- if the model supports it.
33
- """
34
-
35
- mm_processor_kwargs: NotRequired[dict[str, Any] | None]
36
- """
37
- Optional multi-modal processor kwargs to be forwarded to the
38
- multimodal input mapper & processor. Note that if multiple modalities
39
- have registered mappers etc for the model being considered, we attempt
40
- to pass the mm_processor_kwargs to each of them.
41
- """
42
-
43
- multi_modal_uuids: NotRequired[MultiModalUUIDDict]
44
- """
45
- Optional user-specified UUIDs for multimodal items, mapped by modality.
46
- Lists must match the number of items per modality and may contain `None`.
47
- For `None` entries, the hasher will compute IDs automatically; non-None
48
- entries override the default hashes for caching, and MUST be unique per
49
- multimodal item.
50
- """
51
-
52
- cache_salt: NotRequired[str]
53
- """
54
- Optional cache salt to be used for prefix caching.
55
- """
56
-
57
-
58
-class TextPrompt(_PromptOptions):
59
- """Schema for a text prompt."""
60
-
61
- prompt: str
62
- """The input text to be tokenized before passing to the model."""
63
-
64
-
65
-class TokensPrompt(_PromptOptions):
66
- """Schema for a tokenized prompt."""
67
-
68
- prompt_token_ids: list[int]
69
- """A list of token IDs to pass to the model."""
70
-
71
- prompt: NotRequired[str]
72
- """The prompt text corresponding to the token IDs, if available."""
73
-
74
- token_type_ids: NotRequired[list[int]]
75
- """A list of token type IDs to pass to the cross encoder model."""
76
-
77
-
78
-class EmbedsPrompt(_PromptOptions):
79
- """Schema for a prompt provided via token embeddings."""
80
-
81
- prompt_embeds: torch.Tensor
82
- """The embeddings of the prompt."""
83
-
84
- prompt: NotRequired[str]
85
- """The prompt text corresponding to the token embeddings, if available."""
86
-
87
-
88
-DecoderOnlyPrompt: TypeAlias = (
89
- str | TextPrompt | list[int] | TokensPrompt | EmbedsPrompt
90
-)
91
-"""
92
-Schema of a prompt for a decoder-only model:
93
-
94
-- A text prompt (string or [`TextPrompt`][vllm.inputs.data.TextPrompt])
95
-- A tokenized prompt (list of token IDs, or
96
- [`TokensPrompt`][vllm.inputs.data.TokensPrompt])
97
-- An embeddings prompt ([`EmbedsPrompt`][vllm.inputs.data.EmbedsPrompt])
98
-
99
-For encoder-decoder models, passing a singleton prompt is shorthand for passing
100
-`ExplicitEncoderDecoderPrompt(encoder_prompt=prompt, decoder_prompt=None)`.
101
-"""
102
-
103
-
104
-EncoderPrompt: TypeAlias = str | TextPrompt | list[int] | TokensPrompt
105
-"""
106
-Schema of a prompt for the encoder part of a encoder-decoder model:
107
-
108
-- A text prompt (string or [`TextPrompt`][vllm.inputs.data.TextPrompt])
109
-- A tokenized prompt (list of token IDs, or
110
- [`TokensPrompt`][vllm.inputs.data.TokensPrompt])
111
-"""
112
-
113
-
114
-DecoderPrompt: TypeAlias = str | TextPrompt | list[int] | TokensPrompt
115
-"""
116
-Schema of a prompt for the decoder part of an encoder-decoder model:
117
-
118
-- A text prompt (string or [`TextPrompt`][vllm.inputs.data.TextPrompt])
119
-- A tokenized prompt (list of token IDs, or
120
- [`TokensPrompt`][vllm.inputs.data.TokensPrompt])
121
-
122
-Note:
123
- Multi-modal inputs are not supported for decoder prompts.
124
-"""
125
-
126
-
127
-class ExplicitEncoderDecoderPrompt(TypedDict):
128
- """
129
- Schema for a pair of encoder and decoder singleton prompts.
130
-
131
- Note:
132
- This schema is not valid for decoder-only models.
133
- """
134
-
135
- encoder_prompt: EncoderPrompt
136
- """The prompt for the encoder part of the model."""
137
-
138
- decoder_prompt: DecoderPrompt | None
139
- """
140
- The prompt for the decoder part of the model.
141
-
142
- Passing `None` will cause the prompt to be inferred automatically.
143
- """
144
-
145
-
146
-EncoderDecoderPrompt: TypeAlias = EncoderPrompt | ExplicitEncoderDecoderPrompt
147
-"""
148
-Schema for a prompt for an encoder-decoder model.
149
-
150
-You can pass a singleton encoder prompt, in which case the decoder prompt is
151
-considered to be `None` (i.e., infer automatically).
152
-"""
153
-
154
-
155
-SingletonPrompt: TypeAlias = DecoderOnlyPrompt | EncoderPrompt | DecoderPrompt
156
-"""
157
-Schema for a single prompt. This is as opposed to a data structure
158
-which encapsulates multiple prompts, such as
159
-[`ExplicitEncoderDecoderPrompt`][vllm.inputs.data.ExplicitEncoderDecoderPrompt].
160
-"""
161
-
162
-
163
-PromptType: TypeAlias = DecoderOnlyPrompt | EncoderDecoderPrompt
164
-"""
165
-Schema for any prompt, regardless of model type.
166
-
167
-This is the input format accepted by most [`LLM`][vllm.entrypoints.llm.LLM] APIs.
168
-"""
169
-
170
-
171
-class DataPrompt(_PromptOptions):
172
- """
173
- Represents generic inputs that are converted to
174
- [`PromptType`][vllm.inputs.data.PromptType] by IO processor plugins.
175
- """
176
-
177
- data: Any
178
- """The input data."""
179
-
180
- data_format: str
181
- """The input data format."""
182
-
183
-
184
-# Outputs of processor
185
-class _InputOptions(TypedDict):
186
- """
187
- Additional options available to all input types.
188
- """
189
-
190
- arrival_time: NotRequired[float]
191
- """The time when the input was received (before rendering)."""
192
-
193
- cache_salt: NotRequired[str]
194
- """Optional cache salt to be used for prefix caching."""
195
-
196
-
197
-class TokenInputs(_InputOptions):
198
- """Represents token-based inputs."""
199
-
200
- type: Literal["token"]
201
- """The type of inputs."""
202
-
203
- prompt_token_ids: list[int]
204
- """The token IDs of the prompt."""
205
-
206
- prompt: NotRequired[str]
207
- """The prompt text corresponding to the token IDs, if available."""
208
-
209
-
210
-def token_inputs(
211
- prompt_token_ids: list[int],
212
- *,
213
- prompt: str | None = None,
214
- cache_salt: str | None = None,
215
-) -> TokenInputs:
216
- """Construct [`TokenInputs`][vllm.inputs.data.TokenInputs] from optional
217
- values."""
218
- inputs = TokenInputs(type="token", prompt_token_ids=prompt_token_ids)
219
-
220
- if prompt is not None:
221
- inputs["prompt"] = prompt
222
- if cache_salt is not None:
223
- inputs["cache_salt"] = cache_salt
224
-
225
- return inputs
226
-
227
-
228
-class EmbedsInputs(_InputOptions):
229
- """Represents embeddings-based inputs."""
230
-
231
- type: Literal["embeds"]
232
- """The type of inputs."""
233
-
234
- prompt_embeds: torch.Tensor
235
- """The embeddings of the prompt."""
236
-
237
- prompt: NotRequired[str]
238
- """The prompt text corresponding to the token IDs, if available."""
239
-
240
-
241
-def embeds_inputs(
242
- prompt_embeds: torch.Tensor,
243
- *,
244
- prompt: str | None = None,
245
- cache_salt: str | None = None,
246
-) -> EmbedsInputs:
247
- """Construct [`EmbedsInputs`][vllm.inputs.data.EmbedsInputs] from optional
248
- values."""
249
- inputs = EmbedsInputs(type="embeds", prompt_embeds=prompt_embeds)
250
-
251
- if prompt is not None:
252
- inputs["prompt"] = prompt
253
- if cache_salt is not None:
254
- inputs["cache_salt"] = cache_salt
255
-
256
- return inputs
257
-
258
-
259
-DecoderOnlyInputs: TypeAlias = TokenInputs | EmbedsInputs | MultiModalInputs
260
-"""
261
-A processed prompt from
262
-[`InputPreprocessor`][vllm.inputs.preprocess.InputPreprocessor]
263
-which can be passed to
264
-[`InputProcessor`][vllm.v1.engine.input_processor.InputProcessor]
265
-for decoder-only models.
266
-"""
267
-
268
-
269
-EncoderInputs: TypeAlias = TokenInputs | MultiModalEncDecInputs
270
-"""
271
-A processed encoder prompt from
272
-[`InputPreprocessor`][vllm.inputs.preprocess.InputPreprocessor]
273
-which can be passed to
274
-[`InputProcessor`][vllm.v1.engine.input_processor.InputProcessor]
275
-for encoder-decoder models.
276
-"""
277
-
278
-
279
-DecoderInputs: TypeAlias = TokenInputs | MultiModalInputs
280
-"""
281
-A processed decoder prompt from
282
-[`InputPreprocessor`][vllm.inputs.preprocess.InputPreprocessor]
283
-which can be passed to
284
-[`InputProcessor`][vllm.v1.engine.input_processor.InputProcessor]
285
-for encoder-decoder models.
286
-"""
287
-
288
-
289
-class EncoderDecoderInputs(TypedDict):
290
- """
291
- A processed pair of encoder and decoder singleton prompts.
292
- [`InputPreprocessor`][vllm.inputs.preprocess.InputPreprocessor]
293
- which can be passed to
294
- [`InputProcessor`][vllm.v1.engine.input_processor.InputProcessor]
295
- for encoder-decoder models.
296
- """
297
-
298
- type: Literal["enc_dec"]
299
-
300
- encoder_prompt: EncoderInputs
301
- """The inputs for the encoder portion."""
302
-
303
- decoder_prompt: DecoderInputs
304
- """The inputs for the decoder portion."""
305
-
306
- arrival_time: NotRequired[float]
307
- """The time when the input was received (before rendering)."""
308
-
309
-
310
-ProcessorInputs: TypeAlias = DecoderOnlyInputs | EncoderDecoderInputs
311
-"""
312
-A processed prompt from
313
-[`InputPreprocessor`][vllm.inputs.preprocess.InputPreprocessor]
314
-which can be passed to
315
-[`InputProcessor`][vllm.v1.engine.input_processor.InputProcessor].
316
-"""
317
-
318
-
319
-SingletonInputs: TypeAlias = DecoderOnlyInputs | MultiModalEncDecInputs
320
-"""The inputs for a single encoder/decoder prompt."""
321
-
322
-
323
-def _validate_enc_inputs(inputs: SingletonInputs) -> EncoderInputs:
324
- if inputs["type"] == "embeds":
325
- raise ValueError(
326
- "Embedding inputs are not supported for encoder-decoder models"
327
- )
328
-
329
- if inputs["type"] == "multimodal" and "encoder_prompt_token_ids" not in inputs:
330
- raise RuntimeError(
331
- "You should register an encoder-decoder multi-modal processor "
332
- "for encoder-decoder models."
333
- )
334
-
335
- return inputs # type: ignore[return-value]
336
-
337
-
338
-def _validate_dec_inputs(inputs: SingletonInputs) -> DecoderInputs:
339
- if inputs["type"] == "embeds":
340
- raise ValueError(
341
- "Embedding inputs are not supported for encoder-decoder models"
342
- )
343
-
344
- return inputs
345
-
346
-
347
-def _prepare_decoder_input_ids_for_generation(
348
- decoder_input_ids: list[int],
349
- decoder_start_token_id: int,
350
-) -> list[int]:
351
- """
352
- Prepare `decoder_input_ids` for generation with encoder-decoder models,
353
- according to `GenerationMixin._prepare_decoder_input_ids_for_generation()`.
354
-
355
- Source:
356
- https://github.com/huggingface/transformers/blob/v5.1.0/src/transformers/generation/utils.py
357
- """
358
- if len(decoder_input_ids) == 0 or decoder_input_ids[0] != decoder_start_token_id:
359
- decoder_input_ids = [decoder_start_token_id] + decoder_input_ids
360
-
361
- return decoder_input_ids
362
-
363
-
364
-def build_enc_dec_inputs(
365
- encoder_inputs: SingletonInputs,
366
- decoder_inputs: SingletonInputs | None,
367
- decoder_start_token_id: int,
368
- skip_decoder_start_token: bool = False,
369
-) -> EncoderDecoderInputs:
370
- enc_inputs = _validate_enc_inputs(encoder_inputs)
371
-
372
- if decoder_inputs is None:
373
- dec_inputs: DecoderInputs = enc_inputs
374
- else:
375
- dec_inputs = _validate_dec_inputs(decoder_inputs)
376
-
377
- enc_inputs_new: EncoderInputs
378
- dec_inputs_new: DecoderInputs
379
-
380
- if enc_inputs["type"] == "multimodal":
381
- from vllm.multimodal.inputs import mm_inputs
382
-
383
- enc_inputs_new = token_inputs(
384
- enc_inputs["encoder_prompt_token_ids"],
385
- prompt=enc_inputs.get("encoder_prompt"),
386
- )
387
- dec_inputs_new = mm_inputs(
388
- prompt_token_ids=dec_inputs["prompt_token_ids"],
389
- prompt=dec_inputs.get("prompt"),
390
- mm_kwargs=enc_inputs["mm_kwargs"],
391
- mm_hashes=enc_inputs["mm_hashes"],
392
- mm_placeholders=enc_inputs["mm_placeholders"],
393
- )
394
- elif enc_inputs["type"] == "token":
395
- enc_inputs_new = token_inputs(prompt_token_ids=[])
396
- dec_inputs_new = dec_inputs
397
- else:
398
- assert_never(enc_inputs)
399
-
400
- if not skip_decoder_start_token:
401
- dec_inputs_new["prompt_token_ids"] = _prepare_decoder_input_ids_for_generation(
402
- dec_inputs_new["prompt_token_ids"],
403
- decoder_start_token_id,
404
- )
405
-
406
- if cache_salt := enc_inputs.get("cache_salt"):
407
- dec_inputs_new["cache_salt"] = cache_salt
408
-
409
- return EncoderDecoderInputs(
410
- type="enc_dec",
411
- encoder_prompt=enc_inputs_new,
412
- decoder_prompt=dec_inputs_new,
413
- )
vllm/inputs/engine.py
new
+352
@@ -0,0 +1,352 @@
1
+"""Schema and utilities for inputs to the engine client (`LLMEngine`/`AsyncLLM`)."""
2
+
3
+# SPDX-License-Identifier: Apache-2.0
4
+# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
5
+from collections.abc import Mapping, Sequence
6
+from typing import TYPE_CHECKING, Literal, TypeAlias
7
+
8
+from typing_extensions import NotRequired, TypedDict, assert_never
9
+
10
+if TYPE_CHECKING:
11
+ import torch
12
+
13
+ from vllm.multimodal.inputs import MultiModalKwargsOptionalItems, PlaceholderRange
14
+
15
+
16
+class _InputOptions(TypedDict):
17
+ """
18
+ Additional options available to all
19
+ [`SingletonInput`][vllm.inputs.engine.SingletonInput] types.
20
+ """
21
+
22
+ arrival_time: NotRequired[float]
23
+ """The time when the input was received (before rendering)."""
24
+
25
+ cache_salt: NotRequired[str]
26
+ """Optional cache salt to be used for prefix caching."""
27
+
28
+
29
+class TokensInput(_InputOptions):
30
+ """Represents token-based input to the engine."""
31
+
32
+ type: Literal["token"]
33
+ """The type of input."""
34
+
35
+ prompt_token_ids: list[int]
36
+ """The token IDs of the prompt."""
37
+
38
+ prompt: NotRequired[str]
39
+ """The prompt text corresponding to the token IDs, if available."""
40
+
41
+
42
+def tokens_input(
43
+ prompt_token_ids: list[int],
44
+ *,
45
+ prompt: str | None = None,
46
+ cache_salt: str | None = None,
47
+) -> TokensInput:
48
+ """
49
+ Construct [`TokensInput`][vllm.inputs.engine.TokensInput]
50
+ from optional values.
51
+ """
52
+ inputs = TokensInput(type="token", prompt_token_ids=prompt_token_ids)
53
+
54
+ if prompt is not None:
55
+ inputs["prompt"] = prompt
56
+ if cache_salt is not None:
57
+ inputs["cache_salt"] = cache_salt
58
+
59
+ return inputs
60
+
61
+
62
+class EmbedsInput(_InputOptions):
63
+ """Represents embeddings-based input to the engine."""
64
+
65
+ type: Literal["embeds"]
66
+ """The type of input."""
67
+
68
+ prompt_embeds: "torch.Tensor"
69
+ """The embeddings of the prompt."""
70
+
71
+ prompt: NotRequired[str]
72
+ """The prompt text corresponding to the token IDs, if available."""
73
+
74
+
75
+def embeds_input(
76
+ prompt_embeds: "torch.Tensor",
77
+ *,
78
+ prompt: str | None = None,
79
+ cache_salt: str | None = None,
80
+) -> EmbedsInput:
81
+ """
82
+ Construct [`EmbedsInput`][vllm.inputs.engine.EmbedsInput]
83
+ from optional values.
84
+ """
85
+ inputs = EmbedsInput(type="embeds", prompt_embeds=prompt_embeds)
86
+
87
+ if prompt is not None:
88
+ inputs["prompt"] = prompt
89
+ if cache_salt is not None:
90
+ inputs["cache_salt"] = cache_salt
91
+
92
+ return inputs
93
+
94
+
95
+MultiModalHashes: TypeAlias = Mapping[str, list[str]]
96
+"""
97
+A dictionary containing per-item hashes for each modality.
98
+"""
99
+
100
+
101
+MultiModalPlaceholders: TypeAlias = Mapping[str, Sequence["PlaceholderRange"]]
102
+"""
103
+A dictionary containing per-item placeholder ranges for each modality.
104
+"""
105
+
106
+
107
+class MultiModalInput(_InputOptions):
108
+ """Represents multi-modal input to the engine."""
109
+
110
+ type: Literal["multimodal"]
111
+ """The type of input."""
112
+
113
+ prompt_token_ids: list[int]
114
+ """The processed token IDs which includes placeholder tokens."""
115
+
116
+ prompt: NotRequired[str]
117
+ """The prompt text corresponding to the token IDs, if available."""
118
+
119
+ mm_kwargs: "MultiModalKwargsOptionalItems"
120
+ """Keyword arguments to be directly passed to the model after batching."""
121
+
122
+ mm_hashes: MultiModalHashes
123
+ """The hashes of the multi-modal data."""
124
+
125
+ mm_placeholders: MultiModalPlaceholders
126
+ """
127
+ For each modality, information about the placeholder tokens in
128
+ `prompt_token_ids`.
129
+ """
130
+
131
+
132
+def mm_input(
133
+ prompt_token_ids: list[int],
134
+ mm_kwargs: "MultiModalKwargsOptionalItems",
135
+ mm_hashes: MultiModalHashes,
136
+ mm_placeholders: MultiModalPlaceholders,
137
+ *,
138
+ prompt: str | None = None,
139
+ cache_salt: str | None = None,
140
+) -> MultiModalInput:
141
+ inputs = MultiModalInput(
142
+ type="multimodal",
143
+ prompt_token_ids=prompt_token_ids,
144
+ mm_kwargs=mm_kwargs,
145
+ mm_hashes=mm_hashes,
146
+ mm_placeholders=mm_placeholders,
147
+ )
148
+
149
+ if prompt is not None:
150
+ inputs["prompt"] = prompt
151
+ if cache_salt is not None:
152
+ inputs["cache_salt"] = cache_salt
153
+
154
+ return inputs
155
+
156
+
157
+class MultiModalEncDecInput(MultiModalInput):
158
+ """
159
+ Represents multi-modal input to the engine for encoder-decoder models.
160
+
161
+ Note:
162
+ Even text-only encoder-decoder models are currently implemented
163
+ as multi-modal models for convenience.
164
+ (Example: https://github.com/vllm-project/bart-plugin)
165
+ """
166
+
167
+ encoder_prompt_token_ids: list[int]
168
+ """The processed token IDs of the encoder prompt."""
169
+
170
+ encoder_prompt: NotRequired[str]
171
+ """The prompt text corresponding to the encoder token IDs, if available."""
172
+
173
+
174
+def mm_enc_dec_input(
175
+ encoder_inputs: MultiModalInput,
176
+ decoder_prompt_token_ids: list[int],
177
+ *,
178
+ decoder_prompt: str | None = None,
179
+) -> MultiModalEncDecInput:
180
+ inputs = MultiModalEncDecInput(
181
+ type="multimodal",
182
+ prompt_token_ids=decoder_prompt_token_ids,
183
+ encoder_prompt_token_ids=encoder_inputs["prompt_token_ids"],
184
+ mm_kwargs=encoder_inputs["mm_kwargs"],
185
+ mm_hashes=encoder_inputs["mm_hashes"],
186
+ mm_placeholders=encoder_inputs["mm_placeholders"],
187
+ )
188
+
189
+ if decoder_prompt is not None:
190
+ inputs["prompt"] = decoder_prompt
191
+ if "prompt" in encoder_inputs:
192
+ inputs["encoder_prompt"] = encoder_inputs["prompt"]
193
+ if "cache_salt" in encoder_inputs:
194
+ inputs["cache_salt"] = encoder_inputs["cache_salt"]
195
+
196
+ return inputs
197
+
198
+
199
+DecoderOnlyEngineInput: TypeAlias = TokensInput | EmbedsInput | MultiModalInput
200
+"""
201
+A rendered [`DecoderOnlyPrompt`][vllm.inputs.llm.DecoderOnlyPrompt]
202
+which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
203
+"""
204
+
205
+
206
+EncoderInput: TypeAlias = TokensInput | MultiModalEncDecInput
207
+"""
208
+A rendered [`EncoderPrompt`][vllm.inputs.llm.EncoderPrompt]
209
+which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
210
+"""
211
+
212
+
213
+DecoderEngineInput: TypeAlias = TokensInput | MultiModalInput
214
+"""
215
+A rendered [`DecoderPrompt`][vllm.inputs.llm.DecoderPrompt]
216
+which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
217
+"""
218
+
219
+
220
+class EncoderDecoderInput(TypedDict):
221
+ """
222
+ A rendered [`EncoderDecoderPrompt`][vllm.inputs.llm.EncoderDecoderPrompt]
223
+ which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
224
+ """
225
+
226
+ type: Literal["enc_dec"]
227
+
228
+ encoder_prompt: EncoderInput
229
+ """The inputs for the encoder portion."""
230
+
231
+ decoder_prompt: DecoderEngineInput
232
+ """The inputs for the decoder portion."""
233
+
234
+ arrival_time: NotRequired[float]
235
+ """The time when the input was received (before rendering)."""
236
+
237
+
238
+SingletonInput: TypeAlias = DecoderOnlyEngineInput | MultiModalEncDecInput
239
+"""
240
+A rendered [`SingletonPrompt`][vllm.inputs.llm.SingletonPrompt]
241
+which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
242
+"""
243
+
244
+
245
+EngineInput: TypeAlias = DecoderOnlyEngineInput | EncoderDecoderInput
246
+"""
247
+A rendered [`PromptType`][vllm.inputs.llm.PromptType]
248
+which can be passed to `LLMEngine.add_request` or `AsyncLLM.add_request`.
249
+"""
250
+
251
+
252
+def _validate_enc_input(enc_input: SingletonInput) -> EncoderInput:
253
+ if enc_input["type"] == "embeds":
254
+ raise ValueError(
255
+ "Embedding inputs are not supported for encoder-decoder models"
256
+ )
257
+
258
+ if (
259
+ enc_input["type"] == "multimodal"
260
+ and "encoder_prompt_token_ids" not in enc_input
261
+ ):
262
+ raise RuntimeError(
263
+ "You should register an encoder-decoder multi-modal processor "
264
+ "for encoder-decoder models."
265
+ )
266
+
267
+ return enc_input # type: ignore[return-value]
268
+
269
+
270
+def _validate_dec_input(dec_input: SingletonInput) -> DecoderEngineInput:
271
+ if dec_input["type"] == "embeds":
272
+ raise ValueError(
273
+ "Embedding inputs are not supported for encoder-decoder models"
274
+ )
275
+
276
+ return dec_input
277
+
278
+
279
+def _prepare_decoder_input_ids_for_generation(
280
+ decoder_input_ids: list[int],
281
+ decoder_start_token_id: int,
282
+) -> list[int]:
283
+ """
284
+ Prepare `decoder_input_ids` for generation with encoder-decoder models,
285
+ according to `GenerationMixin._prepare_decoder_input_ids_for_generation()`.
286
+
287
+ Source:
288
+ https://github.com/huggingface/transformers/blob/v5.1.0/src/transformers/generation/utils.py
289
+ """
290
+ if len(decoder_input_ids) == 0 or decoder_input_ids[0] != decoder_start_token_id:
291
+ decoder_input_ids = [decoder_start_token_id] + decoder_input_ids
292
+
293
+ return decoder_input_ids
294
+
295
+
296
+def build_enc_dec_input(
297
+ encoder_input: SingletonInput,
298
+ decoder_input: SingletonInput | None,
299
+ decoder_start_token_id: int,
300
+ skip_decoder_start_token: bool = False,
301
+) -> EncoderDecoderInput:
302
+ enc_input = _validate_enc_input(encoder_input)
303
+
304
+ if decoder_input is None:
305
+ dec_input: DecoderEngineInput = enc_input
306
+ else:
307
+ dec_input = _validate_dec_input(decoder_input)
308
+
309
+ enc_input_new: EncoderInput
310
+ dec_input_new: DecoderEngineInput
311
+
312
+ if enc_input["type"] == "multimodal":
313
+ enc_input_new = tokens_input(
314
+ enc_input["encoder_prompt_token_ids"],
315
+ prompt=enc_input.get("encoder_prompt"),
316
+ )
317
+ dec_input_new = mm_input(
318
+ prompt_token_ids=dec_input["prompt_token_ids"],
319
+ prompt=dec_input.get("prompt"),
320
+ mm_kwargs=enc_input["mm_kwargs"],
321
+ mm_hashes=enc_input["mm_hashes"],
322
+ mm_placeholders=enc_input["mm_placeholders"],
323
+ )
324
+ elif enc_input["type"] == "token":
325
+ enc_input_new = tokens_input(prompt_token_ids=[])
326
+ dec_input_new = dec_input
327
+ else:
328
+ assert_never(enc_input)
329
+
330
+ if not skip_decoder_start_token:
331
+ dec_input_new["prompt_token_ids"] = _prepare_decoder_input_ids_for_generation(
332
+ dec_input_new["prompt_token_ids"],
333
+ decoder_start_token_id,
334
+ )
335
+
336
+ if cache_salt := enc_input.get("cache_salt"):
337
+ dec_input_new["cache_salt"] = cache_salt
338
+
339
+ return EncoderDecoderInput(
340
+ type="enc_dec",
341
+ encoder_prompt=enc_input_new,
342
+ decoder_prompt=dec_input_new,
343
+ )
344
+
345
+
346
+def split_enc_dec_input(
347
+ inputs: EngineInput,
348
+) -> tuple[SingletonInput | None, SingletonInput]:
349
+ if inputs["type"] == "enc_dec":
350
+ return inputs["encoder_prompt"], inputs["decoder_prompt"]
351
+
352
+ return None, inputs
vllm/inputs/llm.py
new
+222
@@ -0,0 +1,222 @@
1
+"""Schema and utilities for input prompts to the LLM API."""
2
+
3
+# SPDX-License-Identifier: Apache-2.0
4
+# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
5
+from collections.abc import Mapping, Sequence
6
+from typing import TYPE_CHECKING, Any, TypeAlias, TypeVar, final
7
+
8
+from typing_extensions import NotRequired, TypedDict
9
+
10
+if TYPE_CHECKING:
11
+ import torch
12
+
13
+ from vllm.multimodal.inputs import AudioItem, ImageItem, VideoItem, VisionChunk
14
+
15
+
16
+_T = TypeVar("_T")
17
+
18
+ModalityData: TypeAlias = _T | list[_T | None] | None
19
+"""
20
+Either a single data item, or a list of data items. Can only be None if UUID
21
+is provided.
22
+
23
+The number of data items allowed per modality is restricted by
24
+`--limit-mm-per-prompt`.
25
+"""
26
+
27
+
28
+@final
29
+class MultiModalDataBuiltins(TypedDict, total=False):
30
+ """Type annotations for modality types predefined by vLLM."""
31
+
32
+ image: ModalityData["ImageItem"]
33
+ """The input image(s)."""
34
+
35
+ video: ModalityData["VideoItem"]
36
+ """The input video(s)."""
37
+
38
+ audio: ModalityData["AudioItem"]
39
+ """The input audio(s)."""
40
+
41
+ vision_chunk: ModalityData["VisionChunk"]
42
+ """The input visual atom(s) - unified modality for images and video chunks."""
43
+
44
+
45
+MultiModalDataDict: TypeAlias = Mapping[str, ModalityData[Any]]
46
+"""
47
+A dictionary containing an entry for each modality type to input.
48
+
49
+The built-in modalities are defined by
50
+[`MultiModalDataBuiltins`][vllm.inputs.llm.MultiModalDataBuiltins].
51
+"""
52
+
53
+MultiModalUUIDDict: TypeAlias = Mapping[str, Sequence[str | None] | str]
54
+"""
55
+A dictionary containing user-provided UUIDs for items in each modality.
56
+If a UUID for an item is not provided, its entry will be `None` and
57
+MultiModalHasher will compute a hash for the item.
58
+
59
+The UUID will be used to identify the item for all caching purposes
60
+(input processing caching, embedding caching, prefix caching, etc).
61
+"""
62
+
63
+
64
+class _PromptOptions(TypedDict):
65
+ """
66
+ Additional options available to all
67
+ [`SingletonPrompt`][vllm.inputs.llm.SingletonPrompt] types.
68
+ """
69
+
70
+ multi_modal_data: NotRequired[MultiModalDataDict | None]
71
+ """
72
+ Optional multi-modal data to pass to the model,
73
+ if the model supports it.
74
+ """
75
+
76
+ mm_processor_kwargs: NotRequired[dict[str, Any] | None]
77
+ """
78
+ Optional multi-modal processor kwargs to be forwarded to the
79
+ multimodal input mapper & processor. Note that if multiple modalities
80
+ have registered mappers etc for the model being considered, we attempt
81
+ to pass the mm_processor_kwargs to each of them.
82
+ """
83
+
84
+ multi_modal_uuids: NotRequired[MultiModalUUIDDict]
85
+ """
86
+ Optional user-specified UUIDs for multimodal items, mapped by modality.
87
+ Lists must match the number of items per modality and may contain `None`.
88
+ For `None` entries, the hasher will compute IDs automatically; non-None
89
+ entries override the default hashes for caching, and MUST be unique per
90
+ multimodal item.
91
+ """
92
+
93
+ cache_salt: NotRequired[str]
94
+ """
95
+ Optional cache salt to be used for prefix caching.
96
+ """
97
+
98
+
99
+class TextPrompt(_PromptOptions):
100
+ """Schema for a text prompt."""
101
+
102
+ prompt: str
103
+ """The input text to be tokenized before passing to the model."""
104
+
105
+
106
+class TokensPrompt(_PromptOptions):
107
+ """Schema for a tokenized prompt."""
108
+
109
+ prompt_token_ids: list[int]
110
+ """A list of token IDs to pass to the model."""
111
+
112
+ prompt: NotRequired[str]
113
+ """The prompt text corresponding to the token IDs, if available."""
114
+
115
+ token_type_ids: NotRequired[list[int]]
116
+ """A list of token type IDs to pass to the cross encoder model."""
117
+
118
+
119
+class EmbedsPrompt(_PromptOptions):
120
+ """Schema for a prompt provided via token embeddings."""
121
+
122
+ prompt_embeds: "torch.Tensor"
123
+ """The embeddings of the prompt."""
124
+
125
+ prompt: NotRequired[str]
126
+ """The prompt text corresponding to the token embeddings, if available."""
127
+
128
+
129
+DecoderOnlyPrompt: TypeAlias = (
130
+ str | TextPrompt | list[int] | TokensPrompt | EmbedsPrompt
131
+)
132
+"""
133
+Schema of a prompt for a decoder-only model:
134
+
135
+- A text prompt (string or [`TextPrompt`][vllm.inputs.llm.TextPrompt])
136
+- A tokenized prompt (list of token IDs, or
137
+ [`TokensPrompt`][vllm.inputs.llm.TokensPrompt])
138
+- An embeddings prompt ([`EmbedsPrompt`][vllm.inputs.llm.EmbedsPrompt])
139
+
140
+For encoder-decoder models, passing a singleton prompt is shorthand for passing
141
+`ExplicitEncoderDecoderPrompt(encoder_prompt=prompt, decoder_prompt=None)`.
142
+"""
143
+
144
+
145
+EncoderPrompt: TypeAlias = str | TextPrompt | list[int] | TokensPrompt
146
+"""
147
+Schema of a prompt for the encoder part of a encoder-decoder model:
148
+
149
+- A text prompt (string or [`TextPrompt`][vllm.inputs.llm.TextPrompt])
150
+- A tokenized prompt (list of token IDs, or
151
+ [`TokensPrompt`][vllm.inputs.llm.TokensPrompt])
152
+"""
153
+
154
+
155
+DecoderPrompt: TypeAlias = str | TextPrompt | list[int] | TokensPrompt
156
+"""
157
+Schema of a prompt for the decoder part of an encoder-decoder model:
158
+
159
+- A text prompt (string or [`TextPrompt`][vllm.inputs.llm.TextPrompt])
160
+- A tokenized prompt (list of token IDs, or
161
+ [`TokensPrompt`][vllm.inputs.llm.TokensPrompt])
162
+
163
+Note:
164
+ Multi-modal inputs are not supported for decoder prompts.
165
+"""
166
+
167
+
168
+class ExplicitEncoderDecoderPrompt(TypedDict):
169
+ """
170
+ Schema for a pair of encoder and decoder singleton prompts.
171
+
172
+ Note:
173
+ This schema is not valid for decoder-only models.
174
+ """
175
+
176
+ encoder_prompt: EncoderPrompt
177
+ """The prompt for the encoder part of the model."""
178
+
179
+ decoder_prompt: DecoderPrompt | None
180
+ """
181
+ The prompt for the decoder part of the model.
182
+
183
+ Passing `None` will cause the prompt to be inferred automatically.
184
+ """
185
+
186
+
187
+EncoderDecoderPrompt: TypeAlias = EncoderPrompt | ExplicitEncoderDecoderPrompt
188
+"""
189
+Schema for a prompt for an encoder-decoder model.
190
+
191
+You can pass a singleton encoder prompt, in which case the decoder prompt is
192
+considered to be `None` (i.e., infer automatically).
193
+"""
194
+
195
+
196
+SingletonPrompt: TypeAlias = DecoderOnlyPrompt | EncoderPrompt | DecoderPrompt
197
+"""
198
+Schema for a single prompt. This is as opposed to a data structure
199
+which encapsulates multiple prompts, such as
200
+[`ExplicitEncoderDecoderPrompt`][vllm.inputs.llm.ExplicitEncoderDecoderPrompt].
201
+"""
202
+
203
+
204
+PromptType: TypeAlias = DecoderOnlyPrompt | EncoderDecoderPrompt
205
+"""
206
+Schema for any prompt, regardless of model type.
207
+
208
+This is the input format accepted by most [`LLM`][vllm.entrypoints.llm.LLM] APIs.
209
+"""
210
+
211
+
212
+class DataPrompt(_PromptOptions):
213
+ """
214
+ Represents generic inputs that are converted to
215
+ [`PromptType`][vllm.inputs.llm.PromptType] by IO processor plugins.
216
+ """
217
+
218
+ data: Any
219
+ """The input data."""
220
+
221
+ data_format: str
222
+ """The input data format."""
vllm/inputs/parse.py
deleted
-13
@@ -1,13 +0,0 @@
1
-# SPDX-License-Identifier: Apache-2.0
2
-# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
-
4
-from .data import ProcessorInputs, SingletonInputs
5
-
6
-
7
-def split_enc_dec_inputs(
8
- inputs: ProcessorInputs,
9
-) -> tuple[SingletonInputs | None, SingletonInputs]:
10
- if inputs["type"] == "enc_dec":
11
- return inputs["encoder_prompt"], inputs["decoder_prompt"]
12
-
13
- return None, inputs
vllm/inputs/preprocess.py
+34
-73
@@ -7,14 +7,9 @@ from typing import Any, overload
7
from typing_extensions import assert_never
8
9
from vllm.config import VllmConfig
10
-from vllm.inputs.data import build_enc_dec_inputs
10
+from vllm.inputs import build_enc_dec_input
11
from vllm.logger import init_logger
12
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalRegistry
13
-from vllm.multimodal.inputs import (
14
- MultiModalDataDict,
15
- MultiModalInputs,
16
- MultiModalUUIDDict,
17
-)
13
from vllm.renderers import BaseRenderer, renderer_from_config
14
from vllm.renderers.inputs import (
15
DecoderDictPrompt,
@@ -26,20 +21,25 @@ from vllm.renderers.inputs import (
21
from vllm.renderers.inputs.preprocess import parse_dec_only_prompt, parse_enc_dec_prompt
22
from vllm.tokenizers import TokenizerLike
23
29
-from .data import (
30
- DecoderInputs,
31
- DecoderOnlyInputs,
32
- EmbedsInputs,
24
+from .engine import (
25
+ DecoderEngineInput,
26
+ DecoderOnlyEngineInput,
27
+ EmbedsInput,
28
+ EncoderDecoderInput,
29
+ EncoderInput,
30
+ EngineInput,
31
+ MultiModalInput,
32
+ SingletonInput,
33
+ TokensInput,
34
+ tokens_input,
35
+)
36
+from .llm import (
37
EmbedsPrompt,
34
- EncoderDecoderInputs,
35
- EncoderInputs,
36
- ProcessorInputs,
38
+ MultiModalDataDict,
39
+ MultiModalUUIDDict,
40
PromptType,
38
- SingletonInputs,
41
TextPrompt,
40
- TokenInputs,
42
TokensPrompt,
42
- token_inputs,
43
)
44
45
logger = init_logger(__name__)
@@ -95,7 +95,7 @@ class InputPreprocessor:
95
tokenization_kwargs: dict[str, Any] | None = None,
96
*,
97
mm_uuids: MultiModalUUIDDict | None = None,
98
- ) -> MultiModalInputs:
98
+ ) -> MultiModalInput:
99
"""
100
Apply the model's multi-modal processor to a multi-modal prompt,
101
returning the corresponding token IDs and metadata.
@@ -111,7 +111,7 @@ class InputPreprocessor:
111
def _process_embeds(
112
self,
113
parsed_content: EmbedsPrompt,
114
- ) -> EmbedsInputs:
114
+ ) -> EmbedsInput:
115
return self.renderer._process_embeds(parsed_content)
116
117
def _truncate_inputs(
@@ -134,12 +134,12 @@ class InputPreprocessor:
134
self,
135
parsed_content: TokensPrompt,
136
tokenization_kwargs: dict[str, Any] | None = None,
137
- ) -> TokenInputs | MultiModalInputs:
137
+ ) -> TokensInput | MultiModalInput:
138
prompt_token_ids = self._truncate_inputs(
139
parsed_content["prompt_token_ids"], tokenization_kwargs
140
)
141
142
- inputs: TokenInputs | MultiModalInputs
142
+ inputs: TokensInput | MultiModalInput
143
if multi_modal_data := parsed_content.get("multi_modal_data"):
144
inputs = self._process_multimodal(
145
prompt_token_ids,
@@ -149,7 +149,7 @@ class InputPreprocessor:
149
mm_uuids=parsed_content.get("multi_modal_uuids"),
150
)
151
else:
152
- inputs = token_inputs(prompt_token_ids)
152
+ inputs = tokens_input(prompt_token_ids)
153
154
if prompt_text := parsed_content.get("prompt"):
155
inputs["prompt"] = prompt_text
@@ -162,10 +162,10 @@ class InputPreprocessor:
162
self,
163
parsed_content: TextPrompt,
164
tokenization_kwargs: dict[str, Any] | None = None,
165
- ) -> TokenInputs | MultiModalInputs:
165
+ ) -> TokensInput | MultiModalInput:
166
prompt_text = parsed_content["prompt"]
167
168
- inputs: TokenInputs | MultiModalInputs
168
+ inputs: TokensInput | MultiModalInput
169
if multi_modal_data := parsed_content.get("multi_modal_data"):
170
inputs = self._process_multimodal(
171
prompt_text,
@@ -178,7 +178,7 @@ class InputPreprocessor:
178
prompt_text,
179
tokenization_kwargs=tokenization_kwargs,
180
)
181
- inputs = token_inputs(prompt_token_ids)
181
+ inputs = tokens_input(prompt_token_ids)
182
183
inputs["prompt"] = prompt_text
184
@@ -192,38 +192,27 @@ class InputPreprocessor:
192
self,
193
prompt: EncoderDictPrompt,
194
tokenization_kwargs: dict[str, Any] | None = None,
195
- ) -> EncoderInputs: ...
195
+ ) -> EncoderInput: ...
196
197
@overload
198
def _prompt_to_llm_inputs( # type: ignore[misc]
199
self,
200
prompt: DecoderDictPrompt,
201
tokenization_kwargs: dict[str, Any] | None = None,
202
- ) -> DecoderInputs: ...
202
+ ) -> DecoderEngineInput: ...
203
204
@overload
205
def _prompt_to_llm_inputs( # type: ignore[misc]
206
self,
207
prompt: DecoderOnlyDictPrompt,
208
tokenization_kwargs: dict[str, Any] | None = None,
209
- ) -> DecoderOnlyInputs: ...
209
+ ) -> DecoderOnlyEngineInput: ...
210
211
def _prompt_to_llm_inputs(
212
self,
213
prompt: SingletonDictPrompt,
214
tokenization_kwargs: dict[str, Any] | None = None,
215
- ) -> SingletonInputs:
216
- """
217
- Extract the singleton inputs from a prompt.
218
-
219
- Arguments:
220
-
221
- * prompt: single encoder or decoder input prompt
222
-
223
- Returns:
224
-
225
- * [`SingletonInputs`][vllm.inputs.data.SingletonInputs] instance
226
- """
215
+ ) -> SingletonInput:
216
if "prompt_embeds" in prompt:
217
return self._process_embeds(prompt) # type: ignore[arg-type]
218
@@ -242,22 +231,7 @@ class InputPreprocessor:
231
self,
232
prompt: EncoderDecoderDictPrompt,
233
tokenization_kwargs: dict[str, Any] | None = None,
245
- ) -> EncoderDecoderInputs:
246
- """
247
- For encoder/decoder models only:
248
- Process an input prompt into an
249
- [`EncoderDecoderInputs`][vllm.inputs.data.EncoderDecoderInputs]
250
- instance.
251
-
252
- Arguments:
253
-
254
- * prompt: an input prompt
255
-
256
- Returns:
257
-
258
- * [`EncoderDecoderInputs`][vllm.inputs.data.EncoderDecoderInputs]
259
- instance
260
- """
234
+ ) -> EncoderDecoderInput:
235
encoder_prompt = prompt["encoder_prompt"]
236
decoder_prompt = prompt["decoder_prompt"]
237
@@ -270,12 +244,12 @@ class InputPreprocessor:
244
self.renderer.mm_processor.skip_decoder_start_token
245
)
246
273
- return build_enc_dec_inputs(
274
- encoder_inputs=self._prompt_to_llm_inputs(
247
+ return build_enc_dec_input(
248
+ encoder_input=self._prompt_to_llm_inputs(
249
encoder_prompt,
250
tokenization_kwargs=tokenization_kwargs,
251
),
278
- decoder_inputs=(
252
+ decoder_input=(
253
None
254
if decoder_prompt is None
255
else self._prompt_to_llm_inputs(
@@ -291,20 +265,7 @@ class InputPreprocessor:
265
self,
266
prompt: DecoderOnlyDictPrompt,
267
tokenization_kwargs: dict[str, Any] | None = None,
294
- ) -> DecoderOnlyInputs:
295
- """
296
- For decoder-only models:
297
- Process an input prompt into a
298
- [`DecoderOnlyInputs`][vllm.inputs.data.DecoderOnlyInputs] instance.
299
-
300
- Arguments:
301
-
302
- * prompt: input prompt
303
-
304
- Returns:
305
-
306
- * [`DecoderOnlyInputs`][vllm.inputs.data.DecoderOnlyInputs] instance
307
- """
268
+ ) -> DecoderOnlyEngineInput:
269
return self._prompt_to_llm_inputs(
270
prompt,
271
tokenization_kwargs=tokenization_kwargs,
@@ -314,7 +275,7 @@ class InputPreprocessor:
275
self,
276
prompt: PromptType,
277
tokenization_kwargs: dict[str, Any] | None = None,
317
- ) -> ProcessorInputs:
278
+ ) -> EngineInput:
279
"""Preprocess the input prompt."""
280
if self.model_config.is_encoder_decoder:
281
# Encoder-decoder model requires special mapping of
vllm/model_executor/models/aria.py
+1
-1
@@ -12,6 +12,7 @@ from transformers.models.aria.processing_aria import AriaProcessor
12
from vllm.config import VllmConfig
13
from vllm.config.multimodal import BaseDummyOptions
14
from vllm.distributed import get_tensor_model_parallel_rank
15
+from vllm.inputs import MultiModalDataDict
16
from vllm.model_executor.layers.activation import get_act_fn
17
from vllm.model_executor.layers.fused_moe import SharedFusedMoE
18
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -24,7 +25,6 @@ from vllm.model_executor.model_loader.weight_utils import (
25
)
26
from vllm.multimodal import MULTIMODAL_REGISTRY
27
from vllm.multimodal.inputs import (
27
- MultiModalDataDict,
28
MultiModalFieldConfig,
29
MultiModalKwargsItems,
30
)
vllm/model_executor/models/audioflamingo3.py
+1
-2
@@ -31,17 +31,16 @@ from transformers.models.qwen2_audio import Qwen2AudioEncoder
31
32
from vllm.config import VllmConfig
33
from vllm.config.multimodal import BaseDummyOptions
34
+from vllm.inputs import ModalityData, MultiModalDataDict
35
from vllm.model_executor.layers.activation import get_act_fn
36
from vllm.model_executor.models.module_mapping import MultiModelKeys
37
from vllm.multimodal import MULTIMODAL_REGISTRY
38
from vllm.multimodal.inputs import (
38
- MultiModalDataDict,
39
MultiModalFieldConfig,
40
MultiModalKwargsItems,
41
)
42
from vllm.multimodal.parse import (
43
DictEmbeddingItems,
44
- ModalityData,
44
ModalityDataItems,
45
MultiModalDataItems,
46
MultiModalDataParser,
vllm/model_executor/models/aya_vision.py
+1
-1
@@ -17,9 +17,9 @@ from transformers.models.got_ocr2.image_processing_got_ocr2 import (
17
18
from vllm.config import VllmConfig
19
from vllm.config.multimodal import BaseDummyOptions
20
+from vllm.inputs import MultiModalDataDict
21
from vllm.multimodal import MULTIMODAL_REGISTRY
22
from vllm.multimodal.inputs import (
22
- MultiModalDataDict,
23
MultiModalFieldConfig,
24
MultiModalKwargsItems,
25
)
vllm/model_executor/models/bagel.py
+1
-1
@@ -15,6 +15,7 @@ import torch.nn as nn
15
16
from vllm.config import VllmConfig
17
from vllm.config.multimodal import BaseDummyOptions
18
+from vllm.inputs import MultiModalDataDict
19
from vllm.logger import init_logger
20
from vllm.model_executor.layers.activation import get_act_fn
21
from vllm.model_executor.layers.linear import (
@@ -24,7 +25,6 @@ from vllm.model_executor.layers.linear import (
25
from vllm.model_executor.layers.quantization import QuantizationConfig
26
from vllm.multimodal import MULTIMODAL_REGISTRY
27
from vllm.multimodal.inputs import (
27
- MultiModalDataDict,
28
MultiModalFieldConfig,
29
MultiModalKwargsItems,
30
)
vllm/model_executor/models/bee.py
+1
-1
@@ -9,8 +9,8 @@ from transformers.activations import GELUActivation
9
10
from vllm.config import VllmConfig
11
from vllm.config.multimodal import BaseDummyOptions
12
+from vllm.inputs import MultiModalDataDict
13
from vllm.multimodal import MULTIMODAL_REGISTRY
13
-from vllm.multimodal.inputs import MultiModalDataDict
14
15
from .llava_next import (
16
LlavaDummyInputsBuilder,
vllm/model_executor/models/blip2.py
+1
-1
@@ -15,11 +15,11 @@ from transformers import (
15
16
from vllm.config import CacheConfig, VllmConfig
17
from vllm.config.multimodal import BaseDummyOptions
18
+from vllm.inputs import MultiModalDataDict
19
from vllm.model_executor.layers.activation import get_act_fn
20
from vllm.model_executor.layers.quantization import QuantizationConfig
21
from vllm.multimodal import MULTIMODAL_REGISTRY
22
from vllm.multimodal.inputs import (
22
- MultiModalDataDict,
23
MultiModalFieldConfig,
24
MultiModalKwargsItems,
25
)
vllm/model_executor/models/chameleon.py
+1
-1
@@ -19,6 +19,7 @@ from transformers import (
19
from vllm.config import CacheConfig, VllmConfig
20
from vllm.config.multimodal import BaseDummyOptions
21
from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
22
+from vllm.inputs import MultiModalDataDict
23
from vllm.logger import init_logger
24
from vllm.model_executor.layers.activation import SiluAndMul
25
from vllm.model_executor.layers.attention import Attention
@@ -43,7 +44,6 @@ from vllm.model_executor.model_loader.weight_utils import (
44
from vllm.model_executor.utils import set_weight_attrs
45
from vllm.multimodal import MULTIMODAL_REGISTRY
46
from vllm.multimodal.inputs import (
46
- MultiModalDataDict,
47
MultiModalFieldConfig,
48
MultiModalKwargsItems,
49
)
vllm/model_executor/models/clip.py
+2
-3
@@ -17,6 +17,7 @@ from transformers import (
17
from vllm.config import VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
from vllm.distributed import divide, get_tensor_model_parallel_world_size
20
+from vllm.inputs import MultiModalDataDict, MultiModalInput
21
from vllm.model_executor.layers.activation import get_act_fn
22
from vllm.model_executor.layers.attention import Attention, MMEncoderAttention
23
from vllm.model_executor.layers.conv import Conv2dLayer
@@ -32,9 +33,7 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
33
from vllm.model_executor.models.interfaces import SupportsQuant
34
from vllm.multimodal import MULTIMODAL_REGISTRY
35
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
36
MultiModalFieldConfig,
37
- MultiModalInputs,
37
MultiModalKwargsItems,
38
)
39
from vllm.multimodal.parse import (
@@ -207,7 +206,7 @@ class CLIPMultiModalProcessor(BaseMultiModalProcessor[CLIPProcessingInfo]):
206
self,
207
inputs: ProcessorInputs,
208
timing_ctx: TimingContext,
210
- ) -> MultiModalInputs:
209
+ ) -> MultiModalInput:
210
if inputs.mm_data_items:
211
if isinstance(inputs.prompt, str):
212
if len(inputs.prompt) > 0:
vllm/model_executor/models/cohere2_vision.py
+1
-1
@@ -19,6 +19,7 @@ from transformers.models.cohere2_vision.processing_cohere2_vision import (
19
20
from vllm.config import VllmConfig
21
from vllm.config.multimodal import BaseDummyOptions
22
+from vllm.inputs import MultiModalDataDict
23
from vllm.model_executor.layers.activation import MulAndSilu
24
from vllm.model_executor.layers.linear import (
25
MergedColumnParallelLinear,
@@ -28,7 +29,6 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
29
from vllm.model_executor.layers.quantization.awq import AWQConfig
30
from vllm.multimodal import MULTIMODAL_REGISTRY
31
from vllm.multimodal.inputs import (
31
- MultiModalDataDict,
32
MultiModalFieldConfig,
33
MultiModalKwargsItems,
34
)
vllm/model_executor/models/cohere_asr.py
+6
-10
@@ -3,7 +3,7 @@
3
4
import math
5
from collections.abc import Iterable, Mapping, Sequence
6
-from typing import Literal, cast
6
+from typing import Literal
7
8
import numpy as np
9
import torch
@@ -14,7 +14,7 @@ from transformers import PretrainedConfig
14
from vllm.compilation.decorators import support_torch_compile
15
from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
16
from vllm.distributed import get_tensor_model_parallel_world_size
17
-from vllm.inputs.data import PromptType
17
+from vllm.inputs import MultiModalDataDict, PromptType, TextPrompt
18
from vllm.logger import init_logger
19
from vllm.model_executor.layers.activation import get_act_fn
20
from vllm.model_executor.layers.attention import (
@@ -32,7 +32,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
32
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
33
from vllm.multimodal import MULTIMODAL_REGISTRY
34
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
35
MultiModalFieldConfig,
36
MultiModalKwargsItems,
37
)
@@ -2047,14 +2046,11 @@ class CohereASRForConditionalGeneration(
2046
f"<|noitn|><|notimestamp|><|nodiarize|>"
2047
)
2048
prompt_text = request_prompt if request_prompt else default_prompt
2050
- prompt = {
2051
- "prompt": prompt_text,
2052
- "multi_modal_data": {
2053
- "audio": (audio, stt_config.sample_rate),
2054
- },
2055
- }
2049
2057
- return cast(PromptType, prompt)
2050
+ return TextPrompt(
2051
+ prompt=prompt_text,
2052
+ multi_modal_data={"audio": (audio, stt_config.sample_rate)},
2053
+ )
2054
2055
@classmethod
2056
def get_placeholder_str(cls, modality: str, i: int) -> str | None:
vllm/model_executor/models/colmodernvbert.py
+1
-1
@@ -16,11 +16,11 @@ from transformers import BatchFeature
16
17
from vllm.config import VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
+from vllm.inputs import MultiModalDataDict
20
from vllm.model_executor.layers.pooler.tokwise import pooler_for_token_embed
21
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
22
from vllm.multimodal import MULTIMODAL_REGISTRY
23
from vllm.multimodal.inputs import (
23
- MultiModalDataDict,
24
MultiModalFieldConfig,
25
MultiModalKwargsItems,
26
)
vllm/model_executor/models/deepseek_ocr.py
+1
-1
@@ -12,6 +12,7 @@ from transformers import BatchFeature, CLIPVisionConfig
12
13
from vllm.config import VllmConfig
14
from vllm.config.multimodal import BaseDummyOptions
15
+from vllm.inputs import MultiModalDataDict
16
from vllm.model_executor.models.interfaces import (
17
MultiModalEmbeddings,
18
SupportsLoRA,
@@ -27,7 +28,6 @@ from vllm.model_executor.models.utils import (
28
)
29
from vllm.multimodal import MULTIMODAL_REGISTRY
30
from vllm.multimodal.inputs import (
30
- MultiModalDataDict,
31
MultiModalFieldConfig,
32
MultiModalKwargsItems,
33
NestedTensors,
vllm/model_executor/models/deepseek_ocr2.py
+1
-1
@@ -12,6 +12,7 @@ from transformers import BatchFeature
12
13
from vllm.config import VllmConfig
14
from vllm.config.multimodal import BaseDummyOptions
15
+from vllm.inputs import MultiModalDataDict
16
from vllm.model_executor.models.interfaces import (
17
MultiModalEmbeddings,
18
SupportsLoRA,
@@ -27,7 +28,6 @@ from vllm.model_executor.models.utils import (
28
)
29
from vllm.multimodal import MULTIMODAL_REGISTRY
30
from vllm.multimodal.inputs import (
30
- MultiModalDataDict,
31
MultiModalFieldConfig,
32
MultiModalKwargsItems,
33
NestedTensors,
vllm/model_executor/models/deepseek_vl2.py
+1
-1
@@ -17,11 +17,11 @@ from transformers import BatchFeature
17
from vllm.config import VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
from vllm.distributed import get_tensor_model_parallel_world_size
20
+from vllm.inputs import MultiModalDataDict
21
from vllm.model_executor.layers.quantization import QuantizationConfig
22
from vllm.model_executor.models.transformers.utils import replace_linear_class
23
from vllm.multimodal import MULTIMODAL_REGISTRY
24
from vllm.multimodal.inputs import (
24
- MultiModalDataDict,
25
MultiModalFieldConfig,
26
MultiModalKwargsItems,
27
)
vllm/model_executor/models/dots_ocr.py
+1
-1
@@ -15,6 +15,7 @@ from vllm.distributed.parallel_state import (
15
get_tensor_model_parallel_rank,
16
get_tensor_model_parallel_world_size,
17
)
18
+from vllm.inputs import MultiModalDataDict
19
from vllm.model_executor.layers.activation import SiluAndMul
20
from vllm.model_executor.layers.attention import (
21
MMEncoderAttention,
@@ -54,7 +55,6 @@ from vllm.model_executor.models.utils import (
55
)
56
from vllm.model_executor.models.vision import get_vit_attn_backend
57
from vllm.multimodal import MULTIMODAL_REGISTRY
57
-from vllm.multimodal.inputs import MultiModalDataDict
58
from vllm.sequence import IntermediateTensors
59
from vllm.transformers_utils.configs.dotsocr import DotsOCRConfig, DotsVisionConfig
60
from vllm.utils.tensor_schema import TensorSchema, TensorShape
vllm/model_executor/models/ernie45_vl.py
+1
-1
@@ -40,6 +40,7 @@ from vllm.config import VllmConfig
40
from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
41
from vllm.distributed import parallel_state
42
from vllm.distributed import utils as dist_utils
43
+from vllm.inputs import MultiModalDataDict
44
from vllm.logger import init_logger
45
from vllm.model_executor.layers.activation import QuickGELU
46
from vllm.model_executor.layers.attention import (
@@ -58,7 +59,6 @@ from vllm.model_executor.layers.rotary_embedding.common import (
59
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
60
from vllm.multimodal import MULTIMODAL_REGISTRY
61
from vllm.multimodal.inputs import (
61
- MultiModalDataDict,
62
MultiModalFeatureSpec,
63
MultiModalFieldConfig,
64
MultiModalKwargsItems,
vllm/model_executor/models/fireredasr2.py
+1
-2
@@ -15,7 +15,7 @@ from transformers import (
15
16
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
17
from vllm.config.multimodal import BaseDummyOptions
18
-from vllm.inputs.data import PromptType
18
+from vllm.inputs import MultiModalDataDict, PromptType
19
from vllm.logger import init_logger
20
from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
21
from vllm.model_executor.layers.linear import (
@@ -27,7 +27,6 @@ from vllm.model_executor.models.whisper_utils import (
27
)
28
from vllm.multimodal import MULTIMODAL_REGISTRY
29
from vllm.multimodal.inputs import (
30
- MultiModalDataDict,
30
MultiModalFieldConfig,
31
MultiModalKwargsItems,
32
)
vllm/model_executor/models/funasr.py
+1
-2
@@ -17,7 +17,7 @@ from transformers import (
17
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
from vllm.distributed import get_tensor_model_parallel_world_size
20
-from vllm.inputs.data import PromptType
20
+from vllm.inputs import MultiModalDataDict, PromptType
21
from vllm.logger import init_logger
22
from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
23
from vllm.model_executor.layers.attention.mm_encoder_attention import (
@@ -37,7 +37,6 @@ from vllm.model_executor.models.whisper_utils import (
37
)
38
from vllm.multimodal import MULTIMODAL_REGISTRY
39
from vllm.multimodal.inputs import (
40
- MultiModalDataDict,
40
MultiModalFieldConfig,
41
MultiModalKwargsItems,
42
)
vllm/model_executor/models/funaudiochat.py
+1
-1
@@ -27,12 +27,12 @@ from transformers.modeling_outputs import BaseModelOutput
27
28
from vllm.config import VllmConfig
29
from vllm.config.multimodal import BaseDummyOptions
30
+from vllm.inputs import MultiModalDataDict
31
from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
32
from vllm.model_executor.layers.linear import QKVParallelLinear, RowParallelLinear
33
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
34
from vllm.multimodal import MULTIMODAL_REGISTRY
35
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
36
MultiModalFieldConfig,
37
MultiModalKwargsItems,
38
)
vllm/model_executor/models/fuyu.py
+1
-1
@@ -28,11 +28,11 @@ from transformers import BatchFeature, FuyuConfig, FuyuImageProcessor, FuyuProce
28
29
from vllm.config import VllmConfig
30
from vllm.config.multimodal import BaseDummyOptions
31
+from vllm.inputs import MultiModalDataDict
32
from vllm.model_executor.layers.linear import ColumnParallelLinear
33
from vllm.model_executor.models.persimmon import PersimmonForCausalLM
34
from vllm.multimodal import MULTIMODAL_REGISTRY
35
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
36
MultiModalFieldConfig,
37
MultiModalKwargsItems,
38
)
vllm/model_executor/models/gemma3_mm.py
+1
-1
@@ -12,12 +12,12 @@ from transformers.models.gemma3.processing_gemma3 import Gemma3ProcessorKwargs
12
13
from vllm.config import VllmConfig
14
from vllm.config.multimodal import BaseDummyOptions
15
+from vllm.inputs import MultiModalDataDict
16
from vllm.logger import init_logger
17
from vllm.model_executor.layers.layernorm import GemmaRMSNorm
18
from vllm.model_executor.models.module_mapping import MultiModelKeys
19
from vllm.multimodal import MULTIMODAL_REGISTRY
20
from vllm.multimodal.inputs import (
20
- MultiModalDataDict,
21
MultiModalFieldConfig,
22
MultiModalKwargsItems,
23
)
vllm/model_executor/models/gemma3n_mm.py
+1
-2
@@ -19,7 +19,7 @@ from transformers.models.siglip import SiglipImageProcessorFast
19
20
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
21
from vllm.config.multimodal import BaseDummyOptions
22
-from vllm.inputs.data import PromptType, TextPrompt
22
+from vllm.inputs import MultiModalDataDict, PromptType, TextPrompt
23
from vllm.logger import init_logger
24
from vllm.model_executor.layers.layernorm import RMSNorm
25
from vllm.model_executor.layers.linear import RowParallelLinear
@@ -32,7 +32,6 @@ from vllm.model_executor.models.module_mapping import MultiModelKeys
32
from vllm.model_executor.models.whisper import ISO639_1_SUPPORTED_LANGS
33
from vllm.multimodal import MULTIMODAL_REGISTRY
34
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
35
MultiModalFieldConfig,
36
MultiModalKwargsItems,
37
)
vllm/model_executor/models/glm4_1v.py
+1
-1
@@ -50,6 +50,7 @@ from vllm.config import VllmConfig
50
from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
51
from vllm.distributed import get_tensor_model_parallel_world_size, parallel_state
52
from vllm.distributed import utils as dist_utils
53
+from vllm.inputs import MultiModalDataDict
54
from vllm.logger import init_logger
55
from vllm.model_executor.layers.attention import (
56
MMEncoderAttention,
@@ -74,7 +75,6 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
75
from vllm.model_executor.models.module_mapping import MultiModelKeys
76
from vllm.multimodal import MULTIMODAL_REGISTRY
77
from vllm.multimodal.inputs import (
77
- MultiModalDataDict,
78
MultiModalFeatureSpec,
79
MultiModalFieldConfig,
80
MultiModalKwargsItems,
vllm/model_executor/models/glm4v.py
+1
-1
@@ -18,6 +18,7 @@ from transformers import BatchFeature
18
from vllm.config import VllmConfig
19
from vllm.config.multimodal import BaseDummyOptions
20
from vllm.distributed import get_tensor_model_parallel_world_size
21
+from vllm.inputs import MultiModalDataDict
22
from vllm.model_executor.layers.activation import SiluAndMul, get_act_fn
23
from vllm.model_executor.layers.attention import MMEncoderAttention
24
from vllm.model_executor.layers.conv import Conv2dLayer
@@ -32,7 +33,6 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
33
from vllm.model_executor.models.module_mapping import MultiModelKeys
34
from vllm.multimodal import MULTIMODAL_REGISTRY
35
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
36
MultiModalFeatureSpec,
37
MultiModalFieldConfig,
38
MultiModalKwargsItems,
vllm/model_executor/models/glmasr.py
+1
-3
@@ -14,7 +14,7 @@ from transformers.models.whisper import WhisperFeatureExtractor
14
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
15
from vllm.config.multimodal import BaseDummyOptions
16
from vllm.distributed.parallel_state import get_tensor_model_parallel_world_size
17
-from vllm.inputs.data import PromptType, TokensPrompt
17
+from vllm.inputs import ModalityData, MultiModalDataDict, PromptType, TokensPrompt
18
from vllm.model_executor.layers.activation import get_act_fn
19
from vllm.model_executor.layers.attention import MMEncoderAttention
20
from vllm.model_executor.layers.linear import (
@@ -27,13 +27,11 @@ from vllm.model_executor.layers.rotary_embedding.common import ApplyRotaryEmb
27
from vllm.model_executor.models.module_mapping import MultiModelKeys
28
from vllm.multimodal import MULTIMODAL_REGISTRY
29
from vllm.multimodal.inputs import (
30
- MultiModalDataDict,
30
MultiModalFieldConfig,
31
MultiModalKwargsItems,
32
)
33
from vllm.multimodal.parse import (
34
DictEmbeddingItems,
36
- ModalityData,
35
ModalityDataItems,
36
MultiModalDataItems,
37
MultiModalDataParser,
vllm/model_executor/models/granite_speech.py
+1
-2
@@ -36,13 +36,12 @@ from transformers import BatchFeature, PretrainedConfig
36
37
from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
38
from vllm.config.multimodal import BaseDummyOptions
39
-from vllm.inputs.data import PromptType, TokensPrompt
39
+from vllm.inputs import MultiModalDataDict, PromptType, TokensPrompt
40
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
41
from vllm.model_executor.layers.quantization import QuantizationConfig
42
from vllm.model_executor.models.module_mapping import MultiModelKeys
43
from vllm.multimodal import MULTIMODAL_REGISTRY
44
from vllm.multimodal.inputs import (
45
- MultiModalDataDict,
45
MultiModalFieldConfig,
46
MultiModalKwargsItems,
47
)
vllm/model_executor/models/hunyuan_vision.py
+1
-2
@@ -37,6 +37,7 @@ from vllm.config import VllmConfig
37
from vllm.config.multimodal import BaseDummyOptions
38
from vllm.distributed import parallel_state
39
from vllm.distributed import utils as dist_utils
40
+from vllm.inputs import ModalityData, MultiModalDataDict
41
from vllm.logger import init_logger
42
from vllm.model_executor.layers.activation import get_act_fn
43
from vllm.model_executor.layers.attention import MMEncoderAttention
@@ -52,8 +53,6 @@ from vllm.model_executor.models.module_mapping import MultiModelKeys
53
from vllm.multimodal import MULTIMODAL_REGISTRY
54
from vllm.multimodal.inputs import (
55
ImageItem,
55
- ModalityData,
56
- MultiModalDataDict,
56
MultiModalFeatureSpec,
57
MultiModalFieldConfig,
58
MultiModalKwargsItems,
vllm/model_executor/models/hyperclovax_vision.py
+1
-1
@@ -18,10 +18,10 @@ from transformers import BatchFeature, CLIPVisionConfig, SiglipVisionConfig
18
19
from vllm.config import VllmConfig
20
from vllm.config.multimodal import BaseDummyOptions
21
+from vllm.inputs import MultiModalDataDict
22
from vllm.model_executor.layers.quantization import QuantizationConfig
23
from vllm.multimodal import MULTIMODAL_REGISTRY
24
from vllm.multimodal.inputs import (
24
- MultiModalDataDict,
25
MultiModalFieldConfig,
26
MultiModalKwargsItems,
27
)
vllm/model_executor/models/hyperclovax_vision_v2.py
+1
-1
@@ -21,9 +21,9 @@ from transformers import BatchFeature
21
from vllm.config import VllmConfig
22
from vllm.config.multimodal import BaseDummyOptions
23
from vllm.forward_context import set_forward_context
24
+from vllm.inputs import MultiModalDataDict
25
from vllm.multimodal import MULTIMODAL_REGISTRY
26
from vllm.multimodal.inputs import (
26
- MultiModalDataDict,
27
MultiModalFieldConfig,
28
MultiModalKwargsItems,
29
)
vllm/model_executor/models/idefics3.py
+1
-1
@@ -30,6 +30,7 @@ from transformers import (
30
31
from vllm.config import VllmConfig
32
from vllm.config.multimodal import BaseDummyOptions
33
+from vllm.inputs import MultiModalDataDict
34
from vllm.model_executor.layers.linear import ReplicatedLinear
35
from vllm.model_executor.layers.logits_processor import LogitsProcessor
36
from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -37,7 +38,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
38
from vllm.model_executor.models.module_mapping import MultiModelKeys
39
from vllm.multimodal import MULTIMODAL_REGISTRY
40
from vllm.multimodal.inputs import (
40
- MultiModalDataDict,
41
MultiModalFieldConfig,
42
MultiModalKwargsItems,
43
)
vllm/model_executor/models/interfaces.py
+1
-2
@@ -30,8 +30,7 @@ from transformers.models.whisper.tokenization_whisper import LANGUAGES
30
from typing_extensions import Self, TypeIs
31
32
from vllm.config import ModelConfig, SpeechToTextConfig
33
-from vllm.inputs import TokensPrompt
34
-from vllm.inputs.data import PromptType
33
+from vllm.inputs import PromptType, TokensPrompt
34
from vllm.logger import init_logger
35
from vllm.model_executor.layers.mamba.mamba_utils import MambaStateCopyFunc
36
from vllm.model_executor.layers.quantization import QuantizationConfig
vllm/model_executor/models/interns1.py
+1
-1
@@ -23,12 +23,12 @@ from transformers.models.internvl.video_processing_internvl import (
23
24
from vllm.config import VllmConfig
25
from vllm.config.multimodal import BaseDummyOptions
26
+from vllm.inputs import MultiModalDataDict
27
from vllm.model_executor.layers.quantization import QuantizationConfig
28
from vllm.model_executor.models.interns1_vit import InternS1VisionModel
29
from vllm.model_executor.models.module_mapping import MultiModelKeys
30
from vllm.multimodal import MULTIMODAL_REGISTRY
31
from vllm.multimodal.inputs import (
31
- MultiModalDataDict,
32
MultiModalFieldConfig,
33
MultiModalKwargsItems,
34
)
vllm/model_executor/models/internvl.py
+1
-1
@@ -18,6 +18,7 @@ from transformers import BatchFeature, PretrainedConfig
18
19
from vllm.config import VllmConfig
20
from vllm.config.multimodal import BaseDummyOptions
21
+from vllm.inputs import MultiModalDataDict
22
from vllm.model_executor.layers.quantization import QuantizationConfig
23
from vllm.model_executor.layers.quantization.awq import AWQConfig
24
from vllm.model_executor.models.intern_vit import (
@@ -28,7 +29,6 @@ from vllm.model_executor.models.module_mapping import MultiModelKeys
29
from vllm.multimodal import MULTIMODAL_REGISTRY
30
from vllm.multimodal.inputs import (
31
BatchedTensorInputs,
31
- MultiModalDataDict,
32
MultiModalFieldConfig,
33
MultiModalKwargsItems,
34
)
vllm/model_executor/models/isaac.py
+1
-1
@@ -16,6 +16,7 @@ from vllm.config import ModelConfig, VllmConfig
16
from vllm.config.multimodal import BaseDummyOptions
17
from vllm.distributed import parallel_state
18
from vllm.distributed import utils as dist_utils
19
+from vllm.inputs import MultiModalDataDict
20
from vllm.model_executor.layers.attention import MMEncoderAttention
21
from vllm.model_executor.layers.linear import (
22
ColumnParallelLinear,
@@ -44,7 +45,6 @@ from vllm.model_executor.models.utils import (
45
)
46
from vllm.multimodal import MULTIMODAL_REGISTRY
47
from vllm.multimodal.inputs import (
47
- MultiModalDataDict,
48
MultiModalFeatureSpec,
49
MultiModalFieldConfig,
50
MultiModalKwargsItems,
vllm/model_executor/models/kanana_v.py
+1
-1
@@ -19,10 +19,10 @@ from transformers.models.qwen2_vl.configuration_qwen2_vl import Qwen2VLVisionCon
19
20
from vllm.config import VllmConfig
21
from vllm.config.multimodal import BaseDummyOptions
22
+from vllm.inputs import MultiModalDataDict
23
from vllm.logger import init_logger
24
from vllm.multimodal import MULTIMODAL_REGISTRY
25
from vllm.multimodal.inputs import (
25
- MultiModalDataDict,
26
MultiModalFieldConfig,
27
MultiModalKwargsItems,
28
)
vllm/model_executor/models/keye.py
+1
-2
@@ -19,6 +19,7 @@ from transformers.utils import torch_int
19
from vllm.config import VllmConfig
20
from vllm.config.multimodal import BaseDummyOptions
21
from vllm.distributed import get_tensor_model_parallel_world_size
22
+from vllm.inputs import ModalityData, MultiModalDataDict
23
from vllm.logger import init_logger
24
from vllm.model_executor.layers.attention import (
25
MMEncoderAttention,
@@ -41,8 +42,6 @@ from vllm.model_executor.models.module_mapping import MultiModelKeys
42
from vllm.multimodal import MULTIMODAL_REGISTRY
43
from vllm.multimodal.inputs import (
44
ImageItem,
44
- ModalityData,
45
- MultiModalDataDict,
45
MultiModalFeatureSpec,
46
MultiModalFieldConfig,
47
MultiModalKwargsItems,
vllm/model_executor/models/keye_vl1_5.py
+1
-1
@@ -14,13 +14,13 @@ from transformers.activations import GELUActivation
14
from transformers.feature_extraction_utils import BatchFeature
15
16
from vllm.config import VllmConfig
17
+from vllm.inputs import ModalityData
18
from vllm.logger import init_logger
19
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
20
from vllm.model_executor.layers.quantization import QuantizationConfig
21
from vllm.multimodal import MULTIMODAL_REGISTRY
22
from vllm.multimodal.inputs import (
23
ImageItem,
23
- ModalityData,
24
MultiModalFeatureSpec,
25
MultiModalFieldConfig,
26
MultiModalKwargsItems,
vllm/model_executor/models/kimi_audio.py
+1
-1
@@ -14,7 +14,7 @@ from transformers import WhisperConfig as HFWhisperConfig
14
15
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
16
from vllm.config.multimodal import BaseDummyOptions
17
-from vllm.inputs.data import PromptType, TokensPrompt
17
+from vllm.inputs import PromptType, TokensPrompt
18
from vllm.model_executor.model_loader import DefaultModelLoader
19
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
20
from vllm.model_executor.models.interfaces import (
vllm/model_executor/models/kimi_k25.py
+1
-1
@@ -16,6 +16,7 @@ from transformers import BatchFeature
16
17
from vllm.config import VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
+from vllm.inputs import MultiModalDataDict
20
from vllm.logger import init_logger
21
from vllm.model_executor.layers.quantization import QuantizationConfig
22
from vllm.model_executor.layers.quantization.compressed_tensors import (
@@ -35,7 +36,6 @@ from vllm.model_executor.models.kimi_k25_vit import (
36
)
37
from vllm.multimodal import MULTIMODAL_REGISTRY
38
from vllm.multimodal.inputs import (
38
- MultiModalDataDict,
39
MultiModalFieldConfig,
40
MultiModalKwargsItems,
41
NestedTensors,
vllm/model_executor/models/kimi_vl.py
+1
-1
@@ -54,12 +54,12 @@ from transformers.activations import GELUActivation
54
55
from vllm.config import VllmConfig
56
from vllm.config.multimodal import BaseDummyOptions
57
+from vllm.inputs import MultiModalDataDict
58
from vllm.model_executor.layers.linear import ReplicatedLinear
59
from vllm.model_executor.models.interfaces import SupportsMultiModal, SupportsPP
60
from vllm.model_executor.models.moonvit import MoonVitPretrainedModel
61
from vllm.multimodal import MULTIMODAL_REGISTRY
62
from vllm.multimodal.inputs import (
62
- MultiModalDataDict,
63
MultiModalFieldConfig,
64
MultiModalKwargsItems,
65
NestedTensors,
vllm/model_executor/models/lfm2_vl.py
+1
-1
@@ -21,6 +21,7 @@ from transformers.models.lfm2_vl.image_processing_lfm2_vl_fast import (
21
from vllm.config import VllmConfig
22
from vllm.config.multimodal import BaseDummyOptions
23
from vllm.forward_context import set_forward_context
24
+from vllm.inputs import MultiModalDataDict
25
from vllm.model_executor.layers.mamba.mamba_utils import (
26
MambaStateCopyFunc,
27
MambaStateCopyFuncCalculator,
@@ -30,7 +31,6 @@ from vllm.model_executor.layers.mamba.mamba_utils import (
31
from vllm.model_executor.models.module_mapping import MultiModelKeys
32
from vllm.multimodal import MULTIMODAL_REGISTRY
33
from vllm.multimodal.inputs import (
33
- MultiModalDataDict,
34
MultiModalFieldConfig,
35
MultiModalKwargsItems,
36
)
vllm/model_executor/models/llava.py
+3
-5
@@ -20,17 +20,15 @@ from transformers.models.pixtral import PixtralProcessor
20
21
from vllm.config import VllmConfig
22
from vllm.config.multimodal import BaseDummyOptions
23
+from vllm.inputs import MultiModalDataDict, MultiModalInput, mm_input
24
from vllm.model_executor.layers.activation import get_act_fn
25
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
26
from vllm.model_executor.layers.quantization import QuantizationConfig
27
from vllm.multimodal import MULTIMODAL_REGISTRY
28
from vllm.multimodal.cache import BaseMultiModalProcessorCache
29
from vllm.multimodal.inputs import (
29
- MultiModalDataDict,
30
MultiModalFieldConfig,
31
- MultiModalInputs,
31
MultiModalKwargsItems,
33
- mm_inputs,
32
)
33
from vllm.multimodal.parse import (
34
ImageEmbeddingItems,
@@ -777,7 +775,7 @@ class MantisMultiModalProcessor(LlavaMultiModalProcessor):
775
self,
776
inputs: ProcessorInputs,
777
timing_ctx: TimingContext,
780
- ) -> MultiModalInputs:
778
+ ) -> MultiModalInput:
779
hf_config = self.info.get_hf_config()
780
image_token_id = hf_config.image_token_index
781
@@ -833,7 +831,7 @@ class MantisMultiModalProcessor(LlavaMultiModalProcessor):
831
for modality, placeholders in mm_placeholders.items()
832
}
833
836
- return mm_inputs(
834
+ return mm_input(
835
prompt_token_ids=prompt_ids,
836
mm_kwargs=mm_kwargs,
837
mm_hashes=mm_hashes,
vllm/model_executor/models/llava_next_video.py
+1
-1
@@ -11,11 +11,11 @@ from transformers import BatchFeature, LlavaNextVideoConfig, LlavaNextVideoProce
11
12
from vllm.config import VllmConfig
13
from vllm.config.multimodal import BaseDummyOptions
14
+from vllm.inputs import MultiModalDataDict
15
from vllm.model_executor.layers.activation import get_act_fn
16
from vllm.model_executor.models.clip import CLIPVisionModel
17
from vllm.multimodal import MULTIMODAL_REGISTRY
18
from vllm.multimodal.inputs import (
18
- MultiModalDataDict,
19
MultiModalFieldConfig,
20
MultiModalKwargsItems,
21
)
vllm/model_executor/models/llava_onevision.py
+1
-1
@@ -15,10 +15,10 @@ from transformers.models.llava_onevision.modeling_llava_onevision import (
15
16
from vllm.config import VllmConfig
17
from vllm.config.multimodal import BaseDummyOptions
18
+from vllm.inputs import MultiModalDataDict
19
from vllm.model_executor.layers.activation import get_act_fn
20
from vllm.multimodal import MULTIMODAL_REGISTRY
21
from vllm.multimodal.inputs import (
21
- MultiModalDataDict,
22
MultiModalFieldConfig,
23
MultiModalKwargsItems,
24
)
vllm/model_executor/models/midashenglm.py
+1
-1
@@ -38,6 +38,7 @@ from transformers import BatchFeature
38
from vllm.config import VllmConfig
39
from vllm.config.multimodal import BaseDummyOptions
40
from vllm.distributed import get_tensor_model_parallel_world_size
41
+from vllm.inputs import MultiModalDataDict
42
from vllm.model_executor.layers.activation import get_act_fn
43
from vllm.model_executor.layers.conv import Conv2dLayer
44
from vllm.model_executor.layers.linear import (
@@ -48,7 +49,6 @@ from vllm.model_executor.layers.linear import (
49
from vllm.model_executor.layers.quantization import QuantizationConfig
50
from vllm.multimodal import MULTIMODAL_REGISTRY
51
from vllm.multimodal.inputs import (
51
- MultiModalDataDict,
52
MultiModalFieldConfig,
53
MultiModalKwargsItems,
54
)
vllm/model_executor/models/minicpmo.py
+1
-2
@@ -41,9 +41,9 @@ from transformers.models.whisper.modeling_whisper import (
41
42
from vllm.config import VllmConfig
43
from vllm.config.multimodal import BaseDummyOptions
44
+from vllm.inputs import ModalityData, MultiModalDataDict
45
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargsItems
46
from vllm.multimodal.inputs import (
46
- MultiModalDataDict,
47
MultiModalFieldConfig,
48
NestedTensors,
49
)
@@ -51,7 +51,6 @@ from vllm.multimodal.parse import (
51
AudioItem,
52
AudioProcessorItems,
53
DictEmbeddingItems,
54
- ModalityData,
54
ModalityDataItems,
55
MultiModalDataItems,
56
)
vllm/model_executor/models/minicpmv.py
+1
-2
@@ -41,6 +41,7 @@ from typing_extensions import TypeVar
41
42
from vllm.config import VllmConfig
43
from vllm.config.multimodal import BaseDummyOptions
44
+from vllm.inputs import ModalityData, MultiModalDataDict
45
from vllm.model_executor.layers.quantization import QuantizationConfig
46
from vllm.model_executor.layers.resampler import (
47
BaseResampler,
@@ -54,7 +55,6 @@ from vllm.model_executor.models.qwen2 import Qwen2ForCausalLM
55
from vllm.model_executor.models.qwen3 import Qwen3ForCausalLM
56
from vllm.multimodal import MULTIMODAL_REGISTRY
57
from vllm.multimodal.inputs import (
57
- MultiModalDataDict,
58
MultiModalFieldConfig,
59
MultiModalKwargsItems,
60
NestedTensors,
@@ -64,7 +64,6 @@ from vllm.multimodal.parse import (
64
ImageItem,
65
ImageProcessorItems,
66
ImageSize,
67
- ModalityData,
67
ModalityDataItems,
68
MultiModalDataItems,
69
MultiModalDataParser,
vllm/model_executor/models/mistral3.py
+1
-1
@@ -11,6 +11,7 @@ from transformers.models.pixtral import PixtralProcessor
11
12
from vllm.config import VllmConfig
13
from vllm.config.multimodal import BaseDummyOptions
14
+from vllm.inputs import MultiModalDataDict
15
from vllm.model_executor.layers.activation import get_act_fn
16
from vllm.model_executor.layers.layernorm import RMSNorm
17
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -18,7 +19,6 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
19
from vllm.model_executor.models.module_mapping import MultiModelKeys
20
from vllm.multimodal import MULTIMODAL_REGISTRY
21
from vllm.multimodal.inputs import (
21
- MultiModalDataDict,
22
MultiModalFieldConfig,
23
MultiModalKwargsItems,
24
)
vllm/model_executor/models/mllama4.py
+1
-1
@@ -38,6 +38,7 @@ from vllm.compilation.decorators import (
38
from vllm.config import VllmConfig, set_current_vllm_config
39
from vllm.config.multimodal import BaseDummyOptions
40
from vllm.distributed import get_tensor_model_parallel_world_size
41
+from vllm.inputs import MultiModalDataDict
42
from vllm.model_executor.layers.attention import MMEncoderAttention
43
from vllm.model_executor.layers.fused_moe import FusedMoE
44
from vllm.model_executor.layers.linear import (
@@ -53,7 +54,6 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
54
from vllm.model_executor.models.module_mapping import MultiModelKeys
55
from vllm.multimodal import MULTIMODAL_REGISTRY
56
from vllm.multimodal.inputs import (
56
- MultiModalDataDict,
57
MultiModalFieldConfig,
58
MultiModalKwargsItems,
59
)
vllm/model_executor/models/molmo.py
+1
-1
@@ -29,6 +29,7 @@ from vllm.distributed import (
29
split_tensor_along_last_dim,
30
tensor_model_parallel_all_gather,
31
)
32
+from vllm.inputs import MultiModalDataDict
33
from vllm.model_executor.layers.activation import MulAndSilu, QuickGELU, SiluAndMul
34
from vllm.model_executor.layers.attention import Attention, MMEncoderAttention
35
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -49,7 +50,6 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
50
from vllm.model_executor.models.module_mapping import MultiModelKeys
51
from vllm.multimodal import MULTIMODAL_REGISTRY
52
from vllm.multimodal.inputs import (
52
- MultiModalDataDict,
53
MultiModalFieldConfig,
54
MultiModalKwargsItems,
55
)
vllm/model_executor/models/molmo2.py
+1
-1
@@ -33,6 +33,7 @@ from vllm.distributed import (
33
split_tensor_along_last_dim,
34
tensor_model_parallel_all_gather,
35
)
36
+from vllm.inputs import MultiModalDataDict
37
from vllm.logger import init_logger
38
from vllm.model_executor.layers.activation import MulAndSilu, SiluAndMul, get_act_fn
39
from vllm.model_executor.layers.attention import Attention, MMEncoderAttention
@@ -54,7 +55,6 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
55
from vllm.model_executor.models.module_mapping import MultiModelKeys
56
from vllm.multimodal import MULTIMODAL_REGISTRY
57
from vllm.multimodal.inputs import (
57
- MultiModalDataDict,
58
MultiModalFieldConfig,
59
MultiModalKwargsItems,
60
VideoItem,
vllm/model_executor/models/nano_nemotron_vl.py
+3
-4
@@ -21,6 +21,7 @@ from transformers import BatchFeature
21
22
from vllm.config import VllmConfig
23
from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
24
+from vllm.inputs import MultiModalDataDict, MultiModalInput
25
from vllm.logger import init_logger
26
from vllm.model_executor.layers.activation import ReLUSquaredActivation
27
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -48,9 +49,7 @@ from vllm.multimodal.evs import (
49
from vllm.multimodal.inputs import (
50
AudioItem,
51
BatchedTensorInputs,
51
- MultiModalDataDict,
52
MultiModalFieldConfig,
53
- MultiModalInputs,
53
MultiModalKwargsItems,
54
VideoItem,
55
)
@@ -576,7 +575,7 @@ class NanoNemotronVLMultiModalProcessor(
575
self,
576
inputs: ProcessorInputs,
577
timing_ctx: TimingContext,
579
- ) -> MultiModalInputs:
578
+ ) -> MultiModalInput:
579
use_audio_in_video = bool(
580
inputs.hf_processor_mm_kwargs.get("use_audio_in_video", False)
581
)
@@ -632,7 +631,7 @@ class NanoNemotronVLMultiModalProcessor(
631
for modality, placeholders in mm_placeholders.items()
632
}
633
635
- return MultiModalInputs(
634
+ return MultiModalInput(
635
type="multimodal",
636
prompt_token_ids=prompt_ids,
637
mm_kwargs=mm_info.kwargs,
vllm/model_executor/models/nemotron_parse.py
+1
-1
@@ -23,6 +23,7 @@ from transformers import (
23
from vllm.config import CacheConfig, VllmConfig
24
from vllm.config.lora import LoRAConfig
25
from vllm.config.multimodal import BaseDummyOptions
26
+from vllm.inputs import MultiModalDataDict
27
from vllm.logger import init_logger
28
from vllm.model_executor.layers.activation import get_act_fn
29
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -41,7 +42,6 @@ from vllm.model_executor.models.radio import RadioModel
42
from vllm.model_executor.models.whisper import WhisperAttention, WhisperCrossAttention
43
from vllm.multimodal import MULTIMODAL_REGISTRY
44
from vllm.multimodal.inputs import (
44
- MultiModalDataDict,
45
MultiModalFieldConfig,
46
MultiModalKwargsItems,
47
)
vllm/model_executor/models/nvlm_d.py
+2
-4
@@ -14,12 +14,10 @@ import torch.nn as nn
14
from transformers import PretrainedConfig
15
16
from vllm.config.multimodal import BaseDummyOptions
17
+from vllm.inputs import MultiModalDataDict
18
from vllm.model_executor.layers.quantization import QuantizationConfig
19
from vllm.multimodal import MULTIMODAL_REGISTRY
19
-from vllm.multimodal.inputs import (
20
- BatchedTensorInputs,
21
- MultiModalDataDict,
22
-)
20
+from vllm.multimodal.inputs import BatchedTensorInputs
21
from vllm.multimodal.parse import (
22
ImageEmbeddingItems,
23
ImageProcessorItems,
vllm/model_executor/models/ovis.py
+1
-1
@@ -30,6 +30,7 @@ from transformers import BatchFeature, PretrainedConfig
30
31
from vllm.config import VllmConfig
32
from vllm.config.multimodal import BaseDummyOptions
33
+from vllm.inputs import MultiModalDataDict
34
from vllm.model_executor.layers.linear import ReplicatedLinear
35
from vllm.model_executor.layers.quantization import QuantizationConfig
36
from vllm.model_executor.models.aimv2 import AIMv2Model
@@ -42,7 +43,6 @@ from vllm.model_executor.models.utils import (
43
)
44
from vllm.multimodal import MULTIMODAL_REGISTRY
45
from vllm.multimodal.inputs import (
45
- MultiModalDataDict,
46
MultiModalFieldConfig,
47
MultiModalKwargsItems,
48
)
vllm/model_executor/models/ovis2_5.py
+1
-1
@@ -12,6 +12,7 @@ from transformers import BaseImageProcessor, BatchFeature, PretrainedConfig
12
13
from vllm.config import VllmConfig
14
from vllm.config.multimodal import BaseDummyOptions
15
+from vllm.inputs import MultiModalDataDict
16
from vllm.model_executor.layers.linear import ReplicatedLinear
17
from vllm.model_executor.layers.quantization import QuantizationConfig
18
from vllm.model_executor.models.ovis import VisualEmbedding
@@ -24,7 +25,6 @@ from vllm.model_executor.models.utils import (
25
)
26
from vllm.multimodal import MULTIMODAL_REGISTRY
27
from vllm.multimodal.inputs import (
27
- MultiModalDataDict,
28
MultiModalFieldConfig,
29
MultiModalKwargsItems,
30
)
vllm/model_executor/models/paddleocr_vl.py
+1
-1
@@ -35,6 +35,7 @@ from vllm.config import VllmConfig
35
from vllm.config.multimodal import BaseDummyOptions
36
from vllm.distributed import parallel_state
37
from vllm.distributed import utils as dist_utils
38
+from vllm.inputs import MultiModalDataDict
39
from vllm.model_executor.layers.attention import (
40
MMEncoderAttention,
41
)
@@ -53,7 +54,6 @@ from vllm.model_executor.model_loader.weight_utils import (
54
)
55
from vllm.multimodal import MULTIMODAL_REGISTRY
56
from vllm.multimodal.inputs import (
56
- MultiModalDataDict,
57
MultiModalFeatureSpec,
58
MultiModalFieldConfig,
59
MultiModalKwargsItems,
vllm/model_executor/models/paligemma.py
+2
-3
@@ -9,12 +9,11 @@ from transformers import BatchFeature, PaliGemmaConfig
9
10
from vllm.config import VllmConfig
11
from vllm.config.multimodal import BaseDummyOptions
12
+from vllm.inputs import MultiModalDataDict, MultiModalInput
13
from vllm.logger import init_logger
14
from vllm.multimodal import MULTIMODAL_REGISTRY
15
from vllm.multimodal.inputs import (
15
- MultiModalDataDict,
16
MultiModalFieldConfig,
17
- MultiModalInputs,
17
MultiModalKwargsItems,
18
)
19
from vllm.multimodal.parse import (
@@ -231,7 +230,7 @@ class PaliGemmaMultiModalProcessor(BaseMultiModalProcessor[PaliGemmaProcessingIn
230
self,
231
inputs: ProcessorInputs,
232
timing_ctx: TimingContext,
234
- ) -> MultiModalInputs:
233
+ ) -> MultiModalInput:
234
mm_inputs = super().apply(inputs, timing_ctx)
235
prompt_token_ids = mm_inputs["prompt_token_ids"]
236
vllm/model_executor/models/phi3v.py
+1
-1
@@ -30,12 +30,12 @@ from transformers import (
30
31
from vllm.config import VllmConfig
32
from vllm.config.multimodal import BaseDummyOptions
33
+from vllm.inputs import MultiModalDataDict
34
from vllm.logger import init_logger
35
from vllm.model_executor.layers.quantization import QuantizationConfig
36
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
37
from vllm.multimodal import MULTIMODAL_REGISTRY
38
from vllm.multimodal.inputs import (
38
- MultiModalDataDict,
39
MultiModalFieldConfig,
40
MultiModalKwargsItems,
41
)
vllm/model_executor/models/phi4mm.py
+1
-1
@@ -18,6 +18,7 @@ from transformers import (
18
from vllm.config import VllmConfig
19
from vllm.config.multimodal import BaseDummyOptions
20
from vllm.distributed import get_pp_group
21
+from vllm.inputs import MultiModalDataDict
22
from vllm.model_executor.layers.logits_processor import LogitsProcessor
23
from vllm.model_executor.layers.quantization import QuantizationConfig
24
from vllm.model_executor.layers.vocab_parallel_embedding import (
@@ -27,7 +28,6 @@ from vllm.model_executor.models.llama import LlamaModel
28
from vllm.model_executor.models.module_mapping import MultiModelKeys
29
from vllm.multimodal import MULTIMODAL_REGISTRY
30
from vllm.multimodal.inputs import (
30
- MultiModalDataDict,
31
MultiModalFieldConfig,
32
MultiModalKwargsItems,
33
NestedTensors,
vllm/model_executor/models/pixtral.py
+1
-1
@@ -25,6 +25,7 @@ from transformers.models.pixtral.modeling_pixtral import (
25
from vllm.config import VllmConfig
26
from vllm.config.multimodal import BaseDummyOptions
27
from vllm.distributed import divide, get_tensor_model_parallel_world_size
28
+from vllm.inputs import MultiModalDataDict
29
from vllm.model_executor.layers.activation import get_act_and_mul_fn
30
from vllm.model_executor.layers.conv import Conv2dLayer
31
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -37,7 +38,6 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
38
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
39
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargsItems
40
from vllm.multimodal.inputs import (
40
- MultiModalDataDict,
41
MultiModalFieldConfig,
42
NestedTensors,
43
)
vllm/model_executor/models/qwen2_5_omni_thinker.py
+1
-2
@@ -46,6 +46,7 @@ from transformers.models.whisper import WhisperFeatureExtractor
46
from vllm.config import VllmConfig
47
from vllm.config.multimodal import BaseDummyOptions
48
from vllm.forward_context import set_forward_context
49
+from vllm.inputs import ModalityData, MultiModalDataDict
50
from vllm.logger import init_logger
51
from vllm.model_executor.models.module_mapping import MultiModelKeys
52
from vllm.model_executor.models.qwen2_5_vl import (
@@ -66,8 +67,6 @@ from vllm.model_executor.models.qwen2_vl import Qwen2VLMultiModalDataParser
67
from vllm.multimodal import MULTIMODAL_REGISTRY
68
from vllm.multimodal.inputs import (
69
ImageItem,
69
- ModalityData,
70
- MultiModalDataDict,
70
MultiModalFeatureSpec,
71
MultiModalFieldConfig,
72
MultiModalKwargsItems,
vllm/model_executor/models/qwen2_audio.py
+1
-2
@@ -38,11 +38,10 @@ from transformers.models.whisper import WhisperFeatureExtractor
38
39
from vllm.config import VllmConfig
40
from vllm.config.multimodal import BaseDummyOptions
41
+from vllm.inputs import ModalityData, MultiModalDataDict
42
from vllm.multimodal import MULTIMODAL_REGISTRY
43
from vllm.multimodal.inputs import (
44
AudioItem,
44
- ModalityData,
45
- MultiModalDataDict,
45
MultiModalFieldConfig,
46
MultiModalKwargsItems,
47
)
vllm/model_executor/models/qwen2_vl.py
+1
-2
@@ -47,6 +47,7 @@ from vllm.config import VllmConfig
47
from vllm.config.multimodal import BaseDummyOptions
48
from vllm.distributed import parallel_state, tensor_model_parallel_all_gather
49
from vllm.distributed import utils as dist_utils
50
+from vllm.inputs import ModalityData, MultiModalDataDict
51
from vllm.logger import init_logger
52
from vllm.model_executor.layers.activation import QuickGELU
53
from vllm.model_executor.layers.attention import MMEncoderAttention
@@ -65,8 +66,6 @@ from vllm.model_executor.models.module_mapping import MultiModelKeys
66
from vllm.multimodal import MULTIMODAL_REGISTRY
67
from vllm.multimodal.inputs import (
68
ImageItem,
68
- ModalityData,
69
- MultiModalDataDict,
69
MultiModalFeatureSpec,
70
MultiModalFieldConfig,
71
MultiModalKwargsItems,
vllm/model_executor/models/qwen3_asr.py
+1
-3
@@ -33,7 +33,7 @@ from transformers.models.whisper import WhisperFeatureExtractor
33
34
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
35
from vllm.config.multimodal import BaseDummyOptions
36
-from vllm.inputs.data import PromptType, TokensPrompt
36
+from vllm.inputs import ModalityData, MultiModalDataDict, PromptType, TokensPrompt
37
from vllm.logger import init_logger
38
from vllm.model_executor.models.interfaces import (
39
MultiModalEmbeddings,
@@ -59,8 +59,6 @@ from vllm.model_executor.models.whisper import ISO639_1_SUPPORTED_LANGS
59
from vllm.multimodal import MULTIMODAL_REGISTRY
60
from vllm.multimodal.inputs import (
61
AudioItem,
62
- ModalityData,
63
- MultiModalDataDict,
62
MultiModalFeatureSpec,
63
MultiModalFieldConfig,
64
MultiModalKwargsItems,
vllm/model_executor/models/qwen3_asr_realtime.py
+1
-1
@@ -23,7 +23,7 @@ import numpy as np
23
import torch
24
25
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
26
-from vllm.inputs.data import PromptType, TokensPrompt
26
+from vllm.inputs import PromptType, TokensPrompt
27
from vllm.logger import init_logger
28
from vllm.model_executor.models.interfaces import (
29
SupportsRealtime,
vllm/model_executor/models/qwen3_omni_moe_thinker.py
+3
-6
@@ -31,6 +31,8 @@ import torch
31
import torch.nn as nn
32
import torch.nn.functional as F
33
from packaging.version import Version
34
+from transformers import PretrainedConfig
35
+from transformers import __version__ as TRANSFORMERS_VERSION
36
from transformers.feature_extraction_utils import BatchFeature
37
from transformers.models.qwen3_omni_moe.configuration_qwen3_omni_moe import (
38
Qwen3OmniMoeAudioEncoderConfig,
@@ -42,15 +44,10 @@ from transformers.models.qwen3_omni_moe.processing_qwen3_omni_moe import (
44
)
45
from transformers.models.whisper import WhisperFeatureExtractor
46
45
-# isort: off
46
-from transformers import PretrainedConfig
47
-from transformers import __version__ as TRANSFORMERS_VERSION
48
-# isort: on
49
-
47
from vllm.compilation.decorators import support_torch_compile
48
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
49
from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
53
-from vllm.inputs.data import PromptType
50
+from vllm.inputs import PromptType
51
from vllm.logger import init_logger
52
from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
53
from vllm.model_executor.layers.attention.mm_encoder_attention import (
vllm/model_executor/models/qwen3_vl.py
+1
-1
@@ -52,6 +52,7 @@ from vllm.compilation.decorators import support_torch_compile
52
from vllm.config import VllmConfig
53
from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
54
from vllm.distributed import get_pp_group, parallel_state
55
+from vllm.inputs import MultiModalDataDict
56
from vllm.logger import init_logger
57
from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
58
from vllm.model_executor.layers.attention.mm_encoder_attention import (
@@ -76,7 +77,6 @@ from vllm.multimodal.evs import (
77
recompute_mrope_positions,
78
)
79
from vllm.multimodal.inputs import (
79
- MultiModalDataDict,
80
MultiModalFeatureSpec,
81
MultiModalFieldConfig,
82
MultiModalFieldElem,
vllm/model_executor/models/qwen_vl.py
+1
-1
@@ -18,6 +18,7 @@ from transformers import BatchFeature
18
19
from vllm.config import VllmConfig
20
from vllm.config.multimodal import BaseDummyOptions
21
+from vllm.inputs import MultiModalDataDict
22
from vllm.model_executor.layers.activation import get_act_fn
23
from vllm.model_executor.layers.conv import Conv2dLayer
24
from vllm.model_executor.layers.linear import (
@@ -30,7 +31,6 @@ from vllm.model_executor.layers.resampler import Resampler2, get_abs_pos
31
from vllm.model_executor.models.module_mapping import MultiModelKeys
32
from vllm.multimodal import MULTIMODAL_REGISTRY
33
from vllm.multimodal.inputs import (
33
- MultiModalDataDict,
34
MultiModalFieldConfig,
35
MultiModalKwargsItems,
36
)
vllm/model_executor/models/rvl.py
+1
-1
@@ -9,8 +9,8 @@ from transformers.activations import GELUActivation
9
10
from vllm.config import VllmConfig
11
from vllm.config.multimodal import BaseDummyOptions
12
+from vllm.inputs import MultiModalDataDict
13
from vllm.multimodal import MULTIMODAL_REGISTRY
13
-from vllm.multimodal.inputs import MultiModalDataDict
14
15
from .llava_next import (
16
LlavaDummyInputsBuilder,
vllm/model_executor/models/siglip.py
+2
-3
@@ -18,6 +18,7 @@ from transformers import (
18
from vllm.config import VllmConfig
19
from vllm.config.multimodal import BaseDummyOptions
20
from vllm.distributed import divide, get_tensor_model_parallel_world_size
21
+from vllm.inputs import MultiModalDataDict, MultiModalInput
22
from vllm.model_executor.layers.activation import get_act_fn
23
from vllm.model_executor.layers.attention import (
24
EncoderOnlyAttention,
@@ -38,9 +39,7 @@ from vllm.model_executor.model_loader.weight_utils import (
39
)
40
from vllm.multimodal import MULTIMODAL_REGISTRY
41
from vllm.multimodal.inputs import (
41
- MultiModalDataDict,
42
MultiModalFieldConfig,
43
- MultiModalInputs,
43
MultiModalKwargsItems,
44
)
45
from vllm.multimodal.parse import (
@@ -193,7 +192,7 @@ class SiglipMultiModalProcessor(BaseMultiModalProcessor[SiglipProcessingInfo]):
192
self,
193
inputs: ProcessorInputs,
194
timing_ctx: TimingContext,
196
- ) -> MultiModalInputs:
195
+ ) -> MultiModalInput:
196
if inputs.mm_data_items:
197
if isinstance(inputs.prompt, str):
198
if len(inputs.prompt) > 0:
vllm/model_executor/models/skyworkr1v.py
+1
-1
@@ -16,6 +16,7 @@ from transformers import PretrainedConfig
16
17
from vllm.config import VllmConfig
18
from vllm.config.multimodal import BaseDummyOptions
19
+from vllm.inputs import MultiModalDataDict
20
from vllm.model_executor.layers.linear import ReplicatedLinear
21
from vllm.model_executor.layers.quantization import QuantizationConfig
22
from vllm.model_executor.layers.quantization.awq import AWQConfig
@@ -24,7 +25,6 @@ from vllm.model_executor.models.intern_vit import (
25
InternVisionPatchModel,
26
)
27
from vllm.multimodal import MULTIMODAL_REGISTRY
27
-from vllm.multimodal.inputs import MultiModalDataDict
28
from vllm.multimodal.processing import BaseDummyInputsBuilder
29
from vllm.sequence import IntermediateTensors
30
from vllm.transformers_utils.processors.internvl import (
vllm/model_executor/models/step3_vl.py
+1
-1
@@ -13,6 +13,7 @@ from transformers import BatchFeature
13
from vllm.config import VllmConfig
14
from vllm.config.multimodal import BaseDummyOptions
15
from vllm.distributed import get_tensor_model_parallel_world_size
16
+from vllm.inputs import MultiModalDataDict
17
from vllm.model_executor.layers.activation import get_act_fn
18
from vllm.model_executor.layers.attention import MMEncoderAttention
19
from vllm.model_executor.layers.conv import Conv2dLayer
@@ -24,7 +25,6 @@ from vllm.model_executor.layers.linear import (
25
from vllm.model_executor.layers.quantization import QuantizationConfig
26
from vllm.multimodal import MULTIMODAL_REGISTRY
27
from vllm.multimodal.inputs import (
27
- MultiModalDataDict,
28
MultiModalFieldConfig,
29
MultiModalKwargsItems,
30
)
vllm/model_executor/models/terratorch.py
+3
-6
@@ -34,6 +34,7 @@ from transformers import BatchFeature
34
35
from vllm.config import VllmConfig
36
from vllm.config.multimodal import BaseDummyOptions
37
+from vllm.inputs import ModalityData, MultiModalDataDict, MultiModalInput, mm_input
38
from vllm.logger import init_logger
39
from vllm.model_executor.layers.pooler import IdentityPooler
40
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
@@ -41,13 +42,9 @@ from vllm.model_executor.models.utils import AutoWeightsLoader
42
from vllm.multimodal import MULTIMODAL_REGISTRY
43
from vllm.multimodal.inputs import (
44
ImageItem,
44
- ModalityData,
45
- MultiModalDataDict,
45
MultiModalFieldConfig,
47
- MultiModalInputs,
46
MultiModalKwargsItems,
47
PlaceholderRange,
50
- mm_inputs,
48
)
49
from vllm.multimodal.parse import (
50
DictEmbeddingItems,
@@ -196,7 +193,7 @@ class TerratorchMultiModalProcessor(BaseMultiModalProcessor[TerratorchProcessing
193
self,
194
inputs: ProcessorInputs,
195
timing_ctx: TimingContext,
199
- ) -> MultiModalInputs:
196
+ ) -> MultiModalInput:
197
mm_items = inputs.mm_data_items
198
hf_processor_mm_kwargs = inputs.hf_processor_mm_kwargs
199
@@ -224,7 +221,7 @@ class TerratorchMultiModalProcessor(BaseMultiModalProcessor[TerratorchProcessing
221
222
mm_placeholders = {"image": [PlaceholderRange(offset=0, length=0)]}
223
227
- return mm_inputs(
224
+ return mm_input(
225
prompt_token_ids=[1],
226
mm_kwargs=mm_kwargs,
227
mm_hashes=mm_hashes,
vllm/model_executor/models/transformers/multimodal.py
+3
-5
@@ -22,16 +22,14 @@ from typing import TYPE_CHECKING
22
import torch
23
24
from vllm.config.utils import getattr_iter
25
+from vllm.inputs import MultiModalDataDict, MultiModalInput, mm_input
26
from vllm.logger import init_logger
27
from vllm.model_executor.models.interfaces import SupportsMRoPE, SupportsMultiModal
28
from vllm.multimodal import MultiModalKwargsItems
29
from vllm.multimodal.inputs import (
29
- MultiModalDataDict,
30
MultiModalFeatureSpec,
31
MultiModalFieldConfig,
32
- MultiModalInputs,
32
PlaceholderRange,
34
- mm_inputs,
33
)
34
from vllm.multimodal.parse import (
35
ImageProcessorItems,
@@ -179,7 +177,7 @@ class MultiModalProcessor(BaseMultiModalProcessor[MultiModalProcessingInfo]):
177
self,
178
inputs: ProcessorInputs,
179
timing_ctx: TimingContext,
182
- ) -> MultiModalInputs:
180
+ ) -> MultiModalInput:
181
"""
182
Process multi-modal inputs to be used in vLLM.
183
@@ -261,7 +259,7 @@ class MultiModalProcessor(BaseMultiModalProcessor[MultiModalProcessingInfo]):
259
with timing_ctx.record("get_mm_hashes"):
260
mm_hashes = inputs.get_mm_hashes(self.info.model_id)
261
264
- return mm_inputs(
262
+ return mm_input(
263
prompt_token_ids=prompt_ids,
264
mm_kwargs=mm_kwargs,
265
mm_hashes=mm_hashes,
vllm/model_executor/models/ultravox.py
+1
-1
@@ -23,13 +23,13 @@ from transformers.models.whisper.modeling_whisper import (
23
24
from vllm.config import VllmConfig
25
from vllm.config.multimodal import BaseDummyOptions
26
+from vllm.inputs import MultiModalDataDict
27
from vllm.model_executor.layers.activation import MulAndSilu, get_act_fn
28
from vllm.model_executor.layers.layernorm import RMSNorm
29
from vllm.model_executor.model_loader import DefaultModelLoader
30
from vllm.model_executor.models.module_mapping import MultiModelKeys
31
from vllm.multimodal import MULTIMODAL_REGISTRY
32
from vllm.multimodal.inputs import (
32
- MultiModalDataDict,
33
MultiModalFieldConfig,
34
MultiModalKwargsItems,
35
NestedTensors,
vllm/model_executor/models/voxtral.py
+1
-2
@@ -19,7 +19,7 @@ from transformers import BatchFeature, WhisperConfig
19
20
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
21
from vllm.config.multimodal import BaseDummyOptions
22
-from vllm.inputs.data import PromptType, TokensPrompt
22
+from vllm.inputs import MultiModalDataDict, PromptType, TokensPrompt
23
from vllm.logger import init_logger
24
from vllm.model_executor.layers.quantization import QuantizationConfig
25
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
@@ -32,7 +32,6 @@ from vllm.model_executor.models.whisper import (
32
from vllm.model_executor.models.whisper_causal import WhisperCausalEncoder
33
from vllm.multimodal import MULTIMODAL_REGISTRY
34
from vllm.multimodal.inputs import (
35
- MultiModalDataDict,
35
MultiModalFieldConfig,
36
MultiModalKwargsItems,
37
NestedTensors,
vllm/model_executor/models/voxtral_realtime.py
+2
-4
@@ -20,7 +20,7 @@ from vllm.compilation.decorators import support_torch_compile
20
from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
21
from vllm.engine.protocol import StreamingInput
22
from vllm.envs import VLLM_ENGINE_ITERATION_TIMEOUT_S
23
-from vllm.inputs.data import PromptType, TokensPrompt
23
+from vllm.inputs import PromptType, TokensPrompt
24
from vllm.logger import init_logger
25
from vllm.model_executor.models.interfaces import MultiModalEmbeddings, SupportsRealtime
26
from vllm.model_executor.models.voxtral import (
@@ -31,9 +31,7 @@ from vllm.model_executor.models.voxtral import (
31
)
32
from vllm.multimodal import MULTIMODAL_REGISTRY
33
from vllm.multimodal.cache import _I, BaseMultiModalProcessorCache
34
-from vllm.multimodal.inputs import (
35
- MultiModalKwargsOptionalItems,
36
-)
34
+from vllm.multimodal.inputs import MultiModalKwargsOptionalItems
35
from vllm.multimodal.parse import MultiModalDataItems
36
from vllm.multimodal.processing import BaseDummyInputsBuilder
37
from vllm.multimodal.processing.processor import (
vllm/model_executor/models/whisper.py
+6
-2
@@ -21,7 +21,12 @@ from vllm.compilation.decorators import support_torch_compile
21
from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
22
from vllm.config.multimodal import BaseDummyOptions
23
from vllm.distributed import get_tensor_model_parallel_world_size
24
-from vllm.inputs.data import ExplicitEncoderDecoderPrompt, PromptType, TextPrompt
24
+from vllm.inputs import (
25
+ ExplicitEncoderDecoderPrompt,
26
+ MultiModalDataDict,
27
+ PromptType,
28
+ TextPrompt,
29
+)
30
from vllm.logger import init_logger
31
from vllm.model_executor.layers.activation import get_act_fn
32
from vllm.model_executor.layers.attention import (
@@ -44,7 +49,6 @@ from vllm.model_executor.models.whisper_utils import (
49
)
50
from vllm.multimodal import MULTIMODAL_REGISTRY
51
from vllm.multimodal.inputs import (
47
- MultiModalDataDict,
52
MultiModalFieldConfig,
53
MultiModalKwargsItems,
54
)
vllm/multimodal/__init__.py
+1
-15
@@ -1,16 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
from .hasher import MultiModalHasher
4
-from .inputs import (
5
- BatchedTensorInputs,
6
- ModalityData,
7
- MultiModalDataBuiltins,
8
- MultiModalDataDict,
9
- MultiModalKwargsItems,
10
- MultiModalPlaceholderDict,
11
- MultiModalUUIDDict,
12
- NestedTensors,
13
-)
4
+from .inputs import BatchedTensorInputs, MultiModalKwargsItems, NestedTensors
5
from .registry import MultiModalRegistry
6
7
MULTIMODAL_REGISTRY = MultiModalRegistry()
@@ -25,13 +16,8 @@ Info:
16
17
__all__ = [
18
"BatchedTensorInputs",
28
- "ModalityData",
29
- "MultiModalDataBuiltins",
30
- "MultiModalDataDict",
19
"MultiModalHasher",
20
"MultiModalKwargsItems",
33
- "MultiModalPlaceholderDict",
34
- "MultiModalUUIDDict",
21
"NestedTensors",
22
"MULTIMODAL_REGISTRY",
23
"MultiModalRegistry",
vllm/multimodal/inputs.py
+2
-162
@@ -15,12 +15,11 @@ from typing import (
15
TypedDict,
16
Union,
17
cast,
18
- final,
18
)
19
20
import numpy as np
21
from PIL.Image import Image
23
-from typing_extensions import NotRequired, TypeVar
22
+from typing_extensions import TypeVar
23
24
from vllm.utils.collection_utils import is_list_of
25
from vllm.utils.import_utils import LazyLoader
@@ -32,14 +31,9 @@ if TYPE_CHECKING:
31
import torch
32
import torch.types
33
from transformers.feature_extraction_utils import BatchFeature
35
-
36
- from vllm.inputs.data import _InputOptions
34
else:
35
torch = LazyLoader("torch", globals(), "torch")
36
40
- _InputOptions = dict
41
-
42
-_T = TypeVar("_T")
37
38
HfImageItem: TypeAlias = Union["Image", np.ndarray, "torch.Tensor"]
39
"""
@@ -98,15 +92,6 @@ which are treated as audio embeddings;
92
these are directly passed to the model without HF processing.
93
"""
94
101
-ModalityData: TypeAlias = _T | list[_T | None] | None
102
-"""
103
-Either a single data item, or a list of data items. Can only be None if UUID
104
-is provided.
105
-
106
-The number of data items allowed per modality is restricted by
107
-`--limit-mm-per-prompt`.
108
-"""
109
-
95
96
class VisionChunkImage(TypedDict):
97
"""Represents an image wrapped as a vision chunk."""
@@ -126,46 +111,10 @@ class VisionChunkVideo(TypedDict):
111
video_idx: int
112
113
129
-VisionChunk = VisionChunkImage | VisionChunkVideo
114
+VisionChunk: TypeAlias = VisionChunkImage | VisionChunkVideo
115
"""A vision chunk is either an image or a video chunk."""
116
117
133
-@final
134
-class MultiModalDataBuiltins(TypedDict, total=False):
135
- """Type annotations for modality types predefined by vLLM."""
136
-
137
- image: ModalityData[ImageItem]
138
- """The input image(s)."""
139
-
140
- video: ModalityData[VideoItem]
141
- """The input video(s)."""
142
-
143
- audio: ModalityData[AudioItem]
144
- """The input audio(s)."""
145
-
146
- vision_chunk: ModalityData[VisionChunk]
147
- """The input visual atom(s) - unified modality for images and video chunks."""
148
-
149
-
150
-MultiModalDataDict: TypeAlias = Mapping[str, ModalityData[Any]]
151
-"""
152
-A dictionary containing an entry for each modality type to input.
153
-
154
-The built-in modalities are defined by
155
-[`MultiModalDataBuiltins`][vllm.multimodal.inputs.MultiModalDataBuiltins].
156
-"""
157
-
158
-MultiModalUUIDDict: TypeAlias = Mapping[str, Sequence[str | None] | str]
159
-"""
160
-A dictionary containing user-provided UUIDs for items in each modality.
161
-If a UUID for an item is not provided, its entry will be `None` and
162
-MultiModalHasher will compute a hash for the item.
163
-
164
-The UUID will be used to identify the item for all caching purposes
165
-(input processing caching, embedding caching, prefix caching, etc).
166
-"""
167
-
168
-
118
@dataclass(frozen=True)
119
class PlaceholderRange:
120
"""
@@ -1048,112 +997,3 @@ MultiModalKwargsOptionalItems: TypeAlias = (
997
MultiModalKwargsItems[MultiModalKwargsItem]
998
| MultiModalKwargsItems[MultiModalKwargsItem | None]
999
)
1051
-
1052
-
1053
-MultiModalHashes = dict[str, list[str]]
1054
-"""
1055
-A dictionary containing per-item hashes for each modality.
1056
-"""
1057
-
1058
-
1059
-MultiModalPlaceholderDict: TypeAlias = Mapping[str, Sequence[PlaceholderRange]]
1060
-"""
1061
-A dictionary containing per-item placeholder ranges for each modality.
1062
-"""
1063
-
1064
-
1065
-class MultiModalInputs(_InputOptions):
1066
- """
1067
- Represents the outputs of
1068
- [`BaseMultiModalProcessor`][vllm.multimodal.processing.BaseMultiModalProcessor],
1069
- ready to be passed to vLLM internals.
1070
- """
1071
-
1072
- type: Literal["multimodal"]
1073
- """The type of inputs."""
1074
-
1075
- prompt_token_ids: list[int]
1076
- """The processed token IDs which includes placeholder tokens."""
1077
-
1078
- prompt: NotRequired[str]
1079
- """The prompt text corresponding to the token IDs, if available."""
1080
-
1081
- mm_kwargs: MultiModalKwargsOptionalItems
1082
- """Keyword arguments to be directly passed to the model after batching."""
1083
-
1084
- mm_hashes: MultiModalHashes
1085
- """The hashes of the multi-modal data."""
1086
-
1087
- mm_placeholders: MultiModalPlaceholderDict
1088
- """
1089
- For each modality, information about the placeholder tokens in
1090
- `prompt_token_ids`.
1091
- """
1092
-
1093
-
1094
-def mm_inputs(
1095
- prompt_token_ids: list[int],
1096
- mm_kwargs: MultiModalKwargsOptionalItems,
1097
- mm_hashes: MultiModalHashes,
1098
- mm_placeholders: MultiModalPlaceholderDict,
1099
- *,
1100
- prompt: str | None = None,
1101
- cache_salt: str | None = None,
1102
-) -> MultiModalInputs:
1103
- inputs = MultiModalInputs(
1104
- type="multimodal",
1105
- prompt_token_ids=prompt_token_ids,
1106
- mm_kwargs=mm_kwargs,
1107
- mm_hashes=mm_hashes,
1108
- mm_placeholders=mm_placeholders,
1109
- )
1110
-
1111
- if prompt is not None:
1112
- inputs["prompt"] = prompt
1113
- if cache_salt is not None:
1114
- inputs["cache_salt"] = cache_salt
1115
-
1116
- return inputs
1117
-
1118
-
1119
-class MultiModalEncDecInputs(MultiModalInputs):
1120
- """
1121
- Represents the outputs of
1122
- [`EncDecMultiModalProcessor`][vllm.multimodal.processing.EncDecMultiModalProcessor]
1123
- ready to be passed to vLLM internals.
1124
-
1125
- Note: Even text-only encoder-decoder models are currently implemented
1126
- as multi-modal models for convenience.
1127
- (Example: https://github.com/vllm-project/bart-plugin)
1128
- """
1129
-
1130
- encoder_prompt_token_ids: list[int]
1131
- """The processed token IDs of the encoder prompt."""
1132
-
1133
- encoder_prompt: NotRequired[str]
1134
- """The prompt text corresponding to the encoder token IDs, if available."""
1135
-
1136
-
1137
-def mm_enc_dec_inputs(
1138
- encoder_inputs: MultiModalInputs,
1139
- decoder_prompt_token_ids: list[int],
1140
- *,
1141
- decoder_prompt: str | None = None,
1142
-) -> MultiModalEncDecInputs:
1143
- inputs = MultiModalEncDecInputs(
1144
- type="multimodal",
1145
- prompt_token_ids=decoder_prompt_token_ids,
1146
- encoder_prompt_token_ids=encoder_inputs["prompt_token_ids"],
1147
- mm_kwargs=encoder_inputs["mm_kwargs"],
1148
- mm_hashes=encoder_inputs["mm_hashes"],
1149
- mm_placeholders=encoder_inputs["mm_placeholders"],
1150
- )
1151
-
1152
- if decoder_prompt is not None:
1153
- inputs["prompt"] = decoder_prompt
1154
- if "prompt" in encoder_inputs:
1155
- inputs["encoder_prompt"] = encoder_inputs["prompt"]
1156
- if "cache_salt" in encoder_inputs:
1157
- inputs["cache_salt"] = encoder_inputs["cache_salt"]
1158
-
1159
- return inputs
vllm/multimodal/parse.py
+6
-8
@@ -19,6 +19,7 @@ import numpy as np
19
import torch
20
from typing_extensions import assert_never
21
22
+from vllm.inputs import ModalityData, MultiModalDataDict, MultiModalUUIDDict
23
from vllm.utils.collection_utils import is_list_of
24
from vllm.utils.import_utils import LazyLoader
25
@@ -29,11 +30,8 @@ from .inputs import (
30
HfImageItem,
31
HfVideoItem,
32
ImageItem,
32
- ModalityData,
33
- MultiModalDataDict,
33
MultiModalFieldConfig,
34
MultiModalKwargsItems,
36
- MultiModalUUIDDict,
35
VideoItem,
36
)
37
from .media import MediaWithBytes
@@ -407,8 +405,8 @@ _D = TypeVar("_D", bound=ModalityDataItems[Any, Any])
405
406
class MultiModalDataItems(UserDict[str, ModalityDataItems[Any, Any]]):
407
"""
410
- As [`MultiModalDataDict`][vllm.multimodal.inputs.MultiModalDataDict], but
411
- normalized such that each entry corresponds to a list.
408
+ A normalized [`MultiModalDataDict`][vllm.inputs.MultiModalDataDict]
409
+ such that each entry corresponds to a list.
410
"""
411
412
def select(self, modalities: Set[str]):
@@ -477,7 +475,7 @@ ModalityDataParser: TypeAlias = Callable[
475
476
class MultiModalDataParser:
477
"""
480
- Parses [`MultiModalDataDict`][vllm.multimodal.inputs.MultiModalDataDict]
478
+ Parses [`MultiModalDataDict`][vllm.inputs.MultiModalDataDict]
479
into [`MultiModalDataItems`][vllm.multimodal.parse.MultiModalDataItems].
480
481
Args:
@@ -695,8 +693,8 @@ class MultiModalDataParser:
693
694
MultiModalUUIDItems: TypeAlias = dict[str, Sequence[str | None]]
695
"""
698
-As [`MultiModalUUIDDict`][vllm.multimodal.inputs.MultiModalUUIDDict], but
699
-normalized such that each entry corresponds to a list.
696
+A normalized [`MultiModalUUIDDict`][vllm.inputs.MultiModalUUIDDict]
697
+such that each entry corresponds to a list.
698
"""
699
700
vllm/multimodal/processing/context.py
+6
-4
@@ -11,15 +11,14 @@ from typing import TYPE_CHECKING, Any, overload
11
import torch
12
from typing_extensions import TypeVar
13
14
+from vllm.inputs import MultiModalDataDict
15
from vllm.logger import init_logger
15
-from vllm.multimodal.inputs import MultiModalDataDict
16
from vllm.multimodal.parse import (
17
DictEmbeddingItems,
18
EmbeddingItems,
19
MultiModalDataItems,
20
MultiModalDataParser,
21
)
22
-from vllm.renderers import TokenizeParams
22
from vllm.tokenizers import TokenizerLike
23
from vllm.transformers_utils.processor import cached_processor_from_config
24
from vllm.utils.func_utils import get_allowed_kwarg_only_overrides
@@ -32,12 +31,14 @@ if TYPE_CHECKING:
31
from transformers.processing_utils import ProcessorMixin
32
33
from vllm.config import ModelConfig
34
+ from vllm.renderers import TokenizeParams
35
else:
36
PretrainedConfig = object
37
BatchFeature = object
38
ProcessorMixin = object
39
40
ModelConfig = object
41
+ TokenizeParams = object
42
43
logger = init_logger(__name__)
44
@@ -339,6 +340,8 @@ class BaseProcessingInfo:
340
341
def get_default_tok_params(self) -> TokenizeParams:
342
"""Construct the default parameters for tokenization."""
343
+ from vllm.renderers import TokenizeParams
344
+
345
model_config = self.ctx.model_config
346
encoder_config = model_config.encoder_config or {}
347
@@ -451,8 +454,7 @@ class BaseProcessingInfo:
454
validate: bool = True,
455
) -> MultiModalDataItems:
456
"""
454
- Normalize
455
- [`MultiModalDataDict`][vllm.multimodal.inputs.MultiModalDataDict]
457
+ Normalize [`MultiModalDataDict`][vllm.inputs.MultiModalDataDict]
458
to [`MultiModalDataItems`][vllm.multimodal.parse.MultiModalDataItems]
459
before passing them to
460
[`_get_hf_mm_data`][vllm.multimodal.processing.BaseMultiModalProcessor._get_hf_mm_data].
vllm/multimodal/processing/dummy_inputs.py
+1
-1
@@ -14,9 +14,9 @@ from vllm.config.multimodal import (
14
ImageDummyOptions,
15
VideoDummyOptions,
16
)
17
+from vllm.inputs import MultiModalDataDict
18
from vllm.logger import init_logger
19
19
-from ..inputs import MultiModalDataDict
20
from .context import BaseProcessingInfo
21
from .inputs import ProcessorInputs
22
vllm/multimodal/processing/inputs.py
+3
-2
@@ -3,8 +3,9 @@
3
from collections.abc import Mapping
4
from dataclasses import dataclass, field
5
6
+from vllm.inputs import MultiModalHashes
7
+
8
from ..hasher import MultiModalHasher
7
-from ..inputs import MultiModalHashes
9
from ..parse import MultiModalDataItems, MultiModalUUIDItems
10
11
@@ -26,7 +27,7 @@ class ProcessorInputs:
27
mm_uuid_items = self.mm_uuid_items or {}
28
hf_processor_mm_kwargs = self.hf_processor_mm_kwargs
29
29
- mm_hashes: MultiModalHashes = {}
30
+ mm_hashes = dict[str, list[str]]()
31
hasher = MultiModalHasher
32
33
for modality, data_items in mm_data_items.items():
vllm/multimodal/processing/processor.py
+14
-19
@@ -6,34 +6,29 @@ from collections.abc import Callable, Generator, ItemsView, Iterable, Mapping, S
6
from dataclasses import dataclass, field, replace
7
from enum import Enum
8
from functools import lru_cache
9
-from typing import (
10
- TYPE_CHECKING,
11
- Generic,
12
- NamedTuple,
13
- Protocol,
14
- TypeAlias,
15
- cast,
16
-)
9
+from typing import TYPE_CHECKING, Generic, NamedTuple, Protocol, TypeAlias, cast
10
11
import regex as re
12
import torch
13
from typing_extensions import TypeVar, assert_never
14
15
+from vllm.inputs import (
16
+ MultiModalEncDecInput,
17
+ MultiModalHashes,
18
+ MultiModalInput,
19
+ mm_enc_dec_input,
20
+ mm_input,
21
+)
22
from vllm.logger import init_logger
23
from vllm.tokenizers import TokenizerLike
24
from vllm.utils.collection_utils import flatten_2d_lists, full_groupby
25
26
from ..inputs import (
27
- MultiModalEncDecInputs,
27
MultiModalFieldConfig,
29
- MultiModalHashes,
30
- MultiModalInputs,
28
MultiModalKwargsItem,
29
MultiModalKwargsItems,
30
MultiModalKwargsOptionalItems,
31
PlaceholderRange,
35
- mm_enc_dec_inputs,
36
- mm_inputs,
32
)
33
from ..parse import (
34
DictEmbeddingItems,
@@ -994,7 +989,7 @@ class BaseMultiModalProcessor(ABC, Generic[_I]):
989
mm_items: MultiModalDataItems,
990
mm_uuid_items: MultiModalUUIDItems | None = None,
991
hf_processor_mm_kwargs: Mapping[str, object] | None = None,
997
- ) -> MultiModalInputs:
992
+ ) -> MultiModalInput:
993
processor_inputs = ProcessorInputs(
994
prompt,
995
mm_items,
@@ -1638,7 +1633,7 @@ class BaseMultiModalProcessor(ABC, Generic[_I]):
1633
self,
1634
inputs: ProcessorInputs,
1635
timing_ctx: TimingContext,
1641
- ) -> MultiModalInputs:
1636
+ ) -> MultiModalInput:
1637
"""
1638
Process multi-modal inputs to be used in vLLM.
1639
@@ -1673,7 +1668,7 @@ class BaseMultiModalProcessor(ABC, Generic[_I]):
1668
for modality, placeholders in mm_placeholders.items()
1669
}
1670
1676
- return mm_inputs(
1671
+ return mm_input(
1672
prompt_token_ids=prompt_ids,
1673
mm_kwargs=mm_info.kwargs,
1674
mm_hashes=mm_info.hashes,
@@ -1708,7 +1703,7 @@ class EncDecMultiModalProcessor(BaseMultiModalProcessor[_I]):
1703
self,
1704
prompt: str | list[int],
1705
mm_items: MultiModalDataItems,
1711
- encoder_inputs: MultiModalInputs,
1706
+ encoder_inputs: MultiModalInput,
1707
):
1708
tokenizer = self.info.get_tokenizer()
1709
decoder_prompt_raw = self.create_decoder_prompt(prompt, mm_items)
@@ -1721,7 +1716,7 @@ class EncDecMultiModalProcessor(BaseMultiModalProcessor[_I]):
1716
decoder_prompt_text = None
1717
decoder_prompt_ids = decoder_prompt_raw
1718
1724
- return mm_enc_dec_inputs(
1719
+ return mm_enc_dec_input(
1720
encoder_inputs,
1721
decoder_prompt_ids,
1722
decoder_prompt=decoder_prompt_text,
@@ -1731,7 +1726,7 @@ class EncDecMultiModalProcessor(BaseMultiModalProcessor[_I]):
1726
self,
1727
inputs: ProcessorInputs,
1728
timing_ctx: TimingContext,
1734
- ) -> MultiModalEncDecInputs:
1729
+ ) -> MultiModalEncDecInput:
1730
"""
1731
Process multi-modal inputs to be used in vLLM.
1732
The main processing steps are modified to fit encoder-decoder model:
vllm/multimodal/registry.py
+2
-2
@@ -7,6 +7,7 @@ from dataclasses import dataclass
7
from multiprocessing.synchronize import Lock as LockType
8
from typing import TYPE_CHECKING, Generic, Literal, Protocol, TypeVar, cast
9
10
+from vllm.inputs import MultiModalInput
11
from vllm.logger import init_logger
12
from vllm.tokenizers import TokenizerLike, cached_tokenizer_from_config
13
@@ -19,7 +20,6 @@ from .cache import (
20
ShmObjectStoreReceiverCache,
21
ShmObjectStoreSenderCache,
22
)
22
-from .inputs import MultiModalInputs
23
from .processing import (
24
BaseDummyInputsBuilder,
25
BaseMultiModalProcessor,
@@ -220,7 +220,7 @@ class MultiModalRegistry:
220
*,
221
cache: BaseMultiModalProcessorCache | None = None,
222
processor: BaseMultiModalProcessor | None = None,
223
- ) -> MultiModalInputs:
223
+ ) -> MultiModalInput:
224
"""
225
Create dummy data for profiling the memory usage of a model.
226
vllm/multimodal/utils.py
+3
-3
@@ -12,6 +12,7 @@ import numpy.typing as npt
12
from PIL import Image
13
from typing_extensions import deprecated
14
15
+from vllm.inputs import MultiModalPlaceholders
16
from vllm.utils.import_utils import LazyLoader
17
18
from .hasher import MultiModalHasher
@@ -19,7 +20,6 @@ from .inputs import (
20
BatchedTensorInputs,
21
MultiModalFieldElem,
22
MultiModalKwargsItem,
22
- MultiModalPlaceholderDict,
23
MultiModalSharedField,
24
)
25
from .media import AudioMediaIO, ImageMediaIO, MediaConnector, VideoMediaIO
@@ -110,10 +110,10 @@ def encode_video_url(
110
111
112
def argsort_mm_positions(
113
- mm_positions: MultiModalPlaceholderDict,
113
+ mm_positions: MultiModalPlaceholders,
114
) -> list[tuple[str, int]]:
115
"""
116
- Given a `MultiModalPlaceholderDict`, output a sequence of keys to
116
+ Given a `MultiModalPlaceholders`, output a sequence of keys to
117
sort the dictionary by `offset` (starting index in the input sequence)
118
in ascending order.
119
vllm/platforms/interface.py
+2
-2
@@ -17,7 +17,7 @@ if TYPE_CHECKING:
17
from torch.distributed import PrefixStore, ProcessGroup
18
19
from vllm.config import VllmConfig
20
- from vllm.inputs import ProcessorInputs
20
+ from vllm.inputs import EngineInput
21
from vllm.pooling_params import PoolingParams
22
from vllm.sampling_params import SamplingParams
23
from vllm.utils.argparse_utils import FlexibleArgumentParser
@@ -635,7 +635,7 @@ class Platform:
635
@classmethod
636
def validate_request(
637
cls,
638
- processed_inputs: "ProcessorInputs",
638
+ processed_inputs: "EngineInput",
639
params: "SamplingParams | PoolingParams",
640
) -> None:
641
"""Raises if this request is unsupported on this platform"""
vllm/plugins/io_processors/interface.py
+1
-1
@@ -6,7 +6,7 @@ from collections.abc import AsyncGenerator, Sequence
6
from typing import Generic, TypeVar
7
8
from vllm.config import VllmConfig
9
-from vllm.inputs.data import PromptType
9
+from vllm.inputs import PromptType
10
from vllm.outputs import PoolingRequestOutput
11
from vllm.pooling_params import PoolingParams
12
from vllm.renderers import BaseRenderer
vllm/renderers/base.py
+51
-58
@@ -11,17 +11,32 @@ from typing import TYPE_CHECKING, Any, Generic, overload
11
from typing_extensions import TypeVar
12
13
from vllm.inputs import (
14
- EmbedsInputs,
14
+ EmbedsInput,
15
EmbedsPrompt,
16
- EncoderDecoderInputs,
17
- ProcessorInputs,
18
- SingletonInputs,
16
+ EncoderDecoderInput,
17
+ EngineInput,
18
+ MultiModalDataDict,
19
+ MultiModalInput,
20
+ MultiModalUUIDDict,
21
+ SingletonInput,
22
TextPrompt,
20
- TokenInputs,
23
+ TokensInput,
24
TokensPrompt,
25
+ build_enc_dec_input,
26
+ embeds_input,
27
+ tokens_input,
28
)
23
-from vllm.inputs.data import build_enc_dec_inputs, embeds_inputs, token_inputs
29
from vllm.logger import init_logger
30
+from vllm.multimodal import MULTIMODAL_REGISTRY as mm_registry
31
+from vllm.multimodal.cache import BaseMultiModalProcessorCache
32
+from vllm.multimodal.parse import (
33
+ MultiModalDataItems,
34
+ MultiModalUUIDItems,
35
+ parse_mm_uuids,
36
+)
37
+from vllm.multimodal.processing import BaseMultiModalProcessor
38
+from vllm.multimodal.processing import ProcessorInputs as MMProcessorInputs
39
+from vllm.multimodal.registry import MultiModalTimingRegistry
40
from vllm.tokenizers import TokenizerLike
41
from vllm.utils.async_utils import AsyncMicrobatchTokenizer
42
from vllm.utils.counter import AtomicCounter
@@ -46,14 +61,6 @@ if TYPE_CHECKING:
61
ChatCompletionMessageParam,
62
ConversationMessage,
63
)
49
- from vllm.multimodal.cache import BaseMultiModalProcessorCache
50
- from vllm.multimodal.inputs import (
51
- MultiModalDataDict,
52
- MultiModalInputs,
53
- MultiModalUUIDDict,
54
- )
55
- from vllm.multimodal.parse import MultiModalDataItems, MultiModalUUIDItems
56
- from vllm.multimodal.processing import BaseMultiModalProcessor
64
65
logger = init_logger(__name__)
66
@@ -86,9 +93,6 @@ class BaseRenderer(ABC, Generic[_T]):
93
self.mm_processor: BaseMultiModalProcessor | None = None
94
self._mm_cache_stats: MultiModalCacheStats | None = None
95
if config.model_config.is_multimodal_model:
89
- from vllm.multimodal import MULTIMODAL_REGISTRY as mm_registry
90
- from vllm.multimodal.registry import MultiModalTimingRegistry
91
-
96
mm_processor_cache = mm_registry.processor_cache_from_config(config)
97
98
# Deep-copy the tokenizer so the multimodal processor gets its
@@ -524,9 +528,9 @@ class BaseRenderer(ABC, Generic[_T]):
528
# Step 4: Convert to engine inputs
529
def _validate_mm_uuids(
530
self,
527
- mm_data: "MultiModalDataDict",
528
- mm_data_items: "MultiModalDataItems",
529
- mm_uuid_items: "MultiModalUUIDItems",
531
+ mm_data: MultiModalDataDict,
532
+ mm_data_items: MultiModalDataItems,
533
+ mm_uuid_items: MultiModalUUIDItems,
534
) -> None:
535
# NOTE: Keys corresponding to `None` in `mm_data` don't appear in
536
# `mm_data_items`
@@ -560,11 +564,11 @@ class BaseRenderer(ABC, Generic[_T]):
564
565
def _process_mm_uuids(
566
self,
563
- mm_data: "MultiModalDataDict",
564
- mm_data_items: "MultiModalDataItems",
565
- mm_uuid_items: "MultiModalUUIDItems",
567
+ mm_data: MultiModalDataDict,
568
+ mm_data_items: MultiModalDataItems,
569
+ mm_uuid_items: MultiModalUUIDItems,
570
mm_req_id: str,
567
- ):
571
+ ) -> MultiModalUUIDItems:
572
model_config = self.model_config
573
574
# NOTE: When users explicitly turn off BOTH prefix caching and input
@@ -590,14 +594,11 @@ class BaseRenderer(ABC, Generic[_T]):
594
def _process_multimodal(
595
self,
596
prompt: list[int] | str,
593
- mm_data: "MultiModalDataDict",
594
- mm_uuids: "MultiModalUUIDDict | None",
597
+ mm_data: MultiModalDataDict,
598
+ mm_uuids: MultiModalUUIDDict | None,
599
mm_processor_kwargs: Mapping[str, object] | None,
600
tokenization_kwargs: dict[str, Any] | None,
597
- ) -> "MultiModalInputs":
598
- from vllm.multimodal.parse import parse_mm_uuids
599
- from vllm.multimodal.processing import ProcessorInputs as MMProcessorInputs
600
-
601
+ ) -> "MultiModalInput":
602
mm_req_id = f"renderer{self.api_process_rank}-mm-{self._mm_req_counter.inc(1)}"
603
604
mm_processor = self.get_mm_processor()
@@ -628,12 +629,12 @@ class BaseRenderer(ABC, Generic[_T]):
629
def _process_tokens(
630
self,
631
prompt: TokensPrompt,
631
- ) -> "TokenInputs | MultiModalInputs":
632
+ ) -> TokensInput | MultiModalInput:
633
prompt_token_ids = prompt["prompt_token_ids"]
634
634
- inputs: TokenInputs | MultiModalInputs
635
+ engine_input: TokensInput | MultiModalInput
636
if multi_modal_data := prompt.get("multi_modal_data"):
636
- inputs = self._process_multimodal(
637
+ engine_input = self._process_multimodal(
638
prompt_token_ids,
639
multi_modal_data,
640
mm_processor_kwargs=prompt.get("mm_processor_kwargs"),
@@ -641,19 +642,16 @@ class BaseRenderer(ABC, Generic[_T]):
642
mm_uuids=prompt.get("multi_modal_uuids"),
643
)
644
else:
644
- inputs = token_inputs(prompt_token_ids)
645
+ engine_input = tokens_input(prompt_token_ids)
646
647
if prompt_text := prompt.get("prompt"):
647
- inputs["prompt"] = prompt_text
648
+ engine_input["prompt"] = prompt_text
649
if cache_salt := prompt.get("cache_salt"):
649
- inputs["cache_salt"] = cache_salt
650
+ engine_input["cache_salt"] = cache_salt
651
651
- return inputs
652
+ return engine_input
653
653
- def _process_embeds(
654
- self,
655
- prompt: EmbedsPrompt,
656
- ) -> EmbedsInputs:
654
+ def _process_embeds(self, prompt: EmbedsPrompt) -> EmbedsInput:
655
if not self.model_config.enable_prompt_embeds:
656
raise ValueError(
657
"You must set `--enable-prompt-embeds` to input `prompt_embeds`."
@@ -676,15 +674,12 @@ class BaseRenderer(ABC, Generic[_T]):
674
# hidden device transfer in the critical path of generation.
675
prompt_embeds = prompt_embeds.cpu()
676
679
- return embeds_inputs(
677
+ return embeds_input(
678
prompt_embeds=prompt_embeds,
679
cache_salt=prompt.get("cache_salt"),
680
)
681
684
- def _process_singleton(
685
- self,
686
- prompt: SingletonTokPrompt,
687
- ) -> SingletonInputs:
682
+ def _process_singleton(self, prompt: SingletonTokPrompt) -> SingletonInput:
683
if "prompt_embeds" in prompt:
684
return self._process_embeds(prompt) # type: ignore[arg-type]
685
@@ -693,7 +688,7 @@ class BaseRenderer(ABC, Generic[_T]):
688
def _process_enc_dec(
689
self,
690
prompt: EncoderDecoderTokPrompt,
696
- ) -> EncoderDecoderInputs:
691
+ ) -> EncoderDecoderInput:
692
enc_prompt = prompt["encoder_prompt"]
693
dec_prompt = prompt["decoder_prompt"]
694
@@ -704,27 +699,25 @@ class BaseRenderer(ABC, Generic[_T]):
699
if isinstance(self.mm_processor, EncDecMultiModalProcessor):
700
skip_decoder_start_token = self.mm_processor.skip_decoder_start_token
701
707
- return build_enc_dec_inputs(
708
- encoder_inputs=self._process_singleton(enc_prompt),
709
- decoder_inputs=(
702
+ return build_enc_dec_input(
703
+ encoder_input=self._process_singleton(enc_prompt),
704
+ decoder_input=(
705
None if dec_prompt is None else self._process_singleton(dec_prompt)
706
),
707
decoder_start_token_id=self.get_dec_start_token_id(),
708
skip_decoder_start_token=skip_decoder_start_token,
709
)
710
716
- def process_for_engine(
717
- self, prompt: TokPrompt, arrival_time: float
718
- ) -> ProcessorInputs:
719
- engine_prompt: ProcessorInputs
711
+ def process_for_engine(self, prompt: TokPrompt, arrival_time: float) -> EngineInput:
712
+ engine_input: EngineInput
713
if "encoder_prompt" in prompt:
721
- engine_prompt = self._process_enc_dec(prompt) # type: ignore[arg-type]
714
+ engine_input = self._process_enc_dec(prompt) # type: ignore[arg-type]
715
else:
723
- engine_prompt = self._process_singleton(prompt)
716
+ engine_input = self._process_singleton(prompt)
717
725
- engine_prompt["arrival_time"] = arrival_time
718
+ engine_input["arrival_time"] = arrival_time
719
727
- return engine_prompt
720
+ return engine_input
721
722
# Top-level methods
723
def render_cmpl(
vllm/renderers/hf.py
+7
-13
@@ -5,7 +5,7 @@ import itertools
5
from collections import defaultdict, deque
6
from collections.abc import Set
7
from functools import lru_cache
8
-from typing import TYPE_CHECKING, Any, Literal, cast, overload
8
+from typing import Any, Literal, cast, overload
9
10
import jinja2
11
import jinja2.ext
@@ -25,6 +25,7 @@ from vllm.entrypoints.chat_utils import (
25
parse_chat_messages,
26
parse_chat_messages_async,
27
)
28
+from vllm.inputs import MultiModalDataDict, MultiModalUUIDDict
29
from vllm.logger import init_logger
30
from vllm.tokenizers import cached_get_tokenizer
31
from vllm.tokenizers.hf import CachedHfTokenizer, HfTokenizer
@@ -37,13 +38,6 @@ from .inputs import DictPrompt
38
from .inputs.preprocess import parse_dec_only_prompt
39
from .params import ChatParams
40
40
-if TYPE_CHECKING:
41
- from vllm.multimodal.inputs import MultiModalDataDict, MultiModalUUIDDict
42
-else:
43
- MultiModalDataDict = dict[str, Any]
44
- MultiModalUUIDDict = dict[str, Any]
45
-
46
-
41
logger = init_logger(__name__)
42
43
@@ -512,9 +506,9 @@ def safe_apply_chat_template(
506
507
508
def rebuild_mm_uuids_from_mm_data(
515
- mm_uuids: "MultiModalUUIDDict",
516
- mm_data: "MultiModalDataDict",
517
-) -> "MultiModalUUIDDict":
509
+ mm_uuids: MultiModalUUIDDict,
510
+ mm_data: MultiModalDataDict,
511
+) -> MultiModalUUIDDict:
512
"""Rebuild mm_uuids after vision_chunk processing.
513
514
When videos are split into chunks, the original UUIDs need to be updated
@@ -547,7 +541,7 @@ def rebuild_mm_uuids_from_mm_data(
541
542
543
def build_video_prompts_from_mm_data(
550
- mm_data: "MultiModalDataDict",
544
+ mm_data: MultiModalDataDict,
545
) -> list[str]:
546
"""Build video prompts from vision_chunk data.
547
@@ -585,7 +579,7 @@ def build_video_prompts_from_mm_data(
579
580
def replace_vision_chunk_video_placeholder(
581
prompt_raw: str | list[int],
588
- mm_data: "MultiModalDataDict",
582
+ mm_data: MultiModalDataDict,
583
video_placeholder: str | None,
584
) -> str | list[int]:
585
# get video placeholder, replace it with runtime video-chunk prompts
vllm/renderers/inputs/preprocess.py
+10
-9
@@ -9,8 +9,8 @@ from typing import TYPE_CHECKING, NamedTuple, TypeAlias, TypedDict, overload
9
10
from vllm.inputs import (
11
EmbedsPrompt,
12
+ EngineInput,
13
ExplicitEncoderDecoderPrompt,
13
- ProcessorInputs,
14
PromptType,
15
SingletonPrompt,
16
TextPrompt,
@@ -70,28 +70,28 @@ def conversation_to_seq(
70
71
DecoderOnlyDictPrompt: TypeAlias = TextPrompt | TokensPrompt | EmbedsPrompt
72
"""
73
-A [`DecoderOnlyPrompt`][vllm.inputs.data.DecoderOnlyPrompt]
73
+A [`DecoderOnlyPrompt`][vllm.inputs.llm.DecoderOnlyPrompt]
74
that has been standardized into a dictionary.
75
"""
76
77
78
EncoderDictPrompt: TypeAlias = TextPrompt | TokensPrompt
79
"""
80
-A [`EncoderPrompt`][vllm.inputs.data.EncoderPrompt]
80
+A [`EncoderPrompt`][vllm.inputs.llm.EncoderPrompt]
81
that has been standardized into a dictionary.
82
"""
83
84
85
DecoderDictPrompt: TypeAlias = TextPrompt | TokensPrompt
86
"""
87
-A [`DecoderPrompt`][vllm.inputs.data.DecoderPrompt]
87
+A [`DecoderPrompt`][vllm.inputs.llm.DecoderPrompt]
88
that has been standardized into a dictionary.
89
"""
90
91
92
class EncoderDecoderDictPrompt(TypedDict):
93
"""
94
- A [`EncoderDecoderPrompt`][vllm.inputs.data.EncoderDecoderPrompt]
94
+ A [`EncoderDecoderPrompt`][vllm.inputs.llm.EncoderDecoderPrompt]
95
that has been standardized into a dictionary.
96
"""
97
@@ -104,14 +104,14 @@ SingletonDictPrompt: TypeAlias = (
104
DecoderOnlyDictPrompt | EncoderDictPrompt | DecoderDictPrompt
105
)
106
"""
107
-A [`SingletonPrompt`][vllm.inputs.data.SingletonPrompt]
107
+A [`SingletonPrompt`][vllm.inputs.llm.SingletonPrompt]
108
that has been standardized into a dictionary.
109
"""
110
111
112
DictPrompt: TypeAlias = DecoderOnlyDictPrompt | EncoderDecoderDictPrompt
113
"""
114
-A [`PromptType`][vllm.inputs.data.PromptType]
114
+A [`PromptType`][vllm.inputs.llm.PromptType]
115
that has been standardized into a dictionary.
116
"""
117
@@ -236,7 +236,7 @@ def extract_target_prompt(model_config: "ModelConfig", prompt: object):
236
237
def extract_prompt_components(
238
model_config: "ModelConfig",
239
- prompt: PromptType | ProcessorInputs,
239
+ prompt: PromptType | EngineInput,
240
) -> PromptComponents:
241
target_prompt = extract_target_prompt(model_config, prompt)
242
@@ -248,7 +248,8 @@ def extract_prompt_components(
248
249
250
def extract_prompt_len(
251
- model_config: "ModelConfig", prompt: PromptType | ProcessorInputs
251
+ model_config: "ModelConfig",
252
+ prompt: PromptType | EngineInput,
253
):
254
target_prompt = extract_target_prompt(model_config, prompt)
255
vllm/v1/engine/async_llm.py
+5
-5
@@ -21,7 +21,7 @@ from vllm.distributed.weight_transfer.base import (
21
from vllm.engine.arg_utils import AsyncEngineArgs
22
from vllm.engine.protocol import EngineClient, StreamingInput
23
from vllm.entrypoints.serve.elastic_ep.middleware import set_scaling_elastic_ep
24
-from vllm.inputs import ProcessorInputs, PromptType
24
+from vllm.inputs import EngineInput, PromptType
25
from vllm.logger import init_logger
26
from vllm.lora.request import LoRARequest
27
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalRegistry
@@ -139,7 +139,7 @@ class AsyncLLM(EngineClient):
139
self.model_config.io_processor_plugin,
140
)
141
142
- # Convert TokPrompt --> EngineCoreRequest.
142
+ # Convert EngineInput --> EngineCoreRequest.
143
self.input_processor = InputProcessor(self.vllm_config, renderer)
144
145
# Converts EngineCoreOutputs --> RequestOutput.
@@ -290,7 +290,7 @@ class AsyncLLM(EngineClient):
290
request_id: str,
291
prompt: EngineCoreRequest
292
| PromptType
293
- | ProcessorInputs
293
+ | EngineInput
294
| AsyncGenerator[StreamingInput, None],
295
params: SamplingParams | PoolingParams,
296
arrival_time: float | None = None,
@@ -530,7 +530,7 @@ class AsyncLLM(EngineClient):
530
self,
531
prompt: EngineCoreRequest
532
| PromptType
533
- | ProcessorInputs
533
+ | EngineInput
534
| AsyncGenerator[StreamingInput, None],
535
sampling_params: SamplingParams,
536
request_id: str,
@@ -776,7 +776,7 @@ class AsyncLLM(EngineClient):
776
777
async def encode(
778
self,
779
- prompt: PromptType | ProcessorInputs,
779
+ prompt: PromptType | EngineInput,
780
pooling_params: PoolingParams,
781
request_id: str,
782
lora_request: LoRARequest | None = None,
vllm/v1/engine/input_processor.py
+19
-23
@@ -7,20 +7,18 @@ from typing import Any, Literal
7
8
import vllm.envs as envs
9
from vllm.config import VllmConfig
10
-from vllm.inputs.data import (
11
- ProcessorInputs,
10
+from vllm.inputs import (
11
+ EngineInput,
12
PromptType,
13
- SingletonInputs,
13
+ SingletonInput,
14
+ split_enc_dec_input,
15
)
15
-from vllm.inputs.parse import split_enc_dec_inputs
16
from vllm.inputs.preprocess import InputPreprocessor
17
from vllm.logger import init_logger
18
from vllm.lora.request import LoRARequest
19
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalRegistry
20
from vllm.multimodal.encoder_budget import MultiModalBudget
21
-from vllm.multimodal.inputs import (
22
- MultiModalFeatureSpec,
23
-)
21
+from vllm.multimodal.inputs import MultiModalFeatureSpec
22
from vllm.multimodal.utils import argsort_mm_positions
23
from vllm.platforms import current_platform
24
from vllm.pooling_params import PoolingParams
@@ -197,7 +195,7 @@ class InputProcessor:
195
def process_inputs(
196
self,
197
request_id: str,
200
- prompt: PromptType | ProcessorInputs,
198
+ prompt: PromptType | EngineInput,
199
params: SamplingParams | PoolingParams,
200
supported_tasks: tuple[SupportedTask, ...],
201
arrival_time: float | None = None,
@@ -232,7 +230,7 @@ class InputProcessor:
230
if arrival_time is None:
231
arrival_time = prompt.get("arrival_time", time.time()) # type: ignore[assignment]
232
235
- processed_inputs: ProcessorInputs = prompt # type: ignore[assignment]
233
+ processed_inputs: EngineInput = prompt # type: ignore[assignment]
234
else:
235
logger.warning_once(
236
"Passing raw prompts to InputProcessor is deprecated "
@@ -250,7 +248,7 @@ class InputProcessor:
248
249
current_platform.validate_request(processed_inputs, params)
250
253
- encoder_inputs, decoder_inputs = split_enc_dec_inputs(processed_inputs)
251
+ encoder_inputs, decoder_inputs = split_enc_dec_input(processed_inputs)
252
self._validate_model_inputs(encoder_inputs, decoder_inputs)
253
254
# Mypy can be conservative for TypedDict unions; normalize access.
@@ -385,7 +383,7 @@ class InputProcessor:
383
384
def _validate_model_input(
385
self,
388
- prompt_inputs: SingletonInputs,
386
+ prompt_input: SingletonInput,
387
prompt_type: Literal["encoder", "decoder"],
388
) -> None:
389
model_config = self.model_config
@@ -393,20 +391,18 @@ class InputProcessor:
391
392
prompt_ids = (
393
None
396
- if prompt_inputs["type"] == "embeds"
397
- else prompt_inputs["prompt_token_ids"]
394
+ if prompt_input["type"] == "embeds"
395
+ else prompt_input["prompt_token_ids"]
396
)
397
prompt_embeds = (
400
- prompt_inputs["prompt_embeds"]
401
- if prompt_inputs["type"] == "embeds"
402
- else None
398
+ prompt_input["prompt_embeds"] if prompt_input["type"] == "embeds" else None
399
)
400
401
prompt_len = length_from_prompt_token_ids_or_embeds(prompt_ids, prompt_embeds)
402
self._validate_prompt_len(prompt_len, prompt_type)
403
408
- if prompt_inputs["type"] == "multimodal":
409
- decoder_mm_positions = prompt_inputs["mm_placeholders"]
404
+ if prompt_input["type"] == "multimodal":
405
+ decoder_mm_positions = prompt_input["mm_placeholders"]
406
for modality, mm_positions in decoder_mm_positions.items():
407
for mm_position in mm_positions:
408
embed_length = mm_position.get_num_embeds()
@@ -439,10 +435,10 @@ class InputProcessor:
435
436
def _validate_model_inputs(
437
self,
442
- encoder_inputs: SingletonInputs | None,
443
- decoder_inputs: SingletonInputs,
438
+ encoder_input: SingletonInput | None,
439
+ decoder_input: SingletonInput,
440
):
445
- if encoder_inputs is not None:
446
- self._validate_model_input(encoder_inputs, prompt_type="encoder")
441
+ if encoder_input is not None:
442
+ self._validate_model_input(encoder_input, prompt_type="encoder")
443
448
- self._validate_model_input(decoder_inputs, prompt_type="decoder")
444
+ self._validate_model_input(decoder_input, prompt_type="decoder")
vllm/v1/engine/llm_engine.py
+3
-3
@@ -14,7 +14,7 @@ from vllm.config import ParallelConfig, VllmConfig
14
from vllm.distributed import stateless_destroy_torch_distributed_process_group
15
from vllm.distributed.parallel_state import get_dp_group
16
from vllm.engine.arg_utils import EngineArgs
17
-from vllm.inputs import ProcessorInputs, PromptType
17
+from vllm.inputs import EngineInput, PromptType
18
from vllm.logger import init_logger
19
from vllm.lora.request import LoRARequest
20
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalRegistry
@@ -96,7 +96,7 @@ class LLMEngine:
96
self.model_config.io_processor_plugin,
97
)
98
99
- # Convert TokPrompt --> EngineCoreRequest.
99
+ # Convert EngineInput --> EngineCoreRequest.
100
self.input_processor = InputProcessor(self.vllm_config, renderer)
101
102
# Converts EngineCoreOutputs --> RequestOutput.
@@ -216,7 +216,7 @@ class LLMEngine:
216
def add_request(
217
self,
218
request_id: str,
219
- prompt: EngineCoreRequest | PromptType | ProcessorInputs,
219
+ prompt: EngineCoreRequest | PromptType | EngineInput,
220
params: SamplingParams | PoolingParams,
221
arrival_time: float | None = None,
222
lora_request: LoRARequest | None = None,