@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / c02fccdbd2
Fork 0

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)