{"record":{"id":"b6fe1baeff8784a0","repo":"sgl-project/sglang","slug":"inkling-reasoning-effort-must-be-a-number","errorCode":null,"errorMessage":"Inkling reasoning_effort must be a number","messagePattern":"Inkling reasoning_effort must be a number","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/parser/inkling_renderer.py","lineNumber":254,"sourceCode":"            text = part.get(\"thinking\")\n            if text is None:\n                text = part.get(\"text\", \"\")\n            if not isinstance(text, str):\n                raise TypeError(\"Inkling thinking part payload must be a string\")\n            yield (\"thinking\", text)\n        elif ptype in _IMAGE_PART_TYPES:\n            yield (\"image\", \"\")\n        elif ptype in _AUDIO_PART_TYPES:\n            yield (\"audio\", \"\")\n        else:\n            raise ValueError(f\"unsupported content part type: {ptype!r}\")\n\n\ndef _format_reasoning_effort(reasoning_effort: float) -> str:\n    if isinstance(reasoning_effort, bool) or not isinstance(\n        reasoning_effort, (int, float)\n    ):\n        raise TypeError(\"Inkling reasoning_effort must be a number\")\n    value = float(reasoning_effort)\n    if not math.isfinite(value) or not 0.0 <= value <= 0.99:\n        raise ValueError(\"Inkling reasoning_effort must be finite and in [0.0, 0.99]\")\n    return f\"{round(value, 2):g}\"\n\n\ndef _expect_role(message: Mapping[str, Any]) -> str:\n    role = message.get(\"role\")\n    if role not in ROLE_MESSAGE_TOKENS:\n        raise ValueError(\n            f\"unsupported Inkling message role {role!r}; expected one of {sorted(ROLE_MESSAGE_TOKENS)}\"\n        )\n    return str(role)\n\n\ndef _as_mapping(value: Any) -> Mapping[str, Any]:\n    if isinstance(value, Mapping):\n        return value","sourceCodeStart":236,"sourceCodeEnd":272,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/parser/inkling_renderer.py#L236-L272","documentation":"The Inkling effort directive formats reasoning_effort as a number; passing a bool, string, None, or other non-numeric type raises TypeError (bool is explicitly rejected even though it is an int subclass).","triggerScenarios":"Calling chat with extra_body/reasoning_effort=\"high\" (a string, as some APIs accept) or reasoning_effort=True.","commonSituations":"OpenAI's API accepts string values like 'high'/'medium'/'low'; clients reuse those strings where this renderer expects a float in [0, 0.99].","solutions":["Pass a numeric reasoning_effort, e.g. 0.8 instead of \"high\"","Map string levels yourself: {\"low\":0.2,\"medium\":0.5,\"high\":0.8}"],"exampleFix":"# before\nreasoning_effort=\"high\"\n# after\nreasoning_effort=0.8","handlingStrategy":"type-guard","validationCode":"effort = kwargs.get(\"reasoning_effort\")\nif effort is not None:\n    assert isinstance(effort, (int, float)) and not isinstance(effort, bool), type(effort)","typeGuard":"def effort_ok(e): return e is None or (isinstance(e, (int, float)) and not isinstance(e, bool))","tryCatchPattern":null,"preventionTips":["Pass numeric effort (0.0–0.99); map 'high'/'medium'/'low' strings yourself"],"tags":["inkling","reasoning-effort","type-error"],"backgroundTag":"invalid-field-type","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}