litellm/tests
gumpm5 d4e69e48a4 fix(deepseek-v4): convert tool_choice='required'/'any'/dict to 'auto' for reasoner family
DeepSeek V4 (`deepseek-v4-pro` / `deepseek-v4-flash`, released 2026-04) is a
reasoner-only model family that rejects:
- `tool_choice="required"`
- `tool_choice="any"`
- `tool_choice={"type":"function","function":{"name":"..."}}`

with HTTP 400 from the DeepSeek API:

    deepseek-reasoner does not support this tool_choice

Only `"auto"` and `"none"` are accepted in thinking mode, and V4 enables
thinking mode by default — so this rejection happens even when the caller
did NOT explicitly send `thinking={"type":"enabled"}`.

This breaks any SDK that hardcodes `tool_choice="required"` for forced
tool selection. A real-world example: OpenAI Agents SDK 0.17+ uses
`ModelSettings(tool_choice="required")` on its delegation /
sub-agent paths to force the parent agent to actually dispatch a tool.
With DeepSeek V4 as the routed model, every delegation call 400s.

## Fix

In `DeepSeekChatConfig.map_openai_params`, when the model is recognised
as a V4 reasoner (either by model-name substring match — needed for the
first turn before `thinking` propagates — OR by `thinking={"type":
"enabled"}` already being set), rewrite unsupported `tool_choice` values
to `"auto"`. `"auto"` and `"none"` pass through unchanged. Non-V4 models
(e.g. `deepseek-chat` / V3) are unaffected.

## Tests

Added `TestDeepSeekV4ToolChoiceConstraint` with 7 cases:
- v4-pro + tool_choice="required" → "auto"
- v4-flash + tool_choice="any" → "auto"
- v4-pro + dict tool_choice → "auto"
- v4-pro + "auto" → unchanged
- v4-pro + "none" → unchanged
- non-V4 deepseek-chat + "required" → unchanged (no regression)
- explicit thinking={"type":"enabled"} on any model + "required" → "auto"

All 18 tests in this file pass (11 existing + 7 new):

    pytest tests/litellm/llms/deepseek/chat/test_deepseek_chat_transformation.py
    18 passed in 2.38s

Real-world verified: re-ran a multi-turn delegation e2e against
`deepseek/deepseek-v4-pro` (Lead `Financial Advisor` → SubAgent
`market_analyst` with `tool_choice="required"` forced by the SDK) — 3
prior 400s now zero, full 7-section market-review output completes.

## Refs

- DeepSeek docs: https://api-docs.deepseek.com/guides/thinking_mode
- Related upstream context: V4 series is reasoner-only by design, mirroring
  `deepseek-reasoner` (R1) tool_choice semantics.
