sgl-project/sglang · error · ValueError
top_k must be -1 (disable) or at least 1, got {self.top_k}.
Error message
top_k must be -1 (disable) or at least 1, got {self.top_k}. What it means
SamplingParams.verify() requires top_k to be either -1 (meaning 'consider the whole vocabulary', disable top-k filtering) or an integer >= 1. Values like 0, -2, or -100 raise this ValueError during normalize()/verify(). Note that 0 is invalid even though some APIs treat 0 as disabled.
Source
Thrown at python/sglang/srt/sampling/sampling_params.py:166
# top_k = 1 means greedy sampling
self.temperature = 1.0
self.top_k = 1
if self.top_k == -1:
self.top_k = TOP_K_ALL # whole vocabulary
def verify(self, vocab_size):
if self.beam_width is not None and self.beam_width < 1:
raise ValueError(f"beam_width must be at least 1, got {self.beam_width}.")
if not math.isfinite(self.temperature) or self.temperature < 0.0:
raise ValueError(
f"temperature must be a non-negative finite number, got {self.temperature}."
)
if not 0.0 < self.top_p <= 1.0:
raise ValueError(f"top_p must be in (0, 1], got {self.top_p}.")
if not 0.0 <= self.min_p <= 1.0:
raise ValueError(f"min_p must be in [0, 1], got {self.min_p}.")
if self.top_k < 1 or self.top_k == -1:
raise ValueError(
f"top_k must be -1 (disable) or at least 1, got {self.top_k}."
)
if not -2.0 <= self.frequency_penalty <= 2.0:
raise ValueError(
"frequency_penalty must be in [-2, 2], got "
f"{self.frequency_penalty}."
)
if not -2.0 <= self.presence_penalty <= 2.0:
raise ValueError(
"presence_penalty must be in [-2, 2], got " f"{self.presence_penalty}."
)
if not 0.0 < self.repetition_penalty <= 2.0:
raise ValueError(
"repetition_penalty must be in (0, 2] (1.0 = no penalty), "
f"got {self.repetition_penalty}."
)
if not 0 <= self.min_new_tokens:
raise ValueError(View on GitHub (pinned to 0132848349)
Solutions
- Use top_k=-1 to disable top-k filtering
- Use top_k=1 for greedy decoding
- Ensure integer values >= 1 otherwise (e.g. top_k=50)
Example fix
# before params = SamplingParams(top_k=0) # after params = SamplingParams(top_k=-1) # disabled
Defensive patterns
Strategy: validation
Validate before calling
if not isinstance(top_k, int) or top_k < 1:
top_k = -1
params = SamplingParams(top_k=top_k) Type guard
def valid_top_k(k):
return isinstance(k, int) and (k == -1 or k >= 1) Try / catch
try:
llm.generate(prompts, SamplingParams(top_k=k))
except ValueError as e:
if 'top_k' in str(e):
k = -1
else:
raise Prevention
- Use -1 (never 0) to disable top-k
- Sanitize integer config fields for sentinel values
When it happens
Trigger: Passing SamplingParams(top_k=0) intending to disable top-k; any top_k < 1 other than exactly -1. verify() is invoked via normalize() when preparing the request.
Common situations: Porting configs from engines where top_k=0 means disabled; negative 'sentinel' values other than -1; UIs with 0 defaults; note the code above already maps top_k=0 -> 1 in a branch that sets top_k=1, so hitting this usually means an explicit out-of-range value.
Related errors
- beam_width must be at least 1, got {self.beam_width}.
- temperature must be a non-negative finite number, got {self.
- top_p must be in (0, 1], got {self.top_p}.
- min_p must be in [0, 1], got {self.min_p}.
- frequency_penalty must be in [-2, 2], got {self.frequency_pe
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/f09bf5354e09a4e4.
Report an issue: GitHub.