sgl-project/sglang · error · ValueError

Kimi K3 required parameters are missing schemas: {sorted(mis

Error message

Kimi K3 required parameters are missing schemas: {sorted(missing)!r}

What it means

The names listed in tool.parameters.required must each have a corresponding schema in properties. If a required name has no property schema, the grammar cannot be built because a mandatory argument has no value format; the error lists the missing names sorted.

Source

Thrown at python/sglang/srt/function_call/kimik3_structural_tag.py:392

        content=content,
        end=ARGUMENT_CLOSE,
    )


def _strict_arguments_format(parameters: Dict[str, Any]) -> Format:
    properties = parameters.get("properties", {})
    if not isinstance(properties, dict):
        raise ValueError("Kimi K3 tool parameters 'properties' must be an object")
    required = parameters.get("required", [])
    if not isinstance(required, list) or not all(
        isinstance(item, str) for item in required
    ):
        raise ValueError("Kimi K3 tool parameters 'required' must be a string list")

    required_set = set(required)
    missing = required_set.difference(properties)
    if missing:
        raise ValueError(
            f"Kimi K3 required parameters are missing schemas: {sorted(missing)!r}"
        )

    elements: List[Format] = []
    for key, schema in properties.items():
        if not isinstance(key, str) or not isinstance(schema, (bool, dict)):
            raise ValueError("Kimi K3 tool property schemas must be JSON schemas")
        argument = _known_argument_format(key, schema, parameters)
        if argument is None:
            if key in required_set:
                raise ValueError(
                    f"Kimi K3 required parameter {key!r} accepts no values"
                )
            continue
        elements.append(
            argument if key in required_set else OptionalFormat(content=argument)
        )

View on GitHub (pinned to 0132848349)

Solutions

  1. Add a schema for each missing name in properties
  2. Remove stale names from required if the parameter was deleted
  3. Align names exactly (watch typos and case differences)

Example fix

// before
"properties": {"location": {"type": "string"}}, "required": ["city"]
// after
"properties": {"city": {"type": "string"}}, "required": ["city"]
Defensive patterns

Strategy: validation

Validate before calling

props = params.get("properties", {})
missing = set(params.get("required", [])).difference(props)
assert not missing, f"required without schemas: {sorted(missing)}"

Type guard

def required_has_schemas(params: dict) -> bool:
    return set(params.get("required", [])).issubset(params.get("properties", {}))

Try / catch

try:
    build_tag(tools)
except ValueError as e:
    if "missing schemas" in str(e):
        sync_required_with_properties(tools)
    else:
        raise

Prevention

When it happens

Trigger: "required": ["city"] while "properties" lacks a "city" key (typo, renamed field, or properties omitted).

Common situations: Renaming a field in properties but not in required; copying schemas between tools and leaving stale required entries; tool definitions assembled by string concatenation.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/28607a54e9f751f6. Report an issue: GitHub.