{"record":{"id":"febe718cf3637e16","repo":"sgl-project/sglang","slug":"label-token-ids-is-required-for-generation-causal","errorCode":null,"errorMessage":"label_token_ids is required for generation (CausalLM) models.","messagePattern":"label_token_ids is required for generation \\(CausalLM\\) models\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/managers/tokenizer_manager_score_mixin.py","lineNumber":480,"sourceCode":"           multiple items into a single sequence using delimiter for efficient processing.\n           Note: item_first parameter is ignored in multi-item scoring mode since it uses\n           a fixed format: query<delimiter>item1<delimiter>item2<delimiter>item3<delimiter>\n\n           Multi-item scoring works with both text and pre-tokenized inputs:\n           - Text: query<delimiter_text>item1<delimiter_text>item2<delimiter_text>item3<delimiter_text>\n           - Tokens: query<delimiter_token_id>item1<delimiter_token_id>item2<delimiter_token_id>item3<delimiter_token_id>\n\n        Supports two model types:\n        - Generation (CausalLM): Requires label_token_ids; returns logprob-based scores.\n        - SequenceClassification: label_token_ids is optional; returns pooled class logits.\n\n        return_pooled_hidden_states is only supported for non-generation models\n        (SequenceClassification, RewardModel); raises ValueError for CausalLM.\n        \"\"\"\n        is_generation = self.is_generation\n\n        if is_generation and label_token_ids is None:\n            raise ValueError(\n                \"label_token_ids is required for generation (CausalLM) models.\"\n            )\n        if items is None:\n            raise ValueError(\"items must be provided\")\n        if not items:\n            return ScoreResult(scores=[], prompt_tokens=0)\n\n        has_embeds = (\n            query_embed_overrides is not None or item_embed_overrides is not None\n        )\n        if has_embeds and embed_override_token_id is None:\n            raise ValueError(\n                \"embed_override_token_id is required when query_embed_overrides \"\n                \"or item_embed_overrides are supplied.\"\n            )\n        if item_first and has_embeds:\n            raise ValueError(\"item_first is not supported when embeddings are supplied\")\n        if item_embed_overrides is not None and len(item_embed_overrides) != len(items):","sourceCodeStart":462,"sourceCodeEnd":498,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/managers/tokenizer_manager_score_mixin.py#L462-L498","documentation":"score_request for generation (CausalLM) models requires label_token_ids, since scoring with a generative model works by computing log-prob/scores against provided label tokens. The method reads self.is_generation and rejects the call when labels are missing.","triggerScenarios":"Calling engine.score / score_request without label_token_ids while the loaded model path/architecture is a CausalLM (is_generation True).","commonSituations":"Porting scoring code written for a SequenceClassification/RewardModel server to a CausalLM endpoint; assuming classifier-style zero-label scoring works on generative models; config flag mixups identifying the model as generative.","solutions":["Supply label_token_ids (and label_token_ids as str accepts a list of ids) matching what you want scored","Or switch to a scoring-oriented architecture (SequenceClassification / RewardModel) if you want label-free scoring"],"exampleFix":"# before\nresult = engine.score_request(query=\"Q\", items=[\"A\"], ...)\n\n# after\nresult = engine.score_request(query=\"Q\", items=[\"A\"],\n    label_token_ids=tokenizer.encode(\"A\") ...)","handlingStrategy":"validation","validationCode":"if engine.is_generation and label_token_ids is None:\n    raise ValueError(\"provide label_token_ids for CausalLM scoring\")","typeGuard":"def can_score_without_labels(engine) -> bool:\n    return not getattr(engine, \"is_generation\", True)","tryCatchPattern":"try:\n    r = engine.score_request(query=q, items=items)\nexcept ValueError as e:\n    if \"label_token_ids is required\" in str(e):\n        r = engine.score_request(query=q, items=items, label_token_ids=labels)\n    else:\n        raise","preventionTips":["Check /get_server_info model type before writing scoring clients","For CausalLM scoring always construct label_token_ids from the target text","Use SequenceClassification/Reward checkpoints for label-free scoring"],"tags":["scoring","causal-lm","labels","validation"],"backgroundTag":"missing-required-parameter","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}