{"record":{"id":"46abdc171290b377","repo":"sgl-project/sglang","slug":"unknown-config-key-key-r-valid-keys-sorted-de","errorCode":null,"errorMessage":"Unknown config key {key!r}. Valid keys: {sorted(defaults)}","messagePattern":"Unknown config key (.+?)\\. Valid keys: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/debug_utils/dumper.py","lineNumber":116,"sourceCode":"    def from_kv_pairs(cls, pairs: Optional[List[str]]) -> \"_BaseConfig\":\n        return cls(**cls._kv_pairs_to_dict(pairs))\n\n    @classmethod\n    def _kv_pairs_to_dict(cls, pairs: Optional[List[str]]) -> dict:\n        if not pairs:\n            return {}\n\n        missing = object()\n        defaults = {f.name: f.default for f in fields(cls)}\n        result: dict = {}\n\n        for pair in pairs:\n            key, sep, value = pair.partition(\"=\")\n            if not sep:\n                raise ValueError(f\"Invalid config pair (missing '='): {pair!r}\")\n            default = defaults.get(key, missing)\n            if default is missing:\n                raise ValueError(\n                    f\"Unknown config key {key!r}. Valid keys: {sorted(defaults)}\"\n                )\n            try:\n                result[key] = cls._parse_env_value(value, default)\n            except (ValueError, TypeError) as exc:\n                field_type = type(default).__name__\n                raise TypeError(f\"{key}: expected {field_type}, got {value!r}\") from exc\n\n        return result\n\n\n_DEFAULT_EXP_NAME_PREFIX = \"dump_\"\n\n\n@dataclass(frozen=True)\nclass DumperConfig(_BaseConfig):\n    enable: bool = False\n    filter: Optional[str] = None","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/debug_utils/dumper.py#L98-L134","documentation":"Raised when a kv pair's key does not match any dataclass field of the config class. from_kv_pairs validates keys against the set of dataclass fields (with defaults) before parsing values, and lists the valid keys in the message. This catches misspelled or outdated config option names.","triggerScenarios":"Calling from_kv_pairs(['phasee=decode']) where 'phasee' is not a field of the config dataclass; using a key removed or renamed in a newer sglang version.","commonSituations":"Typos in option names, stale scripts written against an older field set after the dumper config schema changed, copy-pasting options from another tool's docs.","solutions":["Read the error message: it prints the sorted list of valid keys","Fix the spelling / rename of the offending key","Re-generate your config list from the current dataclass fields (e.g. via dataclasses.fields) after upgrading sglang"],"exampleFix":"// before\ncfg = DumpConfig.from_kv_pairs([\"phase=decode\", \"phaze=prefill\"])\n// after\ncfg = DumpConfig.from_kv_pairs([\"phase=decode\", \"phase=prefill\"])","handlingStrategy":"validation","validationCode":"from dataclasses import fields\nvalid = {f.name for f in fields(DumpConfig)}\nkeys = [p.partition(\"=\")[0] for p in pairs]\nunknown = [k for k in keys if k not in valid]\nassert not unknown, f\"unknown keys {unknown}, valid: {sorted(valid)}\"","typeGuard":null,"tryCatchPattern":"try:\n    cfg = DumpConfig.from_kv_pairs(pairs)\nexcept ValueError as e:\n    if \"Unknown config key\" in str(e):\n        # message lists valid keys; surface to user\n        ...","preventionTips":["Derive key names from dataclasses.fields at build time instead of hardcoding strings","Pin the sglang version your config scripts target"],"tags":["config","validation","unknown-key"],"backgroundTag":"unknown-config-key","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}