{"record":{"id":"01687c2f3f5e1c72","repo":"sgl-project/sglang","slug":"get-num-tokens-per-bs-for-target-verify-is-depreca","errorCode":null,"errorMessage":"get_num_tokens_per_bs_for_target_verify is deprecated; use get_num_tokens_per_req_for_target_verify instead.","messagePattern":"get_num_tokens_per_bs_for_target_verify is deprecated; use get_num_tokens_per_req_for_target_verify instead\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"python/sglang/srt/speculative/spec_info.py","lineNumber":244,"sourceCode":"            _handle_ngram(server_args)\n\n    def get_num_tokens_per_req_for_target_verify(\n        self, num_draft_tokens: int, is_draft_worker: bool\n    ) -> int:\n        # FIXME: Remove this after the forward mode refactor. Target verify is\n        # essentially a fixed sequence length prefill/extend with full cuda\n        # graph support. We can use it for target verify, or we can use it for\n        # other cases which is not target verify but fixed length prefill.\n        # Here, we expose this interface to allow the other use cases.\n        if self.is_dspark() and is_draft_worker:\n            return num_draft_tokens - 1\n        return num_draft_tokens\n\n    def get_num_tokens_per_bs_for_target_verify(\n        self, num_draft_tokens: int, is_draft_worker: bool\n    ) -> int:\n        # Deprecated alias; remove together with the FIXME above.\n        warnings.warn(\n            \"get_num_tokens_per_bs_for_target_verify is deprecated; use \"\n            \"get_num_tokens_per_req_for_target_verify instead.\",\n            DeprecationWarning,\n            stacklevel=2,\n        )\n        return self.get_num_tokens_per_req_for_target_verify(\n            num_draft_tokens, is_draft_worker\n        )\n\n    def create_worker(\n        self, server_args: ServerArgs\n    ) -> Optional[Union[Type[BaseSpecWorker], Type[TpModelWorker], Type[NGRAMWorker]]]:\n        from sglang.srt.arg_groups.overrides import resolving_view\n\n        cfg = resolving_view(server_args)\n        assert (\n            not self.is_none()\n        ), \"Cannot create worker for NONE speculative algorithm.\"","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/speculative/spec_info.py#L226-L262","documentation":"Speculative decoding code emits this DeprecationWarning when the old batch-size-oriented API get_num_tokens_per_bs_for_target_verify is called. It has been renamed to get_num_tokens_per_req_for_target_verify to reflect per-request semantics; the old name is a thin alias that warns and forwards. It appears in python/sglang/srt/speculative/spec_info.py on the base SpecInfo class.","triggerScenarios":"Any code path (typically older draft-worker/target-verify batch preparation, custom spec algorithms, or downstream forks) invoking spec_info.get_num_tokens_per_bs_for_target_verify(num_draft_tokens, is_draft_worker). Triggered during scheduler preparation of target-verify batches in speculative decoding.","commonSituations":"Upgrading SGLang to a version where the bs->req rename happened while custom speculative algorithms or monkey-patches still call the old name; plugins/tests written against the older API surface.","solutions":["Replace every call to get_num_tokens_per_bs_for_target_verify(...) with get_num_tokens_per_req_for_target_verify(...) — identical signature and return","If third-party code must keep working, run with -W ignore::DeprecationWarning or PYTHONWARNINGS=ignore::DeprecationWarning as a stopgap","After migrating, verify no remaining references: grep -r 'get_num_tokens_per_bs_for_target_verify' your_code/"],"exampleFix":"# before\nn = spec_info.get_num_tokens_per_bs_for_target_verify(num_draft_tokens, is_draft_worker)\n# after\nn = spec_info.get_num_tokens_per_req_for_target_verify(num_draft_tokens, is_draft_worker)","handlingStrategy":"validation","validationCode":"import warnings\nwith warnings.catch_warnings():\n    warnings.simplefilter(\"ignore\", DeprecationWarning)\n    n = spec.get_num_tokens_per_bs_for_target_verify(k, is_draft)","typeGuard":"hasattr(spec, \"get_num_tokens_per_req_for_target_verify\")","tryCatchPattern":null,"preventionTips":["Migrate call sites to the _per_req_ name at upgrade time","Run tests with -W error::DeprecationWarning once to enumerate all stale call sites"],"tags":["speculative-decoding","deprecation","api-rename","python-warnings"],"backgroundTag":"deprecated-api-rename","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}