{"record":{"id":"ebe2fe0088162937","repo":"sgl-project/sglang","slug":"cache-dit-params-must-be-a-dict-got-type-raw","errorCode":null,"errorMessage":"cache_dit_params must be a dict, got {type(raw).__name__}.","messagePattern":"cache_dit_params must be a dict, got (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py","lineNumber":228,"sourceCode":"CACHE_DIT_REQUEST_SCM_KEYS = frozenset(\n    {\n        \"scm_preset\",\n        \"scm_compute_bins\",\n        \"scm_cache_bins\",\n        \"scm_policy\",\n    }\n)\nCACHE_DIT_REQUEST_PARAM_KEYS = (\n    CACHE_DIT_REQUEST_KNOB_KEYS | CACHE_DIT_REQUEST_SCM_KEYS | {\"secondary\"}\n)\n\n\ndef resolve_cache_dit_request_overrides(raw: dict | None) -> dict:\n    \"\"\"Validate cache_dit_params and return a copy; unknown keys fail the request.\"\"\"\n    if raw is None:\n        return {}\n    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)}. \"","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py#L210-L246","documentation":"resolve_cache_dit_request_overrides validates the per-request cache_dit_params field (reached via _maybe_enable_cache_dit). After the None check, it requires the value to be a dict; any other type (string, list, number) fails fast so the request is rejected before cache-dit is configured.","triggerScenarios":"Sending a generate/image request with cache_dit_params set to a non-dict value, e.g. cache_dit_params=\"true\" or [\"steps\", 4], which reaches resolve_cache_dit_request_overrides.","commonSituations":"Client-side JSON double-encoding turning the dict into a string; passing a list of key-value pairs; a request schema defaulting cache_dit_params to a non-dict sentinel.","solutions":["Send cache_dit_params as a JSON object (e.g. {\"secondary\": {...}}) or omit it / pass null for defaults.","Fix client serialization that double-encodes the dict as a string.","Add request-schema validation enforcing an object type for this field."],"exampleFix":"// before\nrequest(cache_dit_params='[{\"cfg\": 1.0}]')  // string\n// after\nrequest(cache_dit_params={\"secondary\": {\"cfg\": 1.0}})  // object","handlingStrategy":"type-guard","validationCode":"if cache_dit_params is not None and not isinstance(cache_dit_params, dict):\n    raise TypeError(\"cache_dit_params must be a dict or None\")\nresp = client.generate(prompt, cache_dit_params=cache_dit_params)","typeGuard":"def is_valid_cache_dit_params(v: object) -> bool:\n    return v is None or isinstance(v, dict)","tryCatchPattern":"try:\n    client.generate(prompt, cache_dit_params=params)\nexcept ValueError as e:\n    if \"must be a dict\" in str(e):\n        params = json.loads(params) if isinstance(params, str) else {}\n        retry(client.generate, prompt, cache_dit_params=params)\n    else:\n        raise","preventionTips":["Type cache_dit_params as dict | None in client schemas.","Avoid double JSON-encoding request extras.","Add server-side schema validation so non-dicts are rejected with a 4xx before the runtime."],"tags":["cache-dit","request-validation","type-error","config"],"backgroundTag":"request-schema-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}