{"record":{"id":"31a76fef0f013cbb","repo":"sgl-project/sglang","slug":"backend-must-be-a-non-empty-string","errorCode":null,"errorMessage":"backend must be a non-empty string","messagePattern":"backend must be a non-empty string","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/layers/sampler.py","lineNumber":535,"sourceCode":"        sampling_info: SamplingBatchInfo,\n        top_logprobs_nums: List[int],\n        token_ids_logprobs: List[List[int]],\n    ) -> None:\n        logprob_result = self.output_logprob_processor.compute_logprobs_only(\n            next_token_logits=logits_output.next_token_logits,\n            top_logprobs_nums=top_logprobs_nums,\n            token_ids_logprobs=token_ids_logprobs,\n            preprocess_fn=partial(self._preprocess_logits, sampling_info=sampling_info),\n        )\n        if logprob_result is not None:\n            logprob_result.write_output_to(logits_output)\n\n\ndef register_sampler_backend(backend: str, factory: Callable[[], \"Sampler\"]) -> None:\n    \"\"\"Register a custom sampler factory for a backend string.\"\"\"\n\n    if not backend:\n        raise ValueError(\"backend must be a non-empty string\")\n\n    from sglang.srt.server_args import SAMPLING_BACKEND_CHOICES\n\n    if backend in _CUSTOM_SAMPLER_FACTORIES:\n        logger.warning(\"Overriding existing sampler factory for backend '%s'\", backend)\n    SAMPLING_BACKEND_CHOICES.add(backend)\n    _CUSTOM_SAMPLER_FACTORIES[backend] = factory\n\n\ndef create_sampler(backend: Optional[str] = None) -> \"Sampler\":\n    \"\"\"Create a sampler honoring custom backend registrations.\"\"\"\n\n    server_args = get_server_args()\n    backend = backend or (get_exec().kernel.sampling_backend if server_args else None)\n\n    if backend in _CUSTOM_SAMPLER_FACTORIES:\n        sampler = _CUSTOM_SAMPLER_FACTORIES[backend]()\n        if not isinstance(sampler, Sampler):","sourceCodeStart":517,"sourceCodeEnd":553,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/layers/sampler.py#L517-L553","documentation":"Raised by register_sampler_backend() when the backend name passed in is empty (empty string or None). SGLang requires every custom sampler backend to be identified by a non-empty string key that gets added to SAMPLING_BACKend_CHOICES, so an empty key is rejected up front.","triggerScenarios":"Calling register_sampler_backend('', factory) or register_sampler_backend(None, factory). Callers like install_oracle_sampler / install_customized_info_sampler pass a hard-coded name, so this is only hit by user code registering its own backend with a bad name variable.","commonSituations":"Programmatically deriving the backend name from a config value or model name that turns out to be empty; copy-pasting a registration snippet and forgetting to fill in the name.","solutions":["Pass a non-empty, unique string as the backend name, e.g. 'oracle' or 'custom_info'","If the name comes from config, validate/default it before registering: backend = backend or 'my_backend'","Pick a name that does not collide with built-ins unless you intend the logged override warning"],"exampleFix":"// before\nregister_sampler_backend('', my_factory)\n// after\nregister_sampler_backend('my_custom_sampler', my_factory)","handlingStrategy":"validation","validationCode":"from sglang.srt.layers.sampler import register_sampler_backend\n\nname = name.strip() if isinstance(name, str) else ''\nif not name:\n    raise ValueError('sampler backend name must be a non-empty string')\nregister_sampler_backend(name, factory)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Normalize/default backend names from config before registering","Assert non-empty name in plugin entry points"],"tags":["sampler","validation","configuration","sglang"],"backgroundTag":"invalid-argument-validation","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}