sgl-project/sglang · error · ValueError
repetition_penalty must be in (0, 2] (1.0 = no penalty), got
Error message
repetition_penalty must be in (0, 2] (1.0 = no penalty), got {self.repetition_penalty}. What it means
SamplingParams.verify() requires repetition_penalty to lie in (0, 2], where 1.0 means no penalty. Zero, negative values, and values above 2 raise this ValueError during normalize()/verify(). repetition_penalty is a multiplicative penalty on repeated-token logits (CTRL paper style), so 0 or negatives are undefined.
Source
Thrown at python/sglang/srt/sampling/sampling_params.py:184
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(
f"min_new_tokens must be in [0, max_new_tokens], got "
f"{self.min_new_tokens}."
)
if self.max_new_tokens is not None:
if self.max_new_tokens < 0:
raise ValueError(
f"max_new_tokens must be at least 0, got {self.max_new_tokens}."
)
if not self.min_new_tokens <= self.max_new_tokens:
raise ValueError(
f"min_new_tokens must be in [0, max_new_tokens({self.max_new_tokens})], got "
f"{self.min_new_tokens}."
)
if self.logit_bias is not None:
for token_id in self.logit_bias:
if not 0 <= int(token_id) < vocab_size:
raise ValueError(
f"logit_bias must has keys in [0, {vocab_size - 1}], got "View on GitHub (pinned to 0132848349)
Solutions
- Use repetition_penalty=1.0 to disable
- Keep values in (0, 2]; typical range 1.0-1.3
- Clamp: max(1.0, min(2.0, rp)) if you need a safe default
Example fix
# before params = SamplingParams(repetition_penalty=0) # after params = SamplingParams(repetition_penalty=1.0)
Defensive patterns
Strategy: validation
Validate before calling
repetition_penalty = repetition_penalty if isinstance(repetition_penalty,(int,float)) and 0.0 < repetition_penalty <= 2.0 else 1.0 params = SamplingParams(repetition_penalty=repetition_penalty)
Type guard
def valid_repetition_penalty(p):
return isinstance(p,(int,float)) and 0.0 < p <= 2.0 Try / catch
try:
llm.generate(prompts, SamplingParams(repetition_penalty=p))
except ValueError as e:
if 'repetition_penalty' in str(e):
p = 1.0
else:
raise Prevention
- Use 1.0 (not 0) to disable repetition penalty
- Note SGLang caps at 2.0 even though HF allows higher values
When it happens
Trigger: Passing SamplingParams(repetition_penalty=0) (e.g. intending 'disabled'), a negative value, or > 2 such as 3.0; verify() runs via normalize().
Common situations: Users setting 0 meaning 'off' instead of 1.0; HF transformers configs with repetition_penalty up to ~5 ported directly; hyperparameter sweeps exceeding the cap.
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}.
- top_k must be -1 (disable) or at least 1, got {self.top_k}.
AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28).
Data as JSON: /api/errors/07a1954e88c2d5c9.
Report an issue: GitHub.