test_deepseekv31_tool_parser.py 1.91 KB
Newer Older
1
2
3
4
5
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project

import pytest

6
7
8
from vllm.entrypoints.openai.tool_parsers.deepseekv31_tool_parser import (
    DeepSeekV31ToolParser,
)
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from vllm.transformers_utils.tokenizer import get_tokenizer

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


@pytest.fixture(scope="module")
def deepseekv31_tokenizer():
    return get_tokenizer(tokenizer_name=MODEL)


@pytest.fixture
def parser(deepseekv31_tokenizer):
    return DeepSeekV31ToolParser(deepseekv31_tokenizer)


def test_extract_tool_calls_with_tool(parser):
    model_output = (
26
27
28
29
30
        "normal text"
        + "<|tool▁calls▁begin|>"
        + '<|tool▁call▁begin|>foo<|tool▁sep|>{"x":1}<|tool▁call▁end|>'
        + "<|tool▁calls▁end|>"
    )
31
32
33
34
    result = parser.extract_tool_calls(model_output, None)
    assert result.tools_called
    assert len(result.tool_calls) == 1
    assert result.tool_calls[0].function.name == "foo"
35
    assert result.tool_calls[0].function.arguments == '{"x":1}'
36
37
38
39
40
    assert result.content == "normal text"


def test_extract_tool_calls_with_multiple_tools(parser):
    model_output = (
41
42
43
44
45
46
47
        "some prefix text"
        + "<|tool▁calls▁begin|>"
        + '<|tool▁call▁begin|>foo<|tool▁sep|>{"x":1}<|tool▁call▁end|>'
        + '<|tool▁call▁begin|>bar<|tool▁sep|>{"y":2}<|tool▁call▁end|>'
        + "<|tool▁calls▁end|>"
        + " some suffix text"
    )
48
49
50
51
52
53
54

    result = parser.extract_tool_calls(model_output, None)

    assert result.tools_called
    assert len(result.tool_calls) == 2

    assert result.tool_calls[0].function.name == "foo"
55
    assert result.tool_calls[0].function.arguments == '{"x":1}'
56
57

    assert result.tool_calls[1].function.name == "bar"
58
    assert result.tool_calls[1].function.arguments == '{"y":2}'
59
60
61

    # prefix is content
    assert result.content == "some prefix text"