mudler/LocalAI · error · ValueError

unknown engine_args key {key!r}.{hint}

Error message

unknown engine_args key {key!r}.{hint}

What it means

Raised by the sglang backend's engine-args parser when a key in the engine_args JSON object does not match any field of sglang's ServerArgs dataclass. Keys are validated up front against dataclasses.fields(ServerArgs) so typos fail fast with a difflib close-match hint (e.g. 'tp_sizee' -> did you mean 'tp_size'?) instead of a TypeError during engine startup.

Source

Thrown at backend/python/sglang/backend.py:135

        early with a close-match suggestion instead of producing a confusing
        ``TypeError`` deep inside engine startup.
        """
        if not engine_args_json:
            return engine_kwargs
        try:
            extra = json.loads(engine_args_json)
        except json.JSONDecodeError as e:
            raise ValueError(f"engine_args is not valid JSON: {e}") from e
        if not isinstance(extra, dict):
            raise ValueError(
                f"engine_args must be a JSON object, got {type(extra).__name__}"
            )
        valid = {f.name for f in dataclasses.fields(ServerArgs)}
        for key in extra:
            if key not in valid:
                suggestion = difflib.get_close_matches(key, valid, n=1)
                hint = f" did you mean {suggestion[0]!r}?" if suggestion else ""
                raise ValueError(f"unknown engine_args key {key!r}.{hint}")
        engine_kwargs.update(extra)
        return engine_kwargs

    def _messages_to_dicts(self, messages) -> List[dict]:
        result: List[dict] = []
        for msg in messages:
            d = {"role": msg.role, "content": msg.content or ""}
            if msg.name:
                d["name"] = msg.name
            if msg.tool_call_id:
                d["tool_call_id"] = msg.tool_call_id
            if msg.reasoning_content:
                d["reasoning_content"] = msg.reasoning_content
            if msg.tool_calls:
                try:
                    tool_calls = json.loads(msg.tool_calls)
                except json.JSONDecodeError:
                    pass

View on GitHub (pinned to 44413a9d06)

Solutions

  1. Rename the key to the suggested close match shown in the error hint
  2. Check the ServerArgs fields for your installed sglang version: python -c 'import dataclasses, sglang; print([f.name for f in dataclasses.fields(sglang.ServerArgs)])'
  3. Remove keys not supported by your sglang version

Example fix

# before
engine_args: '{"tensor_para_size": 2}'

# after
engine_args: '{"tp_size": 2}'
Defensive patterns

Strategy: validation

Validate before calling

import dataclasses, json, sglang
valid = {f.name for f in dataclasses.fields(sglang.ServerArgs)}
extra = json.loads(cfg['engine_args'])
unknown = [k for k in extra if k not in valid]
if unknown:
    raise ValueError(f'keys not in ServerArgs: {unknown}; valid e.g. {sorted(valid)[:10]}')

Type guard

def engine_args_keys_valid(s: str) -> bool:
    try:
        return set(json.loads(s)) <= {f.name for f in dataclasses.fields(ServerArgs)}
    except (TypeError, json.JSONDecodeError):
        return False

Try / catch

try:
    kwargs = _apply_engine_args(base, engine_args_json)
except ValueError as err:
    fail_config(str(err))  # message includes the did-you-mean hint

Prevention

When it happens

Trigger: Including a key like 'tensor_para_size' (vllm naming) instead of 'tp_size' (sglang naming), or passing an option that exists in a different sglang version's ServerArgs.

Common situations: Copying vllm engine_args into an sglang model config, version drift where ServerArgs fields were renamed/removed, or camelCase vs snake_case mistakes.

Related errors


AI-assisted analysis of mudler/LocalAI@44413a9d06 (2026-08-15). Data as JSON: /api/errors/97b4abbd4a75994d. Report an issue: GitHub.