sgl-project/sglang · error · ValueError
presence_penalty must be in [-2, 2], got {self.presence_pena
Error message
presence_penalty must be in [-2, 2], got {self.presence_penalty}. What it means
SamplingParams.verify() requires presence_penalty to lie in [-2, 2] (OpenAI-compatible range). presence_penalty adds a flat penalty to tokens that have already appeared at least once; values outside the range raise this ValueError during normalize()/verify().
Source
Thrown at python/sglang/srt/sampling/sampling_params.py:179
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(
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}."
)View on GitHub (pinned to 0132848349)
Solutions
- Clamp presence_penalty to [-2, 2]
- Add request validation middleware for penalty fields
- Use 0.0 to disable
Example fix
# before params = SamplingParams(presence_penalty=penalty) # after params = SamplingParams(presence_penalty=max(-2.0, min(2.0, penalty)))
Defensive patterns
Strategy: validation
Validate before calling
presence_penalty = max(-2.0, min(2.0, presence_penalty)) params = SamplingParams(presence_penalty=presence_penalty)
Type guard
def valid_presence_penalty(p):
return isinstance(p,(int,float)) and -2.0 <= p <= 2.0 Try / catch
try:
llm.generate(prompts, SamplingParams(presence_penalty=p))
except ValueError as e:
if 'presence_penalty' in str(e):
p = 0.0
else:
raise Prevention
- Clamp presence_penalty to [-2, 2] for OpenAI-API compatibility
- Use 0.0 to disable
When it happens
Trigger: Passing SamplingParams(presence_penalty=2.5) or below -2; OpenAI-style API requests with out-of-range presence_penalty forwarded to SGLang.
Common situations: Proxy servers forwarding unvalidated OpenAI request fields; experiment scripts sweeping penalties outside the legal range; users assuming 0-10 scale.
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/a19946a42bf8e6a3.
Report an issue: GitHub.