{"record":{"id":"c7f0efcddc777560","repo":"vllm-project/vllm","slug":"kind-parser-name-is-not-registered","errorCode":null,"errorMessage":"{kind} parser `{name}` is not registered{}","messagePattern":"(.+?) parser `(.+?)` is not registered(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"rust/src/chat/src/error.rs","lineNumber":37,"sourceCode":"    ChatTemplate(String),\n    #[error(\"multimodal input is not supported by this chat renderer\")]\n    UnsupportedMultimodalRenderer,\n    #[error(\"unsupported multimodal content: {0}\")]\n    UnsupportedMultimodalContent(&'static str),\n    #[error(\"`{modality}` input is not supported by this model\")]\n    UnsupportedModality { modality: String },\n    #[error(\"At most {limit} {modality}(s) may be provided in one prompt.\")]\n    MmLimitExceeded { modality: String, limit: usize },\n    #[error(\"multimodal preprocessing error: {0}\")]\n    Multimodal(#[message] String),\n    #[error(\"{kind} parsing is not available for model `{model_id}`\")]\n    ParserUnavailableForModel {\n        kind: &'static str,\n        model_id: String,\n    },\n    #[error(\"{kind} parsing is disabled by frontend configuration\")]\n    ParserDisabled { kind: &'static str },\n    #[error(\n        \"{kind} parser `{name}` is not registered{}\",\n        available_parser_hint(.available_names)\n    )]\n    ParserUnavailableByName {\n        kind: &'static str,\n        name: String,\n        available_names: Vec<String>,\n    },\n    #[error(\"failed to initialize {kind} parser `{name}`\")]\n    ParserInitialization {\n        kind: &'static str,\n        name: String,\n        #[source]\n        error: BoxedError,\n    },\n    #[error(\n        \"gpt_oss uses native Harmony output parsing; generic {kind} parser override `{selection}` is not supported\"\n    )]","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/rust/src/chat/src/error.rs#L19-L55","documentation":"Thrown when a chat frontend requests a named structured-output or tool-call parser by name, but the parser registry has no creator registered under that name. The message is augmented by `available_parser_hint`, which appends the list of registered parser names (e.g. ` (available: guided_json, regex)`). Registry lookups happen in `rust/src/chat/src/parser/tool/mod.rs:156`, `parser/unified.rs:72`, `parser/reasoning/mod.rs:139`, and in `lib.rs:73/84` when the frontend config selects a parser.","triggerScenarios":"Passing `structured_outputs.parser = \"<name>\"` or `tool_call_parser = \"<name>\"` in the Rust frontend config where <name> is misspelled or was compiled out (parser crates are behind feature flags). Calling `ParserRegistry::creator(name)` for a kind (tool / structured / reasoning) whose registry only contains a subset of names.","commonSituations":"Typos like `hermes` vs `llama3_json`; migrating from Python vLLM where a parser exists but the Rust build does not enable that feature; assuming hermetic-style names, then running against a build compiled without them.","solutions":["Read the `(available: ...)` suffix in the message and switch the config to one of the listed names.","Check the parser kind: tool parsers, unified (structured) parsers, and reasoning parsers each have separate registries; a name valid for one kind is invalid for another.","If the parser should exist, rebuild the Rust workspace with the cargo feature that gates it (see rust/src/chat/src/parser/*/mod.rs registration lists).","Search the codebase for the exact name string to confirm it is registered at startup."],"exampleFix":"// before\nstructured_outputs.parser = \"json_mode\"; // not registered\n\n// after\nstructured_outputs.parser = \"guided_json\"; // name taken from the available list in the error","handlingStrategy":"validation","validationCode":"let registered: &[&str] = registry.available_names(kind);\nlet name = config.parser_name.as_str();\nif !registered.contains(&name) {\n    return Err(format!(\"parser `{name}` not registered; available: {registered:?}\"));\n}","typeGuard":"fn is_registered_parser(registry: &ParserRegistry, kind: ParserKind, name: &str) -> bool {\n    registry.available_names(kind).iter().any(|n| n == name)\n}","tryCatchPattern":"match result {\n    Err(vllm_chat::Error::ParserUnavailableByName { name, available_names, .. }) => {\n        eprintln!(\"parser `{name}` unknown; pick from {available_names:?}\");\n    }\n    other => other?,\n}","preventionTips":["Derive parser-name config values from the registry's available_names at startup instead of hardcoding strings.","Log the registered parser list once at server startup so misconfigurations are obvious.","Add a config smoke test that resolves every configured parser name before accepting traffic."],"tags":["rust","parser","configuration","registry","structured-output"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}