mirror of
https://github.com/BerriAI/litellm.git
synced 2026-11-15 09:12:18 +00:00
* fix(responses): accept any sequence for allowed_openai_params and give UnsupportedParamsError a response A deployment whose allowed_openai_params is a string (or an SDK caller passing a tuple) made every Responses-mode request answer 500 "can only concatenate list". The Responses path now builds the allowlist from any sequence, matching the chat path. UnsupportedParamsError now runs BadRequestError's constructor, so it carries response, body and request like every other 400 instead of raising AttributeError on .response. * fix(params): read a bare-string allowed_openai_params as one param name on every path A deployment or request with allowed_openai_params: "presence_penalty" now allowlists presence_penalty on chat completions, embeddings, the Responses API, the chat-to-Responses bridge, the router's tier and precall filters, and Mistral's prompt_cache_key check. Before, chat and Responses read the string letter by letter, so it allowlisted nothing, and the router ignored it. UnsupportedParamsError's args now hold its own message instead of the BadRequestError one. * fix(params): read a dict or comma-separated allowed_openai_params the way chat and embeddings did A dict allowlist is read for its keys and a string is split on commas, so configs that worked on chat or embeddings before keep working, and the router reads them the same way. The fallback errors header names an error by its class when its type is empty, so UnsupportedParamsError still shows up there by name. * fix(params): read every param name in a string allowed_openai_params A string allowlist now yields every name in it, whether the names are split by commas or spaces or written as a list inside the string, so embeddings configs like "dimensions encoding_format" keep working. A request with no allowlist returns early instead of raising and catching a validation error. * fix(fallbacks): keep the fallback errors header type for errors other than UnsupportedParamsError The header named an error by its class whenever its type was empty, which changed "None" to the class name for timeouts and other errors built without a provider body. Only UnsupportedParamsError needs its class name now that it inherits an empty type, so every other error keeps the type it carries. * perf(params): read a string allowed_openai_params with one regex scan The string reader walked every character in Python and ran twice per request, so a 1 MB allowlist added about 300 ms of event-loop time. `\w+` matches exactly the alphanumeric-or-underscore runs the old loop kept, checked over every Unicode code point, and runs in C. * test(params): cover an int allowed_openai_params and an admin request for a model two teams share An allowlist that is no string, mapping, or sequence now allowlists nothing instead of raising TypeError, and an admin request with no team for a model name two teams share answers the multiple-teams 400 with the model name --------- Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| pre_call_checks | ||
| __init__.py | ||
| test_access_windows.py | ||
| test_add_retry_fallback_headers.py | ||
| test_client_initalization_utils.py | ||
| test_cooldown_cache.py | ||
| test_cooldown_handlers.py | ||
| test_deployment_pricing.py | ||
| test_embedding_batch_size_check.py | ||
| test_endpoint_eligibility.py | ||
| test_fallback_event_handlers.py | ||
| test_fallback_event_v2_dispatch.py | ||
| test_get_retry_from_policy.py | ||
| test_handle_error.py | ||
| test_health_check_allowed_fails_integration.py | ||
| test_health_state_cache.py | ||
| test_kubernetes_pod_discovery.py | ||
| test_pattern_match_deployments.py | ||
| test_prompt_caching_cache.py | ||
| test_ptu_shares.py | ||
| test_reasoning_effort_capability.py | ||
| test_request_priority.py | ||
| test_router_health_check_routing.py | ||
| test_router_interactions_endpoints.py | ||
| test_router_utils_common_utils.py | ||
| test_routing_read_batch.py | ||