{"record":{"id":"f7f8e7ad3300e272","repo":"sgl-project/sglang","slug":"upper-is-a-reserved-speculative-algorithm-name","errorCode":null,"errorMessage":"'{upper}' is a reserved speculative algorithm name; cannot be re-registered.","messagePattern":"'(.+?)' is a reserved speculative algorithm name; cannot be re-registered\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/speculative/spec_registry.py","lineNumber":239,"sourceCode":"            \"so plugin-registered algorithms stay dispatchable.\"\n        )\n\n\ndef register_algorithm(\n    name: str,\n    *,\n    supports_overlap: bool = False,\n    validate_server_args: Optional[ServerArgsValidator] = None,\n    spec_class: Type[CustomSpecAlgo] = CustomSpecAlgo,\n) -> Callable[[WorkerFactory], WorkerFactory]:\n    \"\"\"Return a decorator that registers a plugin algorithm under ``name``.\n\n    Pass a ``spec_class`` subclass of ``CustomSpecAlgo`` to override any\n    ``is_*()`` / ``supports_*()`` / ``create_worker`` method.\n    \"\"\"\n    upper = name.upper()\n    if upper in _reserved_names():\n        raise ValueError(\n            f\"'{upper}' is a reserved speculative algorithm name; cannot be re-registered.\"\n        )\n    if upper in _REGISTRY:\n        raise ValueError(f\"Speculative algorithm '{upper}' already registered.\")\n    _assert_custom_spec_algo_conforms(spec_class)\n\n    def decorator(factory: WorkerFactory) -> WorkerFactory:\n        _REGISTRY[upper] = spec_class(\n            name=upper,\n            factory=factory,\n            supports_overlap=supports_overlap,\n            validate_server_args=validate_server_args,\n        )\n        return factory\n\n    return decorator\n\n","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/speculative/spec_registry.py#L221-L257","documentation":"register_algorithm rejects names that collide with the built-in reserved SpeculativeAlgorithm names, so plugins cannot shadow built-in algorithms like EAGLE or NGRAM.","triggerScenarios":"Calling @register_algorithm('EAGLE') or any name whose uppercase form appears in _reserved_names().","commonSituations":"A plugin intentionally or accidentally naming itself after a built-in algorithm; name collisions after new built-ins are added in upgrades.","solutions":["Rename your plugin algorithm to something unique (e.g. 'MY_EAGLE_VARIANT')","If you want built-in behavior, don't register — just use the built-in name in --speculative-algorithm"],"exampleFix":"# before\n@register_algorithm('EAGLE')\n# after\n@register_algorithm('MY_EAGLE_VARIANT')","handlingStrategy":"validation","validationCode":"from sglang.srt.speculative.spec_registry import _reserved_names\nassert name.upper() not in _reserved_names(), f'{name} is reserved'","typeGuard":"def is_reserved_name(name: str) -> bool:\n    return name.upper() in _reserved_names()","tryCatchPattern":null,"preventionTips":["Prefix plugin algorithm names with your project name to avoid collisions"],"tags":["speculative-decoding","plugin-api","name-collision"],"backgroundTag":"duplicate-registration","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}