{"record":{"id":"7f5ca2fb44bbf2ac","repo":"sgl-project/sglang","slug":"reasoning-effort-must-not-be-a-boolean","errorCode":null,"errorMessage":"reasoning_effort must not be a boolean","messagePattern":"reasoning_effort must not be a boolean","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/entrypoints/openai/protocol.py","lineNumber":980,"sourceCode":"        return _migrate_deprecated_dp_rank(values)\n\n    @model_validator(mode=\"before\")\n    @classmethod\n    def set_tool_choice_default(cls, values):\n        if values.get(\"tool_choice\") is None:\n            if values.get(\"tools\") is None and not _has_message_level_tools(\n                values.get(\"messages\")\n            ):\n                values[\"tool_choice\"] = \"none\"\n            else:\n                values[\"tool_choice\"] = \"auto\"\n        return values\n\n    @field_validator(\"reasoning_effort\", mode=\"before\")\n    @classmethod\n    def validate_reasoning_effort_type(cls, value):\n        if isinstance(value, bool):\n            raise ValueError(\"reasoning_effort must not be a boolean\")\n        return value\n\n    @model_validator(mode=\"before\")\n    @classmethod\n    def normalize_reasoning_inputs(cls, values: Dict):\n        r = values.get(\"reasoning\")\n        thinking = None\n\n        if r is not None and isinstance(r, dict):\n            effort = r.get(\"effort\")\n            if effort is None:\n                effort = r.get(\"reasoning_effort\")\n            if isinstance(effort, str) and effort in {\n                \"none\",\n                \"minimal\",\n                \"low\",\n                \"medium\",\n                \"high\",","sourceCodeStart":962,"sourceCodeEnd":998,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/openai/protocol.py#L962-L998","documentation":"Chat completion request validator explicitly rejects booleans for reasoning_effort (bool is a subclass of int in Python, so this guard runs before enum checks).","triggerScenarios":"reasoning_effort=true/false or True/False in the request JSON.","commonSituations":"Config templating that substitutes booleans; YAML/JSON configs where effort level was toggled to a bool; dynamic kwargs passing unchecked flags.","solutions":["Set reasoning_effort to a valid string like 'low'/'medium'/'high' or omit it.","Audit config templating so booleans never land in reasoning_effort."],"exampleFix":"# before\n{\"reasoning_effort\": true}\n# after\n{\"reasoning_effort\": \"high\"}","handlingStrategy":"type-guard","validationCode":"if reasoning_effort is not None:\n    assert not isinstance(reasoning_effort,bool) and isinstance(reasoning_effort,str)","typeGuard":"def valid_effort(v): return v is None or (isinstance(v,str) and not isinstance(v,bool))","tryCatchPattern":null,"preventionTips":["Never let config booleans flow into reasoning_effort.","Default reasoning_effort to None or a string."],"tags":["openai-api","reasoning-effort","type-error"],"backgroundTag":"request-field-type-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}