diff --git a/docs/features/reasoning_outputs.md b/docs/features/reasoning_outputs.md index dc2b2315182a..28520a80ed36 100644 --- a/docs/features/reasoning_outputs.md +++ b/docs/features/reasoning_outputs.md @@ -219,7 +219,6 @@ You can add a new `ReasoningParser` similar to [vllm/reasoning/deepseek_r1_reaso # define a reasoning parser and register it to vllm # the name list in register_module can be used # in --reasoning-parser. - @ReasoningParserManager.register_module(["example"]) class ExampleParser(ReasoningParser): def __init__(self, tokenizer: AnyTokenizer): super().__init__(tokenizer) @@ -263,6 +262,12 @@ You can add a new `ReasoningParser` similar to [vllm/reasoning/deepseek_r1_reaso tuple[Optional[str], Optional[str]] A tuple containing the reasoning content and the content. """ + # Register the reasoning parser + ReasoningParserManager.register_lazy_module( + name="example", + module_path="vllm.reasoning.example_reasoning_parser", + class_name="ExampleParser", + ) ``` Additionally, to enable structured output, you'll need to create a new `Reasoner` similar to the one in [vllm/reasoning/deepseek_r1_reasoning_parser.py](../../vllm/reasoning/deepseek_r1_reasoning_parser.py). diff --git a/tests/reasoning/test_deepseekv3_reasoning_parser.py b/tests/reasoning/test_deepseekv3_reasoning_parser.py index 3d12f3e5b30e..e1ff7462b1fa 100644 --- a/tests/reasoning/test_deepseekv3_reasoning_parser.py +++ b/tests/reasoning/test_deepseekv3_reasoning_parser.py @@ -5,11 +5,9 @@ from transformers import AutoTokenizer from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage -from vllm.reasoning import ( - DeepSeekR1ReasoningParser, - DeepSeekV3ReasoningParser, - IdentityReasoningParser, -) +from vllm.reasoning.deepseek_r1_reasoning_parser import DeepSeekR1ReasoningParser +from vllm.reasoning.deepseek_v3_reasoning_parser import DeepSeekV3ReasoningParser +from vllm.reasoning.identity_reasoning_parser import IdentityReasoningParser REASONING_MODEL_NAME = "deepseek-ai/DeepSeek-V3.1" diff --git a/vllm/engine/arg_utils.py b/vllm/engine/arg_utils.py index 0b2b8bbe678a..a697f451d483 100644 --- a/vllm/engine/arg_utils.py +++ b/vllm/engine/arg_utils.py @@ -708,7 +708,7 @@ def add_cli_args(parser: FlexibleArgumentParser) -> FlexibleArgumentParser: structured_outputs_group.add_argument( "--reasoning-parser", # This choice is a special case because it's not static - choices=list(ReasoningParserManager.reasoning_parsers), + choices=list(ReasoningParserManager.list_registered()), **structured_outputs_kwargs["reasoning_parser"], ) # Deprecated guided decoding arguments diff --git a/vllm/entrypoints/openai/api_server.py b/vllm/entrypoints/openai/api_server.py index e184f22f3630..5ef33cd0c351 100644 --- a/vllm/entrypoints/openai/api_server.py +++ b/vllm/entrypoints/openai/api_server.py @@ -1950,7 +1950,7 @@ def validate_api_server_args(args): f"(chose from {{ {','.join(valid_tool_parses)} }})" ) - valid_reasoning_parses = ReasoningParserManager.reasoning_parsers.keys() + valid_reasoning_parses = ReasoningParserManager.list_registered() if ( reasoning_parser := args.structured_outputs_config.reasoning_parser ) and reasoning_parser not in valid_reasoning_parses: diff --git a/vllm/entrypoints/openai/run_batch.py b/vllm/entrypoints/openai/run_batch.py index 4caccf88fd7d..7a39113961e1 100644 --- a/vllm/entrypoints/openai/run_batch.py +++ b/vllm/entrypoints/openai/run_batch.py @@ -334,7 +334,7 @@ async def run_request( def validate_run_batch_args(args): - valid_reasoning_parses = ReasoningParserManager.reasoning_parsers.keys() + valid_reasoning_parses = ReasoningParserManager.list_registered() if ( reasoning_parser := args.structured_outputs_config.reasoning_parser ) and reasoning_parser not in valid_reasoning_parses: diff --git a/vllm/entrypoints/openai/tool_parsers/__init__.py b/vllm/entrypoints/openai/tool_parsers/__init__.py index 7038d4c1f05c..89e439dd53f5 100644 --- a/vllm/entrypoints/openai/tool_parsers/__init__.py +++ b/vllm/entrypoints/openai/tool_parsers/__init__.py @@ -72,7 +72,7 @@ ), "llama4_json": ( "llama_tool_parser", - "Llama4JsonToolParser", + "Llama3JsonToolParser", ), "llama4_pythonic": ( "llama4_pythonic_tool_parser", @@ -116,11 +116,11 @@ ), "qwen3_xml": ( "qwen3xml_tool_parser", - "Qwen3XmlToolParser", + "Qwen3XMLToolParser", ), "seed_oss": ( "seed_oss_tool_parser", - "SeedOsSToolParser", + "SeedOssToolParser", ), "step3": ( "step3_tool_parser", diff --git a/vllm/reasoning/__init__.py b/vllm/reasoning/__init__.py index 3d666882efb5..6bd1d8463e45 100644 --- a/vllm/reasoning/__init__.py +++ b/vllm/reasoning/__init__.py @@ -1,39 +1,88 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -from .abs_reasoning_parsers import ReasoningParser, ReasoningParserManager -from .basic_parsers import BaseThinkingReasoningParser -from .deepseek_r1_reasoning_parser import DeepSeekR1ReasoningParser -from .deepseek_v3_reasoning_parser import DeepSeekV3ReasoningParser -from .ernie45_reasoning_parser import Ernie45ReasoningParser -from .glm4_moe_reasoning_parser import Glm4MoeModelReasoningParser -from .gptoss_reasoning_parser import GptOssReasoningParser -from .granite_reasoning_parser import GraniteReasoningParser -from .hunyuan_a13b_reasoning_parser import HunyuanA13BReasoningParser -from .identity_reasoning_parser import IdentityReasoningParser -from .minimax_m2_reasoning_parser import MiniMaxM2ReasoningParser -from .mistral_reasoning_parser import MistralReasoningParser -from .olmo3_reasoning_parser import Olmo3ReasoningParser -from .qwen3_reasoning_parser import Qwen3ReasoningParser -from .seedoss_reasoning_parser import SeedOSSReasoningParser -from .step3_reasoning_parser import Step3ReasoningParser +from vllm.reasoning.abs_reasoning_parsers import ReasoningParser, ReasoningParserManager __all__ = [ "ReasoningParser", - "BaseThinkingReasoningParser", "ReasoningParserManager", - "DeepSeekR1ReasoningParser", - "IdentityReasoningParser", - "DeepSeekV3ReasoningParser", - "Ernie45ReasoningParser", - "GraniteReasoningParser", - "HunyuanA13BReasoningParser", - "Qwen3ReasoningParser", - "Glm4MoeModelReasoningParser", - "MistralReasoningParser", - "Olmo3ReasoningParser", - "Step3ReasoningParser", - "GptOssReasoningParser", - "SeedOSSReasoningParser", - "MiniMaxM2ReasoningParser", ] +""" +Register a lazy module mapping. + +Example: + ReasoningParserManager.register_lazy_module( + name="qwen3", + module_path="vllm.reasoning.qwen3_reasoning_parser", + class_name="Qwen3ReasoningParser", + ) +""" + + +_REASONING_PARSERS_TO_REGISTER = { + "deepseek_r1": ( # name + "deepseek_r1_reasoning_parser", # filename + "DeepSeekR1ReasoningParser", # class_name + ), + "deepseek_v3": ( + "deepseek_v3_reasoning_parser", + "DeepSeekV3ReasoningParser", + ), + "ernie45": ( + "ernie45_reasoning_parser", + "Ernie45ReasoningParser", + ), + "glm45": ( + "glm4_moe_reasoning_parser", + "Glm4MoeModelReasoningParser", + ), + "openai_gptoss": ( + "gptoss_reasoning_parser", + "GptOssReasoningParser", + ), + "granite": ( + "granite_reasoning_parser", + "GraniteReasoningParser", + ), + "hunyuan_a13b": ( + "hunyuan_a13b_reasoning_parser", + "HunyuanA13BReasoningParser", + ), + "minimax_m2": ( + "minimax_m2_reasoning_parser", + "MiniMaxM2ReasoningParser", + ), + "minimax_m2_append_think": ( + "minimax_m2_reasoning_parser", + "MiniMaxM2AppendThinkReasoningParser", + ), + "mistral": ( + "mistral_reasoning_parser", + "MistralReasoningParser", + ), + "olmo3": ( + "olmo3_reasoning_parser", + "Olmo3ReasoningParser", + ), + "qwen3": ( + "qwen3_reasoning_parser", + "Qwen3ReasoningParser", + ), + "seed_oss": ( + "seedoss_reasoning_parser", + "SeedOSSReasoningParser", + ), + "step3": ( + "step3_reasoning_parser", + "Step3ReasoningParser", + ), +} + + +def register_lazy_reasoning_parsers(): + for name, (file_name, class_name) in _REASONING_PARSERS_TO_REGISTER.items(): + module_path = f"vllm.reasoning.{file_name}" + ReasoningParserManager.register_lazy_module(name, module_path, class_name) + + +register_lazy_reasoning_parsers() diff --git a/vllm/reasoning/abs_reasoning_parsers.py b/vllm/reasoning/abs_reasoning_parsers.py index ebd660ca5a84..63ff450053ea 100644 --- a/vllm/reasoning/abs_reasoning_parsers.py +++ b/vllm/reasoning/abs_reasoning_parsers.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project +import importlib import os from abc import abstractmethod from collections.abc import Callable, Sequence @@ -129,50 +130,117 @@ def prepare_structured_tag( class ReasoningParserManager: - reasoning_parsers: dict[str, type] = {} + """ + Central registry for ReasoningParser implementations. + + Supports two registration modes: + - Eager registration via `register_module` + - Lazy registration via `register_lazy_module` + + Each reasoning parser must inherit from `ReasoningParser`. + """ + + reasoning_parsers: dict[str, type[ReasoningParser]] = {} + lazy_parsers: dict[str, tuple[str, str]] = {} # name -> (module_path, class_name) @classmethod - def get_reasoning_parser(cls, name: str | None) -> type[ReasoningParser]: + def get_reasoning_parser(cls, name: str) -> type[ReasoningParser]: """ - Get reasoning parser by name which is registered by `register_module`. + Retrieve a registered or lazily registered ReasoningParser class. + + If the parser is lazily registered, it will be imported and cached + on first access. - Raise a KeyError exception if the name is not registered. + Raises: + KeyError: if no parser is found under the given name. """ if name in cls.reasoning_parsers: return cls.reasoning_parsers[name] - raise KeyError(f"reasoning helper: '{name}' not found in reasoning_parsers") + if name in cls.lazy_parsers: + return cls._load_lazy_parser(name) + + raise KeyError(f"Reasoning parser '{name}' not found.") + + @classmethod + def list_registered(cls) -> list[str]: + """Return names of all eagerly and lazily registered reasoning parsers.""" + return sorted(set(cls.reasoning_parsers.keys()) | set(cls.lazy_parsers.keys())) + + @classmethod + def _load_lazy_parser(cls, name: str) -> type[ReasoningParser]: + """Import and register a lazily loaded reasoning 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, ReasoningParser): + raise TypeError( + f"{class_name} in {module_path} is not a ReasoningParser subclass." + ) + + cls.reasoning_parsers[name] = parser_cls # cache + return parser_cls + except Exception as e: + logger.exception( + "Failed to import lazy reasoning parser '%s' from %s: %s", + name, + module_path, + e, + ) + raise @classmethod def _register_module( cls, - module: type, + module: type[ReasoningParser], module_name: str | list[str] | None = None, force: bool = True, ) -> None: + """Register a ReasoningParser class immediately.""" if not issubclass(module, ReasoningParser): raise TypeError( f"module must be subclass of ReasoningParser, but got {type(module)}" ) + if module_name is None: - module_name = module.__name__ - if isinstance(module_name, str): - module_name = [module_name] - for name in module_name: + module_names = [module.__name__] + elif isinstance(module_name, str): + module_names = [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.reasoning_parsers: - existed_module = cls.reasoning_parsers[name] - raise KeyError( - f"{name} is already registered at {existed_module.__module__}" - ) + existed = cls.reasoning_parsers[name] + raise KeyError(f"{name} is already registered at {existed.__module__}") cls.reasoning_parsers[name] = module + @classmethod + def register_lazy_module(cls, name: str, module_path: str, class_name: str) -> None: + """ + Register a lazy module mapping for delayed import. + + Example: + ReasoningParserManager.register_lazy_module( + name="qwen3", + module_path="vllm.reasoning.parsers.qwen3_reasoning_parser", + class_name="Qwen3ReasoningParser", + ) + """ + cls.lazy_parsers[name] = (module_path, class_name) + @classmethod def register_module( cls, name: str | list[str] | None = None, force: bool = True, - module: type | None = None, - ) -> type | Callable: + module: type[ReasoningParser] | None = None, + ) -> ( + type[ReasoningParser] | Callable[[type[ReasoningParser]], type[ReasoningParser]] + ): """ Register module with the given name or name list. it can be used as a decoder(with module as None) or normal function(with module as not @@ -181,24 +249,29 @@ def register_module( if not isinstance(force, bool): raise TypeError(f"force must be a boolean, but got {type(force)}") - # raise the error ahead of time - 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) + # Immediate registration (explicit call) if module is not None: cls._register_module(module=module, module_name=name, force=force) return module - # use it as a decorator: @x.register_module() - def _register(module): - cls._register_module(module=module, module_name=name, force=force) - return module + # Decorator usage + def _decorator(obj: type[ReasoningParser]) -> type[ReasoningParser]: + module_path = obj.__module__ + class_name = obj.__name__ + + if isinstance(name, str): + names = [name] + elif is_list_of(name, str): + names = name + else: + names = [class_name] + + for n in names: + cls.lazy_parsers[n] = (module_path, class_name) + + return obj - return _register + return _decorator @classmethod def import_reasoning_parser(cls, plugin_path: str) -> None: diff --git a/vllm/reasoning/deepseek_r1_reasoning_parser.py b/vllm/reasoning/deepseek_r1_reasoning_parser.py index d5200145ea03..ad4e0fe6c9ce 100644 --- a/vllm/reasoning/deepseek_r1_reasoning_parser.py +++ b/vllm/reasoning/deepseek_r1_reasoning_parser.py @@ -4,11 +4,9 @@ from collections.abc import Sequence from vllm.entrypoints.openai.protocol import DeltaMessage -from vllm.reasoning.abs_reasoning_parsers import ReasoningParserManager from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser -@ReasoningParserManager.register_module("deepseek_r1") class DeepSeekR1ReasoningParser(BaseThinkingReasoningParser): """ Reasoning parser for DeepSeek R1 model. diff --git a/vllm/reasoning/deepseek_v3_reasoning_parser.py b/vllm/reasoning/deepseek_v3_reasoning_parser.py index 7116f90a1ac0..73292f9047c1 100644 --- a/vllm/reasoning/deepseek_v3_reasoning_parser.py +++ b/vllm/reasoning/deepseek_v3_reasoning_parser.py @@ -10,7 +10,6 @@ from vllm.reasoning import ( DeepSeekR1ReasoningParser, ReasoningParser, - ReasoningParserManager, ) from .identity_reasoning_parser import IdentityReasoningParser @@ -18,7 +17,6 @@ logger = init_logger(__name__) -@ReasoningParserManager.register_module("deepseek_v3") class DeepSeekV3ReasoningParser(ReasoningParser): """ V3 parser that delegates to either DeepSeekR1ReasoningParser or diff --git a/vllm/reasoning/ernie45_reasoning_parser.py b/vllm/reasoning/ernie45_reasoning_parser.py index 8dfbcc0ce46b..11dc1d10f73e 100644 --- a/vllm/reasoning/ernie45_reasoning_parser.py +++ b/vllm/reasoning/ernie45_reasoning_parser.py @@ -7,13 +7,11 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.logger import init_logger -from vllm.reasoning import ReasoningParserManager from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser logger = init_logger(__name__) -@ReasoningParserManager.register_module("ernie45") class Ernie45ReasoningParser(BaseThinkingReasoningParser): """ Reasoning parser for Ernie45 thinking model. diff --git a/vllm/reasoning/glm4_moe_reasoning_parser.py b/vllm/reasoning/glm4_moe_reasoning_parser.py index 09cd43c1d555..d43fa7700799 100644 --- a/vllm/reasoning/glm4_moe_reasoning_parser.py +++ b/vllm/reasoning/glm4_moe_reasoning_parser.py @@ -7,12 +7,11 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) -@ReasoningParserManager.register_module("glm45") class Glm4MoeModelReasoningParser(ReasoningParser): """ Reasoning parser for the Glm4MoeModel model. diff --git a/vllm/reasoning/gptoss_reasoning_parser.py b/vllm/reasoning/gptoss_reasoning_parser.py index e6766ddcbc68..fbfa7619ef3c 100644 --- a/vllm/reasoning/gptoss_reasoning_parser.py +++ b/vllm/reasoning/gptoss_reasoning_parser.py @@ -9,7 +9,7 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.entrypoints.tool_server import ToolServer from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) @@ -57,7 +57,6 @@ def tag_with_builtin_funcs(no_func_reaonsing_tag, builtin_tool_list: list[str]) return new_tag -@ReasoningParserManager.register_module("openai_gptoss") class GptOssReasoningParser(ReasoningParser): """ Reasoning parser for GptOss model. diff --git a/vllm/reasoning/granite_reasoning_parser.py b/vllm/reasoning/granite_reasoning_parser.py index 44391f8ad635..eae6c2f5c7b3 100644 --- a/vllm/reasoning/granite_reasoning_parser.py +++ b/vllm/reasoning/granite_reasoning_parser.py @@ -8,12 +8,11 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) -@ReasoningParserManager.register_module("granite") class GraniteReasoningParser(ReasoningParser): """ Reasoning parser for IBM Granite. diff --git a/vllm/reasoning/hunyuan_a13b_reasoning_parser.py b/vllm/reasoning/hunyuan_a13b_reasoning_parser.py index e5cf6f399740..1a82068c2694 100644 --- a/vllm/reasoning/hunyuan_a13b_reasoning_parser.py +++ b/vllm/reasoning/hunyuan_a13b_reasoning_parser.py @@ -8,12 +8,11 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) -@ReasoningParserManager.register_module("hunyuan_a13b") class HunyuanA13BReasoningParser(ReasoningParser): """ Reasoning parser for Hunyuan A13B Model diff --git a/vllm/reasoning/minimax_m2_reasoning_parser.py b/vllm/reasoning/minimax_m2_reasoning_parser.py index 0d4f6cc270a1..440b2b6e2fc2 100644 --- a/vllm/reasoning/minimax_m2_reasoning_parser.py +++ b/vllm/reasoning/minimax_m2_reasoning_parser.py @@ -9,14 +9,13 @@ ResponsesRequest, ) from vllm.logger import init_logger -from vllm.reasoning.abs_reasoning_parsers import ReasoningParser, ReasoningParserManager +from vllm.reasoning.abs_reasoning_parsers import ReasoningParser from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser from vllm.transformers_utils.tokenizer import AnyTokenizer logger = init_logger(__name__) -@ReasoningParserManager.register_module("minimax_m2") class MiniMaxM2ReasoningParser(BaseThinkingReasoningParser): """ Reasoning parser for MiniMax M2 model. @@ -33,7 +32,6 @@ def end_token(self) -> str: return "" -@ReasoningParserManager.register_module("minimax_m2_append_think") class MiniMaxM2AppendThinkReasoningParser(ReasoningParser): """ Reasoning parser for MiniMax M2 model. diff --git a/vllm/reasoning/mistral_reasoning_parser.py b/vllm/reasoning/mistral_reasoning_parser.py index 5658c372a264..af6d179bf6d0 100644 --- a/vllm/reasoning/mistral_reasoning_parser.py +++ b/vllm/reasoning/mistral_reasoning_parser.py @@ -4,14 +4,13 @@ from functools import cached_property from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser from vllm.reasoning.deepseek_r1_reasoning_parser import DeepSeekR1ReasoningParser from vllm.transformers_utils.tokenizers.mistral import MistralTokenizer logger = init_logger(__name__) -@ReasoningParserManager.register_module("mistral") class MistralReasoningParser(DeepSeekR1ReasoningParser): """ Reasoning parser for Mistral models. diff --git a/vllm/reasoning/olmo3_reasoning_parser.py b/vllm/reasoning/olmo3_reasoning_parser.py index b6c26899a114..91512a2e34c7 100644 --- a/vllm/reasoning/olmo3_reasoning_parser.py +++ b/vllm/reasoning/olmo3_reasoning_parser.py @@ -17,7 +17,7 @@ ResponsesRequest, ) from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) @@ -192,7 +192,6 @@ def add_text(self, delta_text: str) -> DeltaMessage | None: return delta_message -@ReasoningParserManager.register_module("olmo3") class Olmo3ReasoningParser(ReasoningParser): """ Reasoning parser for Olmo 3 model diff --git a/vllm/reasoning/qwen3_reasoning_parser.py b/vllm/reasoning/qwen3_reasoning_parser.py index 2ec06720719d..254f0e2e066b 100644 --- a/vllm/reasoning/qwen3_reasoning_parser.py +++ b/vllm/reasoning/qwen3_reasoning_parser.py @@ -3,11 +3,9 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, ResponsesRequest -from vllm.reasoning.abs_reasoning_parsers import ReasoningParserManager from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser -@ReasoningParserManager.register_module("qwen3") class Qwen3ReasoningParser(BaseThinkingReasoningParser): """ Reasoning parser for the Qwen3 model. diff --git a/vllm/reasoning/seedoss_reasoning_parser.py b/vllm/reasoning/seedoss_reasoning_parser.py index 72f8dc54f1b3..d3d4d8ec0749 100644 --- a/vllm/reasoning/seedoss_reasoning_parser.py +++ b/vllm/reasoning/seedoss_reasoning_parser.py @@ -1,11 +1,10 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -from vllm.reasoning.abs_reasoning_parsers import ReasoningParserManager + from vllm.reasoning.basic_parsers import BaseThinkingReasoningParser -@ReasoningParserManager.register_module("seed_oss") class SeedOSSReasoningParser(BaseThinkingReasoningParser): """ Reasoning parser for SeedOSS model. diff --git a/vllm/reasoning/step3_reasoning_parser.py b/vllm/reasoning/step3_reasoning_parser.py index ae066d96f250..202da057b028 100644 --- a/vllm/reasoning/step3_reasoning_parser.py +++ b/vllm/reasoning/step3_reasoning_parser.py @@ -8,12 +8,11 @@ from vllm.entrypoints.openai.protocol import ChatCompletionRequest, DeltaMessage from vllm.logger import init_logger -from vllm.reasoning import ReasoningParser, ReasoningParserManager +from vllm.reasoning import ReasoningParser logger = init_logger(__name__) -@ReasoningParserManager.register_module("step3") class Step3ReasoningParser(ReasoningParser): """ Reasoning parser for Step3 model.