{"record":{"id":"75925395a7379d90","repo":"sgl-project/sglang","slug":"kimi-k3-tool-parameters-required-must-be-a-strin","errorCode":null,"errorMessage":"Kimi K3 tool parameters 'required' must be a string list","messagePattern":"Kimi K3 tool parameters 'required' must be a string list","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/function_call/kimik3_structural_tag.py","lineNumber":387,"sourceCode":"    if not variants:\n        raise ValueError(\"Kimi K3 additional parameter schema accepts no values\")\n    content = variants[0] if len(variants) == 1 else OrFormat(elements=variants)\n    return TagFormat(\n        begin='<|open|>argument key=\"',\n        content=content,\n        end=ARGUMENT_CLOSE,\n    )\n\n\ndef _strict_arguments_format(parameters: Dict[str, Any]) -> Format:\n    properties = parameters.get(\"properties\", {})\n    if not isinstance(properties, dict):\n        raise ValueError(\"Kimi K3 tool parameters 'properties' must be an object\")\n    required = parameters.get(\"required\", [])\n    if not isinstance(required, list) or not all(\n        isinstance(item, str) for item in required\n    ):\n        raise ValueError(\"Kimi K3 tool parameters 'required' must be a string list\")\n\n    required_set = set(required)\n    missing = required_set.difference(properties)\n    if missing:\n        raise ValueError(\n            f\"Kimi K3 required parameters are missing schemas: {sorted(missing)!r}\"\n        )\n\n    elements: List[Format] = []\n    for key, schema in properties.items():\n        if not isinstance(key, str) or not isinstance(schema, (bool, dict)):\n            raise ValueError(\"Kimi K3 tool property schemas must be JSON schemas\")\n        argument = _known_argument_format(key, schema, parameters)\n        if argument is None:\n            if key in required_set:\n                raise ValueError(\n                    f\"Kimi K3 required parameter {key!r} accepts no values\"\n                )","sourceCodeStart":369,"sourceCodeEnd":405,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/function_call/kimik3_structural_tag.py#L369-L405","documentation":"In strict mode the Kimi K3 structural-tag builder reads tool.parameters.required and requires it to be a list of strings. Any other shape (string, dict, list containing non-strings) prevents computing the required-property set, so it fails fast.","triggerScenarios":"A tool schema with \"required\": \"city\", \"required\": {\"city\": true}, or \"required\": [\"city\", 3].","commonSituations":"Schemas written from memory where required is given as a single name or an object map; loose conversions from Pydantic or OpenAPI that emit non-standard required shapes.","solutions":["Make required a list of property-name strings, e.g. [\"city\", \"units\"]","Omit required entirely if no property is mandatory","Validate with a JSON Schema linter/meta-schema before launching the server"],"exampleFix":"// before\n\"required\": \"city\"\n// after\n\"required\": [\"city\"]","handlingStrategy":"validation","validationCode":"req = params.get(\"required\", [])\nassert isinstance(req, list) and all(isinstance(x, str) for x in req)","typeGuard":"def valid_required(params: dict) -> bool:\n    r = params.get(\"required\", [])\n    return isinstance(r, list) and all(isinstance(i, str) for i in r)","tryCatchPattern":"try:\n    build_tag(tools)\nexcept ValueError as e:\n    if \"required\" in str(e):\n        normalize_required(tools)\n    else:\n        raise","preventionTips":["Always write required as a list of strings","Omit required when empty","Validate tool JSON before server submission"],"tags":["kimi-k3","json-schema","required-fields","validation"],"backgroundTag":"json-schema-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}