huggingface/transformers · error · ValueError

`bad_words_ids` has to be a non-empty list, but is {bad_word

Error message

`bad_words_ids` has to be a non-empty list, but is {bad_words_ids}.

What it means

Error "`bad_words_ids` has to be a non-empty list, but is {bad_words_ids}." thrown in huggingface/transformers.

Source

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

        # Filter EOS token from bad_words_ids
        if eos_token_id is not None:
            if not isinstance(eos_token_id, torch.Tensor):
                if isinstance(eos_token_id, int):
                    eos_token_id = [eos_token_id]
                eos_token_id = torch.tensor(eos_token_id)

            eos_token_id_list = eos_token_id.tolist()  # convert to python list before
            bad_words_ids = list(
                filter(lambda bad_token_seq: all(bad_token_seq != [i] for i in eos_token_id_list), bad_words_ids)
            )
        # Forbidding a sequence is equivalent to setting its bias to -inf
        sequence_bias = {tuple(sequence): float("-inf") for sequence in bad_words_ids}
        super().__init__(sequence_bias=sequence_bias)

    def _validate_arguments(self):
        bad_words_ids = self.bad_word_ids
        if not isinstance(bad_words_ids, list) or len(bad_words_ids) == 0:
            raise ValueError(f"`bad_words_ids` has to be a non-empty list, but is {bad_words_ids}.")
        if any(not isinstance(bad_word_ids, list) for bad_word_ids in bad_words_ids):
            raise ValueError(f"`bad_words_ids` has to be a list of lists, but is {bad_words_ids}.")
        if any(
            any((not isinstance(token_id, (int, np.integer)) or token_id < 0) for token_id in bad_word_ids)
            for bad_word_ids in bad_words_ids
        ):
            raise ValueError(
                f"Each list in `bad_words_ids` has to be a list of positive integers, but is {bad_words_ids}."
            )


class PrefixConstrainedLogitsProcessor(LogitsProcessor):
    r"""
    [`LogitsProcessor`] that enforces constrained generation and is useful for prefix-conditioned constrained
    generation. See [Autoregressive Entity Retrieval](https://huggingface.co/papers/2010.00904) for more information.

    Args:
        prefix_allowed_tokens_fn (`Callable[[int, torch.Tensor], list[int]]`):

View on GitHub (pinned to a597f97485)

Solutions

  1. Pass `bad_words_ids` as a non-empty list of token-id lists, e.g. `[[tok1, tok2]]`.
  2. If no words should be blocked, omit the argument instead of passing an empty list.

When it happens

Trigger: Raised in NoBadWordsLogitsProcessor.__init__ when bad_words_ids is None or an empty list.

Common situations: Calling generate() with bad_words_ids=[] or constructing the processor without any banned phrases.


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