{"record":{"id":"4814dac270ae4ea3","repo":"PaddlePaddle/PaddleOCR","slug":"decoder-start-token-id-or-bos-token-id-has-to","errorCode":null,"errorMessage":"`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation.","messagePattern":"`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ppocr/modeling/heads/rec_unimernet_head.py","lineNumber":2154,"sourceCode":"\n    def _get_decoder_start_token_id(\n        self, decoder_start_token_id=None, bos_token_id=None\n    ) -> int:\n        decoder_start_token_id = (\n            decoder_start_token_id\n            if decoder_start_token_id is not None\n            else self.generation_config.decoder_start_token_id\n        )\n        bos_token_id = (\n            bos_token_id\n            if bos_token_id is not None\n            else self.generation_config.bos_token_id\n        )\n        if decoder_start_token_id is not None:\n            return decoder_start_token_id\n        elif bos_token_id is not None:\n            return bos_token_id\n        raise ValueError(\n            \"`decoder_start_token_id` or `bos_token_id` has to be defined for encoder-decoder generation.\"\n        )\n\n    def _prepare_decoder_input_ids_for_generation(\n        self,\n        batch_size,\n        model_kwargs,\n        decoder_start_token_id=None,\n        bos_token_id=None,\n    ):\n        if model_kwargs is not None and \"decoder_input_ids\" in model_kwargs:\n            decoder_input_ids = model_kwargs.pop(\"decoder_input_ids\")\n        elif \"input_ids\" in model_kwargs:\n            decoder_input_ids = model_kwargs.pop(\"input_ids\")\n        else:\n            decoder_input_ids = None\n\n        decoder_start_token_id = self._get_decoder_start_token_id(","sourceCodeStart":2136,"sourceCodeEnd":2172,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/ppocr/modeling/heads/rec_unimernet_head.py#L2136-L2172","documentation":"For encoder-decoder generation the first decoded token must come from somewhere; this helper resolves it from decoder_start_token_id or bos_token_id (argument, then generation_config). If both resolve to None it raises this ValueError because generation cannot build the initial [batch,1] decoder input.","triggerScenarios":"Calling generate on the UniMERNet head when neither decoder_start_token_id nor bos_token_id is passed and generation_config leaves both unset.","commonSituations":"Loading a fine-tuned checkpoint whose config dropped generation fields; building GenerationConfig manually and forgetting the start token; VQ-style tokenizers where bos was never defined.","solutions":["Set generation_config.decoder_start_token_id (or bos_token_id) to a valid token id, e.g. the tokenizer/pad id used during training","Or pass decoder_start_token_id explicitly to generate()"],"exampleFix":"# before\ngeneration_config = GenerationConfig(...)\n# after\ngeneration_config = GenerationConfig(\n    ..., decoder_start_token_id=tokenizer.bos_token_id,\n)","handlingStrategy":"validation","validationCode":"start = (decoder_start_token_id\n         or generation_config.decoder_start_token_id\n         or generation_config.bos_token_id)\nassert start is not None, 'set decoder_start_token_id or bos_token_id before generate'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Persist decoder_start_token_id in every checkpoint's generation_config","Smoke-test generate() with batch size 1 right after loading a model"],"tags":["paddle","generation","config","missing-argument"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}