Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d3aac35
[Bugfix] fix the issue with the default reasoning mode in reasoner_gr…
jeremyzhang866 Sep 24, 2025
4145c9d
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 24, 2025
216fca6
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 25, 2025
ae78dff
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 25, 2025
c12d7c0
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 25, 2025
62dd271
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 26, 2025
0d9277a
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 26, 2025
943fffc
Merge branch 'main' into jeremy_reasoner_grammer_fix
JustinTong0323 Sep 26, 2025
1dae6b5
[Bugfix] fix the issue with the default reasoning mode in reasoner_gr…
jeremyzhang866 Sep 26, 2025
599bc21
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 26, 2025
c8ccadd
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 28, 2025
244ec0c
Merge branch 'main' into jeremy_reasoner_grammer_fix
JustinTong0323 Sep 28, 2025
286f35d
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 28, 2025
50d4d22
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 28, 2025
1694aee
Merge branch 'main' into jeremy_reasoner_grammer_fix
JustinTong0323 Sep 29, 2025
3e70338
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 29, 2025
93daf97
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Sep 30, 2025
fbab761
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Oct 9, 2025
cdb8c6c
Merge branch 'main' into jeremy_reasoner_grammer_fix
JustinTong0323 Oct 16, 2025
e5b89ff
Merge branch 'main' into jeremy_reasoner_grammer_fix
JustinTong0323 Oct 20, 2025
aead1b5
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Oct 22, 2025
881f12d
Merge branch 'main' into jeremy_reasoner_grammer_fix
jeremyzhang866 Oct 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions python/sglang/srt/constrained/base_grammar_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ class CacheEntry:
class BaseGrammarBackend:
def __init__(self):
self.executor = ThreadPoolExecutor()
self.cache: Dict[Tuple[str, str], CacheEntry] = {}
self.cache: Dict[Tuple[str, str, bool], CacheEntry] = {}

def _not_supported(self, key_type: str, key_string: str) -> None:
logger.warning(f"Skip unsupported {key_type=}, {key_string=}")
Expand All @@ -150,9 +150,11 @@ def dispatch_ebnf(self, key_string: str) -> Optional[BaseGrammarObject]:
def dispatch_structural_tag(self, key_string: str) -> Optional[BaseGrammarObject]:
return self._not_supported("structural_tag", key_string)

def _init_value_dispatch(self, key: Tuple[str, str]) -> Optional[BaseGrammarObject]:
def _init_value_dispatch(
self, key: Tuple[str, str, bool]
) -> Optional[BaseGrammarObject]:
s = time.perf_counter()
key_type, key_string = key
key_type, key_string, may_can_reasoning = key
if key_type == "json":
grammar = self.dispatch_json(key_string)
elif key_type == "regex":
Expand All @@ -172,16 +174,14 @@ def _init_value_dispatch(self, key: Tuple[str, str]) -> Optional[BaseGrammarObje
grammar.grammar_stats.compilation_time = time.perf_counter() - s
return grammar

def get_cached_or_future_value(
self, key: Tuple[str, str]
) -> Optional[BaseGrammarObject]:
def get_cached_or_future_value(self, key: Tuple[str, str, bool]):
value = self.cache.get(key)
if value:
return value.copy(), True
value = self.executor.submit(self._init_value_dispatch, key)
return value, False

def set_cache(self, key: Tuple[str, str], value: BaseGrammarObject):
def set_cache(self, key: Tuple[str, str, bool], value: BaseGrammarObject):
self.cache[key] = value

def reset(self):
Expand Down
17 changes: 13 additions & 4 deletions python/sglang/srt/constrained/reasoner_grammar_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@


class ReasonerGrammarObject(BaseGrammarObject):
def __init__(self, grammar: BaseGrammarObject, think_end_id):
def __init__(self, grammar: BaseGrammarObject, think_end_id, may_can_reasoning):
super().__init__()
self.grammar = grammar
self.think_end_id = think_end_id
self.is_in_reasoning = True
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don't we simpily set this field to False?

self.is_in_reasoning = may_can_reasoning

def accept_token(self, token: int):
if token == self.think_end_id:
Expand All @@ -38,11 +38,17 @@ def accept_token(self, token: int):
if not self.is_in_reasoning and token != self.think_end_id:
self.grammar.accept_token(token)

def rollback(self, k: int):
self.grammar.rollback(k)

def allocate_vocab_mask(
self, vocab_size: int, batch_size: int, device
) -> torch.Tensor:
return self.grammar.allocate_vocab_mask(vocab_size, batch_size, device)

def is_terminated(self):
return self.grammar.is_terminated()

def fill_vocab_mask(self, vocab_mask: torch.Tensor, idx: int) -> None:
if not self.is_in_reasoning:
self.grammar.fill_vocab_mask(vocab_mask, idx)
Expand All @@ -55,7 +61,9 @@ def apply_vocab_mask(self):
return self.grammar.apply_vocab_mask

def copy(self) -> BaseGrammarObject:
return ReasonerGrammarObject(self.grammar.copy(), self.think_end_id)
return ReasonerGrammarObject(
self.grammar.copy(), self.think_end_id, self.is_in_reasoning
)

@property
def finished(self):
Expand Down Expand Up @@ -90,4 +98,5 @@ def _init_value_dispatch(self, key: Tuple[str, str]) -> Optional[BaseGrammarObje
# avoid wrapping invalid grammar, so that the scheduler can detect it
if ret is None or ret is INVALID_GRAMMAR_OBJ:
return ret
return ReasonerGrammarObject(ret, self.think_end_id)
may_can_reasoning = key[2]
return ReasonerGrammarObject(ret, self.think_end_id, may_can_reasoning)
5 changes: 5 additions & 0 deletions python/sglang/srt/managers/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1318,6 +1318,11 @@ def handle_generate_request(
elif req.sampling_params.structural_tag:
key = ("structural_tag", req.sampling_params.structural_tag)

may_can_reasoning = not getattr(
self.tokenizer, "think_end_id", None
) in getattr(req, "origin_input_ids", [])
key = (key[0], key[1], may_can_reasoning)

value, cache_hit = self.grammar_backend.get_cached_or_future_value(key)
req.grammar = value

Expand Down
Loading