{"record":{"id":"e66e513405533cac","repo":"sgl-project/sglang","slug":"unsupported-transfer-backend-transfer-backend","errorCode":null,"errorMessage":"Unsupported transfer backend: {transfer_backend}","messagePattern":"Unsupported transfer backend: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/disaggregation/utils.py","lineNumber":693,"sourceCode":"            KVClassType.SENDER: NixlKVSender,\n            KVClassType.RECEIVER: NixlKVReceiver,\n            KVClassType.BOOTSTRAP_SERVER: NixlKVBootstrapServer,\n        }\n    elif transfer_backend == TransferBackend.FAKE:\n        from sglang.srt.disaggregation.fake import (\n            FakeKVManager,\n            FakeKVReceiver,\n            FakeKVSender,\n        )\n\n        # No bootstrap server: the fake backend never registers one.\n        class_mapping = {\n            KVClassType.MANAGER: FakeKVManager,\n            KVClassType.SENDER: FakeKVSender,\n            KVClassType.RECEIVER: FakeKVReceiver,\n        }\n    else:\n        raise ValueError(f\"Unsupported transfer backend: {transfer_backend}\")\n\n    return class_mapping.get(class_type)\n\n\ndef _get_cp_rank_page_bounds(\n    total_pages: int, cp_rank: int, cp_size: int\n) -> Tuple[int, int]:\n    base = total_pages // cp_size\n    rem = total_pages % cp_size\n    local_start = cp_rank * base + min(cp_rank, rem)\n    n_pages = base + (1 if cp_rank < rem else 0)\n    return local_start, local_start + n_pages\n\n\ndef filter_kv_indices_for_cp_rank(\n    kv_mgr: CommonKVManager,\n    kv_indices: np.ndarray,\n    index_slice: slice,","sourceCodeStart":675,"sourceCodeEnd":711,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/disaggregation/utils.py#L675-L711","documentation":"get_kv_class maps a transfer backend string (e.g. 'mooncake', 'nixl', 'fake', '') to KV manager/sender/receiver classes for disaggregated KV transfer. Any backend name not in the known mapping raises ValueError with the unsupported name.","triggerScenarios":"Passing a misspelled or unknown --disaggregation-transfer-backend value to server args, e.g. 'Nixl', 'rdma', or a backend compiled out of the current build; get_kv_class then falls through all elif branches to the final raise.","commonSituations":"Typos in launch scripts, case mismatches, backends introduced in newer SGLang versions used on an older install, or custom transfer backends registered under a different name.","solutions":["Check the spelling/case of --disaggregation-transfer-backend against supported values (e.g. mooncake, nixl, fake)","Upgrade sglang to a version that supports the backend you want","If a custom backend exists, register/alias it in get_kv_class's mapping or use its exact name"],"exampleFix":"# before\n--disaggregation-transfer-backend NIXL\n# after\n--disaggregation-transfer-backend nixl","handlingStrategy":"validation","validationCode":"SUPPORTED = {\"\", \"mooncake\", \"nixl\", \"fake\"}  # keep in sync with get_kv_class\nassert server_args.disaggregation_transfer_backend in SUPPORTED, f\"unsupported backend {server_args.disaggregation_transfer_backend}\"","typeGuard":null,"tryCatchPattern":"try:\n    cls = get_kv_class(backend, class_type)\nexcept ValueError as e:\n    raise SystemExit(f\"Bad --disaggregation-transfer-backend: {e}\") from e","preventionTips":["Validate the backend string against the docs/CLI help before launching","Copy backend names verbatim from working launch scripts"],"tags":["disaggregation","transfer-backend","invalid-argument","configuration"],"backgroundTag":"unsupported-backend-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}