"docs/design/arch_overview.md" did not exist on "5390d6664f65d84f37a5fb524e967b01baad9100"
test_deepseekv3_reasoning_parser.py 2.86 KB
Newer Older
1
2
3
4
5
6
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project

import pytest
from transformers import AutoTokenizer

7
8
from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionRequest
from vllm.entrypoints.openai.engine.protocol import DeltaMessage
9
from vllm.reasoning import ReasoningParserManager
10
11
12
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
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

REASONING_MODEL_NAME = "deepseek-ai/DeepSeek-V3.1"


@pytest.fixture(scope="module")
def tokenizer():
    return AutoTokenizer.from_pretrained(REASONING_MODEL_NAME)


@pytest.mark.parametrize(
    "thinking,expected_parser_type",
    [
        (True, DeepSeekR1ReasoningParser),
        (False, IdentityReasoningParser),
    ],
)
def test_parser_selection(tokenizer, thinking, expected_parser_type):
    parser = DeepSeekV3ReasoningParser(
        tokenizer, chat_template_kwargs={"thinking": thinking}
    )

    assert isinstance(parser._parser, expected_parser_type)


37
38
39
40
41
42
def test_deepseek_v4_reasoning_parser_alias():
    parser_cls = ReasoningParserManager.get_reasoning_parser("deepseek_v4")

    assert parser_cls is DeepSeekV3ReasoningParser


43
44
45
46
47
48
49
50
def test_identity_reasoning_parser_basic(tokenizer):
    parser = IdentityReasoningParser(tokenizer)

    # Test is_reasoning_end always returns True
    input_text = "This is some output"
    input_tokens = tokenizer.tokenize(input_text)
    input_ids = tokenizer.convert_tokens_to_ids(input_tokens)
    assert parser.is_reasoning_end(input_ids) is True
51
    assert parser.is_reasoning_end_streaming(input_ids, input_ids) is True
52
53
54
55

    # Test extract_content_ids returns all input_ids
    assert parser.extract_content_ids(input_ids) == input_ids

56
    # Test extract_reasoning returns (None, model_output)
57
    request = ChatCompletionRequest(model="test-model", messages=[], temperature=1.0)
58
    reasoning, content = parser.extract_reasoning(input_text, request)
59
60
61
    assert reasoning is None
    assert content == input_text

62
63
    # Test extract_reasoning_streaming returns DeltaMessage or None
    result = parser.extract_reasoning_streaming(
64
65
66
67
68
69
70
71
72
73
74
        previous_text="",
        current_text="Hello world",
        delta_text="Hello world",
        previous_token_ids=[],
        current_token_ids=input_ids,
        delta_token_ids=input_ids,
    )
    assert isinstance(result, DeltaMessage)
    assert result.content == "Hello world"

    # If delta_text is empty, should return None
75
    result_none = parser.extract_reasoning_streaming(
76
77
78
79
80
81
82
83
        previous_text="Hello world",
        current_text="Hello world",
        delta_text="",
        previous_token_ids=input_ids,
        current_token_ids=input_ids,
        delta_token_ids=[],
    )
    assert result_none is None