"auto" tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set
The message
"auto" tool choice requires --enable-auto-tool-choice and --tool-call-parser to be setWhat it means
Your request included tools, which vLLM treats as tool_choice="auto", but the server was started without tool-call parsing, so it has no way to turn the model's output into tool calls and refuses the request.
What to do
Restart the server with --enable-auto-tool-choice --tool-call-parser <name>, picking the parser listed for your model family in vLLM's tool calling docs.
This comes back from the server, so you see it in your client. Here's how the OpenAI Python library printed it in issue #9986:
openai.BadRequestError: Error code: 400 - {'object': 'error', 'message': '"auto" tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set', 'type': 'BadRequestError', 'param': None, 'code': 400}
That report is from 2024. In vLLM 0.30.0 (the release we read, September 22, 2026) the fields sit inside an error object, but the message and the 400 are unchanged. Your model is fine. The server just wasn't started with tool calling on.
Why a request with tools trips it
You don't have to ask for "auto" to get this. vLLM's request code says that when tools are present and tool_choice isn't set, tool_choice defaults to "auto". So any agent framework or chat app that passes a tool list will hit this error on a server launched with plain vllm serve <model>.
"Auto" means the model decides whether to call a tool, and vLLM then has to spot the call in the generated text. Every model family writes tool calls in its own format, and a tool call parser is the piece that reads one format. Without one, vLLM refuses up front. A maintainer's whole reply on #9986 was: "The error message tells you what to do because you provided invalid input."
The fix: two flags at startup
This is the example from vLLM's tool calling docs:
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--enable-auto-tool-choice \
--tool-call-parser llama3_json \
--chat-template examples/tool_chat_template_llama3.1_json.jinja
You need both flags. Pass only --enable-auto-tool-choice and the server won't start at all: it stops with Error: --enable-auto-tool-choice requires --tool-call-parser. A parser name vLLM doesn't know fails at startup too, with "has not been registered".
The parser has to match the model. The docs list them by family: hermes for Hermes models (and Qwen2.5, whose built-in template uses Hermes-style tool calls), llama3_json for Llama 3.1, 3.2 and 4 with JSON tool calls, mistral for Mistral, and about twenty more sections after those. The --chat-template flag is optional. You need it only when the model's own template can't render tool messages.
Cases that skip the check
Setting tool_choice to "none", or leaving out tools, avoids it. Two model setups never see it: models loaded with a Mistral tokenizer, and gpt-oss (vLLM checks for that model type by name). Asking for "required" or naming one function gets a sibling message instead, requires --tool-call-parser to be set, since those only need a parser.
The Responses endpoint behaves differently. #39221 (April 2026) reported that without the flags /v1/responses succeeds silently, handing back the raw tool-call markup as plain text, while /v1/chat/completions gives this 400. That issue was closed as stale in August, so if a Responses client "works" but never calls tools, it's the same missing flags.
As of September 26, 2026, 1,723 issues in the vLLM repo mention enable-auto-tool-choice.
Other lines the same feature prints
Match yours against these if the one at the top of the page is not quite it. They come from the same code and mean related things.
openai.BadRequestError: Error code: 400 - {'object': 'error', 'message': '"auto" tool choice requires --enable-auto-tool-choice and --tool-call-parser to be set', 'type': 'BadRequestError', 'param': None, 'code': 400}Error: --enable-auto-tool-choice requires --tool-call-parserrequires --tool-call-parser to be set