[Refactor] Lazy import tool_parser (#27974)
Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
This commit is contained in:
@@ -407,7 +407,6 @@ Here is a summary of a plugin file:
|
|||||||
# the name list in register_module can be used
|
# the name list in register_module can be used
|
||||||
# in --tool-call-parser. you can define as many
|
# in --tool-call-parser. you can define as many
|
||||||
# tool parsers as you want here.
|
# tool parsers as you want here.
|
||||||
@ToolParserManager.register_module(["example"])
|
|
||||||
class ExampleToolParser(ToolParser):
|
class ExampleToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
@@ -439,6 +438,12 @@ Here is a summary of a plugin file:
|
|||||||
return ExtractedToolCallInformation(tools_called=False,
|
return ExtractedToolCallInformation(tools_called=False,
|
||||||
tool_calls=[],
|
tool_calls=[],
|
||||||
content=text)
|
content=text)
|
||||||
|
# register the tool parser to ToolParserManager
|
||||||
|
ToolParserManager.register_lazy_module(
|
||||||
|
name="example",
|
||||||
|
module_path="vllm.entrypoints.openai.tool_parsers.example",
|
||||||
|
class_name="ExampleToolParser",
|
||||||
|
)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from vllm.entrypoints.openai.tool_parsers import DeepSeekV31ToolParser
|
from vllm.entrypoints.openai.tool_parsers.deepseekv31_tool_parser import (
|
||||||
|
DeepSeekV31ToolParser,
|
||||||
|
)
|
||||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||||
|
|
||||||
MODEL = "deepseek-ai/DeepSeek-V3.1"
|
MODEL = "deepseek-ai/DeepSeek-V3.1"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
FunctionCall,
|
FunctionCall,
|
||||||
ToolCall,
|
ToolCall,
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers import Ernie45ToolParser
|
from vllm.entrypoints.openai.tool_parsers.ernie45_tool_parser import Ernie45ToolParser
|
||||||
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import json
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
||||||
from vllm.entrypoints.openai.tool_parsers import Glm4MoeModelToolParser
|
from vllm.entrypoints.openai.tool_parsers.glm4_moe_tool_parser import (
|
||||||
|
Glm4MoeModelToolParser,
|
||||||
|
)
|
||||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||||
|
|
||||||
pytestmark = pytest.mark.cpu_test
|
pytestmark = pytest.mark.cpu_test
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import pytest
|
|||||||
from partial_json_parser.core.options import Allow
|
from partial_json_parser.core.options import Allow
|
||||||
|
|
||||||
from vllm.entrypoints.openai.protocol import DeltaMessage, FunctionCall, ToolCall
|
from vllm.entrypoints.openai.protocol import DeltaMessage, FunctionCall, ToolCall
|
||||||
from vllm.entrypoints.openai.tool_parsers import JambaToolParser
|
from vllm.entrypoints.openai.tool_parsers.jamba_tool_parser import JambaToolParser
|
||||||
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import json
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
||||||
from vllm.entrypoints.openai.tool_parsers import KimiK2ToolParser
|
from vllm.entrypoints.openai.tool_parsers.kimi_k2_tool_parser import KimiK2ToolParser
|
||||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||||
|
|
||||||
pytestmark = pytest.mark.cpu_test
|
pytestmark = pytest.mark.cpu_test
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
FunctionCall,
|
FunctionCall,
|
||||||
ToolCall,
|
ToolCall,
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers import MinimaxToolParser
|
from vllm.entrypoints.openai.tool_parsers.minimax_tool_parser import MinimaxToolParser
|
||||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||||
|
|
||||||
pytestmark = pytest.mark.cpu_test
|
pytestmark = pytest.mark.cpu_test
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from openai_harmony import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
|
||||||
from vllm.entrypoints.openai.tool_parsers import OpenAIToolParser
|
from vllm.entrypoints.openai.tool_parsers.openai_tool_parser import OpenAIToolParser
|
||||||
from vllm.transformers_utils.tokenizer import get_tokenizer
|
from vllm.transformers_utils.tokenizer import get_tokenizer
|
||||||
|
|
||||||
MODEL = "gpt2"
|
MODEL = "gpt2"
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
FunctionCall,
|
FunctionCall,
|
||||||
ToolCall,
|
ToolCall,
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers import SeedOssToolParser
|
from vllm.entrypoints.openai.tool_parsers.seed_oss_tool_parser import SeedOssToolParser
|
||||||
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
FunctionCall,
|
FunctionCall,
|
||||||
ToolCall,
|
ToolCall,
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers import xLAMToolParser
|
from vllm.entrypoints.openai.tool_parsers.xlam_tool_parser import xLAMToolParser
|
||||||
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
|
||||||
|
|
||||||
|
|||||||
@@ -1943,7 +1943,7 @@ def create_server_unix_socket(path: str) -> socket.socket:
|
|||||||
|
|
||||||
|
|
||||||
def validate_api_server_args(args):
|
def validate_api_server_args(args):
|
||||||
valid_tool_parses = ToolParserManager.tool_parsers.keys()
|
valid_tool_parses = ToolParserManager.list_registered()
|
||||||
if args.enable_auto_tool_choice and args.tool_call_parser not in valid_tool_parses:
|
if args.enable_auto_tool_choice and args.tool_call_parser not in valid_tool_parses:
|
||||||
raise KeyError(
|
raise KeyError(
|
||||||
f"invalid tool call parser: {args.tool_call_parser} "
|
f"invalid tool call parser: {args.tool_call_parser} "
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ class FrontendArgs:
|
|||||||
frontend_kwargs["middleware"]["default"] = []
|
frontend_kwargs["middleware"]["default"] = []
|
||||||
|
|
||||||
# Special case: Tool call parser shows built-in options.
|
# Special case: Tool call parser shows built-in options.
|
||||||
valid_tool_parsers = list(ToolParserManager.tool_parsers.keys())
|
valid_tool_parsers = list(ToolParserManager.list_registered())
|
||||||
parsers_str = ",".join(valid_tool_parsers)
|
parsers_str = ",".join(valid_tool_parsers)
|
||||||
frontend_kwargs["tool_call_parser"]["metavar"] = (
|
frontend_kwargs["tool_call_parser"]["metavar"] = (
|
||||||
f"{{{parsers_str}}} or name registered in --tool-parser-plugin"
|
f"{{{parsers_str}}} or name registered in --tool-parser-plugin"
|
||||||
|
|||||||
@@ -1,61 +1,142 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||||
|
|
||||||
from .abstract_tool_parser import ToolParser, ToolParserManager
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
from .deepseekv3_tool_parser import DeepSeekV3ToolParser
|
ToolParser,
|
||||||
from .deepseekv31_tool_parser import DeepSeekV31ToolParser
|
ToolParserManager,
|
||||||
from .ernie45_tool_parser import Ernie45ToolParser
|
)
|
||||||
from .glm4_moe_tool_parser import Glm4MoeModelToolParser
|
|
||||||
from .granite_20b_fc_tool_parser import Granite20bFCToolParser
|
|
||||||
from .granite_tool_parser import GraniteToolParser
|
|
||||||
from .hermes_tool_parser import Hermes2ProToolParser
|
|
||||||
from .hunyuan_a13b_tool_parser import HunyuanA13BToolParser
|
|
||||||
from .internlm2_tool_parser import Internlm2ToolParser
|
|
||||||
from .jamba_tool_parser import JambaToolParser
|
|
||||||
from .kimi_k2_tool_parser import KimiK2ToolParser
|
|
||||||
from .llama4_pythonic_tool_parser import Llama4PythonicToolParser
|
|
||||||
from .llama_tool_parser import Llama3JsonToolParser
|
|
||||||
from .longcat_tool_parser import LongcatFlashToolParser
|
|
||||||
from .minimax_m2_tool_parser import MinimaxM2ToolParser
|
|
||||||
from .minimax_tool_parser import MinimaxToolParser
|
|
||||||
from .mistral_tool_parser import MistralToolParser
|
|
||||||
from .olmo3_tool_parser import Olmo3PythonicToolParser
|
|
||||||
from .openai_tool_parser import OpenAIToolParser
|
|
||||||
from .phi4mini_tool_parser import Phi4MiniJsonToolParser
|
|
||||||
from .pythonic_tool_parser import PythonicToolParser
|
|
||||||
from .qwen3coder_tool_parser import Qwen3CoderToolParser
|
|
||||||
from .qwen3xml_tool_parser import Qwen3XMLToolParser
|
|
||||||
from .seed_oss_tool_parser import SeedOssToolParser
|
|
||||||
from .step3_tool_parser import Step3ToolParser
|
|
||||||
from .xlam_tool_parser import xLAMToolParser
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = ["ToolParser", "ToolParserManager"]
|
||||||
"ToolParser",
|
|
||||||
"ToolParserManager",
|
|
||||||
"Granite20bFCToolParser",
|
"""
|
||||||
"GraniteToolParser",
|
Register a lazy module mapping.
|
||||||
"Hermes2ProToolParser",
|
|
||||||
"MistralToolParser",
|
Example:
|
||||||
"Internlm2ToolParser",
|
ToolParserManager.register_lazy_module(
|
||||||
"Llama3JsonToolParser",
|
name="kimi_k2",
|
||||||
"JambaToolParser",
|
module_path="vllm.entrypoints.openai.tool_parsers.kimi_k2_parser",
|
||||||
"Llama4PythonicToolParser",
|
class_name="KimiK2ToolParser",
|
||||||
"LongcatFlashToolParser",
|
)
|
||||||
"PythonicToolParser",
|
"""
|
||||||
"Phi4MiniJsonToolParser",
|
|
||||||
"DeepSeekV3ToolParser",
|
|
||||||
"DeepSeekV31ToolParser",
|
_TOOL_PARSERS_TO_REGISTER = {
|
||||||
"Ernie45ToolParser",
|
"deepseek_v3": ( # name
|
||||||
"xLAMToolParser",
|
"deepseekv3_tool_parser", # filename
|
||||||
"Olmo3PythonicToolParser",
|
"DeepSeekV3ToolParser", # class_name
|
||||||
"MinimaxToolParser",
|
),
|
||||||
"KimiK2ToolParser",
|
"deepseek_v31": (
|
||||||
"HunyuanA13BToolParser",
|
"deepseekv31_tool_parser",
|
||||||
"Glm4MoeModelToolParser",
|
"DeepSeekV31ToolParser",
|
||||||
"Qwen3CoderToolParser",
|
),
|
||||||
"Qwen3XMLToolParser",
|
"ernie45": (
|
||||||
"SeedOssToolParser",
|
"ernie45_tool_parser",
|
||||||
"Step3ToolParser",
|
"Ernie45ToolParser",
|
||||||
"OpenAIToolParser",
|
),
|
||||||
"MinimaxM2ToolParser",
|
"glm45": (
|
||||||
]
|
"glm4_moe_tool_parser",
|
||||||
|
"Glm4MoeModelToolParser",
|
||||||
|
),
|
||||||
|
"granite-20b-fc": (
|
||||||
|
"granite_20b_fc_tool_parser",
|
||||||
|
"Granite20bFCToolParser",
|
||||||
|
),
|
||||||
|
"granite": (
|
||||||
|
"granite_tool_parser",
|
||||||
|
"GraniteToolParser",
|
||||||
|
),
|
||||||
|
"hermes": (
|
||||||
|
"hermes_tool_parser",
|
||||||
|
"Hermes2ProToolParser",
|
||||||
|
),
|
||||||
|
"hunyuan_a13b": (
|
||||||
|
"hunyuan_a13b_tool_parser",
|
||||||
|
"HunyuanA13BToolParser",
|
||||||
|
),
|
||||||
|
"internlm": (
|
||||||
|
"internlm2_tool_parser",
|
||||||
|
"Internlm2ToolParser",
|
||||||
|
),
|
||||||
|
"jamba": (
|
||||||
|
"jamba_tool_parser",
|
||||||
|
"JambaToolParser",
|
||||||
|
),
|
||||||
|
"kimi_k2": (
|
||||||
|
"kimi_k2_tool_parser",
|
||||||
|
"KimiK2ToolParser",
|
||||||
|
),
|
||||||
|
"llama3_json": (
|
||||||
|
"llama_tool_parser",
|
||||||
|
"Llama3JsonToolParser",
|
||||||
|
),
|
||||||
|
"llama4_json": (
|
||||||
|
"llama_tool_parser",
|
||||||
|
"Llama4JsonToolParser",
|
||||||
|
),
|
||||||
|
"llama4_pythonic": (
|
||||||
|
"llama4_pythonic_tool_parser",
|
||||||
|
"Llama4PythonicToolParser",
|
||||||
|
),
|
||||||
|
"longcat": (
|
||||||
|
"longcat_tool_parser",
|
||||||
|
"LongcatFlashToolParser",
|
||||||
|
),
|
||||||
|
"minimax_m2": (
|
||||||
|
"minimax_m2_tool_parser",
|
||||||
|
"MinimaxM2ToolParser",
|
||||||
|
),
|
||||||
|
"minimax": (
|
||||||
|
"minimax_tool_parser",
|
||||||
|
"MinimaxToolParser",
|
||||||
|
),
|
||||||
|
"mistral": (
|
||||||
|
"mistral_tool_parser",
|
||||||
|
"MistralToolParser",
|
||||||
|
),
|
||||||
|
"olmo3": (
|
||||||
|
"olmo3_tool_parser",
|
||||||
|
"Olmo3PythonicToolParser",
|
||||||
|
),
|
||||||
|
"openai": (
|
||||||
|
"openai_tool_parser",
|
||||||
|
"OpenAIToolParser",
|
||||||
|
),
|
||||||
|
"phi4_mini_json": (
|
||||||
|
"phi4mini_tool_parser",
|
||||||
|
"Phi4MiniJsonToolParser",
|
||||||
|
),
|
||||||
|
"pythonic": (
|
||||||
|
"pythonic_tool_parser",
|
||||||
|
"PythonicToolParser",
|
||||||
|
),
|
||||||
|
"qwen3_coder": (
|
||||||
|
"qwen3coder_tool_parser",
|
||||||
|
"Qwen3CoderToolParser",
|
||||||
|
),
|
||||||
|
"qwen3_xml": (
|
||||||
|
"qwen3xml_tool_parser",
|
||||||
|
"Qwen3XmlToolParser",
|
||||||
|
),
|
||||||
|
"seed_oss": (
|
||||||
|
"seed_oss_tool_parser",
|
||||||
|
"SeedOsSToolParser",
|
||||||
|
),
|
||||||
|
"step3": (
|
||||||
|
"step3_tool_parser",
|
||||||
|
"Step3ToolParser",
|
||||||
|
),
|
||||||
|
"xlam": (
|
||||||
|
"xlam_tool_parser",
|
||||||
|
"xLAMToolParser",
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def register_lazy_tool_parsers():
|
||||||
|
for name, (file_name, class_name) in _TOOL_PARSERS_TO_REGISTER.items():
|
||||||
|
module_path = f"vllm.entrypoints.openai.tool_parsers.{file_name}"
|
||||||
|
ToolParserManager.register_lazy_module(name, module_path, class_name)
|
||||||
|
|
||||||
|
|
||||||
|
register_lazy_tool_parsers()
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||||
|
|
||||||
|
import importlib
|
||||||
import os
|
import os
|
||||||
from collections.abc import Callable, Sequence
|
from collections.abc import Callable, Sequence
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
@@ -99,89 +100,158 @@ class ToolParser:
|
|||||||
|
|
||||||
|
|
||||||
class ToolParserManager:
|
class ToolParserManager:
|
||||||
tool_parsers: dict[str, type] = {}
|
"""
|
||||||
|
Central registry for ToolParser implementations.
|
||||||
|
|
||||||
|
Supports two modes:
|
||||||
|
- Eager (immediate) registration via `register_module`
|
||||||
|
- Lazy registration via `register_lazy_module`
|
||||||
|
"""
|
||||||
|
|
||||||
|
tool_parsers: dict[str, type[ToolParser]] = {}
|
||||||
|
lazy_parsers: dict[str, tuple[str, str]] = {} # name -> (module_path, class_name)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_tool_parser(cls, name) -> type:
|
def get_tool_parser(cls, name: str) -> type[ToolParser]:
|
||||||
"""
|
"""
|
||||||
Get tool parser by name which is registered by `register_module`.
|
Retrieve a registered or lazily registered ToolParser class.
|
||||||
|
|
||||||
Raise a KeyError exception if the name is not registered.
|
If the parser is lazily registered,
|
||||||
|
it will be imported and cached on first access.
|
||||||
|
Raises KeyError if not found.
|
||||||
"""
|
"""
|
||||||
if name in cls.tool_parsers:
|
if name in cls.tool_parsers:
|
||||||
return cls.tool_parsers[name]
|
return cls.tool_parsers[name]
|
||||||
|
|
||||||
raise KeyError(f"tool helper: '{name}' not found in tool_parsers")
|
if name in cls.lazy_parsers:
|
||||||
|
return cls._load_lazy_parser(name)
|
||||||
|
|
||||||
|
raise KeyError(f"Tool parser '{name}' not found.")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _load_lazy_parser(cls, name: str) -> type[ToolParser]:
|
||||||
|
"""Import and register a lazily loaded parser."""
|
||||||
|
module_path, class_name = cls.lazy_parsers[name]
|
||||||
|
try:
|
||||||
|
mod = importlib.import_module(module_path)
|
||||||
|
parser_cls = getattr(mod, class_name)
|
||||||
|
if not issubclass(parser_cls, ToolParser):
|
||||||
|
raise TypeError(
|
||||||
|
f"{class_name} in {module_path} is not a ToolParser subclass."
|
||||||
|
)
|
||||||
|
cls.tool_parsers[name] = parser_cls # cache
|
||||||
|
return parser_cls
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(
|
||||||
|
"Failed to import lazy tool parser '%s' from %s: %s",
|
||||||
|
name,
|
||||||
|
module_path,
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _register_module(
|
def _register_module(
|
||||||
cls,
|
cls,
|
||||||
module: type,
|
module: type[ToolParser],
|
||||||
module_name: str | list[str] | None = None,
|
module_name: str | list[str] | None = None,
|
||||||
force: bool = True,
|
force: bool = True,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
"""Register a ToolParser class immediately."""
|
||||||
if not issubclass(module, ToolParser):
|
if not issubclass(module, ToolParser):
|
||||||
raise TypeError(
|
raise TypeError(
|
||||||
f"module must be subclass of ToolParser, but got {type(module)}"
|
f"module must be subclass of ToolParser, but got {type(module)}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if module_name is None:
|
if module_name is None:
|
||||||
module_name = module.__name__
|
module_name = module.__name__
|
||||||
|
|
||||||
if isinstance(module_name, str):
|
if isinstance(module_name, str):
|
||||||
module_name = [module_name]
|
module_names = [module_name]
|
||||||
for name in module_name:
|
elif is_list_of(module_name, str):
|
||||||
|
module_names = module_name
|
||||||
|
else:
|
||||||
|
raise TypeError("module_name must be str, list[str], or None.")
|
||||||
|
|
||||||
|
for name in module_names:
|
||||||
if not force and name in cls.tool_parsers:
|
if not force and name in cls.tool_parsers:
|
||||||
existed_module = cls.tool_parsers[name]
|
existed = cls.tool_parsers[name]
|
||||||
raise KeyError(
|
raise KeyError(f"{name} is already registered at {existed.__module__}")
|
||||||
f"{name} is already registered at {existed_module.__module__}"
|
|
||||||
)
|
|
||||||
cls.tool_parsers[name] = module
|
cls.tool_parsers[name] = module
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def register_lazy_module(cls, name: str, module_path: str, class_name: str) -> None:
|
||||||
|
"""
|
||||||
|
Register a lazy module mapping.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
ToolParserManager.register_lazy_module(
|
||||||
|
name="kimi_k2",
|
||||||
|
module_path="vllm.entrypoints.openai.tool_parsers.kimi_k2_parser",
|
||||||
|
class_name="KimiK2ToolParser",
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
cls.lazy_parsers[name] = (module_path, class_name)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register_module(
|
def register_module(
|
||||||
cls,
|
cls,
|
||||||
name: str | list[str] | None = None,
|
name: str | list[str] | None = None,
|
||||||
force: bool = True,
|
force: bool = True,
|
||||||
module: type | None = None,
|
module: type[ToolParser] | None = None,
|
||||||
) -> type | Callable:
|
) -> type[ToolParser] | Callable[[type[ToolParser]], type[ToolParser]]:
|
||||||
"""
|
"""
|
||||||
Register module with the given name or name list. it can be used as a
|
Register module immediately or lazily (as a decorator).
|
||||||
decoder(with module as None) or normal function(with module as not
|
|
||||||
None).
|
Usage:
|
||||||
|
@ToolParserManager.register_module("kimi_k2")
|
||||||
|
class KimiK2ToolParser(ToolParser):
|
||||||
|
...
|
||||||
|
|
||||||
|
Or:
|
||||||
|
ToolParserManager.register_module(module=SomeToolParser)
|
||||||
"""
|
"""
|
||||||
if not isinstance(force, bool):
|
if not isinstance(force, bool):
|
||||||
raise TypeError(f"force must be a boolean, but got {type(force)}")
|
raise TypeError(f"force must be a boolean, but got {type(force)}")
|
||||||
|
|
||||||
# raise the error ahead of time
|
# Immediate registration
|
||||||
if not (name is None or isinstance(name, str) or is_list_of(name, str)):
|
|
||||||
raise TypeError(
|
|
||||||
"name must be None, an instance of str, or a sequence of str, "
|
|
||||||
f"but got {type(name)}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# use it as a normal method: x.register_module(module=SomeClass)
|
|
||||||
if module is not None:
|
if module is not None:
|
||||||
cls._register_module(module=module, module_name=name, force=force)
|
cls._register_module(module=module, module_name=name, force=force)
|
||||||
return module
|
return module
|
||||||
|
|
||||||
# use it as a decorator: @x.register_module()
|
# Decorator usage
|
||||||
def _register(module):
|
def _decorator(obj: type[ToolParser]) -> type[ToolParser]:
|
||||||
cls._register_module(module=module, module_name=name, force=force)
|
module_path = obj.__module__
|
||||||
return module
|
class_name = obj.__name__
|
||||||
|
|
||||||
return _register
|
if isinstance(name, str):
|
||||||
|
names = [name]
|
||||||
|
elif is_list_of(name, str):
|
||||||
|
names = name
|
||||||
|
else:
|
||||||
|
names = [class_name]
|
||||||
|
|
||||||
|
for n in names:
|
||||||
|
# Lazy mapping only: do not import now
|
||||||
|
cls.lazy_parsers[n] = (module_path, class_name)
|
||||||
|
|
||||||
|
return obj
|
||||||
|
|
||||||
|
return _decorator
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def list_registered(cls) -> list[str]:
|
||||||
|
"""Return names of all eagerly and lazily registered tool parsers."""
|
||||||
|
return sorted(set(cls.tool_parsers.keys()) | set(cls.lazy_parsers.keys()))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def import_tool_parser(cls, plugin_path: str) -> None:
|
def import_tool_parser(cls, plugin_path: str) -> None:
|
||||||
"""
|
"""Import a user-defined parser file from arbitrary path."""
|
||||||
Import a user-defined tool parser by the path of the tool parser define
|
|
||||||
file.
|
|
||||||
"""
|
|
||||||
module_name = os.path.splitext(os.path.basename(plugin_path))[0]
|
|
||||||
|
|
||||||
|
module_name = os.path.splitext(os.path.basename(plugin_path))[0]
|
||||||
try:
|
try:
|
||||||
import_from_path(module_name, plugin_path)
|
import_from_path(module_name, plugin_path)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception(
|
logger.exception(
|
||||||
"Failed to load module '%s' from %s.", module_name, plugin_path
|
"Failed to load module '%s' from %s.", module_name, plugin_path
|
||||||
)
|
)
|
||||||
return
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("deepseek_v31")
|
|
||||||
class DeepSeekV31ToolParser(ToolParser):
|
class DeepSeekV31ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("deepseek_v3")
|
|
||||||
class DeepSeekV3ToolParser(ToolParser):
|
class DeepSeekV3ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("ernie45")
|
|
||||||
class Ernie45ToolParser(ToolParser):
|
class Ernie45ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("glm45")
|
|
||||||
class Glm4MoeModelToolParser(ToolParser):
|
class Glm4MoeModelToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import (
|
from vllm.entrypoints.openai.tool_parsers.utils import (
|
||||||
consume_space,
|
consume_space,
|
||||||
@@ -35,7 +34,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("granite-20b-fc")
|
|
||||||
class Granite20bFCToolParser(ToolParser):
|
class Granite20bFCToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for the granite-20b-functioncalling model intended
|
Tool call parser for the granite-20b-functioncalling model intended
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import (
|
from vllm.entrypoints.openai.tool_parsers.utils import (
|
||||||
consume_space,
|
consume_space,
|
||||||
@@ -33,7 +32,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("granite")
|
|
||||||
class GraniteToolParser(ToolParser):
|
class GraniteToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for the granite 3.0 models. Intended
|
Tool call parser for the granite 3.0 models. Intended
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
|
||||||
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("hermes")
|
|
||||||
class Hermes2ProToolParser(ToolParser):
|
class Hermes2ProToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import consume_space
|
from vllm.entrypoints.openai.tool_parsers.utils import consume_space
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
@@ -29,7 +28,6 @@ from vllm.utils import random_uuid
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("hunyuan_a13b")
|
|
||||||
class HunyuanA13BToolParser(ToolParser):
|
class HunyuanA13BToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module(["internlm"])
|
|
||||||
class Internlm2ToolParser(ToolParser):
|
class Internlm2ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
FunctionCall,
|
FunctionCall,
|
||||||
ToolCall,
|
ToolCall,
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
|
from vllm.entrypoints.openai.tool_parsers import ToolParser
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -27,7 +27,6 @@ from vllm.transformers_utils.tokenizers import MistralTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("jamba")
|
|
||||||
class JambaToolParser(ToolParser):
|
class JambaToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -25,7 +24,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module(["kimi_k2"])
|
|
||||||
class KimiK2ToolParser(ToolParser):
|
class KimiK2ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
|
|
||||||
@@ -31,7 +30,6 @@ class _UnexpectedAstError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("llama4_pythonic")
|
|
||||||
class Llama4PythonicToolParser(ToolParser):
|
class Llama4PythonicToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Toolcall parser for Llama4 that produce tool calls in a pythonic style
|
Toolcall parser for Llama4 that produce tool calls in a pythonic style
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import (
|
from vllm.entrypoints.openai.tool_parsers.utils import (
|
||||||
find_common_prefix,
|
find_common_prefix,
|
||||||
@@ -33,8 +32,6 @@ from vllm.logger import init_logger
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("llama3_json")
|
|
||||||
@ToolParserManager.register_module("llama4_json")
|
|
||||||
class Llama3JsonToolParser(ToolParser):
|
class Llama3JsonToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for Llama 3.x and 4 models intended for use with the
|
Tool call parser for Llama 3.x and 4 models intended for use with the
|
||||||
|
|||||||
@@ -3,12 +3,10 @@
|
|||||||
|
|
||||||
import regex as re
|
import regex as re
|
||||||
|
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import ToolParserManager
|
|
||||||
from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
|
from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("longcat")
|
|
||||||
class LongcatFlashToolParser(Hermes2ProToolParser):
|
class LongcatFlashToolParser(Hermes2ProToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -27,7 +26,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("minimax_m2")
|
|
||||||
class MinimaxM2ToolParser(ToolParser):
|
class MinimaxM2ToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("minimax")
|
|
||||||
class MinimaxToolParser(ToolParser):
|
class MinimaxToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
@@ -53,7 +52,6 @@ def _is_fn_name_regex_support(model_tokenizer: AnyTokenizer) -> bool:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("mistral")
|
|
||||||
class MistralToolParser(ToolParser):
|
class MistralToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for Mistral 7B Instruct v0.3, intended for use with
|
Tool call parser for Mistral 7B Instruct v0.3, intended for use with
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
|
|
||||||
@@ -31,7 +30,6 @@ class _UnexpectedAstError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("olmo3")
|
|
||||||
class Olmo3PythonicToolParser(ToolParser):
|
class Olmo3PythonicToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for Olmo 3 models that produce tool calls as
|
Tool call parser for Olmo 3 models that produce tool calls as
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
|
|
||||||
@@ -26,7 +25,6 @@ else:
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("openai")
|
|
||||||
class OpenAIToolParser(ToolParser):
|
class OpenAIToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: "AnyTokenizer"):
|
def __init__(self, tokenizer: "AnyTokenizer"):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -18,14 +18,12 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
|
|
||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("phi4_mini_json")
|
|
||||||
class Phi4MiniJsonToolParser(ToolParser):
|
class Phi4MiniJsonToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for phi-4-mini models intended for use with the
|
Tool call parser for phi-4-mini models intended for use with the
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
|
|
||||||
@@ -32,7 +31,6 @@ class _UnexpectedAstError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("pythonic")
|
|
||||||
class PythonicToolParser(ToolParser):
|
class PythonicToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool call parser for models that produce tool calls in a pythonic style,
|
Tool call parser for models that produce tool calls in a pythonic style,
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -28,7 +27,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("qwen3_coder")
|
|
||||||
class Qwen3CoderToolParser(ToolParser):
|
class Qwen3CoderToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -1165,7 +1164,6 @@ class StreamingXMLToolCallParser:
|
|||||||
self.deferred_param_raw_value = ""
|
self.deferred_param_raw_value = ""
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("qwen3_xml")
|
|
||||||
class Qwen3XMLToolParser(ToolParser):
|
class Qwen3XMLToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -31,7 +30,6 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("seed_oss")
|
|
||||||
class SeedOssToolParser(ToolParser):
|
class SeedOssToolParser(ToolParser):
|
||||||
TOOL_CALL_START = "<seed:tool_call>"
|
TOOL_CALL_START = "<seed:tool_call>"
|
||||||
TOOL_CALL_END = "</seed:tool_call>"
|
TOOL_CALL_END = "</seed:tool_call>"
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -28,7 +27,6 @@ from vllm.utils import random_uuid
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module(["step3"])
|
|
||||||
class Step3ToolParser(ToolParser):
|
class Step3ToolParser(ToolParser):
|
||||||
"""
|
"""
|
||||||
Tool parser for a model that uses a specific XML-like format for tool calls.
|
Tool parser for a model that uses a specific XML-like format for tool calls.
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ from vllm.entrypoints.openai.protocol import (
|
|||||||
)
|
)
|
||||||
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
|
||||||
ToolParser,
|
ToolParser,
|
||||||
ToolParserManager,
|
|
||||||
)
|
)
|
||||||
from vllm.logger import init_logger
|
from vllm.logger import init_logger
|
||||||
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
from vllm.transformers_utils.tokenizer import AnyTokenizer
|
||||||
@@ -28,7 +27,6 @@ from vllm.utils import random_uuid
|
|||||||
logger = init_logger(__name__)
|
logger = init_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ToolParserManager.register_module("xlam")
|
|
||||||
class xLAMToolParser(ToolParser):
|
class xLAMToolParser(ToolParser):
|
||||||
def __init__(self, tokenizer: AnyTokenizer):
|
def __init__(self, tokenizer: AnyTokenizer):
|
||||||
super().__init__(tokenizer)
|
super().__init__(tokenizer)
|
||||||
|
|||||||
Reference in New Issue
Block a user