vllm-project/vllm · error · Error

invalid repetition detection params: {message}

Error message

invalid repetition detection params: {message}

What it means

Carries a free-form message describing an invalid `repetition_detection` parameter block; the enum message is `invalid repetition detection params: {message}`. Produced by `validate_repetition_detection` (rust/src/text/src/lower.rs:212-237) in exactly two cases: `min_pattern_size > max_pattern_size`, or `max_pattern_size > 0` while `min_count < 2`. Request-validation error.

Source

Thrown at rust/src/text/src/error.rs:38

    #[error(
        "this model's maximum context length is {max_model_len} tokens, \
         but the prompt contains {prompt_len} input tokens"
    )]
    PromptTooLong { max_model_len: u32, prompt_len: u32 },
    #[error(transparent)]
    Logprobs(#[from] LogprobsError),
    #[error(transparent)]
    TokenIds(#[from] TokenIdsError),
    #[error(transparent)]
    SamplingParams(#[from] SamplingParamsError),
    #[error(
        "`min_tokens` must be less than or equal to `max_tokens`, \
         got min_tokens={min_tokens}, max_tokens={max_tokens}"
    )]
    MinTokensExceedsMaxTokens { min_tokens: u32, max_tokens: u32 },
    #[error("`thinking_token_budget` must be a non-negative integer or -1 for unlimited.")]
    InvalidThinkingTokenBudget,
    #[error("invalid repetition detection params: {message}")]
    InvalidRepetitionDetection { message: String },
    #[error("text request stream `{request_id}` closed before terminal output")]
    StreamClosedBeforeTerminalOutput { request_id: String },
    #[error(transparent)]
    Llm(#[from] LlmError),
    #[error(transparent)]
    EngineCore(#[from] EngineCoreError),
}

pub type Result<T> = std::result::Result<T, Error>;

impl Error {
    /// Whether this error represents invalid user request parameters.
    pub fn is_request_validation_error(&self) -> bool {
        match self {
            Self::PromptTooLong { .. }
            | Self::EmptyPromptTokenIds { .. }
            | Self::EmptyStopString { .. }

View on GitHub (pinned to c794754062)

Solutions

  1. Set min_pattern_size <= max_pattern_size
  2. Set min_count >= 2 when max_pattern_size > 0
  3. To disable repetition detection, omit the block or use the API's disabled form (a disabled block is filtered out before validation)

Example fix

// before
repetition_detection = { min_pattern_size: 10, max_pattern_size: 5, min_count: 1 }

// after
repetition_detection = { min_pattern_size: 5, max_pattern_size: 10, min_count: 3 }
Defensive patterns

Strategy: validation

Validate before calling

if let Some(rd) = &request.repetition_detection {
    assert!(rd.min_pattern_size <= rd.max_pattern_size);
    if rd.max_pattern_size > 0 {
        assert!(rd.min_count >= 2);
    }
}

Type guard

fn is_repetition_detection_error(e: &Error) -> bool {
    matches!(e, Error::InvalidRepetitionDetection { .. })
}

Try / catch

match lower_request(params) {
    Err(Error::InvalidRepetitionDetection { message }) => bad_request(message),
    other => other,
}

Prevention

When it happens

Trigger: Sending a request with `repetition_detection` where min_pattern_size exceeds max_pattern_size, or where detection is enabled (max_pattern_size > 0) but min_count is 0 or 1.

Common situations: Tuning anti-repetition heuristics by hand and inverting the size bounds; copying example configs from a different vLLM version with different defaults; setting min_count=1 thinking it means 'report first occurrence'.

Related errors


AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14). Data as JSON: /api/errors/6f07cd27266ed260. Report an issue: GitHub.