{"record":{"id":"0c673c53fb92a5e4","repo":"sgl-project/sglang","slug":"tried-to-append-none-to-state","errorCode":null,"errorMessage":"Tried to append None to state.","messagePattern":"Tried to append None to state\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/lang/interpreter.py","lineNumber":1025,"sourceCode":"                        break\n        else:\n            if var_name is None:\n                yield self.text()\n            else:\n                yield self.get_var(var_name)\n\n    def get_var(self, name):\n        return self.stream_executor.get_var(name)\n\n    def set_var(self, name, value):\n        return self.stream_executor.set_var(name, value)\n\n    def get_meta_info(self, name):\n        return self.stream_executor.get_meta_info(name)\n\n    def __iadd__(self, other):\n        if other is None:\n            raise ValueError(\"Tried to append None to state.\")\n        self.stream_executor.submit(other)\n        return self\n\n    def __getitem__(self, name):\n        return self.get_var(name)\n\n    def __setitem__(self, name, value):\n        self.set_var(name, value)\n\n    def __contains__(self, name):\n        return name in self.stream_executor.variables\n\n    def __del__(self):\n        self.stream_executor.end()\n\n    def __repr__(self) -> str:\n        return f\"ProgramState({self.text()})\"\n","sourceCodeStart":1007,"sourceCodeEnd":1043,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/lang/interpreter.py#L1007-L1043","documentation":"Raised by State.__iadd__ (the `+=` operator on an SGL program state) when the right-hand side is None. Appending None is almost always a bug — usually an expression or variable that evaluated to None being added to the program.","triggerScenarios":"`state += maybe_image` where maybe_image is None (e.g. multimodal payload absent); `state += vars.get('x')` with a missing key; a helper returning None on failure being appended unconditionally.","commonSituations":"Optional image/audio inputs not present in the request; dict.get() defaulting to None; branching logic that was supposed to append text but fell through.","solutions":["Guard the append: only `+=` when the value is not None","Fix the upstream expression so it returns '' or a valid Sgl primitive instead of None","Use explicit defaults: vars.get('x', '')"],"exampleFix":"# before\nstate += prompt_parts.get(\"image\")  # None when no image\n# after\nimg = prompt_parts.get(\"image\")\nif img is not None:\n    state += img","handlingStrategy":"type-guard","validationCode":"if value is not None:\n    state += value","typeGuard":"def appendable(v) -> bool:\n    return v is not None","tryCatchPattern":"try:\n    state += value\nexcept ValueError as e:\n    if \"None to state\" in str(e):\n        pass  # skip optional segment\n    else:\n        raise","preventionTips":["Use vars.get('x', '') instead of vars.get('x') before appending","Guard optional multimodal inputs with if-checks","Never append the result of a function that may return None without checking"],"tags":["none-check","operator-overload","dsl","validation"],"backgroundTag":"none-value-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}