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 13, 20:45 UTC
[Refactor] Lazy import tool_parser (#27974)
Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
Chauncey committed
Nov 4, 2025 at 10:10 UTC
c02fccdbd2794fe016ebd738e3a8b8c8d78eb78c
40 files changed
+267
-159
docs/features/tool_calling.md
+6
-1
@@ -407,7 +407,6 @@ Here is a summary of a plugin file:
407
# the name list in register_module can be used
408
# in --tool-call-parser. you can define as many
409
# tool parsers as you want here.
410
- @ToolParserManager.register_module(["example"])
410
class ExampleToolParser(ToolParser):
411
def __init__(self, tokenizer: AnyTokenizer):
412
super().__init__(tokenizer)
@@ -439,6 +438,12 @@ Here is a summary of a plugin file:
438
return ExtractedToolCallInformation(tools_called=False,
439
tool_calls=[],
440
content=text)
441
+ # register the tool parser to ToolParserManager
442
+ ToolParserManager.register_lazy_module(
443
+ name="example",
444
+ module_path="vllm.entrypoints.openai.tool_parsers.example",
445
+ class_name="ExampleToolParser",
446
+ )
447
448
```
449
tests/tool_use/test_deepseekv31_tool_parser.py
+3
-1
@@ -3,7 +3,9 @@
3
4
import pytest
5
6
-from vllm.entrypoints.openai.tool_parsers import DeepSeekV31ToolParser
6
+from vllm.entrypoints.openai.tool_parsers.deepseekv31_tool_parser import (
7
+ DeepSeekV31ToolParser,
8
+)
9
from vllm.transformers_utils.tokenizer import get_tokenizer
10
11
MODEL = "deepseek-ai/DeepSeek-V3.1"
tests/tool_use/test_ernie45_moe_tool_parser.py
+1
-1
@@ -13,7 +13,7 @@ from vllm.entrypoints.openai.protocol import (
13
FunctionCall,
14
ToolCall,
15
)
16
-from vllm.entrypoints.openai.tool_parsers import Ernie45ToolParser
16
+from vllm.entrypoints.openai.tool_parsers.ernie45_tool_parser import Ernie45ToolParser
17
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
18
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
19
tests/tool_use/test_glm4_moe_tool_parser.py
+3
-1
@@ -7,7 +7,9 @@ import json
7
import pytest
8
9
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10
-from vllm.entrypoints.openai.tool_parsers import Glm4MoeModelToolParser
10
+from vllm.entrypoints.openai.tool_parsers.glm4_moe_tool_parser import (
11
+ Glm4MoeModelToolParser,
12
+)
13
from vllm.transformers_utils.tokenizer import get_tokenizer
14
15
pytestmark = pytest.mark.cpu_test
tests/tool_use/test_jamba_tool_parser.py
+1
-1
@@ -9,7 +9,7 @@ import pytest
9
from partial_json_parser.core.options import Allow
10
11
from vllm.entrypoints.openai.protocol import DeltaMessage, FunctionCall, ToolCall
12
-from vllm.entrypoints.openai.tool_parsers import JambaToolParser
12
+from vllm.entrypoints.openai.tool_parsers.jamba_tool_parser import JambaToolParser
13
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
14
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
15
tests/tool_use/test_kimi_k2_tool_parser.py
+1
-1
@@ -7,7 +7,7 @@ import json
7
import pytest
8
9
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10
-from vllm.entrypoints.openai.tool_parsers import KimiK2ToolParser
10
+from vllm.entrypoints.openai.tool_parsers.kimi_k2_tool_parser import KimiK2ToolParser
11
from vllm.transformers_utils.tokenizer import get_tokenizer
12
13
pytestmark = pytest.mark.cpu_test
tests/tool_use/test_minimax_tool_parser.py
+1
-1
@@ -12,7 +12,7 @@ from vllm.entrypoints.openai.protocol import (
12
FunctionCall,
13
ToolCall,
14
)
15
-from vllm.entrypoints.openai.tool_parsers import MinimaxToolParser
15
+from vllm.entrypoints.openai.tool_parsers.minimax_tool_parser import MinimaxToolParser
16
from vllm.transformers_utils.tokenizer import get_tokenizer
17
18
pytestmark = pytest.mark.cpu_test
tests/tool_use/test_openai_tool_parser.py
+1
-1
@@ -15,7 +15,7 @@ from openai_harmony import (
15
)
16
17
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
18
-from vllm.entrypoints.openai.tool_parsers import OpenAIToolParser
18
+from vllm.entrypoints.openai.tool_parsers.openai_tool_parser import OpenAIToolParser
19
from vllm.transformers_utils.tokenizer import get_tokenizer
20
21
MODEL = "gpt2"
tests/tool_use/test_seed_oss_tool_parser.py
+1
-1
@@ -14,7 +14,7 @@ from vllm.entrypoints.openai.protocol import (
14
FunctionCall,
15
ToolCall,
16
)
17
-from vllm.entrypoints.openai.tool_parsers import SeedOssToolParser
17
+from vllm.entrypoints.openai.tool_parsers.seed_oss_tool_parser import SeedOssToolParser
18
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
19
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
20
tests/tool_use/test_xlam_tool_parser.py
+1
-1
@@ -12,7 +12,7 @@ from vllm.entrypoints.openai.protocol import (
12
FunctionCall,
13
ToolCall,
14
)
15
-from vllm.entrypoints.openai.tool_parsers import xLAMToolParser
15
+from vllm.entrypoints.openai.tool_parsers.xlam_tool_parser import xLAMToolParser
16
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
17
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
18
vllm/entrypoints/openai/api_server.py
+1
-1
@@ -1943,7 +1943,7 @@ def create_server_unix_socket(path: str) -> socket.socket:
1943
1944
1945
def validate_api_server_args(args):
1946
- valid_tool_parses = ToolParserManager.tool_parsers.keys()
1946
+ valid_tool_parses = ToolParserManager.list_registered()
1947
if args.enable_auto_tool_choice and args.tool_call_parser not in valid_tool_parses:
1948
raise KeyError(
1949
f"invalid tool call parser: {args.tool_call_parser} "
vllm/entrypoints/openai/cli_args.py
+1
-1
@@ -219,7 +219,7 @@ class FrontendArgs:
219
frontend_kwargs["middleware"]["default"] = []
220
221
# Special case: Tool call parser shows built-in options.
222
- valid_tool_parsers = list(ToolParserManager.tool_parsers.keys())
222
+ valid_tool_parsers = list(ToolParserManager.list_registered())
223
parsers_str = ",".join(valid_tool_parsers)
224
frontend_kwargs["tool_call_parser"]["metavar"] = (
225
f"{{{parsers_str}}} or name registered in --tool-parser-plugin"
vllm/entrypoints/openai/tool_parsers/__init__.py
+139
-58
@@ -1,61 +1,142 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
-from .abstract_tool_parser import ToolParser, ToolParserManager
5
-from .deepseekv3_tool_parser import DeepSeekV3ToolParser
6
-from .deepseekv31_tool_parser import DeepSeekV31ToolParser
7
-from .ernie45_tool_parser import Ernie45ToolParser
8
-from .glm4_moe_tool_parser import Glm4MoeModelToolParser
9
-from .granite_20b_fc_tool_parser import Granite20bFCToolParser
10
-from .granite_tool_parser import GraniteToolParser
11
-from .hermes_tool_parser import Hermes2ProToolParser
12
-from .hunyuan_a13b_tool_parser import HunyuanA13BToolParser
13
-from .internlm2_tool_parser import Internlm2ToolParser
14
-from .jamba_tool_parser import JambaToolParser
15
-from .kimi_k2_tool_parser import KimiK2ToolParser
16
-from .llama4_pythonic_tool_parser import Llama4PythonicToolParser
17
-from .llama_tool_parser import Llama3JsonToolParser
18
-from .longcat_tool_parser import LongcatFlashToolParser
19
-from .minimax_m2_tool_parser import MinimaxM2ToolParser
20
-from .minimax_tool_parser import MinimaxToolParser
21
-from .mistral_tool_parser import MistralToolParser
22
-from .olmo3_tool_parser import Olmo3PythonicToolParser
23
-from .openai_tool_parser import OpenAIToolParser
24
-from .phi4mini_tool_parser import Phi4MiniJsonToolParser
25
-from .pythonic_tool_parser import PythonicToolParser
26
-from .qwen3coder_tool_parser import Qwen3CoderToolParser
27
-from .qwen3xml_tool_parser import Qwen3XMLToolParser
28
-from .seed_oss_tool_parser import SeedOssToolParser
29
-from .step3_tool_parser import Step3ToolParser
30
-from .xlam_tool_parser import xLAMToolParser
31
-
32
-__all__ = [
33
- "ToolParser",
34
- "ToolParserManager",
35
- "Granite20bFCToolParser",
36
- "GraniteToolParser",
37
- "Hermes2ProToolParser",
38
- "MistralToolParser",
39
- "Internlm2ToolParser",
40
- "Llama3JsonToolParser",
41
- "JambaToolParser",
42
- "Llama4PythonicToolParser",
43
- "LongcatFlashToolParser",
44
- "PythonicToolParser",
45
- "Phi4MiniJsonToolParser",
46
- "DeepSeekV3ToolParser",
47
- "DeepSeekV31ToolParser",
48
- "Ernie45ToolParser",
49
- "xLAMToolParser",
50
- "Olmo3PythonicToolParser",
51
- "MinimaxToolParser",
52
- "KimiK2ToolParser",
53
- "HunyuanA13BToolParser",
54
- "Glm4MoeModelToolParser",
55
- "Qwen3CoderToolParser",
56
- "Qwen3XMLToolParser",
57
- "SeedOssToolParser",
58
- "Step3ToolParser",
59
- "OpenAIToolParser",
60
- "MinimaxM2ToolParser",
61
-]
4
+from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
5
+ ToolParser,
6
+ ToolParserManager,
7
+)
8
+
9
+__all__ = ["ToolParser", "ToolParserManager"]
10
+
11
+
12
+"""
13
+Register a lazy module mapping.
14
+
15
+Example:
16
+ ToolParserManager.register_lazy_module(
17
+ name="kimi_k2",
18
+ module_path="vllm.entrypoints.openai.tool_parsers.kimi_k2_parser",
19
+ class_name="KimiK2ToolParser",
20
+ )
21
+"""
22
+
23
+
24
+_TOOL_PARSERS_TO_REGISTER = {
25
+ "deepseek_v3": ( # name
26
+ "deepseekv3_tool_parser", # filename
27
+ "DeepSeekV3ToolParser", # class_name
28
+ ),
29
+ "deepseek_v31": (
30
+ "deepseekv31_tool_parser",
31
+ "DeepSeekV31ToolParser",
32
+ ),
33
+ "ernie45": (
34
+ "ernie45_tool_parser",
35
+ "Ernie45ToolParser",
36
+ ),
37
+ "glm45": (
38
+ "glm4_moe_tool_parser",
39
+ "Glm4MoeModelToolParser",
40
+ ),
41
+ "granite-20b-fc": (
42
+ "granite_20b_fc_tool_parser",
43
+ "Granite20bFCToolParser",
44
+ ),
45
+ "granite": (
46
+ "granite_tool_parser",
47
+ "GraniteToolParser",
48
+ ),
49
+ "hermes": (
50
+ "hermes_tool_parser",
51
+ "Hermes2ProToolParser",
52
+ ),
53
+ "hunyuan_a13b": (
54
+ "hunyuan_a13b_tool_parser",
55
+ "HunyuanA13BToolParser",
56
+ ),
57
+ "internlm": (
58
+ "internlm2_tool_parser",
59
+ "Internlm2ToolParser",
60
+ ),
61
+ "jamba": (
62
+ "jamba_tool_parser",
63
+ "JambaToolParser",
64
+ ),
65
+ "kimi_k2": (
66
+ "kimi_k2_tool_parser",
67
+ "KimiK2ToolParser",
68
+ ),
69
+ "llama3_json": (
70
+ "llama_tool_parser",
71
+ "Llama3JsonToolParser",
72
+ ),
73
+ "llama4_json": (
74
+ "llama_tool_parser",
75
+ "Llama4JsonToolParser",
76
+ ),
77
+ "llama4_pythonic": (
78
+ "llama4_pythonic_tool_parser",
79
+ "Llama4PythonicToolParser",
80
+ ),
81
+ "longcat": (
82
+ "longcat_tool_parser",
83
+ "LongcatFlashToolParser",
84
+ ),
85
+ "minimax_m2": (
86
+ "minimax_m2_tool_parser",
87
+ "MinimaxM2ToolParser",
88
+ ),
89
+ "minimax": (
90
+ "minimax_tool_parser",
91
+ "MinimaxToolParser",
92
+ ),
93
+ "mistral": (
94
+ "mistral_tool_parser",
95
+ "MistralToolParser",
96
+ ),
97
+ "olmo3": (
98
+ "olmo3_tool_parser",
99
+ "Olmo3PythonicToolParser",
100
+ ),
101
+ "openai": (
102
+ "openai_tool_parser",
103
+ "OpenAIToolParser",
104
+ ),
105
+ "phi4_mini_json": (
106
+ "phi4mini_tool_parser",
107
+ "Phi4MiniJsonToolParser",
108
+ ),
109
+ "pythonic": (
110
+ "pythonic_tool_parser",
111
+ "PythonicToolParser",
112
+ ),
113
+ "qwen3_coder": (
114
+ "qwen3coder_tool_parser",
115
+ "Qwen3CoderToolParser",
116
+ ),
117
+ "qwen3_xml": (
118
+ "qwen3xml_tool_parser",
119
+ "Qwen3XmlToolParser",
120
+ ),
121
+ "seed_oss": (
122
+ "seed_oss_tool_parser",
123
+ "SeedOsSToolParser",
124
+ ),
125
+ "step3": (
126
+ "step3_tool_parser",
127
+ "Step3ToolParser",
128
+ ),
129
+ "xlam": (
130
+ "xlam_tool_parser",
131
+ "xLAMToolParser",
132
+ ),
133
+}
134
+
135
+
136
+def register_lazy_tool_parsers():
137
+ for name, (file_name, class_name) in _TOOL_PARSERS_TO_REGISTER.items():
138
+ module_path = f"vllm.entrypoints.openai.tool_parsers.{file_name}"
139
+ ToolParserManager.register_lazy_module(name, module_path, class_name)
140
+
141
+
142
+register_lazy_tool_parsers()
vllm/entrypoints/openai/tool_parsers/abstract_tool_parser.py
+106
-36
@@ -1,6 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
+import importlib
5
import os
6
from collections.abc import Callable, Sequence
7
from functools import cached_property
@@ -99,89 +100,158 @@ class ToolParser:
100
101
102
class ToolParserManager:
102
- tool_parsers: dict[str, type] = {}
103
+ """
104
+ Central registry for ToolParser implementations.
105
+
106
+ Supports two modes:
107
+ - Eager (immediate) registration via `register_module`
108
+ - Lazy registration via `register_lazy_module`
109
+ """
110
+
111
+ tool_parsers: dict[str, type[ToolParser]] = {}
112
+ lazy_parsers: dict[str, tuple[str, str]] = {} # name -> (module_path, class_name)
113
114
@classmethod
105
- def get_tool_parser(cls, name) -> type:
115
+ def get_tool_parser(cls, name: str) -> type[ToolParser]:
116
"""
107
- Get tool parser by name which is registered by `register_module`.
117
+ Retrieve a registered or lazily registered ToolParser class.
118
109
- Raise a KeyError exception if the name is not registered.
119
+ If the parser is lazily registered,
120
+ it will be imported and cached on first access.
121
+ Raises KeyError if not found.
122
"""
123
if name in cls.tool_parsers:
124
return cls.tool_parsers[name]
125
114
- raise KeyError(f"tool helper: '{name}' not found in tool_parsers")
126
+ if name in cls.lazy_parsers:
127
+ return cls._load_lazy_parser(name)
128
+
129
+ raise KeyError(f"Tool parser '{name}' not found.")
130
+
131
+ @classmethod
132
+ def _load_lazy_parser(cls, name: str) -> type[ToolParser]:
133
+ """Import and register a lazily loaded parser."""
134
+ module_path, class_name = cls.lazy_parsers[name]
135
+ try:
136
+ mod = importlib.import_module(module_path)
137
+ parser_cls = getattr(mod, class_name)
138
+ if not issubclass(parser_cls, ToolParser):
139
+ raise TypeError(
140
+ f"{class_name} in {module_path} is not a ToolParser subclass."
141
+ )
142
+ cls.tool_parsers[name] = parser_cls # cache
143
+ return parser_cls
144
+ except Exception as e:
145
+ logger.exception(
146
+ "Failed to import lazy tool parser '%s' from %s: %s",
147
+ name,
148
+ module_path,
149
+ e,
150
+ )
151
+ raise
152
153
@classmethod
154
def _register_module(
155
cls,
119
- module: type,
156
+ module: type[ToolParser],
157
module_name: str | list[str] | None = None,
158
force: bool = True,
159
) -> None:
160
+ """Register a ToolParser class immediately."""
161
if not issubclass(module, ToolParser):
162
raise TypeError(
163
f"module must be subclass of ToolParser, but got {type(module)}"
164
)
165
+
166
if module_name is None:
167
module_name = module.__name__
168
+
169
if isinstance(module_name, str):
130
- module_name = [module_name]
131
- for name in module_name:
170
+ module_names = [module_name]
171
+ elif is_list_of(module_name, str):
172
+ module_names = module_name
173
+ else:
174
+ raise TypeError("module_name must be str, list[str], or None.")
175
+
176
+ for name in module_names:
177
if not force and name in cls.tool_parsers:
133
- existed_module = cls.tool_parsers[name]
134
- raise KeyError(
135
- f"{name} is already registered at {existed_module.__module__}"
136
- )
178
+ existed = cls.tool_parsers[name]
179
+ raise KeyError(f"{name} is already registered at {existed.__module__}")
180
cls.tool_parsers[name] = module
181
182
+ @classmethod
183
+ def register_lazy_module(cls, name: str, module_path: str, class_name: str) -> None:
184
+ """
185
+ Register a lazy module mapping.
186
+
187
+ Example:
188
+ ToolParserManager.register_lazy_module(
189
+ name="kimi_k2",
190
+ module_path="vllm.entrypoints.openai.tool_parsers.kimi_k2_parser",
191
+ class_name="KimiK2ToolParser",
192
+ )
193
+ """
194
+ cls.lazy_parsers[name] = (module_path, class_name)
195
+
196
@classmethod
197
def register_module(
198
cls,
199
name: str | list[str] | None = None,
200
force: bool = True,
144
- module: type | None = None,
145
- ) -> type | Callable:
201
+ module: type[ToolParser] | None = None,
202
+ ) -> type[ToolParser] | Callable[[type[ToolParser]], type[ToolParser]]:
203
"""
147
- Register module with the given name or name list. it can be used as a
148
- decoder(with module as None) or normal function(with module as not
149
- None).
204
+ Register module immediately or lazily (as a decorator).
205
+
206
+ Usage:
207
+ @ToolParserManager.register_module("kimi_k2")
208
+ class KimiK2ToolParser(ToolParser):
209
+ ...
210
+
211
+ Or:
212
+ ToolParserManager.register_module(module=SomeToolParser)
213
"""
214
if not isinstance(force, bool):
215
raise TypeError(f"force must be a boolean, but got {type(force)}")
216
154
- # raise the error ahead of time
155
- if not (name is None or isinstance(name, str) or is_list_of(name, str)):
156
- raise TypeError(
157
- "name must be None, an instance of str, or a sequence of str, "
158
- f"but got {type(name)}"
159
- )
160
-
161
- # use it as a normal method: x.register_module(module=SomeClass)
217
+ # Immediate registration
218
if module is not None:
219
cls._register_module(module=module, module_name=name, force=force)
220
return module
221
166
- # use it as a decorator: @x.register_module()
167
- def _register(module):
168
- cls._register_module(module=module, module_name=name, force=force)
169
- return module
222
+ # Decorator usage
223
+ def _decorator(obj: type[ToolParser]) -> type[ToolParser]:
224
+ module_path = obj.__module__
225
+ class_name = obj.__name__
226
171
- return _register
227
+ if isinstance(name, str):
228
+ names = [name]
229
+ elif is_list_of(name, str):
230
+ names = name
231
+ else:
232
+ names = [class_name]
233
+
234
+ for n in names:
235
+ # Lazy mapping only: do not import now
236
+ cls.lazy_parsers[n] = (module_path, class_name)
237
+
238
+ return obj
239
+
240
+ return _decorator
241
+
242
+ @classmethod
243
+ def list_registered(cls) -> list[str]:
244
+ """Return names of all eagerly and lazily registered tool parsers."""
245
+ return sorted(set(cls.tool_parsers.keys()) | set(cls.lazy_parsers.keys()))
246
247
@classmethod
248
def import_tool_parser(cls, plugin_path: str) -> None:
175
- """
176
- Import a user-defined tool parser by the path of the tool parser define
177
- file.
178
- """
179
- module_name = os.path.splitext(os.path.basename(plugin_path))[0]
249
+ """Import a user-defined parser file from arbitrary path."""
250
251
+ module_name = os.path.splitext(os.path.basename(plugin_path))[0]
252
try:
253
import_from_path(module_name, plugin_path)
254
except Exception:
255
logger.exception(
256
"Failed to load module '%s' from %s.", module_name, plugin_path
257
)
187
- return
vllm/entrypoints/openai/tool_parsers/deepseekv31_tool_parser.py
-2
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
17
)
18
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19
ToolParser,
20
- ToolParserManager,
20
)
21
from vllm.logger import init_logger
22
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
24
logger = init_logger(__name__)
25
26
28
-@ToolParserManager.register_module("deepseek_v31")
27
class DeepSeekV31ToolParser(ToolParser):
28
def __init__(self, tokenizer: AnyTokenizer):
29
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/deepseekv3_tool_parser.py
-2
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
17
)
18
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19
ToolParser,
20
- ToolParserManager,
20
)
21
from vllm.logger import init_logger
22
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
24
logger = init_logger(__name__)
25
26
28
-@ToolParserManager.register_module("deepseek_v3")
27
class DeepSeekV3ToolParser(ToolParser):
28
def __init__(self, tokenizer: AnyTokenizer):
29
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/ernie45_tool_parser.py
-2
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
17
)
18
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19
ToolParser,
20
- ToolParserManager,
20
)
21
from vllm.logger import init_logger
22
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
24
logger = init_logger(__name__)
25
26
28
-@ToolParserManager.register_module("ernie45")
27
class Ernie45ToolParser(ToolParser):
28
def __init__(self, tokenizer: AnyTokenizer):
29
"""
vllm/entrypoints/openai/tool_parsers/glm4_moe_tool_parser.py
-2
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
20
)
21
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22
ToolParser,
23
- ToolParserManager,
23
)
24
from vllm.logger import init_logger
25
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module("glm45")
30
class Glm4MoeModelToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/granite_20b_fc_tool_parser.py
-2
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
21
)
22
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23
ToolParser,
24
- ToolParserManager,
24
)
25
from vllm.entrypoints.openai.tool_parsers.utils import (
26
consume_space,
@@ -35,7 +34,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
34
logger = init_logger(__name__)
35
36
38
-@ToolParserManager.register_module("granite-20b-fc")
37
class Granite20bFCToolParser(ToolParser):
38
"""
39
Tool call parser for the granite-20b-functioncalling model intended
vllm/entrypoints/openai/tool_parsers/granite_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.entrypoints.openai.tool_parsers.utils import (
24
consume_space,
@@ -33,7 +32,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
32
logger = init_logger(__name__)
33
34
36
-@ToolParserManager.register_module("granite")
35
class GraniteToolParser(ToolParser):
36
"""
37
Tool call parser for the granite 3.0 models. Intended
vllm/entrypoints/openai/tool_parsers/hermes_tool_parser.py
-2
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
20
)
21
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22
ToolParser,
23
- ToolParserManager,
23
)
24
from vllm.logger import init_logger
25
from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module("hermes")
30
class Hermes2ProToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/hunyuan_a13b_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.entrypoints.openai.tool_parsers.utils import consume_space
24
from vllm.logger import init_logger
@@ -29,7 +28,6 @@ from vllm.utils import random_uuid
28
logger = init_logger(__name__)
29
30
32
-@ToolParserManager.register_module("hunyuan_a13b")
31
class HunyuanA13BToolParser(ToolParser):
32
def __init__(self, tokenizer: AnyTokenizer):
33
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/internlm2_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
24
from vllm.logger import init_logger
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module(["internlm"])
30
class Internlm2ToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/jamba_tool_parser.py
+1
-2
@@ -18,7 +18,7 @@ from vllm.entrypoints.openai.protocol import (
18
FunctionCall,
19
ToolCall,
20
)
21
-from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
21
+from vllm.entrypoints.openai.tool_parsers import ToolParser
22
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
23
from vllm.logger import init_logger
24
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -27,7 +27,6 @@ from vllm.transformers_utils.tokenizers import MistralTokenizer
27
logger = init_logger(__name__)
28
29
30
-@ToolParserManager.register_module("jamba")
30
class JambaToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/kimi_k2_tool_parser.py
-2
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
17
)
18
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19
ToolParser,
20
- ToolParserManager,
20
)
21
from vllm.logger import init_logger
22
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
24
logger = init_logger(__name__)
25
26
28
-@ToolParserManager.register_module(["kimi_k2"])
27
class KimiK2ToolParser(ToolParser):
28
def __init__(self, tokenizer: AnyTokenizer):
29
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/llama4_pythonic_tool_parser.py
-2
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
20
)
21
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22
ToolParser,
23
- ToolParserManager,
23
)
24
from vllm.logger import init_logger
25
@@ -31,7 +30,6 @@ class _UnexpectedAstError(Exception):
30
pass
31
32
34
-@ToolParserManager.register_module("llama4_pythonic")
33
class Llama4PythonicToolParser(ToolParser):
34
"""
35
Toolcall parser for Llama4 that produce tool calls in a pythonic style
vllm/entrypoints/openai/tool_parsers/llama_tool_parser.py
-3
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
21
)
22
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23
ToolParser,
24
- ToolParserManager,
24
)
25
from vllm.entrypoints.openai.tool_parsers.utils import (
26
find_common_prefix,
@@ -33,8 +32,6 @@ from vllm.logger import init_logger
32
logger = init_logger(__name__)
33
34
36
-@ToolParserManager.register_module("llama3_json")
37
-@ToolParserManager.register_module("llama4_json")
35
class Llama3JsonToolParser(ToolParser):
36
"""
37
Tool call parser for Llama 3.x and 4 models intended for use with the
vllm/entrypoints/openai/tool_parsers/longcat_tool_parser.py
-2
@@ -3,12 +3,10 @@
3
4
import regex as re
5
6
-from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import ToolParserManager
6
from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
7
from vllm.transformers_utils.tokenizer import AnyTokenizer
8
9
11
-@ToolParserManager.register_module("longcat")
10
class LongcatFlashToolParser(Hermes2ProToolParser):
11
def __init__(self, tokenizer: AnyTokenizer):
12
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/minimax_m2_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.logger import init_logger
24
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -27,7 +26,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
26
logger = init_logger(__name__)
27
28
30
-@ToolParserManager.register_module("minimax_m2")
29
class MinimaxM2ToolParser(ToolParser):
30
def __init__(self, tokenizer: AnyTokenizer):
31
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/minimax_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
24
from vllm.logger import init_logger
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module("minimax")
30
class MinimaxToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/mistral_tool_parser.py
-2
@@ -22,7 +22,6 @@ from vllm.entrypoints.openai.protocol import (
22
)
23
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
24
ToolParser,
25
- ToolParserManager,
25
)
26
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
27
from vllm.logger import init_logger
@@ -53,7 +52,6 @@ def _is_fn_name_regex_support(model_tokenizer: AnyTokenizer) -> bool:
52
)
53
54
56
-@ToolParserManager.register_module("mistral")
55
class MistralToolParser(ToolParser):
56
"""
57
Tool call parser for Mistral 7B Instruct v0.3, intended for use with
vllm/entrypoints/openai/tool_parsers/olmo3_tool_parser.py
-2
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
20
)
21
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22
ToolParser,
23
- ToolParserManager,
23
)
24
from vllm.logger import init_logger
25
@@ -31,7 +30,6 @@ class _UnexpectedAstError(Exception):
30
pass
31
32
34
-@ToolParserManager.register_module("olmo3")
33
class Olmo3PythonicToolParser(ToolParser):
34
"""
35
Tool call parser for Olmo 3 models that produce tool calls as
vllm/entrypoints/openai/tool_parsers/openai_tool_parser.py
-2
@@ -14,7 +14,6 @@ from vllm.entrypoints.openai.protocol import (
14
)
15
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
16
ToolParser,
17
- ToolParserManager,
17
)
18
from vllm.logger import init_logger
19
@@ -26,7 +25,6 @@ else:
25
logger = init_logger(__name__)
26
27
29
-@ToolParserManager.register_module("openai")
28
class OpenAIToolParser(ToolParser):
29
def __init__(self, tokenizer: "AnyTokenizer"):
30
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/phi4mini_tool_parser.py
-2
@@ -18,14 +18,12 @@ from vllm.entrypoints.openai.protocol import (
18
)
19
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
20
ToolParser,
21
- ToolParserManager,
21
)
22
from vllm.logger import init_logger
23
24
logger = init_logger(__name__)
25
26
28
-@ToolParserManager.register_module("phi4_mini_json")
27
class Phi4MiniJsonToolParser(ToolParser):
28
"""
29
Tool call parser for phi-4-mini models intended for use with the
vllm/entrypoints/openai/tool_parsers/pythonic_tool_parser.py
-2
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
21
)
22
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23
ToolParser,
24
- ToolParserManager,
24
)
25
from vllm.logger import init_logger
26
@@ -32,7 +31,6 @@ class _UnexpectedAstError(Exception):
31
pass
32
33
35
-@ToolParserManager.register_module("pythonic")
34
class PythonicToolParser(ToolParser):
35
"""
36
Tool call parser for models that produce tool calls in a pythonic style,
vllm/entrypoints/openai/tool_parsers/qwen3coder_tool_parser.py
-2
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
20
)
21
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22
ToolParser,
23
- ToolParserManager,
23
)
24
from vllm.logger import init_logger
25
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module("qwen3_coder")
30
class Qwen3CoderToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/qwen3xml_tool_parser.py
-2
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
21
)
22
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23
ToolParser,
24
- ToolParserManager,
24
)
25
from vllm.logger import init_logger
26
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -1165,7 +1164,6 @@ class StreamingXMLToolCallParser:
1164
self.deferred_param_raw_value = ""
1165
1166
1168
-@ToolParserManager.register_module("qwen3_xml")
1167
class Qwen3XMLToolParser(ToolParser):
1168
def __init__(self, tokenizer: AnyTokenizer):
1169
super().__init__(tokenizer)
vllm/entrypoints/openai/tool_parsers/seed_oss_tool_parser.py
-2
@@ -23,7 +23,6 @@ from vllm.entrypoints.openai.protocol import (
23
)
24
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
25
ToolParser,
26
- ToolParserManager,
26
)
27
from vllm.logger import init_logger
28
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -31,7 +30,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
30
logger = init_logger(__name__)
31
32
34
-@ToolParserManager.register_module("seed_oss")
33
class SeedOssToolParser(ToolParser):
34
TOOL_CALL_START = "<seed:tool_call>"
35
TOOL_CALL_END = "</seed:tool_call>"
vllm/entrypoints/openai/tool_parsers/step3_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.logger import init_logger
24
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -28,7 +27,6 @@ from vllm.utils import random_uuid
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module(["step3"])
30
class Step3ToolParser(ToolParser):
31
"""
32
Tool parser for a model that uses a specific XML-like format for tool calls.
vllm/entrypoints/openai/tool_parsers/xlam_tool_parser.py
-2
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
19
)
20
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21
ToolParser,
22
- ToolParserManager,
22
)
23
from vllm.logger import init_logger
24
from vllm.transformers_utils.tokenizer import AnyTokenizer
@@ -28,7 +27,6 @@ from vllm.utils import random_uuid
27
logger = init_logger(__name__)
28
29
31
-@ToolParserManager.register_module("xlam")
30
class xLAMToolParser(ToolParser):
31
def __init__(self, tokenizer: AnyTokenizer):
32
super().__init__(tokenizer)