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_lenView on GitHub (pinned to a597f97485)
Solutions
- To disable, remove encoder_no_repeat_ngram_size from the generate call / config
- Otherwise pass a positive int, typically 2–4: encoder_no_repeat_ngram_size=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
- Omit the parameter to disable encoder n-gram blocking
- Use 2-4 in practice
- Ensure encoder_input_ids come from the same tokenizer
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
- `temperature` (={temperature}) has to be a strictly positive
- `penalty` has to be a strictly positive float, but is {penal
- `prompt_ignore_length` has to be a positive integer, but is
- `top_p` has to be a float > 0 and < 1, but is {top_p}
- `min_tokens_to_keep` has to be a positive integer, but is {m
AI-assisted analysis of huggingface/transformers@a597f97485 (2026-08-14).
Data as JSON: /api/errors/e43489b33b5bb581.
Report an issue: GitHub.