{"record":{"id":"3c8210cfd18f9142","repo":"sgl-project/sglang","slug":"unknown-cache-dit-params-secondary-keys-sorte","errorCode":null,"errorMessage":"Unknown cache_dit_params['secondary'] keys: {sorted(unknown)}. Valid keys: {sorted(CACHE_DIT_REQUEST_KNOB_KEYS)}.","messagePattern":"Unknown cache_dit_params\\['secondary'\\] keys: (.+?)\\. Valid keys: (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py","lineNumber":245,"sourceCode":"    if not isinstance(raw, dict):\n        raise ValueError(f\"cache_dit_params must be a dict, got {type(raw).__name__}.\")\n    unknown = set(raw) - CACHE_DIT_REQUEST_PARAM_KEYS\n    if unknown:\n        raise ValueError(\n            f\"Unknown cache_dit_params keys: {sorted(unknown)}. \"\n            f\"Valid keys: {sorted(CACHE_DIT_REQUEST_PARAM_KEYS)}.\"\n        )\n    overrides = dict(raw)\n    secondary = overrides.get(\"secondary\")\n    if secondary is not None:\n        if not isinstance(secondary, dict):\n            raise ValueError(\n                \"cache_dit_params['secondary'] must be a dict, got \"\n                f\"{type(secondary).__name__}.\"\n            )\n        unknown = set(secondary) - CACHE_DIT_REQUEST_KNOB_KEYS\n        if unknown:\n            raise ValueError(\n                f\"Unknown cache_dit_params['secondary'] keys: {sorted(unknown)}. \"\n                f\"Valid keys: {sorted(CACHE_DIT_REQUEST_KNOB_KEYS)}.\"\n            )\n        overrides[\"secondary\"] = dict(secondary)\n    return overrides\n\n\ndef cache_dit_overrides_key(overrides: dict) -> tuple:\n    \"\"\"Hashable snapshot of request overrides, for mount-change detection.\"\"\"\n\n    def _freeze(value):\n        if isinstance(value, dict):\n            return tuple(sorted((k, _freeze(v)) for k, v in value.items()))\n        if isinstance(value, (list, tuple)):\n            return tuple(_freeze(v) for v in value)\n        return value\n\n    return _freeze(overrides)","sourceCodeStart":227,"sourceCodeEnd":263,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py#L227-L263","documentation":"Once 'secondary' is confirmed to be a dict, resolve_cache_dit_request_overrides computes unknown = set(secondary) - CACHE_DIT_REQUEST_KNOB_KEYS and rejects unknown nested keys, listing the valid knob names. Only after this does it copy the dict via dict(secondary).","triggerScenarios":"Sending cache_dit_params={\"secondary\": {\"cfgx\": 1.0}} where 'cfgx' is not in CACHE_DIT_REQUEST_KNOB_KEYS.","commonSituations":"Guessing knob names ('cfg_weight' vs 'cfg'); the knob set changing between sglang versions; copying server CacheDitConfig field names into the per-request override dict.","solutions":["Use only knob names from CACHE_DIT_REQUEST_KNOB_KEYS (printed in the error message).","Set non-request-level knobs server-side via CacheDitConfig instead.","Re-check valid knob keys after upgrading sglang."],"exampleFix":"// before\nrequest(cache_dit_params={\"secondary\": {\"cfg_weight\": 1.0}})\n// after\nrequest(cache_dit_params={\"secondary\": {\"cfg\": 1.0}})","handlingStrategy":"validation","validationCode":"from sglang.multimodal_gen.runtime.cache.cache_dit_integration import CACHE_DIT_REQUEST_KNOB_KEYS\nsec = (cache_dit_params or {}).get(\"secondary\") or {}\nbad = set(sec) - CACHE_DIT_REQUEST_KNOB_KEYS\nassert not bad, f\"unknown secondary keys: {bad}\"","typeGuard":"def valid_secondary_keys(sec: dict) -> bool:\n    return set(sec) <= CACHE_DIT_REQUEST_KNOB_KEYS","tryCatchPattern":"try:\n    client.generate(prompt, cache_dit_params=params)\nexcept ValueError as e:\n    if \"cache_dit_params['secondary'] keys\" in str(e):\n        params[\"secondary\"] = {k: v for k, v in sec.items() if k in CACHE_DIT_REQUEST_KNOB_KEYS}\n        retry(client.generate, prompt, cache_dit_params=params)\n    raise","preventionTips":["Snapshot the valid knob-key set per deployed sglang version.","Add integration tests asserting request payloads only use valid knob keys.","Prefer server-level CacheDitConfig for knobs not exposed per-request."],"tags":["cache-dit","secondary-cache","unknown-key","request-validation"],"backgroundTag":"unknown-config-key","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}