Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
bd9e0b3
[Misc] Convert `TokenizerBase` to protocol, consolidate tokenizer tests
DarkLight1337 Nov 28, 2025
668eb2c
BC
DarkLight1337 Nov 28, 2025
6684cd0
Unnecessary quote
DarkLight1337 Nov 28, 2025
9f3ab67
Rename
DarkLight1337 Nov 28, 2025
d35e431
Forward merge
DarkLight1337 Nov 28, 2025
38afdfd
Merge branch 'main' into tokenizer-proto
DarkLight1337 Nov 28, 2025
a616c7a
Oops
DarkLight1337 Nov 28, 2025
94688c1
Docstring
DarkLight1337 Nov 28, 2025
54787a5
Increase tolerance
DarkLight1337 Nov 28, 2025
bb46b1a
[Bugfix] Fix wrong mock attribute
DarkLight1337 Nov 28, 2025
4ab6dcb
Merge branch 'main' into tokenizer-proto
DarkLight1337 Nov 28, 2025
c8e948d
Avoid circular import
DarkLight1337 Nov 28, 2025
665305e
Merge branch 'fix-serving-test' into tokenizer-proto
DarkLight1337 Nov 28, 2025
94b9c62
Fix mypy
DarkLight1337 Nov 28, 2025
3dbb92c
Fix circular import
DarkLight1337 Nov 28, 2025
9aeed95
rel import
DarkLight1337 Nov 28, 2025
e18ea6b
Avoid circular import
DarkLight1337 Nov 29, 2025
e90b9c1
Move
DarkLight1337 Nov 29, 2025
4d5a4b9
Merge branch 'main' into tokenizer-proto
DarkLight1337 Nov 29, 2025
18710e3
Reword
DarkLight1337 Nov 29, 2025
f8577a5
Fix imports
DarkLight1337 Nov 29, 2025
6c46abf
More updates
DarkLight1337 Nov 29, 2025
72afec3
Move
DarkLight1337 Nov 29, 2025
d77156a
SImplify
DarkLight1337 Nov 29, 2025
80ac48d
Fix
DarkLight1337 Nov 29, 2025
ae6eaac
Fix
DarkLight1337 Nov 29, 2025
7b6feb2
Update error message
DarkLight1337 Nov 29, 2025
d1c48fc
Merge branch 'main' into tokenizer-proto
DarkLight1337 Nov 29, 2025
5137574
Merge branch 'main' into tokenizer-proto
DarkLight1337 Nov 29, 2025
3866bae
Move
DarkLight1337 Nov 29, 2025
c59476a
Unnecessary `runtime_checkable`
DarkLight1337 Nov 29, 2025
9d974a3
Update import
DarkLight1337 Nov 29, 2025
15bf2a0
Avoid conflict with `tokenizers` package
DarkLight1337 Nov 29, 2025
6b558be
Don't run type validation on internal structures
DarkLight1337 Nov 29, 2025
767f2c8
kw only
DarkLight1337 Nov 29, 2025
02c1857
Fix mypy
DarkLight1337 Nov 29, 2025
a5fbb67
Fix test
DarkLight1337 Nov 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .buildkite/test-amd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -316,15 +316,15 @@ steps:
source_file_dependencies:
- vllm/
- tests/engine
- tests/tokenization
- tests/tokenizers
- tests/test_sequence
- tests/test_config
- tests/test_logger
- tests/test_vllm_port
commands:
- pytest -v -s engine test_sequence.py test_config.py test_logger.py test_vllm_port.py
# OOM in the CI unless we run this separately
- pytest -v -s tokenization
- pytest -v -s tokenizers

- label: V1 Test e2e + engine # 30min
timeout_in_minutes: 45
Expand Down
4 changes: 2 additions & 2 deletions .buildkite/test-pipeline.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -282,15 +282,15 @@ steps:
source_file_dependencies:
- vllm/
- tests/engine
- tests/tokenization
- tests/tokenizers
- tests/test_sequence
- tests/test_config
- tests/test_logger
- tests/test_vllm_port
commands:
- pytest -v -s engine test_sequence.py test_config.py test_logger.py test_vllm_port.py
# OOM in the CI unless we run this separately
- pytest -v -s tokenization
- pytest -v -s tokenizers

