{"record":{"id":"97b4abbd4a75994d","repo":"mudler/LocalAI","slug":"unknown-engine-args-key-key-r-hint","errorCode":null,"errorMessage":"unknown engine_args key {key!r}.{hint}","messagePattern":"unknown engine_args key (.+?)\\.(.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/python/sglang/backend.py","lineNumber":135,"sourceCode":"        early with a close-match suggestion instead of producing a confusing\n        ``TypeError`` deep inside engine startup.\n        \"\"\"\n        if not engine_args_json:\n            return engine_kwargs\n        try:\n            extra = json.loads(engine_args_json)\n        except json.JSONDecodeError as e:\n            raise ValueError(f\"engine_args is not valid JSON: {e}\") from e\n        if not isinstance(extra, dict):\n            raise ValueError(\n                f\"engine_args must be a JSON object, got {type(extra).__name__}\"\n            )\n        valid = {f.name for f in dataclasses.fields(ServerArgs)}\n        for key in extra:\n            if key not in valid:\n                suggestion = difflib.get_close_matches(key, valid, n=1)\n                hint = f\" did you mean {suggestion[0]!r}?\" if suggestion else \"\"\n                raise ValueError(f\"unknown engine_args key {key!r}.{hint}\")\n        engine_kwargs.update(extra)\n        return engine_kwargs\n\n    def _messages_to_dicts(self, messages) -> List[dict]:\n        result: List[dict] = []\n        for msg in messages:\n            d = {\"role\": msg.role, \"content\": msg.content or \"\"}\n            if msg.name:\n                d[\"name\"] = msg.name\n            if msg.tool_call_id:\n                d[\"tool_call_id\"] = msg.tool_call_id\n            if msg.reasoning_content:\n                d[\"reasoning_content\"] = msg.reasoning_content\n            if msg.tool_calls:\n                try:\n                    tool_calls = json.loads(msg.tool_calls)\n                except json.JSONDecodeError:\n                    pass","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/python/sglang/backend.py#L117-L153","documentation":"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.","triggerScenarios":"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.","commonSituations":"Copying vllm engine_args into an sglang model config, version drift where ServerArgs fields were renamed/removed, or camelCase vs snake_case mistakes.","solutions":["Rename the key to the suggested close match shown in the error hint","Check the ServerArgs fields for your installed sglang version: python -c 'import dataclasses, sglang; print([f.name for f in dataclasses.fields(sglang.ServerArgs)])'","Remove keys not supported by your sglang version"],"exampleFix":"# before\nengine_args: '{\"tensor_para_size\": 2}'\n\n# after\nengine_args: '{\"tp_size\": 2}'","handlingStrategy":"validation","validationCode":"import dataclasses, json, sglang\nvalid = {f.name for f in dataclasses.fields(sglang.ServerArgs)}\nextra = json.loads(cfg['engine_args'])\nunknown = [k for k in extra if k not in valid]\nif unknown:\n    raise ValueError(f'keys not in ServerArgs: {unknown}; valid e.g. {sorted(valid)[:10]}')","typeGuard":"def engine_args_keys_valid(s: str) -> bool:\n    try:\n        return set(json.loads(s)) <= {f.name for f in dataclasses.fields(ServerArgs)}\n    except (TypeError, json.JSONDecodeError):\n        return False","tryCatchPattern":"try:\n    kwargs = _apply_engine_args(base, engine_args_json)\nexcept ValueError as err:\n    fail_config(str(err))  # message includes the did-you-mean hint","preventionTips":["Check ServerArgs fields for the installed sglang version before configuring","Do not copy vllm engine_args verbatim","Rely on the close-match hint in the error to fix typos"],"tags":["python","sglang","configuration","typo","version-drift"],"backgroundTag":null,"analyzedSha":"44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26","analyzedAt":"2026-08-15T10:13:50.291Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}