@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 2a1776b7ac
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 11, 11:15 UTC

[Refactor] [2/N] Move tool parsers into the vLLM main directory (#30675)

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>

Chauncey committed Dec 15, 2025 at 20:54 UTC 2a1776b7ac4fae7c50c694edeafc1b14270e4350
61 files changed +288 -257
docs/features/tool_calling.md
+2 -2
@@ -420,7 +420,7 @@ Flags: `--tool-call-parser pythonic --chat-template {see_above}`
420
421 ## How to Write a Tool Parser Plugin
422
423 -A tool parser plugin is a Python file containing one or more ToolParser implementations. You can write a ToolParser similar to the `Hermes2ProToolParser` in [vllm/entrypoints/openai/tool_parsers/hermes_tool_parser.py](../../vllm/entrypoints/openai/tool_parsers/hermes_tool_parser.py).
423 +A tool parser plugin is a Python file containing one or more ToolParser implementations. You can write a ToolParser similar to the `Hermes2ProToolParser` in [vllm/tool_parsers/hermes_tool_parser.py](../../vllm/tool_parsers/hermes_tool_parser.py).
424
425 Here is a summary of a plugin file:
426
@@ -468,7 +468,7 @@ Here is a summary of a plugin file:
468 # register the tool parser to ToolParserManager
469 ToolParserManager.register_lazy_module(
470 name="example",
471 - module_path="vllm.entrypoints.openai.tool_parsers.example",
471 + module_path="vllm.tool_parsers.example",
472 class_name="ExampleToolParser",
473 )
474
tests/entrypoints/openai/test_serving_chat.py
+1 -1
@@ -19,9 +19,9 @@ from vllm.entrypoints.openai.protocol import (
19 )
20 from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
21 from vllm.entrypoints.openai.serving_models import BaseModelPath, OpenAIServingModels
22 -from vllm.entrypoints.openai.tool_parsers import ToolParserManager
22 from vllm.outputs import CompletionOutput, RequestOutput
23 from vllm.tokenizers import get_tokenizer
24 +from vllm.tool_parsers import ToolParserManager
25 from vllm.v1.engine.async_llm import AsyncLLM
26
27 from ...utils import RemoteOpenAIServer
tests/entrypoints/openai/tool_parsers/test_gigachat3_tool_parser.py
+1 -1
@@ -10,8 +10,8 @@ from tests.entrypoints.openai.tool_parsers.utils import (
10 run_tool_extraction_streaming,
11 )
12 from vllm.entrypoints.openai.protocol import FunctionCall
13 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
13 from vllm.tokenizers import TokenizerLike
14 +from vllm.tool_parsers import ToolParser, ToolParserManager
15
16 SIMPLE_ARGS_DICT = {
17 "action": "create",
tests/entrypoints/openai/tool_parsers/test_hermes_tool_parser.py
+1 -1
@@ -6,8 +6,8 @@ import json
6 import pytest
7
8 from vllm.entrypoints.openai.protocol import ChatCompletionRequest
9 -from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
9 from vllm.tokenizers import TokenizerLike
10 +from vllm.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
11
12 from ....utils import RemoteOpenAIServer
13
tests/entrypoints/openai/tool_parsers/test_hunyuan_a13b_tool_parser.py
+1 -1
@@ -12,7 +12,7 @@ from tests.entrypoints.openai.tool_parsers.utils import (
12 run_tool_extraction_streaming,
13 )
14 from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
15 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
15 +from vllm.tool_parsers import ToolParser, ToolParserManager
16
17
18 def make_tool_call(name, arguments):
tests/entrypoints/openai/tool_parsers/test_llama3_json_tool_parser.py
+1 -1
@@ -6,8 +6,8 @@ from unittest.mock import MagicMock, patch
6 import pytest
7
8 from vllm.entrypoints.openai.protocol import ExtractedToolCallInformation
9 -from vllm.entrypoints.openai.tool_parsers.llama_tool_parser import Llama3JsonToolParser
9 from vllm.tokenizers import TokenizerLike
10 +from vllm.tool_parsers.llama_tool_parser import Llama3JsonToolParser
11
12
13 @pytest.fixture
tests/entrypoints/openai/tool_parsers/test_llama4_pythonic_tool_parser.py
+1 -1
@@ -10,8 +10,8 @@ from tests.entrypoints.openai.tool_parsers.utils import (
10 run_tool_extraction_streaming,
11 )
12 from vllm.entrypoints.openai.protocol import FunctionCall
13 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
13 from vllm.tokenizers import TokenizerLike
14 +from vllm.tool_parsers import ToolParser, ToolParserManager
15
16 # Test cases similar to pythonic parser but with Llama4 specific format
17 SIMPLE_FUNCTION_OUTPUT = "[get_weather(city='LA', metric='C')]"
tests/entrypoints/openai/tool_parsers/test_olmo3_tool_parser.py
+1 -1
@@ -10,8 +10,8 @@ from tests.entrypoints.openai.tool_parsers.utils import (
10 run_tool_extraction_streaming,
11 )
12 from vllm.entrypoints.openai.protocol import FunctionCall
13 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
13 from vllm.tokenizers import TokenizerLike
14 +from vllm.tool_parsers import ToolParser, ToolParserManager
15
16 # https://github.com/meta-llama/llama-models/blob/main/models/llama3_2/text_prompt_format.md#model-response-format-1
17 SIMPLE_FUNCTION_OUTPUT = "get_weather(city='San Francisco', metric='celsius')"
tests/entrypoints/openai/tool_parsers/test_pythonic_tool_parser.py
+1 -1
@@ -10,8 +10,8 @@ from tests.entrypoints.openai.tool_parsers.utils import (
10 run_tool_extraction_streaming,
11 )
12 from vllm.entrypoints.openai.protocol import FunctionCall
13 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
13 from vllm.tokenizers import TokenizerLike
14 +from vllm.tool_parsers import ToolParser, ToolParserManager
15
16 # https://github.com/meta-llama/llama-models/blob/main/models/llama3_2/text_prompt_format.md#model-response-format-1
17 SIMPLE_FUNCTION_OUTPUT = "get_weather(city='San Francisco', metric='celsius')"
tests/entrypoints/openai/tool_parsers/utils.py
+1 -1
@@ -10,8 +10,8 @@ from vllm.entrypoints.openai.protocol import (
10 FunctionCall,
11 ToolCall,
12 )
13 -from vllm.entrypoints.openai.tool_parsers import ToolParser
13 from vllm.tokenizers import TokenizerLike
14 +from vllm.tool_parsers import ToolParser
15
16
17 class StreamingToolReconstructor:
tests/models/language/generation/test_mistral.py
+3 -3
@@ -5,12 +5,12 @@ import json
5
6 import pytest
7
8 -from vllm.entrypoints.openai.tool_parsers.mistral_tool_parser import (
8 +from vllm.sampling_params import SamplingParams
9 +from vllm.tokenizers.mistral import MistralTokenizer
10 +from vllm.tool_parsers.mistral_tool_parser import (
11 MistralToolCall,
12 MistralToolParser,
13 )
12 -from vllm.sampling_params import SamplingParams
13 -from vllm.tokenizers.mistral import MistralTokenizer
14
15 from ...utils import check_logprobs_close
16
tests/tool_use/test_deepseekv31_tool_parser.py
+2 -2
@@ -3,10 +3,10 @@
3
4 import pytest
5
6 -from vllm.entrypoints.openai.tool_parsers.deepseekv31_tool_parser import (
6 +from vllm.tokenizers import get_tokenizer
7 +from vllm.tool_parsers.deepseekv31_tool_parser import (
8 DeepSeekV31ToolParser,
9 )
9 -from vllm.tokenizers import get_tokenizer
10
11 MODEL = "deepseek-ai/DeepSeek-V3.1"
12
tests/tool_use/test_ernie45_moe_tool_parser.py
+1 -1
@@ -13,9 +13,9 @@ from vllm.entrypoints.openai.protocol import (
13 FunctionCall,
14 ToolCall,
15 )
16 -from vllm.entrypoints.openai.tool_parsers.ernie45_tool_parser import Ernie45ToolParser
16 from vllm.tokenizers import TokenizerLike, get_tokenizer
17 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
18 +from vllm.tool_parsers.ernie45_tool_parser import Ernie45ToolParser
19
20 # Use a common model that is likely to be available
21 MODEL = "baidu/ERNIE-4.5-21B-A3B-Thinking"
tests/tool_use/test_glm4_moe_tool_parser.py
+2 -2
@@ -7,10 +7,10 @@ import json
7 import pytest
8
9 from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10 -from vllm.entrypoints.openai.tool_parsers.glm4_moe_tool_parser import (
10 +from vllm.tokenizers import get_tokenizer
11 +from vllm.tool_parsers.glm4_moe_tool_parser import (
12 Glm4MoeModelToolParser,
13 )
13 -from vllm.tokenizers import get_tokenizer
14
15 pytestmark = pytest.mark.cpu_test
16
tests/tool_use/test_jamba_tool_parser.py
+1 -1
@@ -9,9 +9,9 @@ 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.jamba_tool_parser import JambaToolParser
12 from vllm.tokenizers import TokenizerLike, get_tokenizer
13 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
14 +from vllm.tool_parsers.jamba_tool_parser import JambaToolParser
15
16 pytestmark = pytest.mark.cpu_test
17
tests/tool_use/test_kimi_k2_tool_parser.py
+1 -1
@@ -7,8 +7,8 @@ import json
7 import pytest
8
9 from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10 -from vllm.entrypoints.openai.tool_parsers.kimi_k2_tool_parser import KimiK2ToolParser
10 from vllm.tokenizers import get_tokenizer
11 +from vllm.tool_parsers.kimi_k2_tool_parser import KimiK2ToolParser
12
13 pytestmark = pytest.mark.cpu_test
14
tests/tool_use/test_minimax_tool_parser.py
+1 -1
@@ -12,8 +12,8 @@ from vllm.entrypoints.openai.protocol import (
12 FunctionCall,
13 ToolCall,
14 )
15 -from vllm.entrypoints.openai.tool_parsers.minimax_tool_parser import MinimaxToolParser
15 from vllm.tokenizers import get_tokenizer
16 +from vllm.tool_parsers.minimax_tool_parser import MinimaxToolParser
17
18 pytestmark = pytest.mark.cpu_test
19
tests/tool_use/test_mistral_tool_parser.py
+1 -1
@@ -12,10 +12,10 @@ from mistral_common.protocol.instruct.tool_calls import FunctionCall, ToolCall
12 from partial_json_parser.core.options import Allow
13
14 from vllm.entrypoints.openai.protocol import DeltaMessage, DeltaToolCall
15 -from vllm.entrypoints.openai.tool_parsers.mistral_tool_parser import MistralToolParser
15 from vllm.tokenizers import TokenizerLike, get_tokenizer
16 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
17 from vllm.tokenizers.mistral import MistralTokenizer
18 +from vllm.tool_parsers.mistral_tool_parser import MistralToolParser
19
20
21 @pytest.fixture(scope="module")
tests/tool_use/test_openai_tool_parser.py
+1 -1
@@ -15,8 +15,8 @@ from openai_harmony import (
15 )
16
17 from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
18 -from vllm.entrypoints.openai.tool_parsers.openai_tool_parser import OpenAIToolParser
18 from vllm.tokenizers import get_tokenizer
19 +from vllm.tool_parsers.openai_tool_parser import OpenAIToolParser
20
21 MODEL = "gpt2"
22
tests/tool_use/test_qwen3coder_tool_parser.py
+4 -4
@@ -13,12 +13,12 @@ from vllm.entrypoints.openai.protocol import (
13 FunctionCall,
14 ToolCall,
15 )
16 -from vllm.entrypoints.openai.tool_parsers.qwen3coder_tool_parser import (
17 - Qwen3CoderToolParser,
18 -)
19 -from vllm.entrypoints.openai.tool_parsers.qwen3xml_tool_parser import Qwen3XMLToolParser
16 from vllm.tokenizers import TokenizerLike, get_tokenizer
17 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
18 +from vllm.tool_parsers.qwen3coder_tool_parser import (
19 + Qwen3CoderToolParser,
20 +)
21 +from vllm.tool_parsers.qwen3xml_tool_parser import Qwen3XMLToolParser
22
23 pytestmark = pytest.mark.cpu_test
24
tests/tool_use/test_seed_oss_tool_parser.py
+1 -1
@@ -14,9 +14,9 @@ from vllm.entrypoints.openai.protocol import (
14 FunctionCall,
15 ToolCall,
16 )
17 -from vllm.entrypoints.openai.tool_parsers.seed_oss_tool_parser import SeedOssToolParser
17 from vllm.tokenizers import TokenizerLike, get_tokenizer
18 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
19 +from vllm.tool_parsers.seed_oss_tool_parser import SeedOssToolParser
20
21 pytestmark = pytest.mark.cpu_test
22
tests/tool_use/test_tool_choice_required.py
+1 -1
@@ -12,7 +12,7 @@ from vllm.entrypoints.openai.protocol import (
12 ChatCompletionToolsParam,
13 )
14 from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
15 -from vllm.entrypoints.openai.tool_parsers.utils import get_json_schema_from_tools
15 +from vllm.tool_parsers.utils import get_json_schema_from_tools
16
17 pytestmark = pytest.mark.cpu_test
18
tests/tool_use/test_xlam_tool_parser.py
+1 -1
@@ -12,9 +12,9 @@ from vllm.entrypoints.openai.protocol import (
12 FunctionCall,
13 ToolCall,
14 )
15 -from vllm.entrypoints.openai.tool_parsers.xlam_tool_parser import xLAMToolParser
15 from vllm.tokenizers import TokenizerLike, get_tokenizer
16 from vllm.tokenizers.detokenizer_utils import detokenize_incrementally
17 +from vllm.tool_parsers.xlam_tool_parser import xLAMToolParser
18
19 pytestmark = pytest.mark.cpu_test
20
vllm/entrypoints/context.py
+1 -1
@@ -34,13 +34,13 @@ from vllm.entrypoints.openai.protocol import (
34 ResponseRawMessageAndToken,
35 ResponsesRequest,
36 )
37 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import ToolParser
37 from vllm.entrypoints.responses_utils import construct_tool_dicts
38 from vllm.entrypoints.tool import Tool
39 from vllm.entrypoints.tool_server import ToolServer
40 from vllm.outputs import RequestOutput
41 from vllm.reasoning.abs_reasoning_parsers import ReasoningParser
42 from vllm.tokenizers.protocol import TokenizerLike
43 +from vllm.tool_parsers.abstract_tool_parser import ToolParser
44 from vllm.transformers_utils.tokenizer import AnyTokenizer
45 from vllm.utils import random_uuid
46
vllm/entrypoints/openai/api_server.py
+1 -1
@@ -72,7 +72,6 @@ from vllm.entrypoints.openai.serving_transcription import (
72 OpenAIServingTranscription,
73 OpenAIServingTranslation,
74 )
75 -from vllm.entrypoints.openai.tool_parsers import ToolParserManager
75 from vllm.entrypoints.openai.utils import validate_json_request
76 from vllm.entrypoints.pooling.classify.serving import ServingClassification
77 from vllm.entrypoints.pooling.embed.serving import OpenAIServingEmbedding
@@ -95,6 +94,7 @@ from vllm.entrypoints.utils import (
94 from vllm.logger import init_logger
95 from vllm.reasoning import ReasoningParserManager
96 from vllm.tasks import POOLING_TASKS
97 +from vllm.tool_parsers import ToolParserManager
98 from vllm.usage.usage_lib import UsageContext
99 from vllm.utils.argparse_utils import FlexibleArgumentParser
100 from vllm.utils.gc_utils import freeze_gc_heap
vllm/entrypoints/openai/cli_args.py
+1 -1
@@ -27,8 +27,8 @@ from vllm.entrypoints.constants import (
27 H11_MAX_INCOMPLETE_EVENT_SIZE_DEFAULT,
28 )
29 from vllm.entrypoints.openai.serving_models import LoRAModulePath
30 -from vllm.entrypoints.openai.tool_parsers import ToolParserManager
30 from vllm.logger import init_logger
31 +from vllm.tool_parsers import ToolParserManager
32 from vllm.utils.argparse_utils import FlexibleArgumentParser
33
34 logger = init_logger(__name__)
vllm/entrypoints/openai/parser/responses_parser.py
+1 -1
@@ -12,10 +12,10 @@ from openai.types.responses.response_reasoning_item import (
12 )
13
14 from vllm.entrypoints.openai.protocol import ResponseInputOutputItem, ResponsesRequest
15 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import ToolParser
15 from vllm.outputs import CompletionOutput
16 from vllm.reasoning.abs_reasoning_parsers import ReasoningParser
17 from vllm.tokenizers.protocol import TokenizerLike
18 +from vllm.tool_parsers.abstract_tool_parser import ToolParser
19 from vllm.transformers_utils.tokenizer import AnyTokenizer
20 from vllm.utils import random_uuid
21
vllm/entrypoints/openai/serving_chat.py
+2 -2
@@ -57,8 +57,6 @@ from vllm.entrypoints.openai.serving_engine import (
57 clamp_prompt_logprobs,
58 )
59 from vllm.entrypoints.openai.serving_models import OpenAIServingModels
60 -from vllm.entrypoints.openai.tool_parsers import ToolParser
61 -from vllm.entrypoints.openai.tool_parsers.mistral_tool_parser import MistralToolCall
60 from vllm.entrypoints.openai.utils import maybe_filter_parallel_tool_calls
61 from vllm.entrypoints.utils import get_max_tokens, should_include_usage
62 from vllm.inputs.data import TokensPrompt
@@ -73,6 +71,8 @@ from vllm.tokenizers.mistral import (
71 truncate_tool_call_ids,
72 validate_request_params,
73 )
74 +from vllm.tool_parsers import ToolParser
75 +from vllm.tool_parsers.mistral_tool_parser import MistralToolCall
76 from vllm.utils.collection_utils import as_list
77 from vllm.v1.sample.logits_processor import validate_logits_processors_parameters
78
vllm/entrypoints/openai/serving_engine.py
+1 -1
@@ -59,7 +59,6 @@ from vllm.entrypoints.openai.protocol import (
59 TranslationRequest,
60 )
61 from vllm.entrypoints.openai.serving_models import OpenAIServingModels
62 -from vllm.entrypoints.openai.tool_parsers import ToolParser, ToolParserManager
62 from vllm.entrypoints.pooling.classify.protocol import (
63 ClassificationChatRequest,
64 ClassificationCompletionRequest,
@@ -104,6 +103,7 @@ from vllm.sampling_params import BeamSearchParams, SamplingParams
103 from vllm.tokenizers import TokenizerLike
104 from vllm.tokenizers.deepseek_v32 import DeepseekV32Tokenizer
105 from vllm.tokenizers.mistral import MistralTokenizer
106 +from vllm.tool_parsers import ToolParser, ToolParserManager
107 from vllm.tracing import (
108 contains_trace_headers,
109 extract_trace_headers,
vllm/entrypoints/openai/tool_parsers/__init__.py
+23 -140
@@ -1,150 +1,33 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
5 - ToolParser,
6 - ToolParserManager,
7 -)
4 +import warnings
5
9 -__all__ = ["ToolParser", "ToolParserManager"]
6
7 +def __getattr__(name: str):
8 + if name == "ToolParser":
9 + from vllm.tool_parsers import ToolParser
10
12 -"""
13 -Register a lazy module mapping.
11 + warnings.warn(
12 + "`vllm.entrypoints.openai.tool_parsers.ToolParser` has been moved to "
13 + "`vllm.tool_parsers.ToolParser`. "
14 + "The old name will be removed in v0.14.",
15 + DeprecationWarning,
16 + stacklevel=2,
17 + )
18
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 -"""
19 + return ToolParser
20 + if name == "ToolParserManager":
21 + from vllm.tool_parsers import ToolParserManager
22
23 + warnings.warn(
24 + "`vllm.entrypoints.openai.tool_parsers.ToolParserManager` "
25 + "has been moved to `vllm.tool_parsers.ToolParserManager`. "
26 + "The old name will be removed in v0.14.",
27 + DeprecationWarning,
28 + stacklevel=2,
29 + )
30
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 - "deepseek_v32": (
34 - "deepseekv32_tool_parser",
35 - "DeepSeekV32ToolParser",
36 - ),
37 - "ernie45": (
38 - "ernie45_tool_parser",
39 - "Ernie45ToolParser",
40 - ),
41 - "glm45": (
42 - "glm4_moe_tool_parser",
43 - "Glm4MoeModelToolParser",
44 - ),
45 - "granite-20b-fc": (
46 - "granite_20b_fc_tool_parser",
47 - "Granite20bFCToolParser",
48 - ),
49 - "granite": (
50 - "granite_tool_parser",
51 - "GraniteToolParser",
52 - ),
53 - "hermes": (
54 - "hermes_tool_parser",
55 - "Hermes2ProToolParser",
56 - ),
57 - "hunyuan_a13b": (
58 - "hunyuan_a13b_tool_parser",
59 - "HunyuanA13BToolParser",
60 - ),
61 - "internlm": (
62 - "internlm2_tool_parser",
63 - "Internlm2ToolParser",
64 - ),
65 - "jamba": (
66 - "jamba_tool_parser",
67 - "JambaToolParser",
68 - ),
69 - "kimi_k2": (
70 - "kimi_k2_tool_parser",
71 - "KimiK2ToolParser",
72 - ),
73 - "llama3_json": (
74 - "llama_tool_parser",
75 - "Llama3JsonToolParser",
76 - ),
77 - "llama4_json": (
78 - "llama_tool_parser",
79 - "Llama3JsonToolParser",
80 - ),
81 - "llama4_pythonic": (
82 - "llama4_pythonic_tool_parser",
83 - "Llama4PythonicToolParser",
84 - ),
85 - "longcat": (
86 - "longcat_tool_parser",
87 - "LongcatFlashToolParser",
88 - ),
89 - "minimax_m2": (
90 - "minimax_m2_tool_parser",
91 - "MinimaxM2ToolParser",
92 - ),
93 - "minimax": (
94 - "minimax_tool_parser",
95 - "MinimaxToolParser",
96 - ),
97 - "mistral": (
98 - "mistral_tool_parser",
99 - "MistralToolParser",
100 - ),
101 - "olmo3": (
102 - "olmo3_tool_parser",
103 - "Olmo3PythonicToolParser",
104 - ),
105 - "openai": (
106 - "openai_tool_parser",
107 - "OpenAIToolParser",
108 - ),
109 - "phi4_mini_json": (
110 - "phi4mini_tool_parser",
111 - "Phi4MiniJsonToolParser",
112 - ),
113 - "pythonic": (
114 - "pythonic_tool_parser",
115 - "PythonicToolParser",
116 - ),
117 - "qwen3_coder": (
118 - "qwen3coder_tool_parser",
119 - "Qwen3CoderToolParser",
120 - ),
121 - "qwen3_xml": (
122 - "qwen3xml_tool_parser",
123 - "Qwen3XMLToolParser",
124 - ),
125 - "seed_oss": (
126 - "seed_oss_tool_parser",
127 - "SeedOssToolParser",
128 - ),
129 - "step3": (
130 - "step3_tool_parser",
131 - "Step3ToolParser",
132 - ),
133 - "xlam": (
134 - "xlam_tool_parser",
135 - "xLAMToolParser",
136 - ),
137 - "gigachat3": (
138 - "gigachat3_tool_parser",
139 - "GigaChat3ToolParser",
140 - ),
141 -}
31 + return ToolParserManager
32
143 -
144 -def register_lazy_tool_parsers():
145 - for name, (file_name, class_name) in _TOOL_PARSERS_TO_REGISTER.items():
146 - module_path = f"vllm.entrypoints.openai.tool_parsers.{file_name}"
147 - ToolParserManager.register_lazy_module(name, module_path, class_name)
148 -
149 -
150 -register_lazy_tool_parsers()
33 + raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
vllm/tool_parsers/__init__.py new
+150
@@ -0,0 +1,150 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +
4 +from vllm.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.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 + "deepseek_v32": (
34 + "deepseekv32_tool_parser",
35 + "DeepSeekV32ToolParser",
36 + ),
37 + "ernie45": (
38 + "ernie45_tool_parser",
39 + "Ernie45ToolParser",
40 + ),
41 + "glm45": (
42 + "glm4_moe_tool_parser",
43 + "Glm4MoeModelToolParser",
44 + ),
45 + "granite-20b-fc": (
46 + "granite_20b_fc_tool_parser",
47 + "Granite20bFCToolParser",
48 + ),
49 + "granite": (
50 + "granite_tool_parser",
51 + "GraniteToolParser",
52 + ),
53 + "hermes": (
54 + "hermes_tool_parser",
55 + "Hermes2ProToolParser",
56 + ),
57 + "hunyuan_a13b": (
58 + "hunyuan_a13b_tool_parser",
59 + "HunyuanA13BToolParser",
60 + ),
61 + "internlm": (
62 + "internlm2_tool_parser",
63 + "Internlm2ToolParser",
64 + ),
65 + "jamba": (
66 + "jamba_tool_parser",
67 + "JambaToolParser",
68 + ),
69 + "kimi_k2": (
70 + "kimi_k2_tool_parser",
71 + "KimiK2ToolParser",
72 + ),
73 + "llama3_json": (
74 + "llama_tool_parser",
75 + "Llama3JsonToolParser",
76 + ),
77 + "llama4_json": (
78 + "llama_tool_parser",
79 + "Llama3JsonToolParser",
80 + ),
81 + "llama4_pythonic": (
82 + "llama4_pythonic_tool_parser",
83 + "Llama4PythonicToolParser",
84 + ),
85 + "longcat": (
86 + "longcat_tool_parser",
87 + "LongcatFlashToolParser",
88 + ),
89 + "minimax_m2": (
90 + "minimax_m2_tool_parser",
91 + "MinimaxM2ToolParser",
92 + ),
93 + "minimax": (
94 + "minimax_tool_parser",
95 + "MinimaxToolParser",
96 + ),
97 + "mistral": (
98 + "mistral_tool_parser",
99 + "MistralToolParser",
100 + ),
101 + "olmo3": (
102 + "olmo3_tool_parser",
103 + "Olmo3PythonicToolParser",
104 + ),
105 + "openai": (
106 + "openai_tool_parser",
107 + "OpenAIToolParser",
108 + ),
109 + "phi4_mini_json": (
110 + "phi4mini_tool_parser",
111 + "Phi4MiniJsonToolParser",
112 + ),
113 + "pythonic": (
114 + "pythonic_tool_parser",
115 + "PythonicToolParser",
116 + ),
117 + "qwen3_coder": (
118 + "qwen3coder_tool_parser",
119 + "Qwen3CoderToolParser",
120 + ),
121 + "qwen3_xml": (
122 + "qwen3xml_tool_parser",
123 + "Qwen3XMLToolParser",
124 + ),
125 + "seed_oss": (
126 + "seed_oss_tool_parser",
127 + "SeedOssToolParser",
128 + ),
129 + "step3": (
130 + "step3_tool_parser",
131 + "Step3ToolParser",
132 + ),
133 + "xlam": (
134 + "xlam_tool_parser",
135 + "xLAMToolParser",
136 + ),
137 + "gigachat3": (
138 + "gigachat3_tool_parser",
139 + "GigaChat3ToolParser",
140 + ),
141 +}
142 +
143 +
144 +def register_lazy_tool_parsers():
145 + for name, (file_name, class_name) in _TOOL_PARSERS_TO_REGISTER.items():
146 + module_path = f"vllm.tool_parsers.{file_name}"
147 + ToolParserManager.register_lazy_module(name, module_path, class_name)
148 +
149 +
150 +register_lazy_tool_parsers()
vllm/tool_parsers/abstract_tool_parser.py renamed
+2 -2
@@ -17,12 +17,12 @@ from vllm.entrypoints.openai.protocol import (
17 ResponsesRequest,
18 ResponseTextConfig,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.utils import get_json_schema_from_tools
20 from vllm.logger import init_logger
21 from vllm.sampling_params import (
22 StructuredOutputsParams,
23 )
24 from vllm.tokenizers import TokenizerLike
25 +from vllm.tool_parsers.utils import get_json_schema_from_tools
26 from vllm.utils.collection_utils import is_list_of
27 from vllm.utils.import_utils import import_from_path
28
@@ -203,7 +203,7 @@ class ToolParserManager:
203 Example:
204 ToolParserManager.register_lazy_module(
205 name="kimi_k2",
206 - module_path="vllm.entrypoints.openai.tool_parsers.kimi_k2_parser",
206 + module_path="vllm.tool_parsers.kimi_k2_parser",
207 class_name="KimiK2ToolParser",
208 )
209 """
vllm/tool_parsers/deepseekv31_tool_parser.py renamed
+1 -3
@@ -15,11 +15,9 @@ from vllm.entrypoints.openai.protocol import (
15 FunctionCall,
16 ToolCall,
17 )
18 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19 - ToolParser,
20 -)
18 from vllm.logger import init_logger
19 from vllm.tokenizers import TokenizerLike
20 +from vllm.tool_parsers.abstract_tool_parser import ToolParser
21
22 logger = init_logger(__name__)
23
vllm/tool_parsers/deepseekv32_tool_parser.py renamed
+3 -3
@@ -17,11 +17,11 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25
26 logger = init_logger(__name__)
27
vllm/tool_parsers/deepseekv3_tool_parser.py renamed
+3 -3
@@ -15,11 +15,11 @@ from vllm.entrypoints.openai.protocol import (
15 FunctionCall,
16 ToolCall,
17 )
18 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19 - ToolParser,
20 -)
18 from vllm.logger import init_logger
19 from vllm.tokenizers import TokenizerLike
20 +from vllm.tool_parsers.abstract_tool_parser import (
21 + ToolParser,
22 +)
23
24 logger = init_logger(__name__)
25
vllm/tool_parsers/ernie45_tool_parser.py renamed
+3 -3
@@ -15,11 +15,11 @@ from vllm.entrypoints.openai.protocol import (
15 FunctionCall,
16 ToolCall,
17 )
18 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19 - ToolParser,
20 -)
18 from vllm.logger import init_logger
19 from vllm.tokenizers import TokenizerLike
20 +from vllm.tool_parsers.abstract_tool_parser import (
21 + ToolParser,
22 +)
23
24 logger = init_logger(__name__)
25
vllm/tool_parsers/gigachat3_tool_parser.py renamed
+1 -1
@@ -16,9 +16,9 @@ from vllm.entrypoints.openai.protocol import (
16 FunctionCall,
17 ToolCall,
18 )
19 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import ToolParser
19 from vllm.logger import init_logger
20 from vllm.tokenizers import TokenizerLike
21 +from vllm.tool_parsers.abstract_tool_parser import ToolParser
22
23 logger = init_logger(__name__)
24
vllm/tool_parsers/glm4_moe_tool_parser.py renamed
+3 -3
@@ -18,11 +18,11 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22 - ToolParser,
23 -)
21 from vllm.logger import init_logger
22 from vllm.tokenizers import TokenizerLike
23 +from vllm.tool_parsers.abstract_tool_parser import (
24 + ToolParser,
25 +)
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/granite_20b_fc_tool_parser.py renamed
+4 -4
@@ -19,17 +19,17 @@ from vllm.entrypoints.openai.protocol import (
19 FunctionCall,
20 ToolCall,
21 )
22 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22 +from vllm.logger import init_logger
23 +from vllm.tokenizers import TokenizerLike
24 +from vllm.tool_parsers.abstract_tool_parser import (
25 ToolParser,
26 )
25 -from vllm.entrypoints.openai.tool_parsers.utils import (
27 +from vllm.tool_parsers.utils import (
28 consume_space,
29 find_common_prefix,
30 is_complete_json,
31 partial_json_loads,
32 )
31 -from vllm.logger import init_logger
32 -from vllm.tokenizers import TokenizerLike
33
34 logger = init_logger(__name__)
35
vllm/tool_parsers/granite_tool_parser.py renamed
+4 -4
@@ -17,17 +17,17 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
20 +from vllm.logger import init_logger
21 +from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 ToolParser,
24 )
23 -from vllm.entrypoints.openai.tool_parsers.utils import (
25 +from vllm.tool_parsers.utils import (
26 consume_space,
27 find_common_prefix,
28 is_complete_json,
29 partial_json_loads,
30 )
29 -from vllm.logger import init_logger
30 -from vllm.tokenizers import TokenizerLike
31
32 logger = init_logger(__name__)
33
vllm/tool_parsers/hermes_tool_parser.py renamed
+3 -3
@@ -18,12 +18,12 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22 - ToolParser,
23 -)
21 from vllm.logger import init_logger
22 from vllm.tokenizers import TokenizerLike
23 from vllm.tokenizers.mistral import MistralTokenizer
24 +from vllm.tool_parsers.abstract_tool_parser import (
25 + ToolParser,
26 +)
27
28 logger = init_logger(__name__)
29
vllm/tool_parsers/hunyuan_a13b_tool_parser.py renamed
+4 -4
@@ -17,12 +17,12 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
23 -from vllm.entrypoints.openai.tool_parsers.utils import consume_space
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25 +from vllm.tool_parsers.utils import consume_space
26 from vllm.utils import random_uuid
27
28 logger = init_logger(__name__)
vllm/tool_parsers/internlm2_tool_parser.py renamed
+4 -4
@@ -17,12 +17,12 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
23 -from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25 +from vllm.tool_parsers.utils import extract_intermediate_diff
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/jamba_tool_parser.py renamed
+2 -2
@@ -18,11 +18,11 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers import ToolParser
22 -from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
21 from vllm.logger import init_logger
22 from vllm.tokenizers import TokenizerLike
23 from vllm.tokenizers.mistral import MistralTokenizer
24 +from vllm.tool_parsers import ToolParser
25 +from vllm.tool_parsers.utils import extract_intermediate_diff
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/kimi_k2_tool_parser.py renamed
+3 -3
@@ -15,11 +15,11 @@ from vllm.entrypoints.openai.protocol import (
15 FunctionCall,
16 ToolCall,
17 )
18 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19 - ToolParser,
20 -)
18 from vllm.logger import init_logger
19 from vllm.tokenizers import TokenizerLike
20 +from vllm.tool_parsers.abstract_tool_parser import (
21 + ToolParser,
22 +)
23
24 logger = init_logger(__name__)
25
vllm/tool_parsers/llama4_pythonic_tool_parser.py renamed
+2 -2
@@ -18,10 +18,10 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 +from vllm.logger import init_logger
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 ToolParser,
24 )
24 -from vllm.logger import init_logger
25
26 logger = init_logger(__name__)
27
vllm/tool_parsers/llama_tool_parser.py renamed
+3 -3
@@ -20,15 +20,15 @@ from vllm.entrypoints.openai.protocol import (
20 FunctionCall,
21 ToolCall,
22 )
23 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23 +from vllm.logger import init_logger
24 +from vllm.tool_parsers.abstract_tool_parser import (
25 ToolParser,
26 )
26 -from vllm.entrypoints.openai.tool_parsers.utils import (
27 +from vllm.tool_parsers.utils import (
28 find_common_prefix,
29 is_complete_json,
30 partial_json_loads,
31 )
31 -from vllm.logger import init_logger
32
33 logger = init_logger(__name__)
34
vllm/tool_parsers/longcat_tool_parser.py renamed
+1 -1
@@ -3,8 +3,8 @@
3
4 import regex as re
5
6 -from vllm.entrypoints.openai.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
6 from vllm.tokenizers import TokenizerLike
7 +from vllm.tool_parsers.hermes_tool_parser import Hermes2ProToolParser
8
9
10 class LongcatFlashToolParser(Hermes2ProToolParser):
vllm/tool_parsers/minimax_m2_tool_parser.py renamed
+3 -3
@@ -17,11 +17,11 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25
26 logger = init_logger(__name__)
27
vllm/tool_parsers/minimax_tool_parser.py renamed
+4 -4
@@ -17,12 +17,12 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
23 -from vllm.entrypoints.openai.tool_parsers.utils import extract_intermediate_diff
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25 +from vllm.tool_parsers.utils import extract_intermediate_diff
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/mistral_tool_parser.py renamed
+3 -3
@@ -21,12 +21,12 @@ from vllm.entrypoints.openai.protocol import (
21 FunctionCall,
22 ToolCall,
23 )
24 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
25 - ToolParser,
26 -)
24 from vllm.logger import init_logger
25 from vllm.tokenizers import TokenizerLike
26 from vllm.tokenizers.mistral import MistralTokenizer
27 +from vllm.tool_parsers.abstract_tool_parser import (
28 + ToolParser,
29 +)
30
31 logger = init_logger(__name__)
32
vllm/tool_parsers/olmo3_tool_parser.py renamed
+2 -2
@@ -18,10 +18,10 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 +from vllm.logger import init_logger
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 ToolParser,
24 )
24 -from vllm.logger import init_logger
25
26 logger = init_logger(__name__)
27
vllm/tool_parsers/openai_tool_parser.py renamed
+2 -2
@@ -12,10 +12,10 @@ from vllm.entrypoints.openai.protocol import (
12 FunctionCall,
13 ToolCall,
14 )
15 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
15 +from vllm.logger import init_logger
16 +from vllm.tool_parsers.abstract_tool_parser import (
17 ToolParser,
18 )
18 -from vllm.logger import init_logger
19
20 if TYPE_CHECKING:
21 from vllm.tokenizers import TokenizerLike
vllm/tool_parsers/phi4mini_tool_parser.py renamed
+2 -2
@@ -16,10 +16,10 @@ from vllm.entrypoints.openai.protocol import (
16 FunctionCall,
17 ToolCall,
18 )
19 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
19 +from vllm.logger import init_logger
20 +from vllm.tool_parsers.abstract_tool_parser import (
21 ToolParser,
22 )
22 -from vllm.logger import init_logger
23
24 logger = init_logger(__name__)
25
vllm/tool_parsers/pythonic_tool_parser.py renamed
+2 -2
@@ -19,10 +19,10 @@ from vllm.entrypoints.openai.protocol import (
19 FunctionCall,
20 ToolCall,
21 )
22 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22 +from vllm.logger import init_logger
23 +from vllm.tool_parsers.abstract_tool_parser import (
24 ToolParser,
25 )
25 -from vllm.logger import init_logger
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/qwen3coder_tool_parser.py renamed
+3 -3
@@ -18,11 +18,11 @@ from vllm.entrypoints.openai.protocol import (
18 FunctionCall,
19 ToolCall,
20 )
21 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
22 - ToolParser,
23 -)
21 from vllm.logger import init_logger
22 from vllm.tokenizers import TokenizerLike
23 +from vllm.tool_parsers.abstract_tool_parser import (
24 + ToolParser,
25 +)
26
27 logger = init_logger(__name__)
28
vllm/tool_parsers/qwen3xml_tool_parser.py renamed
+3 -3
@@ -19,11 +19,11 @@ from vllm.entrypoints.openai.protocol import (
19 FunctionCall,
20 ToolCall,
21 )
22 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
23 - ToolParser,
24 -)
22 from vllm.logger import init_logger
23 from vllm.tokenizers import TokenizerLike
24 +from vllm.tool_parsers.abstract_tool_parser import (
25 + ToolParser,
26 +)
27
28 logger = init_logger(__name__)
29
vllm/tool_parsers/seed_oss_tool_parser.py renamed
+3 -3
@@ -21,11 +21,11 @@ from vllm.entrypoints.openai.protocol import (
21 FunctionCall,
22 ToolCall,
23 )
24 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
25 - ToolParser,
26 -)
24 from vllm.logger import init_logger
25 from vllm.tokenizers import TokenizerLike
26 +from vllm.tool_parsers.abstract_tool_parser import (
27 + ToolParser,
28 +)
29
30 logger = init_logger(__name__)
31
vllm/tool_parsers/step3_tool_parser.py renamed
+3 -3
@@ -17,11 +17,11 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
21 - ToolParser,
22 -)
20 from vllm.logger import init_logger
21 from vllm.tokenizers import TokenizerLike
22 +from vllm.tool_parsers.abstract_tool_parser import (
23 + ToolParser,
24 +)
25 from vllm.utils import random_uuid
26
27 logger = init_logger(__name__)
vllm/tool_parsers/utils.py renamed
vllm/tool_parsers/xlam_tool_parser.py renamed
+1 -1
@@ -17,7 +17,7 @@ from vllm.entrypoints.openai.protocol import (
17 FunctionCall,
18 ToolCall,
19 )
20 -from vllm.entrypoints.openai.tool_parsers.abstract_tool_parser import (
20 +from vllm.tool_parsers.abstract_tool_parser import (
21 ToolParser,
22 )
23 from vllm.logger import init_logger