{"record":{"id":"2a7de1f671035d8f","repo":"sgl-project/sglang","slug":"realtime-causal-kv-cache-num-frames-must-be-positi","errorCode":null,"errorMessage":"realtime_causal_kv_cache_num_frames must be positive","messagePattern":"realtime_causal_kv_cache_num_frames must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/causal_denoising.py","lineNumber":417,"sourceCode":"        if sink_size is not None:\n            if sink_size < 0:\n                raise ValueError(\"realtime_causal_sink_size must be non-negative\")\n            self.sink_size = int(sink_size)\n\n        kv_cache_num_frames = getattr(\n            batch,\n            \"realtime_causal_kv_cache_num_frames\",\n            None,\n        )\n        if kv_cache_num_frames is None:\n            kv_cache_num_frames = getattr(\n                pipeline_config,\n                \"realtime_causal_kv_cache_num_frames\",\n                None,\n            )\n        if kv_cache_num_frames is not None:\n            if kv_cache_num_frames <= 0:\n                raise ValueError(\"realtime_causal_kv_cache_num_frames must be positive\")\n            self.sliding_window_num_frames = int(kv_cache_num_frames)\n\n        if (\n            server_args.kv_cache_quant_config.enabled\n            and not self._supports_qvg_kv_cache_quantization()\n        ):\n            raise ValueError(\n                f\"{type(self).__name__} does not support QVG KV-cache quantization\"\n            )\n\n    def _supports_qvg_kv_cache_quantization(self) -> bool:\n        return False\n\n    def _causal_sequence_shard_enabled(self, batch: Req) -> bool:\n        return False\n\n    def _num_causal_cache_attention_heads(\n        self,","sourceCodeStart":399,"sourceCodeEnd":435,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/causal_denoising.py#L399-L435","documentation":"The realtime_causal_kv_cache_num_frames override (from request or pipeline_config) must be > 0 because it defines the sliding-window frame count for the causal KV cache.","triggerScenarios":"Setting realtime_causal_kv_cache_num_frames=0 or negative in config/request; _build_realtime_causal_cache_policy then applies overrides at stage init.","commonSituations":"Disabling the sliding window by setting 0 instead of removing the field; unit-of-confusion (frames vs tokens) leading to 0 after integer division; config defaults drift.","solutions":["Set a positive frame count, e.g. realtime_causal_kv_cache_num_frames=64","Remove/None the field to keep the stage default window"],"exampleFix":"# before\npipeline_config.realtime_causal_kv_cache_num_frames = 0\n# after\npipeline_config.realtime_causal_kv_cache_num_frames = 64","handlingStrategy":"validation","validationCode":"n = cfg.get('realtime_causal_kv_cache_num_frames')\nassert n is None or n > 0","typeGuard":"def valid_window(v) -> bool: return v is None or (isinstance(v,int) and v > 0)","tryCatchPattern":null,"preventionTips":["Omit the field rather than setting 0 to disable overrides"],"tags":["causal-denoising","kv-cache","config-validation"],"backgroundTag":"invalid-config-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}