Does DeepSeek support tool_choice set to required?
Not while reasoning is on. The request is refused rather than downgraded.
What we found
Forcing a tool call with tool_choice set to required is how an agent guarantees structured output instead of prose. On the DeepSeek rows, that combination is refused while reasoning is active. The failure is a rejected request rather than a silently ignored parameter, which is the better of the two behaviours, and still a surprise if you built against a provider where it works.
Ordinary function calling is unaffected. Tools reach the model, tool calls come back, and auto selection behaves normally. It is specifically the forced form that is unavailable.
What to do instead
- Leave tool_choice on auto and validate the response shape yourself, retrying when the model answers in prose.
- Or move the forced-tool step to a model that supports it. GLM and Kimi both take the forced form.
How this was measured
An unattributed measurement is a marketing claim, so here is the receipt.
- Probe
- probe_litellm_followup.py
- Measured
- 2026-09-08
- Applies to
- deepseek-v4-pro, deepseek-v4-flash
We found this by running the probe against the models we serve, which is also why it is worth trusting: it is a reading rather than a restatement of somebody's documentation. The full catalog is on /models, and what a request costs is on /pricing.
Upstream behaviour changes without notice, and a measurement is only as good as its date. If you find this is no longer true, tell us on the support page and we will re-run the probe.