{"record":{"id":"6e980e03b4743d4b","repo":"sgl-project/sglang","slug":"name-must-be-provided","errorCode":null,"errorMessage":"name must be provided","messagePattern":"name must be provided","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/lang/ir.py","lineNumber":630,"sourceCode":"    def __init__(self):\n        super().__init__()\n\n    def __repr__(self):\n        return \"CommitLazy()\"\n\n\nclass SglSeparateReasoning(SglExpr):\n    def __init__(self, model_type: str, expr: SglExpr):\n        super().__init__()\n        self.model_type = model_type\n\n        self.expr = expr\n        self.name = None\n        self._process_expr(expr)\n\n    def process_name_for_reasoning(self, name):\n        if not name:\n            raise ValueError(\"name must be provided\")\n        return f\"{name}_reasoning_content\"\n\n    def _process_expr(self, expr):\n        if isinstance(expr, SglGen):\n            self.name = self.process_name_for_reasoning(expr.name)\n        elif isinstance(expr, SglSelect):\n            self.name = self.process_name_for_reasoning(expr.name)\n        elif isinstance(expr, SglExprList):\n            for x in expr.expr_list:\n                self._process_expr(x)\n\n    def __repr__(self):\n        return f\"SeparateReasoning(model_type={self.model_type}, name={self.name})\"\n","sourceCodeStart":612,"sourceCodeEnd":644,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/lang/ir.py#L612-L644","documentation":"process_name_for_reasoning builds a '<name>_reasoning_content' output key from a generation expression's name and requires a non-empty name. When expr.name is None/empty (e.g. sgen called without name=), ValueError is raised because there is no key to attach reasoning output to.","triggerScenarios":"Using separate reasoning (e.g. _execute_separate_reasoning path) with a SglGen/SglSelect expression that was created without a name parameter, so process_name_for_reasoning receives a falsy name.","commonSituations":"Adding sgen(...) calls without name=\"...\" in an SGL function and then enabling reasoning separation; relying on older code where names were auto-generated.","solutions":["Pass an explicit name to the generation call: sgen(..., name=\"answer\")","Check that every gen/select inside the function that reasoning applies to has a unique non-empty name"],"exampleFix":"# before\ngen(\"...\", temperature=0.7)\n\n# after\ngen(\"...\", name=\"answer\", temperature=0.7)","handlingStrategy":"validation","validationCode":"if not getattr(gen_expr, \"name\", None):\n    gen_expr.name = \"answer\"  # or raise early with context\nresult = separate_reasoning(gen_expr)","typeGuard":null,"tryCatchPattern":"try:\n    out = separate_reasoning(expr)\nexcept ValueError as e:\n    if \"name must be provided\" in str(e):\n        expr.name = expr.name or \"answer\"\n        out = separate_reasoning(expr)\n    else:\n        raise","preventionTips":["Always pass name= to every gen()/select() that reasoning will read from","Write a test asserting all named generations before enabling reasoning separation"],"tags":["sglang","reasoning","naming","validation"],"backgroundTag":"missing-required-parameter","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}