huggingface/transformers · error · ValueError

`encoder_ngram_size` has to be a strictly positive integer,

Error message

`encoder_ngram_size` has to be a strictly positive integer, but is {encoder_ngram_size}

What it means

Thrown by EncoderNoRepeatNGramLogitsProcessor.__init__ when encoder_ngram_size is not a Python int or is <= 0. The processor prevents the decoder from reproducing n-grams present in the encoder (prompt) input, so the n-gram size must be a strictly positive integer. It is triggered via model.generate(encoder_no_repeat_ngram_size=...).

Source

Thrown at src/transformers/generation/logits_process.py:1182

    >>> inputs = tokenizer("Alice: I love cats. What do you love?\nBob:", return_tensors="pt")

    >>> # With greedy decoding, we see Bob repeating Alice's opinion. If Bob was a chatbot, it would be a poor one.
    >>> outputs = model.generate(**inputs)
    >>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
    Alice: I love cats. What do you love?
    Bob: I love cats. What do you

    >>> # With this logits processor, we can prevent Bob from repeating Alice's opinion.
    >>> outputs = model.generate(**inputs, encoder_no_repeat_ngram_size=2)
    >>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])
    Alice: I love cats. What do you love?
    Bob: My cats are very cute.
    ```
    """

    def __init__(self, encoder_ngram_size: int, encoder_input_ids: torch.LongTensor):
        if not isinstance(encoder_ngram_size, int) or encoder_ngram_size <= 0:
            raise ValueError(
                f"`encoder_ngram_size` has to be a strictly positive integer, but is {encoder_ngram_size}"
            )
        self.ngram_size = encoder_ngram_size
        if len(encoder_input_ids.shape) == 1:
            encoder_input_ids = encoder_input_ids.unsqueeze(0)
        self.batch_size = encoder_input_ids.shape[0]
        self.generated_ngrams = _get_ngrams(encoder_ngram_size, encoder_input_ids, self.batch_size)

    @add_start_docstrings(LOGITS_PROCESSOR_INPUTS_DOCSTRING)
    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
        # B x num_beams
        num_hypos = scores.shape[0]
        num_beams = num_hypos // self.batch_size
        cur_len = input_ids.shape[-1]
        scores_processed = scores.clone()
        banned_batch_tokens = [
            _get_generated_ngrams(
                self.generated_ngrams[hypo_idx // num_beams], input_ids[hypo_idx], self.ngram_size, cur_len

View on GitHub (pinned to a597f97485)

Solutions

  1. To disable, remove encoder_no_repeat_ngram_size from the generate call / config
  2. Otherwise pass a positive int, typically 2–4: encoder_no_repeat_ngram_size=3
  3. Coerce and validate external values before generate()

Example fix

# before
out = model.generate(**inputs, encoder_no_repeat_ngram_size=0)  # ValueError

# after
out = model.generate(**inputs)  # disabled by omission
# or:
out = model.generate(**inputs, encoder_no_repeat_ngram_size=3)
Defensive patterns

Strategy: validation

Validate before calling

def valid_encoder_ngram_size(n):
    return isinstance(n, int) and n > 0

Type guard

def is_valid_encoder_ngram_size(n) -> bool:
    return type(n) is int and n > 0

Try / catch

try:
    proc = EncoderNoRepeatNGramLogitsProcessor(int(n), encoder_input_ids=ids)
except ValueError as e:
    raise ValueError(f'encoder_no_repeat_ngram_size={n!r} must be >= 1') from e

Prevention

When it happens

Trigger: EncoderNoRepeatNGramLogitsProcessor(0); encoder_ngram_size=3.0; model.generate(encoder_no_repeat_ngram_size=-1); numpy int values.

Common situations: Encoder-side configs mirroring decoder no_repeat_ngram_size conventions where 0 means off (here, omit the key); float values from YAML; seq2seq pipelines copied from examples with modified parameters.

Related errors


AI-assisted analysis of huggingface/transformers@a597f97485 (2026-08-14). Data as JSON: /api/errors/e43489b33b5bb581. Report an issue: GitHub.