{"record":{"id":"92125304db08da63","repo":"sgl-project/sglang","slug":"layer-layer-id-layer-layer-id-does-not-have-an-i","errorCode":null,"errorMessage":"layer.layer_id={layer.layer_id} does not have an index V cache (either dense, or in the K-only group). index_kv layers: {list(self.index_kv_layer_id_mapping.keys())}","messagePattern":"layer\\.layer_id=(.+?) does not have an index V cache \\(either dense, or in the K-only group\\)\\. index_kv layers: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/mem_cache/memory_pool.py","lineNumber":5014,"sourceCode":"            loc,\n            cache_k,\n            cache_v,\n            k_scale,\n            v_scale,\n        )\n\n    def set_index_kv_buffer(\n        self,\n        layer: RadixAttention,\n        loc: torch.Tensor,\n        cache_idx_k: torch.Tensor,\n        cache_idx_v: torch.Tensor,\n        k_scale: Optional[float] = None,\n        v_scale: Optional[float] = None,\n    ) -> None:\n        mapped_id = self.index_kv_layer_id_mapping.get(layer.layer_id)\n        if mapped_id is None:\n            raise ValueError(\n                f\"layer.layer_id={layer.layer_id} does not have an index V \"\n                f\"cache (either dense, or in the K-only group). \"\n                f\"index_kv layers: {list(self.index_kv_layer_id_mapping.keys())}\"\n            )\n        self.index_kv_pool.set_kv_buffer(\n            layer,\n            loc,\n            cache_idx_k,\n            cache_idx_v,\n            k_scale,\n            v_scale,\n            layer_id_override=mapped_id,\n        )\n\n    def set_index_k_buffer(\n        self,\n        layer: RadixAttention,\n        loc: torch.Tensor,","sourceCodeStart":4996,"sourceCodeEnd":5032,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/mem_cache/memory_pool.py#L4996-L5032","documentation":"set_index_kv_buffer on MiniMaxSparseKVPool only accepts layers registered in index_kv_layer_id_mapping. The given layer.layer_id is dense or K-only, so there is no index-V pool slot to write into and the call is rejected before touching buffers.","triggerScenarios":"Calling set_index_kv_buffer(layer, loc, cache_idx_k, cache_idx_v, ...) with a layer whose id is not in index_kv_layer_id_mapping (dense layer or K-only sparse layer).","commonSituations":"Model code that uses one code path for all sparse layers instead of branching between set_index_k_buffer (K-only) and set_index_kv_buffer; layer partition config mismatches after model definition edits.","solutions":["Branch per layer group: use set_index_kv_buffer only for index-KV layers and set_index_k_buffer for K-only layers","Verify layer.layer_id against index_kv_layer_id_mapping before the call","Rebuild the pool with correct sparse layer classification if the layer should be index-KV"],"exampleFix":"# before\nsparse_pool.set_index_kv_buffer(layer, loc, cache_k, cache_v)  # K-only layer\n# after\nif layer.layer_id in sparse_pool.index_kv_layer_id_mapping:\n    sparse_pool.set_index_kv_buffer(layer, loc, cache_k, cache_v)\nelse:\n    sparse_pool.set_index_k_buffer(layer, loc, cache_k, k_scale=layer.k_scale)","handlingStrategy":"validation","validationCode":"if layer.layer_id not in sparse_pool.index_kv_layer_id_mapping:\n    raise ValueError(f'{layer.layer_id} is not index-KV; use set_index_k_buffer or main pool')","typeGuard":"def is_index_kv_layer(sparse_pool, layer) -> bool:\n    return sparse_pool.index_kv_layer_id_mapping.get(layer.layer_id) is not None","tryCatchPattern":null,"preventionTips":["Split the write path by layer group (K-only vs index-KV vs dense)","Add a startup assertion that the model's layer partition matches the pool mappings"],"tags":["kv-cache","sparse-attention","layer-id","write-path","minimax","sglang"],"backgroundTag":"invalid-layer-id-mapping","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}