{"record":{"id":"bbcc94c832050fbc","repo":"sgl-project/sglang","slug":"inkling-reasoning-effort-must-not-be-a-boolean","errorCode":null,"errorMessage":"Inkling reasoning_effort must not be a boolean","messagePattern":"Inkling reasoning_effort must not be a boolean","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"python/sglang/srt/entrypoints/openai/serving_chat.py","lineNumber":646,"sourceCode":"        if (\n            last.get(\"role\") != \"assistant\"\n            or not isinstance(last.get(\"content\"), str)\n            or last.get(\"tool_calls\")\n            or last.get(\"reasoning_content\")\n        ):\n            return None\n        messages.pop()\n        return last[\"content\"]\n\n    @staticmethod\n    def _parse_inkling_reasoning_effort(\n        value: Optional[Union[str, float]],\n    ) -> Optional[float]:\n        \"\"\"Convert an OpenAI-style reasoning_effort to an Inkling float.\"\"\"\n        if value is None:\n            return None\n        if isinstance(value, bool):\n            raise ValueError(\"Inkling reasoning_effort must not be a boolean\")\n        if isinstance(value, (int, float)):\n            parsed = float(value)\n            if not math.isfinite(parsed) or not 0.0 <= parsed <= 0.99:\n                raise ValueError(\"Inkling reasoning_effort must be in [0.0, 0.99]\")\n            return parsed\n        _EFFORT_MAP = {\n            \"none\": 0.0,\n            \"minimal\": 0.1,\n            \"low\": 0.2,\n            \"medium\": 0.7,\n            \"high\": 0.9,\n            \"xhigh\": 0.99,\n            \"max\": 0.99,\n        }\n        if value in _EFFORT_MAP:\n            return _EFFORT_MAP[value]\n        try:\n            parsed = float(value)","sourceCodeStart":628,"sourceCodeEnd":664,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/openai/serving_chat.py#L628-L664","documentation":"_parse_inkling_reasoning_effort rejects boolean reasoning_effort values for Inkling (GLM-style hybrid) models, which map effort to a float in [0, 0.99]. In Python bool is a subclass of int, so the check runs before numeric conversion to avoid True -> 1.0 silently failing the range check.","triggerScenarios":"Chat completion against an Inkling model with reasoning_effort=true/false, or chat_template_kwargs.reasoning_effort set to a boolean.","commonSituations":"Config systems encoding 'on'/'off' as booleans; clients that treat effort as a toggle; templated request bodies substituting booleans.","solutions":["Pass a number 0.0-0.99 or a recognized label string ('none','low','medium','high',...)","To disable reasoning use the appropriate enable/disable flag, not effort=false"],"exampleFix":"// before\n{\"reasoning_effort\": true}\n// after\n{\"reasoning_effort\": 0.9}","handlingStrategy":"type-guard","validationCode":"assert not isinstance(effort, bool), 'effort must not be boolean'","typeGuard":"def is_valid_inkling_effort(v):\n    return v is None or (not isinstance(v, bool) and (isinstance(v, (int, float)) or isinstance(v, str)))","tryCatchPattern":null,"preventionTips":["Map on/off config flags to 0.0-0.9 floats, never booleans"],"tags":["inkling","reasoning","type-validation","sglang"],"backgroundTag":"invalid-request-parameter","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}