2026-05-11 15:08:35 +08:00
..
agent_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
audio_tests [Test] Tests: Stop parametrizing API keys into pytest test IDs (#27249) 2026-05-05 17:21:18 -07:00
basic_proxy_startup_tests build: migrate packaging, CI, and Docker from Poetry to uv (#25007) 2026-04-09 11:46:23 -07:00
batches_tests [Fix] Batches Tests: Remove VCR Auto-Marker 2026-05-07 15:39:46 -07:00
benchmarks Add CodSpeed performance benchmarks (#23676) 2026-03-14 18:44:36 -07:00
code_coverage_tests feat(audio_transcription): add NVIDIA Riva STT provider (#27185) 2026-05-05 17:17:51 -07:00
documentation_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
enterprise Fix Prometheus custom metadata label counts (#27268) (#27271) 2026-05-05 20:04:56 -07:00
guardrails_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
image_gen_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
litellm fix(deepseek-v4): convert tool_choice='required'/'any'/dict to 'auto' for reasoner family 2026-05-11 15:08:35 +08:00
litellm-proxy-extras style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
litellm_core_utils Merge branch 'litellm_internal_staging' into litellm_staging_03_22_2026 2026-04-20 19:56:00 +05:30
litellm_utils_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
llm_responses_api_testing test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
llm_translation Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_/sweet-mcclintock-2b3656 2026-05-07 13:46:53 -07:00
load_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
local_testing [Test] Tests: Stop parametrizing API keys into pytest test IDs (#27249) 2026-05-05 17:21:18 -07:00
logging_callback_tests Merge pull request #27222 from BerriAI/litellm_s3AuditParams 2026-05-07 12:49:03 -07:00
mcp_tests Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_yj_apr17 2026-04-17 17:36:40 -07:00
multi_instance_e2e_tests
ocr_tests [Fix] Tests: Reduce VCR cassette bloat and fix multipart caching 2026-05-07 11:54:19 -07:00
old_proxy_tests/tests fix: cleanup tests 2026-03-30 16:24:35 -07:00
openai_endpoints_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
otel_tests Fix proxy auth status code tests (#27555) 2026-05-09 14:47:48 -07:00
pass_through_tests chore(deps): refresh dependency locks 2026-05-04 11:36:18 -07:00
pass_through_unit_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
proxy_admin_ui_tests chore(deps): refresh dependency locks 2026-05-04 11:36:18 -07:00
proxy_e2e_anthropic_messages_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
proxy_security_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
proxy_unit_tests Add unit tests for virtual-key model max budget Redis flush. 2026-05-07 01:21:19 +03:00
router_unit_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
scim_tests
search_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
spend_tracking_tests chore(proxy): guard sensitive public endpoints 2026-04-30 11:52:47 -07:00
store_model_in_db_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_litellm fix: reset proxy budget when initial reset duration is null then updated (#27488) 2026-05-09 18:33:36 -04:00
unified_google_tests test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
vector_store_tests fix: drop milvus dbName and partitionNames from MILVUS_OPTIONAL_PARAMS 2026-04-30 11:51:32 -07:00
windows_tests style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
__init__.py
_flush_vcr_cache.py tests(vcr): isolate cassette redis to CASSETTE_REDIS_URL 2026-05-01 12:32:59 -07:00
_vcr_conftest_common.py [Fix] Tests: Reduce VCR cassette bloat and fix multipart caching 2026-05-07 11:54:19 -07:00
_vcr_redis_persister.py test: add 24hr Redis-backed VCR cache to additional test suites (#27159) 2026-05-05 15:13:31 -07:00
eval_swe_bench.py Prompt Compression - add it to the proxy (#25729) 2026-04-20 15:08:00 -07:00
gettysburg.wav
large_text.py
openai_batch_completions.jsonl
README.MD
test_budget_management.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_callbacks_on_proxy.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_config.py
test_debug_warning.py
test_default_encoding_non_root.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_end_users.py
test_entrypoint.py
test_fallbacks.py
test_gpt5_azure_temperature_support.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_health.py chore(proxy): preserve readiness compatibility 2026-04-30 12:05:09 -07:00
test_keys.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_litellm_proxy_responses_config.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_logging.conf
test_models.py test: replace test_add_and_delete_models integration test with mock 2026-03-30 21:30:57 -07:00
test_new_vector_store_endpoints.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_openai_endpoints.py Fix proxy auth status code tests (#27555) 2026-05-09 14:47:48 -07:00
test_organizations.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_otel_thread_leak.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_passthrough_endpoints.py
test_presidio_latency.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_proxy_server_non_root.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_ratelimit.py [Fix] test_ratelimit: skip over-limit cases that race with background RPM tracking 2026-04-11 13:08:59 -07:00
test_resource_cleanup.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_service_logger_otel.py
test_spend_logs.py
test_team.py style: run black formatter on files from main merge 2026-04-17 13:02:59 -07:00
test_team_logging.py test: cleanup dead tests 2026-03-28 20:49:02 -07:00
test_team_members.py
test_users.py Fix proxy auth status code tests (#27555) 2026-05-09 14:47:48 -07:00

In total litellm runs 1000+ tests

[02/20/2025] Update:

To make it easier to contribute and map what behavior is tested,

we've started mapping the litellm directory in tests/test_litellm

This folder can only run mock tests.