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

  1. Use repetition_penalty=1.0 to disable
  2. Keep values in (0, 2]; typical range 1.0-1.3
  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

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


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/07a1954e88c2d5c9. Report an issue: GitHub.