{"record":{"id":"e43489b33b5bb581","repo":"huggingface/transformers","slug":"encoder-ngram-size-has-to-be-a-strictly-positive","errorCode":null,"errorMessage":"`encoder_ngram_size` has to be a strictly positive integer, but is {encoder_ngram_size}","messagePattern":"`encoder_ngram_size` has to be a strictly positive integer, but is (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/transformers/generation/logits_process.py","lineNumber":1182,"sourceCode":"    >>> inputs = tokenizer(\"Alice: I love cats. What do you love?\\nBob:\", return_tensors=\"pt\")\n\n    >>> # With greedy decoding, we see Bob repeating Alice's opinion. If Bob was a chatbot, it would be a poor one.\n    >>> outputs = model.generate(**inputs)\n    >>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])\n    Alice: I love cats. What do you love?\n    Bob: I love cats. What do you\n\n    >>> # With this logits processor, we can prevent Bob from repeating Alice's opinion.\n    >>> outputs = model.generate(**inputs, encoder_no_repeat_ngram_size=2)\n    >>> print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])\n    Alice: I love cats. What do you love?\n    Bob: My cats are very cute.\n    ```\n    \"\"\"\n\n    def __init__(self, encoder_ngram_size: int, encoder_input_ids: torch.LongTensor):\n        if not isinstance(encoder_ngram_size, int) or encoder_ngram_size <= 0:\n            raise ValueError(\n                f\"`encoder_ngram_size` has to be a strictly positive integer, but is {encoder_ngram_size}\"\n            )\n        self.ngram_size = encoder_ngram_size\n        if len(encoder_input_ids.shape) == 1:\n            encoder_input_ids = encoder_input_ids.unsqueeze(0)\n        self.batch_size = encoder_input_ids.shape[0]\n        self.generated_ngrams = _get_ngrams(encoder_ngram_size, encoder_input_ids, self.batch_size)\n\n    @add_start_docstrings(LOGITS_PROCESSOR_INPUTS_DOCSTRING)\n    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:\n        # B x num_beams\n        num_hypos = scores.shape[0]\n        num_beams = num_hypos // self.batch_size\n        cur_len = input_ids.shape[-1]\n        scores_processed = scores.clone()\n        banned_batch_tokens = [\n            _get_generated_ngrams(\n                self.generated_ngrams[hypo_idx // num_beams], input_ids[hypo_idx], self.ngram_size, cur_len","sourceCodeStart":1164,"sourceCodeEnd":1200,"githubUrl":"https://github.com/huggingface/transformers/blob/a597f974857b3d92939971296bc0deb93d33d780/src/transformers/generation/logits_process.py#L1164-L1200","documentation":"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=...).","triggerScenarios":"EncoderNoRepeatNGramLogitsProcessor(0); encoder_ngram_size=3.0; model.generate(encoder_no_repeat_ngram_size=-1); numpy int values.","commonSituations":"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.","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()"],"exampleFix":"# before\nout = model.generate(**inputs, encoder_no_repeat_ngram_size=0)  # ValueError\n\n# after\nout = model.generate(**inputs)  # disabled by omission\n# or:\nout = model.generate(**inputs, encoder_no_repeat_ngram_size=3)","handlingStrategy":"validation","validationCode":"def valid_encoder_ngram_size(n):\n    return isinstance(n, int) and n > 0","typeGuard":"def is_valid_encoder_ngram_size(n) -> bool:\n    return type(n) is int and n > 0","tryCatchPattern":"try:\n    proc = EncoderNoRepeatNGramLogitsProcessor(int(n), encoder_input_ids=ids)\nexcept ValueError as e:\n    raise ValueError(f'encoder_no_repeat_ngram_size={n!r} must be >= 1') from e","preventionTips":["Omit the parameter to disable encoder n-gram blocking","Use 2-4 in practice","Ensure encoder_input_ids come from the same tokenizer"],"tags":["generation","encoder-no-repeat-ngram","seq2seq","argument-validation"],"backgroundTag":null,"analyzedSha":"a597f974857b3d92939971296bc0deb93d33d780","analyzedAt":"2026-08-14T18:24:08.354Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}