{"record":{"id":"c912974e3730b26f","repo":"sgl-project/sglang","slug":"unknown-router-name","errorCode":null,"errorMessage":"Unknown router: {name}","messagePattern":"Unknown router: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/debug_utils/schedule_simulator/entrypoint.py","lineNumber":122,"sourceCode":"    else:\n        requests = generate_random_requests(\n            num_requests=args.synth_random_num_requests,\n            input_len=args.synth_random_input_len,\n            output_len=args.synth_random_output_len,\n            range_ratio=args.synth_random_range_ratio,\n            seed=args.synth_seed,\n        )\n    return requests\n\n\ndef _create_router(name: str, total_gpus: int):\n    if name == \"random\":\n        return RandomRouter(total_gpus)\n    if name == \"round_robin\":\n        return RoundRobinRouter(total_gpus)\n    if name == \"sticky\":\n        return StickyRouter(total_gpus)\n    raise ValueError(f\"Unknown router: {name}\")\n\n\ndef _create_scheduler(name: str):\n    if name == \"fifo\":\n        return FIFOScheduler()\n    raise ValueError(f\"Unknown scheduler: {name}\")\n\n\ndef main(args: argparse.Namespace) -> SimulationResult:\n    if args.synth_seed is not None:\n        random.seed(args.synth_seed)\n    requests = _load_requests(args)\n    total_gpus = args.num_gpus_per_engine * args.num_engines\n    router = _create_router(args.router, total_gpus)\n    scheduler = _create_scheduler(args.scheduler)\n\n    sim = Simulator(\n        num_gpus_per_engine=args.num_gpus_per_engine,","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/debug_utils/schedule_simulator/entrypoint.py#L104-L140","documentation":"Raised by the schedule simulator CLI factory _create_router when the --router argument does not match any of the supported router names: 'random', 'round_robin', or 'sticky'. The factory maps the string to a router class implementing GPU-selection policy; unknown names indicate a typo or an unimplemented policy.","triggerScenarios":"Running the schedule simulator entrypoint with args.router set to something other than random/round_robin/sticky, e.g. --router least_loaded or a misspelling like 'roundrobin'.","commonSituations":"Typos in CLI flags; assuming a router exists because a sibling tool supports it; passing an empty string when the flag is optional but defaulted incorrectly.","solutions":["Use one of the exact supported values: random, round_robin, sticky","Check spelling — underscores matter ('round_robin' not 'roundrobin')","If you need a new routing policy, implement a Router class and register it in _create_router"],"exampleFix":"# before\npython -m ...schedule_simulator.entrypoint --router least_loaded\n\n# after\npython -m ...schedule_simulator.entrypoint --router round_robin","handlingStrategy":"validation","validationCode":"ROUTERS = {'random', 'round_robin', 'sticky'}\nif args.router not in ROUTERS:\n    parser.error(f'--router must be one of {sorted(ROUTERS)}')","typeGuard":"def is_known_router(name: str) -> bool:\n    return name in {'random', 'round_robin', 'sticky'}","tryCatchPattern":"try:\n    router = _create_router(args.router)\nexcept ValueError as e:\n    parser.error(str(e))","preventionTips":["Use argparse choices=['random','round_robin','sticky'] so invalid values fail at parse time","Pin documentation next to the CLI definition"],"tags":["cli-arguments","simulation","schedule-simulator","sglang"],"backgroundTag":"invalid-enum-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}