sgl-project/sglang · info

get_num_tokens_per_bs_for_target_verify is deprecated; use g

Error message

get_num_tokens_per_bs_for_target_verify is deprecated; use get_num_tokens_per_req_for_target_verify instead.

What it means

Same deprecation as in spec_info.py but on the registry-based entry point in python/sglang/srt/speculative/spec_registry.py. The method get_num_tokens_per_bs_for_target_verify now warns (DeprecationWarning) and delegates to get_num_tokens_per_req_for_target_verify, which uses per-request token accounting for target-verify batches in speculative decoding.

Source

Thrown at python/sglang/srt/speculative/spec_registry.py:145

                self.name,
            )
        return self.factory(server_args)

    def get_num_tokens_per_req_for_target_verify(
        self, num_draft_tokens: int, is_draft_worker: bool
    ) -> int:
        # FIXME: Remove this after the forward mode refactor. Target verify is
        # essentially a fixed sequence length prefill/extend with full cuda
        # graph support. We can use it for target verify, or we can use it for
        # other cases which is not target verify but fixed length prefill.
        # Here, we expose this interface to allow the other use cases.
        return num_draft_tokens

    def get_num_tokens_per_bs_for_target_verify(
        self, num_draft_tokens: int, is_draft_worker: bool
    ) -> int:
        # Deprecated alias; remove together with the FIXME above.
        warnings.warn(
            "get_num_tokens_per_bs_for_target_verify is deprecated; use "
            "get_num_tokens_per_req_for_target_verify instead.",
            DeprecationWarning,
            stacklevel=2,
        )
        return self.get_num_tokens_per_req_for_target_verify(
            num_draft_tokens, is_draft_worker
        )

    def build_disagg_draft_input(
        self,
        batch: ScheduleBatch,
        last_tokens_tensor: torch.Tensor,
        future_map: FutureMap,
    ) -> Optional[SpecInput]:
        """Build the disaggregation draft input for ``batch``, or ``None``.

        The speculative config comes from ``runtime_context.get_spec()``, which

View on GitHub (pinned to 0132848349)

Solutions

  1. Switch call sites to get_num_tokens_per_req_for_target_verify — same args (num_draft_tokens, is_draft_worker), same int return
  2. Silence temporarily with PYTHONWARNINGS=ignore::DeprecationWarning while you migrate
  3. grep your codebase for '_per_bs_for_target_verify' to catch all occurrences

Example fix

# before
num = algo.get_num_tokens_per_bs_for_target_verify(k, is_draft_worker)
# after
num = algo.get_num_tokens_per_req_for_target_verify(k, is_draft_worker)
Defensive patterns

Strategy: validation

Validate before calling

fn = getattr(algo, "get_num_tokens_per_req_for_target_verify", None) or getattr(algo, "get_num_tokens_per_bs_for_target_verify")
n = fn(k, is_draft)

Type guard

callable(getattr(algo, "get_num_tokens_per_req_for_target_verify", None))

Prevention

When it happens

Trigger: Calling the registered speculative-algorithm object's get_num_tokens_per_bs_for_target_verify (e.g. via SpecAlgorithm registry lookups during target-verify batch construction in the scheduler).

Common situations: Custom or out-of-tree speculative algorithm implementations built against an older SGLang spec registry; upgrade of SGLang introduces the rename and old call sites start warning.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/e423a5404c9b5233. Report an issue: GitHub.