- label: V1 Test e2e + engine # 30min
timeout_in_minutes: 45
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/backend_request_func.py
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@ def get_tokenizer(
kwargs["use_fast"] = False
if tokenizer_mode == "mistral":
try:
from vllm.transformers_utils.tokenizer import MistralTokenizer
from vllm.tokenizers import MistralTokenizer
except ImportError as e:
raise ImportError(
"MistralTokenizer requires vllm package.\n"
Expand Down
5 changes: 2 additions & 3 deletions docs/features/reasoning_outputs.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,13 @@ You can add a new `ReasoningParser` similar to [vllm/reasoning/deepseek_r1_reaso
# import the required packages

from vllm.reasoning import ReasoningParser, ReasoningParserManager
from vllm.entrypoints.openai.protocol import (ChatCompletionRequest,
DeltaMessage)
from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage

# define a reasoning parser and register it to vllm
# the name list in register_module can be used
# in --reasoning-parser.
class ExampleParser(ReasoningParser):
def __init__(self, tokenizer: AnyTokenizer):
def __init__(self, tokenizer: TokenizerLike):
super().__init__(tokenizer)

def extract_reasoning_streaming(
Expand Down
2 changes: 1 addition & 1 deletion docs/features/tool_calling.md
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ Here is a summary of a plugin file:
# in --tool-call-parser. you can define as many
# tool parsers as you want here.
class ExampleToolParser(ToolParser):
def __init__(self, tokenizer: AnyTokenizer):
def __init__(self, tokenizer: TokenizerLike):
super().__init__(tokenizer)

# adjust request. e.g.: set skip special tokens
Expand Down
2 changes: 1 addition & 1 deletion tests/entrypoints/openai/test_serving_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from vllm.config import ModelConfig
from vllm.entrypoints.openai.serving_engine import OpenAIServing
from vllm.entrypoints.openai.serving_models import OpenAIServingModels
from vllm.transformers_utils.tokenizers.mistral import MistralTokenizer
from vllm.tokenizers import MistralTokenizer


@pytest.fixture()
Expand Down
4 changes: 2 additions & 2 deletions tests/entrypoints/openai/tool_parsers/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
import pytest
from transformers import AutoTokenizer

from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike


@pytest.fixture(scope="function")
def default_tokenizer() -> AnyTokenizer:
def default_tokenizer() -> TokenizerLike:
return AutoTokenizer.from_pretrained("gpt2")
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from vllm.entrypoints.openai.protocol import ChatCompletionRequest
from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

from ....utils import RemoteOpenAIServer

Expand Down Expand Up @@ -270,14 +270,14 @@ async def test_streaming_product_tool_call():


@pytest.fixture
def qwen_tokenizer() -> AnyTokenizer:
def qwen_tokenizer() -> TokenizerLike:
from vllm.transformers_utils.tokenizer import get_tokenizer

return get_tokenizer("Qwen/Qwen3-32B")


@pytest.fixture
def hermes_parser(qwen_tokenizer: AnyTokenizer) -> Hermes2ProToolParser:
def hermes_parser(qwen_tokenizer: TokenizerLike) -> Hermes2ProToolParser:
return Hermes2ProToolParser(qwen_tokenizer)


Expand All @@ -291,7 +291,7 @@ def any_chat_request() -> ChatCompletionRequest:


def test_hermes_parser_streaming_just_forward_text(
qwen_tokenizer: AnyTokenizer,
qwen_tokenizer: TokenizerLike,
hermes_parser: Hermes2ProToolParser,
any_chat_request: ChatCompletionRequest,
) -> None:
Expand Down Expand Up @@ -323,7 +323,7 @@ def test_hermes_parser_streaming_just_forward_text(


def test_hermes_parser_streaming_failure_case_bug_19056(
qwen_tokenizer: AnyTokenizer,
qwen_tokenizer: TokenizerLike,
hermes_parser: Hermes2ProToolParser,
any_chat_request: ChatCompletionRequest,
) -> None:
Expand Down Expand Up @@ -357,7 +357,7 @@ def test_hermes_parser_streaming_failure_case_bug_19056(


def test_hermes_parser_streaming(
qwen_tokenizer: AnyTokenizer,
qwen_tokenizer: TokenizerLike,
hermes_parser: Hermes2ProToolParser,
any_chat_request: ChatCompletionRequest,
) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

from vllm.entrypoints.openai.protocol import ExtractedToolCallInformation
from vllm.entrypoints.openai.tool_parsers.llama_tool_parser import Llama3JsonToolParser
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike


@pytest.fixture
def parser(default_tokenizer: AnyTokenizer):
def parser(default_tokenizer: TokenizerLike):
return Llama3JsonToolParser(default_tokenizer)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
)
from vllm.entrypoints.openai.protocol import FunctionCall
from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

# Test cases similar to pythonic parser but with Llama4 specific format
SIMPLE_FUNCTION_OUTPUT = "[get_weather(city='LA', metric='C')]"
Expand Down Expand Up @@ -64,7 +64,7 @@


@pytest.mark.parametrize("streaming", [True, False])
def test_no_tool_call(streaming: bool, default_tokenizer: AnyTokenizer):
def test_no_tool_call(streaming: bool, default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("llama4_pythonic")(
default_tokenizer
)
Expand Down Expand Up @@ -208,7 +208,7 @@ def test_tool_call(
streaming: bool,
model_output: str,
expected_tool_calls: list[FunctionCall],
default_tokenizer: AnyTokenizer,
default_tokenizer: TokenizerLike,
):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("llama4_pythonic")(
default_tokenizer
Expand All @@ -224,7 +224,7 @@ def test_tool_call(
assert actual.function == expected


def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):
def test_streaming_tool_call_with_large_steps(default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("llama4_pythonic")(
default_tokenizer
)
Expand All @@ -246,7 +246,7 @@ def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):


@pytest.mark.parametrize("streaming", [False])
def test_regex_timeout_handling(streaming: bool, default_tokenizer: AnyTokenizer):
def test_regex_timeout_handling(streaming: bool, default_tokenizer: TokenizerLike):
"""test regex timeout is handled gracefully"""
tool_parser: ToolParser = ToolParserManager.get_tool_parser("llama4_pythonic")(
default_tokenizer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
)
from vllm.entrypoints.openai.protocol import FunctionCall
from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

# https://github.com/meta-llama/llama-models/blob/main/models/llama3_2/text_prompt_format.md#model-response-format-1
SIMPLE_FUNCTION_OUTPUT = "get_weather(city='San Francisco', metric='celsius')"
Expand Down Expand Up @@ -69,7 +69,7 @@


@pytest.mark.parametrize("streaming", [True, False])
def test_no_tool_call(streaming: bool, default_tokenizer: AnyTokenizer):
def test_no_tool_call(streaming: bool, default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("olmo3")(
default_tokenizer
)
Expand Down Expand Up @@ -188,7 +188,7 @@ def test_tool_call(
streaming: bool,
model_output: str,
expected_tool_calls: list[FunctionCall],
default_tokenizer: AnyTokenizer,
default_tokenizer: TokenizerLike,
):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("olmo3")(
default_tokenizer
Expand All @@ -205,7 +205,7 @@ def test_tool_call(
assert actual.function == expected


def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):
def test_streaming_tool_call_with_large_steps(default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("olmo3")(
default_tokenizer
)
Expand All @@ -228,7 +228,7 @@ def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):


@pytest.mark.parametrize("streaming", [False])
def test_regex_timeout_handling(streaming: bool, default_tokenizer: AnyTokenizer):
def test_regex_timeout_handling(streaming: bool, default_tokenizer: TokenizerLike):
"""test regex timeout is handled gracefully"""
tool_parser: ToolParser = ToolParserManager.get_tool_parser("olmo3")(
default_tokenizer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
)
from vllm.entrypoints.openai.protocol import FunctionCall
from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

# https://github.com/meta-llama/llama-models/blob/main/models/llama3_2/text_prompt_format.md#model-response-format-1
SIMPLE_FUNCTION_OUTPUT = "get_weather(city='San Francisco', metric='celsius')"
Expand Down Expand Up @@ -61,7 +61,7 @@


@pytest.mark.parametrize("streaming", [True, False])
def test_no_tool_call(streaming: bool, default_tokenizer: AnyTokenizer):
def test_no_tool_call(streaming: bool, default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("pythonic")(
default_tokenizer
)
Expand Down Expand Up @@ -168,7 +168,7 @@ def test_tool_call(
streaming: bool,
model_output: str,
expected_tool_calls: list[FunctionCall],
default_tokenizer: AnyTokenizer,
default_tokenizer: TokenizerLike,
):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("pythonic")(
default_tokenizer
Expand All @@ -185,7 +185,7 @@ def test_tool_call(
assert actual.function == expected


def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):
def test_streaming_tool_call_with_large_steps(default_tokenizer: TokenizerLike):
tool_parser: ToolParser = ToolParserManager.get_tool_parser("pythonic")(
default_tokenizer
)
Expand All @@ -208,7 +208,7 @@ def test_streaming_tool_call_with_large_steps(default_tokenizer: AnyTokenizer):


@pytest.mark.parametrize("streaming", [False])
def test_regex_timeout_handling(streaming: bool, default_tokenizer: AnyTokenizer):
def test_regex_timeout_handling(streaming: bool, default_tokenizer: TokenizerLike):
"""test regex timeout is handled gracefully"""
tool_parser: ToolParser = ToolParserManager.get_tool_parser("pythonic")(
default_tokenizer
Expand Down
4 changes: 2 additions & 2 deletions tests/entrypoints/openai/tool_parsers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
ToolCall,
)
from vllm.entrypoints.openai.tool_parsers import ToolParser
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike


class StreamingToolReconstructor:
Expand Down Expand Up @@ -111,7 +111,7 @@ def run_tool_extraction_nonstreaming(
return tool_parser.extract_tool_calls(model_output, request)


def split_string_into_token_deltas(tokenizer: AnyTokenizer, text: str) -> list[str]:
def split_string_into_token_deltas(tokenizer: TokenizerLike, text: str) -> list[str]:
# Split a string into a series of deltas using the provided tokenizer. Each
# delta will be the string equivalent of a single token.
token_ids = tokenizer.encode(text, add_special_tokens=False)
Expand Down
2 changes: 1 addition & 1 deletion tests/entrypoints/test_chat_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
encode_image_base64,
encode_video_base64,
)
from vllm.tokenizers import MistralTokenizer
from vllm.transformers_utils.tokenizer import get_tokenizer
from vllm.transformers_utils.tokenizers.mistral import MistralTokenizer

from ..models.registry import HF_EXAMPLE_MODELS
from ..utils import VLLM_PATH
Expand Down
2 changes: 1 addition & 1 deletion tests/models/language/generation/test_mistral.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
MistralToolParser,
)
from vllm.sampling_params import SamplingParams
from vllm.transformers_utils.tokenizer import MistralTokenizer
from vllm.tokenizers import MistralTokenizer

from ...utils import check_logprobs_close

Expand Down
2 changes: 1 addition & 1 deletion tests/models/multimodal/generation/test_voxtral.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from mistral_common.protocol.instruct.chunk import AudioChunk, RawAudio, TextChunk
from mistral_common.protocol.instruct.messages import UserMessage

from vllm.transformers_utils.tokenizer import MistralTokenizer
from vllm.tokenizers import MistralTokenizer

from ....conftest import AudioTestAssets
from ....utils import RemoteOpenAIServer
Expand Down
4 changes: 2 additions & 2 deletions tests/models/multimodal/generation/vlm_utils/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from transformers.models.auto.auto_factory import _BaseAutoModelClass

from vllm.config.model import RunnerOption
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

from .....conftest import HfRunner, VllmRunner
from ....registry import HF_EXAMPLE_MODELS
Expand All @@ -33,7 +33,7 @@ def run_test(
auto_cls: type[_BaseAutoModelClass],
use_tokenizer_eos: bool,
comparator: Callable[..., None],
get_stop_token_ids: Callable[[AnyTokenizer], list[int]] | None,
get_stop_token_ids: Callable[[TokenizerLike], list[int]] | None,
stop_str: list[str] | None,
limit_mm_per_prompt: dict[str, int],
vllm_runner_kwargs: dict[str, Any] | None,
Expand Down
4 changes: 2 additions & 2 deletions tests/models/multimodal/generation/vlm_utils/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from vllm.config.model import RunnerOption
from vllm.logprobs import SampleLogprobs
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.tokenizers import TokenizerLike

from .....conftest import (
AUDIO_ASSETS,
Expand Down Expand Up @@ -126,7 +126,7 @@ class VLMTestInfo(NamedTuple):
vllm_runner_kwargs: dict[str, Any] | None = None

# Optional callable which gets a list of token IDs from the model tokenizer
get_stop_token_ids: Callable[[AnyTokenizer], list[int]] | None = None
get_stop_token_ids: Callable[[TokenizerLike], list[int]] | None = None
# Optional list of strings to stop generation, useful when stop tokens are
# not special tokens in the tokenizer
stop_str: list[str] | None = None
Expand Down
2 changes: 1 addition & 1 deletion tests/models/multimodal/processing/test_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
from vllm.multimodal.cache import MultiModalProcessorOnlyCache
from vllm.multimodal.inputs import MultiModalInputs
from vllm.multimodal.processing import BaseMultiModalProcessor, InputProcessingContext
from vllm.tokenizers import MistralTokenizer
from vllm.transformers_utils.tokenizer import (
MistralTokenizer,
cached_tokenizer_from_config,
encode_tokens,
)
Expand Down
Loading