litellm/tests/proxy_unit_tests
Tim Ren dd4a41951f
fix(utils): allowed_openai_params must not forward unset params as None (#25777)
* feat(proxy): add NO_OPENAPI env var to disable /openapi.json endpoint (#25696)

* feat(proxy): add NO_OPENAPI env var to disable /openapi.json endpoint - Fixes #25538

* test(proxy): add tests for _get_openapi_url

---------

Co-authored-by: Progressive-engg <lov.kumari55@gmail.com>

* feat(prometheus): add api_provider label to spend metric (#25693)

* feat(prometheus): add api_provider label to spend metric

Add `api_provider` to `litellm_spend_metric` labels so users can
build Grafana dashboards that break down spend by cloud provider
(e.g. bedrock, anthropic, openai, azure, vertex_ai).

The `api_provider` label already exists in UserAPIKeyLabelValues and
is populated from `standard_logging_payload["custom_llm_provider"]`,
but was not included in the spend metric's label list.

* add api_provider to requests metric + add test

Address review feedback:
- Add api_provider to litellm_requests_metric too (same call-site as
  spend metric, keeps label sets in sync)
- Add test_api_provider_in_spend_and_requests_metrics following the
  existing pattern in test_prometheus_labels.py

* fix: ensure `litellm_metadata` is attached to `pre_call` guardrail to align with `post_call` guardrail (#25641)

* fix: ensure `litellm_metadata` is attached to pre_call to align with post_call

* refactor: remove unused BaseTranslation._ensure_litellm_metadata

* refactor: module level imports for ensure_litellm_metadata and CodeQL

* fix: update based off of Codex comment

* revert: undo usage of `_guardrail_litellm_metadata`

* feat: add pricing entry for openrouter/google/gemini-3.1-flash-lite-preview (#25610)

* fix(bedrock): skip synthetic tool injection for json_object with no schema (#25740)

When response_format={"type": "json_object"} is sent without a JSON
schema, _create_json_tool_call_for_response_format builds a tool with an
empty schema (properties: {}). The model follows the empty schema and
returns {} instead of the actual JSON the caller asked for.

This patch:
- Skips synthetic json_tool_call injection when no schema is provided.
  The model already returns JSON when the prompt asks for it.
- Fixes finish_reason: after _filter_json_mode_tools strips all
  synthetic tool calls, finish_reason stays "tool_calls" instead of
  "stop". Callers (like the OpenAI SDK) misinterpret this as a pending
  tool invocation.

json_schema requests with an explicit schema are unchanged.

Co-authored-by: Claude <noreply@anthropic.com>

* fix(utils): allowed_openai_params must not forward unset params as None

`_apply_openai_param_overrides` iterated `allowed_openai_params` and
unconditionally wrote `optional_params[param] = non_default_params.pop(param, None)`
for each entry. If the caller listed a param name but did not actually
send that param in the request, the pop returned `None` and `None` was
still written to `optional_params`. The openai SDK then rejected it as
a top-level kwarg:

    AsyncCompletions.create() got an unexpected keyword argument 'enable_thinking'

Reproducer (from #25697):

    allowed_openai_params = ["chat_template_kwargs", "enable_thinking"]
    body = {"chat_template_kwargs": {"enable_thinking": False}}

Here `enable_thinking` is only present nested inside
`chat_template_kwargs`, so the helper should forward
`chat_template_kwargs` and leave `enable_thinking` alone. Instead it
wrote `optional_params["enable_thinking"] = None`.

Fix: only forward a param if it was actually present in
`non_default_params`. Behavior is unchanged for the happy path (param
sent → still forwarded), and the explicit `None` leakage is gone.

Adds a regression test exercising the helper in isolation so the test
does not depend on any provider-specific `map_openai_params` plumbing.

Fixes #25697

---------

Co-authored-by: lovek629 <59618812+lovek629@users.noreply.github.com>
Co-authored-by: Progressive-engg <lov.kumari55@gmail.com>
Co-authored-by: Ori Kotek <ori.k@codium.ai>
Co-authored-by: Alexander Grattan <51346343+agrattan0820@users.noreply.github.com>
Co-authored-by: Mohana Siddhartha Chivukula <103447836+iamsiddhu3007@users.noreply.github.com>
Co-authored-by: Amiram Mizne <amiramm@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-04-16 19:04:26 +05:30
..
example_config_yaml test: test 2026-03-28 19:17:38 -07:00
test_configs test: test 2026-03-28 19:17:38 -07:00
test_model_response_typing
azure_fine_tune.jsonl
batch_job_results_furniture.jsonl
conftest copy.py
conftest.py
data_map.txt
eagle.wav
gettysburg.wav
large_text.py
messages_with_counts.py
model_cost.json
openai_batch_completions_router.jsonl
openai_batch_completions.jsonl
speech_vertex.mp3
test_aproxy_startup.py
test_audit_logs_proxy.py
test_auth_checks.py Fix: Anthropic model wildcard access issue 2026-02-23 17:12:55 +05:30
test_banned_keyword_list.py
test_blog_posts_endpoint.py
test_check_batch_cost.py Fix flaky e2e batch test: set batch_processed=True on completion in retrieve_batch 2026-03-15 18:18:32 -07:00
test_check_responses_cost.py fix(test): update check_responses_cost tests for _expire_stale_rows 2026-04-07 10:09:11 -07:00
test_custom_callback_input.py
test_custom_logger_s3_gcs.py
test_custom_tokenizer_bug.py [Release Fix] (#22411) 2026-02-28 09:46:35 -08:00
test_db_schema_changes.py
test_db_schema_migration.py [Release Fix] (#22411) 2026-02-28 09:46:35 -08:00
test_default_end_user_budget_simple.py
test_deployed_proxy_keygen.py
test_e2e_pod_lock_manager.py
test_get_favicon.py
test_get_image.py
test_google_endpoint_routing.py
test_google_gemini_proxy_request.py Revert "QA: improve gpt-5.4 code/bugs" 2026-03-13 10:15:47 -07:00
test_jwt_key_mapping.py fix: fix ci/cd + handle oidc jwt tokens 2026-03-30 16:12:58 -07:00
test_jwt.py retain ui_routes enum alias for JWT config backwards compatibility 2026-04-10 08:55:32 -07:00
test_key_generate_dynamodb.py
test_key_generate_prisma.py [Fix] /key/aliases: Add pagination and search to prevent OOMs 2026-02-25 17:55:26 -08:00
test_models_fallback_endpoint.py
test_prisma_client_backoff_retry.py
test_project_endpoints_prisma.py [Fix] Include created_at and updated_at in /project/list response 2026-02-27 15:41:03 -08:00
test_prompt_test_endpoint.py
test_proxy_config_unit_test.py
test_proxy_custom_auth.py
test_proxy_custom_logger.py
test_proxy_encrypt_decrypt.py
test_proxy_exception_mapping.py
test_proxy_gunicorn.py
test_proxy_pass_user_config.py test: test 2026-03-28 19:17:38 -07:00
test_proxy_reject_logging.py
test_proxy_routes.py
test_proxy_server_caching.py
test_proxy_server_keys.py
test_proxy_server_langfuse.py
test_proxy_server_spend.py
test_proxy_server.py Litellm ishaan april4 2 (#25150) 2026-04-04 23:09:42 +00:00
test_proxy_setting_guardrails.py
test_proxy_token_counter.py
test_proxy_utils.py fix(utils): allowed_openai_params must not forward unset params as None (#25777) 2026-04-16 19:04:26 +05:30
test_realtime_cache.py
test_response_polling_handler.py Add incomplete response error propagation test 2026-03-17 11:39:12 -07:00
test_response_polling_pre_call_checks.py fix(test): rewrite polling pre-call guard test to call responses_api() directly 2026-03-19 14:30:29 +05:30
test_search_api_logging.py
test_server_root_path.py
test_skills_db.py
test_ui_path_detection.py
test_unit_test_max_model_budget_limiter.py fix(proxy): use model_group for model_max_budget spend tracking cache key (#25549) 2026-04-11 19:37:58 -07:00
test_unit_test_proxy_hooks.py
test_update_daily_tag_spend.py cherry-pick: tag query fix + MCP metadata support (#25145) 2026-04-04 16:44:02 -07:00
test_update_spend.py
test_user_api_key_auth.py refactor: consolidate route auth for UI and API tokens 2026-04-09 21:36:35 -07:00
test_zero_cost_model_budget_bypass.py
vertex_key.json test: update to new vertex ai keys 2026-03-28 20:19:05 -07:00