Skip to content

Commit 9db78f3

Browse files
[Bugfix] Fix the issue where DeepSeek v3.2 cannot use structured_output (vllm-project#30371)
Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
1 parent 434ac76 commit 9db78f3

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

vllm/v1/structured_output/backend_xgrammar.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import vllm.envs
1111
from vllm.logger import init_logger
1212
from vllm.sampling_params import SamplingParams
13-
from vllm.tokenizers import MistralTokenizer
13+
from vllm.tokenizers import DeepseekV32Tokenizer, MistralTokenizer
1414
from vllm.utils.import_utils import LazyLoader
1515
from vllm.v1.structured_output.backend_types import (
1616
StructuredOutputBackend,
@@ -56,6 +56,27 @@ def __post_init__(self):
5656
stop_token_ids=stop_token_ids,
5757
add_prefix_space=True,
5858
)
59+
elif isinstance(self.tokenizer, DeepseekV32Tokenizer):
60+
# copy from xgr.TokenizerInfo.from_huggingface()
61+
# because we are using a custom tokenizer wrapper here.
62+
vocab_dict = self.tokenizer.get_vocab()
63+
tokenizer_vocab_size = max(len(vocab_dict), self.tokenizer.max_token_id + 1)
64+
vocab_size = self.vocab_size or tokenizer_vocab_size
65+
# maintain tokenizer's indexing
66+
encoded_vocab = [""] * vocab_size
67+
for token, idx in vocab_dict.items():
68+
if idx < vocab_size:
69+
encoded_vocab[idx] = token
70+
stop_token_ids = [self.tokenizer.eos_token_id]
71+
backend_str = self.tokenizer.tokenizer.backend_tokenizer.to_str()
72+
metadata = xgr.TokenizerInfo._detect_metadata_from_hf(backend_str)
73+
tokenizer_info = xgr.TokenizerInfo(
74+
encoded_vocab=encoded_vocab,
75+
vocab_type=metadata["vocab_type"],
76+
vocab_size=vocab_size,
77+
stop_token_ids=stop_token_ids,
78+
add_prefix_space=metadata["add_prefix_space"],
79+
)
5980
else:
6081
tokenizer_info = xgr.TokenizerInfo.from_huggingface(
6182
self.tokenizer,

0 commit comments

Comments
 (0)