{"record":{"id":"0f301b9de4910e96","repo":"sgl-project/sglang","slug":"invalid-component-residency-assignment-value-r","errorCode":null,"errorMessage":"Invalid component residency assignment: {value!r}","messagePattern":"Invalid component residency assignment: (.+?)","errorType":"validation","errorClass":"ComponentResidencyError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/managers/memory_managers/component_residency.py","lineNumber":65,"sourceCode":"    LAYERWISE_OFFLOAD_IMAGE_ENCODER_GROUP,\n    LAYERWISE_OFFLOAD_VAE_GROUP,\n)\n\n\ndef normalize_component_residency(\n    assignments: str | Sequence[str] | Mapping[str, str] | None,\n) -> dict[str, str] | None:\n    if assignments is None:\n        return None\n\n    if isinstance(assignments, Mapping):\n        entries = assignments.items()\n    else:\n        values = [assignments] if isinstance(assignments, str) else assignments\n        parsed_entries: list[tuple[str, str]] = []\n        for value in values:\n            if not isinstance(value, str):\n                raise ComponentResidencyError(\n                    f\"Invalid component residency assignment: {value!r}\"\n                )\n            for assignment in value.split(\",\"):\n                assignment = assignment.strip()\n                if not assignment:\n                    continue\n                if \"=\" not in assignment:\n                    raise ComponentResidencyError(\n                        \"Component residency must use COMPONENT=MODE, got \"\n                        f\"{assignment!r}\"\n                    )\n                selector, mode = assignment.split(\"=\", 1)\n                parsed_entries.append((selector, mode))\n        entries = parsed_entries\n\n    normalized: dict[str, str] = {}\n    for raw_selector, raw_mode in entries:\n        if not isinstance(raw_selector, str) or not isinstance(raw_mode, str):","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/managers/memory_managers/component_residency.py#L47-L83","documentation":"normalize_component_residency accepts assignments as a dict, a single string, or a list of strings. Non-string items inside a list (ints, dicts, None) cannot be parsed as COMPONENT=MODE and raise ComponentResidencyError.","triggerScenarios":"Passing a list like [\"vit=cpu\", 42] or [None] as the component residency value (e.g. from programmatic construction or a parsed config that wasn't all strings).","commonSituations":"Building the assignment list from JSON/YAML where one element parsed as a non-string; CLI flag reused programmatically with mixed-type input.","solutions":["Make every element a string of the form COMPONENT=MODE","Filter/validate the list to str before passing"],"exampleFix":"# before\nresidency = [\"vit=cpu\", 42]\n# after\nresidency = [\"vit=cpu\", \"unet=cpu\"]","handlingStrategy":"type-guard","validationCode":"values = assignments if isinstance(assignments, list) else [assignments]\nif any(not isinstance(v, str) for v in values):\n    raise SystemExit(\"all residency assignments must be strings\")","typeGuard":"def all_str(xs) -> bool:\n    return all(isinstance(x, str) for x in (xs if isinstance(xs, list) else [xs]))","tryCatchPattern":null,"preventionTips":["Never mix types when building residency lists from parsed data"],"tags":["config","component-residency","type-error","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}