Skip to content

fix(sentry): scrub PII and secrets inside object reprs and nested locals, add SENTRY_SEND_DEFAULT_PII opt-in - #43123

Merged
mateo-berri merged 10 commits into
mainfrom
litellm_sentry_scrub_pii_reprs
Sep 25, 2026
Merged

mateo-berri merged 10 commits into
mainfrom
litellm_sentry_scrub_pii_reprs

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • Sentry frame locals carried the caller's email and hashed key inside object reprs
  • The master key, the database URL, and the raw virtual key rode along in nested dicts
  • Only a top-level user_id local read [Filtered]; send_default_pii was hardwired off with no opt-in

How it solves it:

  • Scrubs every string in the event for secret and PII field names, sk- keys, emails, and hashes; the bare sk- match starts at the shorter of the custom key minimum and a generated key, so both key shapes match under any pair of settings
  • Keeps Sentry's own denylists and adds the proxy's auth header names to them
  • SENTRY_SEND_DEFAULT_PII=true opts into identity fields; secrets stay filtered either way
  • Source context lines stay readable so the stack trace still makes sense

User Flow

Before: the operator opens the Sentry issue for a rejected request and reads the caller's email, hashed key, raw virtual key, the master key, and the database URL in the frame locals, while the one user_id local reads [Filtered]

  1. The admin creates an internal user with POST https://litellm-domain/user/new and {"user_id": "alice@example.com", "user_email": "alice@example.com", "user_role": "internal_user"}, and gets back a key sk-...
  2. Alice sends POST https://litellm-domain/v1/chat/completions (or /v1/responses, or /v1/messages with the key in x-api-key) with "model": "no-such-model" and gets 400 Invalid model name, then POST https://litellm-domain/team/new and gets 401 Only proxy admin ... Your user_id=ali***om
  3. The operator opens the issues at https://<org>.sentry.io/issues/<id>/: user_id reads [Filtered], but user_api_key_dict reads UserAPIKeyAuth(token='5e77...1ba2', ..., user_id='alice@example.com', user_email='alice@example.com', ...), data.metadata.user_api_key_hash reads 5e77...1ba2, and raw_headers.authorization reads Bearer sk-... in clear
  4. general_settings reads {'master_key': 'sk-...', 'database_url': 'postgresql://user:password@host/db'} in clear, and setting SENTRY_SEND_DEFAULT_PII=true changes nothing
  5. Anyone who can read the Sentry project (support, a contractor, a Slack alert integration) can take the master key, the database credentials, and Alice's own key, and can tell which user each failing request belonged to

After: the same issues read [Filtered] for the email, the hashed key, the raw key, the master key, and the database URL, and SENTRY_SEND_DEFAULT_PII=true lets the operator see the identity fields on purpose

  1. The admin creates an internal user with POST https://litellm-domain/user/new and {"user_id": "alice@example.com", "user_email": "alice@example.com", "user_role": "internal_user"}, and gets back a key sk-...
  2. Alice sends POST https://litellm-domain/v1/chat/completions (or /v1/responses, or /v1/messages with the key in x-api-key) with "model": "no-such-model" and gets 400 Invalid model name, then POST https://litellm-domain/team/new and gets 401 Only proxy admin ... Your user_id=ali***om
  3. The operator opens the issues at https://<org>.sentry.io/issues/<id>/: user_api_key_dict reads UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', ..., user_id='[Filtered]', user_email='[Filtered]', ...), data.metadata.user_api_key_hash reads [Filtered], and raw_headers.authorization (or x-api-key) reads [Filtered]
  4. general_settings reads {'master_key': '[Filtered]', 'database_url': '[Filtered]'}; after SENTRY_SEND_DEFAULT_PII=true and a restart the next issue shows user_id='alice@example.com' and the hashed key again while token, the raw key, master_key, and database_url stay [Filtered]
  5. Anyone who can read the Sentry project no longer sees the master key, the database credentials, or Alice's key, and cannot link a failing request to a user unless the operator opted in

Linear ticket

Resolves LIT-8600

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have added meaningful tests
  • The handful of test files covering my change pass locally, e.g. uv run pytest tests/test_litellm/<your_test_file>.py -v. Leave the suites (make test-unit-*, make test-unit) to CI: it finishes in ~15 minutes where a laptop takes an hour or more
  • My PR passes all required CI/CD checks (e.g., lint, schema.d.ts sync check, etc.)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review (Greptile reviews automatically once the PR is opened; only comment @greptileai to re-request a review after pushing changes)

Delays in PR merge?

If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).

Screenshots / Proof of Fix

Shared setup for both legs: the proxy boots from the named commit with --num_workers 2 on 127.0.0.1:51173 against the shared dev Postgres, SENTRY_DSN points at a local envelope sink on 127.0.0.1:42275 that stores every envelope Sentry's ingest would have received (the before leg would otherwise ship the dev database URL and master key to sentry.io), gpt-5-mini is a real OpenAI deployment. An internal user qa.user.lit8600@example.com with its own key sk-...FJLQ (hash 5e77...1ba2) was created once through POST /user/new. Every leg first sends 10 POST /v1/chat/completions with an unknown model so both workers have initialised Sentry (it initialises lazily on the first LLM route per worker), then runs the cases below. Leak counts come from walking every JSON path of every envelope the sink received for that case; excerpts are the actual frame locals with the master key, database URL, and the QA key replaced by <... redacted> and long values elided with ...

Cases 1 to 4 run with SENTRY_SEND_DEFAULT_PII unset, case 5 is the 200 transaction, case 6 sends request metadata whose field names collide with Sentry's own source-context fields, case 7 re-runs case 1 and case 4 on a proxy restarted with SENTRY_SEND_DEFAULT_PII=true, and case 8 restarts the proxy with litellm_settings.input_callback: ["sentry"] plus a deployment whose provider key OpenAI rejects, first with SENTRY_SEND_DEFAULT_PII unset and then set

Before (cbba146)

Chat Completions, unknown model

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","messages":[{"role":"user","content":"hi"}]}'

  2. {"error":{"message":"/chat/completions: Invalid model name passed in model=no-such-model-lit8600. Call /v1/models to view available models for your key.","type":"invalid_request_error",...}} then HTTP 400

  3. The error event the sink received, frame chat_completion():

    user_api_key_dict = UserAPIKeyAuth(token='5e77...1ba2', key_name='sk-...FJLQ', key_alias=None, ..., user_id='qa.user.lit8600@example.com', ...)
    data.metadata = {..., "user_api_key_hash": "'5e77...1ba2'", ...}
    data.secret_fields.raw_headers = {"host": "'127.0.0.1:51173'", "user-agent": "'curl/8.7.1'", "accept": "'*/*'", "authorization": "'Bearer <virtual key redacted>'", "content-type": "'application/json'", "content-length": "'77'"}
    general_settings = {"master_key": "'<master key redacted>'", "database_url": "'<database url redacted>?connection_limit=10&pool_timeout=60'"}
    
  4. Leak count over the event: email at 5 paths, key hash at 11, raw virtual key at 3, master key at 2, database URL at 2, [Filtered] at 0

Responses, unknown model

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/responses -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","input":"hi"}'

  2. {"error":{"message":"/responses: Invalid model name passed in model=no-such-model-lit8600. ...","type":"invalid_request_error",...}} then HTTP 400

  3. Frame responses_api() in the event:

    user_api_key_dict = UserAPIKeyAuth(token='5e77...1ba2', key_name='sk-...FJLQ', ..., user_id='qa.user.lit8600@example.com', ...)
    general_settings = {"master_key": "'<master key redacted>'", "database_url": "'<database url redacted>?connection_limit=10&pool_timeout=60'"}
    data.secret_fields.raw_headers = {..., "authorization": "'Bearer <virtual key redacted>'", ...}
    
  4. Leak count: email at 5 paths, key hash at 9 (data.litellm_metadata.user_api_key_hash and user_api_key_dict), raw virtual key at 2, master key at 3, database URL at 3

Messages, unknown model, key sent as x-api-key

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/messages -H "x-api-key: $USER_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'

  2. {"type":"error","error":{"type":"invalid_request_error","message":"anthropic_messages: Invalid model name passed in model=no-such-model-lit8600. ..."}} then HTTP 400

  3. Frame route_request() in the event:

    data.secret_fields.raw_headers = {"host": "'127.0.0.1:51173'", "user-agent": "'curl/8.7.1'", "accept": "'*/*'", "x-api-key": "'<virtual key redacted>'", "anthropic-version": "'2023-06-01'", "content-type": "'application/json'", "content-length": "'93'"}
    
  4. Leak count: email at 5 paths, key hash at 9, raw virtual key at 2 (under raw_headers.x-api-key), master key at 3, database URL at 3

/team/new with the internal user's key

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/team/new -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"team_alias":"lit8600"}'

  2. {"error":{"message":"Authentication Error, Only proxy admin can be used to generate, delete, update info for new keys/users/teams. Route=/team/new. Your role=internal_user. Your user_id=qa.use********...",...}} then HTTP 401

  3. Frames _authorize_authenticated_request() and common_checks() in the event (the only two locals the SDK filtered by name are api_key and master_key):

    user_api_key_auth_obj = UserAPIKeyAuth(token='5e77...1ba2', key_name='sk-...FJLQ', ..., user_id='qa.user.lit8600@example.com', ...)
    api_key = [Filtered]
    master_key = [Filtered]
    valid_token = UserAPIKeyAuth(token='5e77...1ba2', key_name='sk-...FJLQ', ..., user_id='qa.user.lit8600@example.com', ...)
    general_settings = {"master_key": "'<master key redacted>'", "database_url": "'<database url redacted>?connection_limit=10&pool_timeout=60'"}
    exception.values[0].value ends with: Your role=internal_user. Your user_id=qa.use*******************om
    
  4. Leak count: email at 9 paths (user_api_key_auth_obj, user_obj, user_object, valid_token), key hash at 5, master key at 2, database URL at 2

Chat Completions, real gpt-5-mini call

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-5-mini","messages":[{"role":"user","content":"Say hi in three words"}]}'
  2. {"id":"chatcmpl-ERqugVeT4lADhmmePrwEGfRxuCre6","created":1790306962,"model":"gpt-5-mini","object":"chat.completion","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi there, friend.","role":"assistant",...}}],...} then HTTP 200
  3. The sink received one transaction envelope and no error event; leak count over the transaction: email 0, key hash 0, raw virtual key 0, master key 0, database URL 0 (transactions never carried identifiers on either leg)

Chat Completions, unknown model, metadata fields named like Sentry source context

  1. curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","messages":[{"role":"user","content":"hi"}],"metadata":{"context_line":"sk-canaryCTXLINE0000000000000000000000000000000000","pre_context":["canary.ctx@example.com"],"plain_key":"sk-canaryPLAIN00000000000000000000000000000000000"}}'

  2. {"error":{"message":"/chat/completions: Invalid model name passed in model=no-such-model-lit8600. Call /v1/models to view available models for your key.","type":"invalid_request_error",...}} then HTTP 400

  3. The error event the sink received, frame chat_completion():

    data.metadata = {..., "context_line": "'sk-canaryCTXLINE0000000000000000000000000000000000'", "pre_context": ["'canary.ctx@example.com'"], "plain_key": "'sk-canaryPLAIN00000000000000000000000000000000000'", "requester_metadata": {"context_line": "'sk-canaryCTXLINE...'", "pre_context": ["'canary.ctx@example.com'"], "plain_key": "'sk-canaryPLAIN...'"}, ...}
    data.proxy_server_request.body.metadata = {"context_line": "'sk-canaryCTXLINE...'", "pre_context": "['canary.ctx@example.com']", "plain_key": "'sk-canaryPLAIN...'", ...}
    
  4. Leak count over the event: each of the three canary values appears at 12 paths (data.metadata, its requester_metadata copy, and the proxy_server_request.body.metadata copy, in three frames each), alongside the same email, key hash, master key, database URL, and raw virtual key leaks as case 1

PII opt-in (SENTRY_SEND_DEFAULT_PII=true), same Chat Completions and /team/new requests

  1. Restart the proxy with SENTRY_SEND_DEFAULT_PII=true and repeat cases 1 and 4
  2. The events are byte-for-byte the same shape as above: token='5e77...1ba2' user_id='qa.user.lit8600@example.com', raw_headers.authorization = "'Bearer <virtual key redacted>'", general_settings = {"master_key": "'<master key redacted>'", "database_url": "'<database url redacted>...'"}
  3. Leak count on Chat Completions: email 5, key hash 11, raw virtual key 3, master key 2, database URL 2; the variable does nothing before this PR

Chat Completions through a deployment whose provider key OpenAI rejects, litellm_settings.input_callback: ["sentry"]

  1. Restart the proxy from a config that adds input_callback: ["sentry"] next to failure_callback: ["sentry"] and a second deployment gpt-5-mini-badkey (real openai/gpt-5-mini, api_key: os.environ/LIT8600_BAD_OPENAI_KEY where that variable holds sk-canaryBADKEY0000000000000000000000000000000000), SENTRY_SEND_DEFAULT_PII unset

  2. 4 x curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-5-mini-badkey","messages":[{"role":"user","content":"hi from canary.msg@example.com"}],"metadata":{"context_line":"sk-canaryCTXLINE0000000000000000000000000000000000","pre_context":["canary.ctx@example.com"],"plain_key":"sk-canaryPLAIN00000000000000000000000000000000000"}}'

  3. {"error":{"message":"litellm.AuthenticationError: AuthenticationError: OpenAIException - Incorrect API key provided: sk-canar****...0000. ... then HTTP 401, and {"error":{"message":"No deployments available for selected model, Try again in 5 seconds. ... then HTTP 429 once the router has cooled the deployment down: 401, 429, 401, 429 over the four requests

  4. Each 401 error event the sink received carries one litellm.llm_call breadcrumb; breadcrumbs.values[0].message (1024 characters, Sentry's string cap) reads:

    Model Call Details pre-call: {'litellm_trace_id': '113b8925-...', 'litellm_call_id': 'dde03434-...', 'input': [{'role': 'user', 'content': 'hi from canary.msg@example.com'}], 'litellm_params': {'acompletion': True, ..., 'api_key': 'sk-canaryBADKEY0000000000000000000000000000000000', 'force_timeout': 600, ...
    
  5. Leak count over the three 401 events' breadcrumb messages: provider key 1 each, prompt email 1 each, [Filtered] 0; the metadata canaries reach the frame locals as in case 6 (sk-canaryPLAIN... at 21 paths, sk-canaryCTXLINE... at 3, canary.ctx@example.com at 1, canary.msg@example.com at 4 across the run's events)

After (28ce1ad)

The tip 5dbc9fb is the merge of origin/main (6b76888) into this branch with the PR diff unchanged: every shared file's hunks are disjoint from main's, the sentry-sdk pin is the same, and the 419 targeted tests pass on the merged tree, so the run below and the /live-pr-risk pass stand at 28ce1ad and CI covers the merged tree

Chat Completions, unknown model

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","messages":[{"role":"user","content":"hi"}]}'

  2. {"error":{"message":"/chat/completions: Invalid model name passed in model=no-such-model-lit8600. Call /v1/models to view available models for your key.","type":"invalid_request_error",...}} then HTTP 400, the same response as before

  3. The error event the sink received, frame chat_completion():

    user_api_key_dict = UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', key_alias=None, ..., user_id='[Filtered]', ...)
    data.metadata = {..., "user_api_key_hash": "[Filtered]", ...}
    data.secret_fields.raw_headers = {"host": "'127.0.0.1:51173'", "user-agent": "'curl/8.7.1'", "accept": "'*/*'", "authorization": "[Filtered]", "content-type": "'application/json'", "content-length": "'77'"}
    general_settings = {"master_key": "[Filtered]", "database_url": "[Filtered]"}
    
  4. Leak count over the event: email at 0 paths, key hash at 0, raw virtual key at 0, master key at 0, database URL at 0, [Filtered] at 19 (every user_api_key_dict, user_api_key_hash, raw_headers.authorization, master_key, and database_url local); the frames' own pre_context, context_line, and post_context source lines carry no [Filtered]

Responses, unknown model

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/responses -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","input":"hi"}'

  2. {"error":{"message":"/responses: Invalid model name passed in model=no-such-model-lit8600. ...","type":"invalid_request_error",...}} then HTTP 400

  3. Frame responses_api() in the event:

    user_api_key_dict = UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', ..., user_id='[Filtered]', ...)
    general_settings = {"master_key": "[Filtered]", "database_url": "[Filtered]"}
    data.secret_fields.raw_headers = {..., "authorization": "[Filtered]", ...}
    
  4. Leak count: email 0, key hash 0, raw virtual key 0, master key 0, database URL 0

Messages, unknown model, key sent as x-api-key

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/messages -H "x-api-key: $USER_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' -d '{"model":"no-such-model-lit8600","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'

  2. {"type":"error","error":{"type":"invalid_request_error","message":"anthropic_messages: Invalid model name passed in model=no-such-model-lit8600. ..."}} then HTTP 400

  3. Frame route_request() in the event:

    data.secret_fields.raw_headers = {"host": "'127.0.0.1:51173'", "user-agent": "'curl/8.7.1'", "accept": "'*/*'", "x-api-key": "[Filtered]", "anthropic-version": "'2023-06-01'", "content-type": "'application/json'", "content-length": "'93'"}
    
  4. Leak count: email 0, key hash 0, raw virtual key 0 (raw_headers.x-api-key now reads [Filtered]), master key 0, database URL 0

/team/new with the internal user's key

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/team/new -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"team_alias":"lit8600"}'

  2. {"error":{"message":"Authentication Error, Only proxy admin can be used to generate, delete, update info for new keys/users/teams. Route=/team/new. Your role=internal_user. Your user_id=qa.use********...",...}} then HTTP 401, the caller still gets the masked id

  3. Frames _authorize_authenticated_request() and common_checks() in the event:

    user_api_key_auth_obj = UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', ..., user_id='[Filtered]', ...)
    api_key = [Filtered]
    master_key = [Filtered]
    valid_token = UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', ..., user_id='[Filtered]', ...)
    general_settings = {"master_key": "[Filtered]", "database_url": "[Filtered]"}
    exception.values[0].value ends with: Your role=internal_user. Your user_id='[Filtered]'
    
  4. Leak count: email 0 (user_api_key_auth_obj, user_obj, user_object, valid_token all read user_id='[Filtered]'), key hash 0, master key 0, database URL 0

Chat Completions, real gpt-5-mini call

  1. `curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51173/v1/chat/completions -H "Authorization: Bearer $USER_KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-5-mini","messages":[{"role":"user","content":"Say hi in three words"}]}'
  2. {"id":"chatcmpl-ERrZJtv89yPGy2GrZ6OroJjCnGt2N","created":1790309481,"model":"gpt-5-mini","object":"chat.completion","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi there, friend.","role":"assistant",...}}],...} then HTTP 200
  3. The sink received one transaction envelope and no error event; leak count over the transaction: email 0, key hash 0, raw virtual key 0, master key 0, database URL 0; its request.headers.authorization reads [Filtered] (an empty string on the before leg)

Chat Completions, unknown model, metadata fields named like Sentry source context

  1. Same request as the Before leg, three canary values in metadata under the field names context_line, pre_context, and plain_key

  2. {"error":{"message":"/chat/completions: Invalid model name passed in model=no-such-model-lit8600. Call /v1/models to view available models for your key.","type":"invalid_request_error",...}} then HTTP 400, unchanged

  3. The error event the sink received, frame chat_completion():

    data.metadata = {..., "context_line": "'[Filtered]'", "pre_context": ["'[Filtered]'"], "plain_key": "'[Filtered]'", "requester_metadata": {"context_line": "'[Filtered]'", "pre_context": ["'[Filtered]'"], "plain_key": "'[Filtered]'"}, ...}
    data.proxy_server_request.body.metadata = {"context_line": "'[Filtered]'", "pre_context": "['[Filtered]']", "plain_key": "'[Filtered]'", ...}
    
  4. Leak count over the event: each canary value at 0 paths (12 each on the Before leg), email 0, key hash 0, raw virtual key 0, master key 0, database URL 0, [Filtered] at 48; the frames' own context_line still reads raise ProxyModelNotFoundError( and their pre_context lines are untouched, because the source-context exemption only applies at a real stack-frame path

PII opt-in (SENTRY_SEND_DEFAULT_PII=true), same Chat Completions and /team/new requests

  1. Restart the proxy with SENTRY_SEND_DEFAULT_PII=true and repeat cases 1, 4, and 6; the responses are unchanged (HTTP 400, HTTP 401, and HTTP 400 with the same bodies)
  2. Chat Completions event, frame chat_completion(): user_api_key_dict = UserAPIKeyAuth(token='[Filtered]', key_name='sk-...FJLQ', ..., user_id='qa.user.lit8600@example.com', user_email='qa.user.lit8600@example.com', ...), data.metadata.user_api_key_hash = '5e77...1ba2', raw_headers.authorization = "[Filtered]", general_settings = {"master_key": "[Filtered]", "database_url": "[Filtered]"}
  3. /team/new event: user_api_key_auth_obj = UserAPIKeyAuth(token='[Filtered]', ..., user_id='qa.user.lit8600@example.com', ...), api_key = [Filtered], master_key = [Filtered], and the message ends with Your user_id=qa.use***om exactly as the caller saw it
  4. Leak count on Chat Completions: email 5 (the user_api_key_dict reprs), key hash 6 (data.metadata.user_api_key_hash and its proxy_server_request.body copy in three frames), raw virtual key 0, master key 0, database URL 0; on /team/new: email 10, key hash 0, raw virtual key 0, master key 0, database URL 0; on case 6 the pre_context email canary is visible at its 12 paths (emails are what the opt-in sends) while the two sk- canaries stay [Filtered] at all 12

Chat Completions through a deployment whose provider key OpenAI rejects, litellm_settings.input_callback: ["sentry"]

  1. Same restart and the same four requests as the Before leg, SENTRY_SEND_DEFAULT_PII unset

  2. HTTP 401 with the same Incorrect API key provided: sk-canar****...0000 body, then HTTP 429 from the cooldown: 401, 429, 429, 429 over the four requests (which request hits the cooldown depends on which worker took it, see the observations)

  3. breadcrumbs.values[0].message on each 401 event (882 characters):

    Model Call Details pre-call: {'litellm_trace_id': 'a63ace4c-...', 'litellm_call_id': '674013a5-...', 'input': [{'role': 'user', 'content': 'hi from [Filtered]'}], 'litellm_params': {'acompletion': True, ..., 'api_key': '[Filtered]', 'force_timeout': 600, ...
    
  4. Leak count over the breadcrumb messages: provider key 0, prompt email 0, [Filtered] 5 each; every metadata canary at 0 paths over the run's 12 events (21, 3, 1, and 4 on the Before leg)

  5. Restarted with SENTRY_SEND_DEFAULT_PII=true, same four requests, same responses: the breadcrumb reads 'content': 'hi from canary.msg@example.com' and still 'api_key': '[Filtered]' (906 characters, [Filtered] 3); canary.msg@example.com at 10 paths and canary.ctx@example.com at 20 over the run's events, the two sk- canaries and the provider key at 0
    Observations from the run:

  • Sentry initialises lazily on a worker's first LLM route; pre-existing, unchanged here
  • With PII off the /team/new message's user_id=qa.use***om becomes user_id='[Filtered]'
  • With PII on /team/new shows no hash: its only carrier is the always-filtered token=
  • Transactions never carried identifiers on either leg
  • Request metadata named context_line or pre_context is scrubbed like any other field; only a real stack frame's source lines are exempt
  • The same Before request through litellm.completion(..., api_key=..., metadata=...) with failure_callback=["sentry"] leaks the key and metadata on the Before tree and nothing on the After tree; with the opt-in only the email is visible
  • The transaction's Authorization header reads [Filtered], an empty string before
  • input_callback: ["sentry"] records a Model Call Details pre-call: {...} breadcrumb that rides the next error event; on the Before tree its 1024-character message carried the deployment's provider api_key and the prompt, on the After tree both read [Filtered] and the prompt's email comes back with the opt-in. Which of the four case 8 requests hit the router cooldown (401, 429, 401, 429 on Before, 401, 429, 429, 429 on both After runs) depends on which worker took it, the cooldown being per-worker in-memory state

/live-pr-risk

Breaking: none observed. Across cases 1 to 8, the risk scenarios A to F (streaming chat, /v1/messages, key generate, info and delete, /health, the spend row, latency), the SDK leg and the merged tree, every client-visible result (status, body keys, stream chunk count, spend row) matched the base tree; only the Sentry envelope contents changed

Backward incompatible (each visible to an operator in Sentry only, each recorded under Caveats):

  • SENTRY_API_TRACE_RATE="" now means 1.0 where the base raised ValueError on the worker's first LLM call
  • Sentry's own default denylists are merged with litellm's instead of replaced and the scrubber walks nested objects, so more values read [Filtered]: the transaction's Authorization header and the masked user_id= tail of the exception message with PII off
  • Request metadata fields named pre_context, context_line or post_context are scrubbed like any other field; only a real stack frame's source lines keep those names exempt
  • SENTRY_SEND_DEFAULT_PII is new; only true and false count and anything else keeps PII off

Regression risk: every Sentry event pays the recursive key scrub plus the regex pass, measured back to back on the same two-worker rig (numbers under Caveats: about 4 ms per captured error event, under 1 ms per transaction). Router retries produce three AuthenticationError events per bad-key request on both trees, so that cost scales with num_retries, not with this PR. Sentry still initialises lazily on the first LLM route, and an exception inside the scrubber makes the SDK drop the event without touching the request, which the fail-closed depth test pins

Dependency graph: 19 dependents from a walk over litellm/, enterprise/, tests/, ui/, the docs checkout and the installed SDK 2.21.0; nothing in ui/ or enterprise/ reads Sentry. Driven live: the Starlette transaction per request, capture_exception from failure_callback on chat, responses and messages, the pre-call breadcrumb from input_callback, the transaction's request headers under both PII modes, the YAML config path, the SDK litellm.completion path, both env parsers, and the tip merged into main. The SDK floor stays 2.21.0 (pyproject.toml proxy-runtime >=2.21.0,<3.0, proxy-dev pins ==2.21.0, every Dockerfile installs 2.21.0) and everything the module imports exists there

Not verified: the logging integration path (an ERROR log whose args carry a secret dict bypasses litellm's handler-level filter on both trees; before_send now scrubs it by field name and value pattern, covered by the unit tests only), general_settings.alerting: ["sentry"] and the DB failure_handler (name-only dependents, unchanged), background jobs and rq workers, the unpinned pip install sentry_sdk fallback in a venv without the extra (latest 2.x drops the 1024-character truncation, so breadcrumbs get longer but pass through the same scrubber), and a host app that calls sentry_sdk.init itself (its options win, as before)

Type

🐛 Bug Fix

Caveats (if any)

Low

  • The exception message loses the masked user_id=qa.use***om tail with PII off; the response the caller gets is unchanged
  • A secret-named field holding a value nested more than four bracket levels deep falls back to the old word match; secret-named keys and sk- values inside it are still filtered
  • Every Sentry event now pays for the recursive key scrub plus the regex pass on the request path. Back to back on the same two-worker rig (base, head, base, head, 50 samples each, load 15 to 21) a 400 error event went from a 10.2 and 10.1 ms median to 14.2 and 13.8 ms and a /v1/models transaction from 3.4 and 3.7 ms to 3.8 and 4.5 ms; the scrubber alone measures 0.6 ms median and 8.4 ms worst over 143 captured events, and it only runs on requests that already fail or on sampled transactions
  • SENTRY_API_TRACE_RATE="" now means 1.0, the same as unset, where the old code raised ValueError on the worker's first LLM call (that request failed and Sentry stayed off); a deployment carrying the empty value starts tracing every request, which is what the docs example already showed. SENTRY_API_SAMPLE_RATE treated empty as 1.0 on both sides
  • The required lint check is red on main itself since feat(mcp): configure protocol versions and capability discovery #43169 (6b76888): ruff check --config ruff-tests.toml tests reports F601 for a repeated "UNIT_FLAG" key in tests/unit/test_unit_shard_missing_paths.py, a file this PR does not touch (same failure on fix(dashscope): pass image generation provider params at the top level of parameters #43208's lint run); the one-line fix fix(tests): drop the repeated UNIT_FLAG key in test_unit_shard_missing_paths #43212 landed on main as 25de1ab, and since the lint workflow checks out the PR head rather than the merge commit, main was merged in at a2bfb20 to pick it up
  • rust-test is red on main as well (run 36090485216 at 3fa02ef fails the same model-catalog spec parity case on fal_ai/fal-ai/nano-banana-2); nothing here touches the catalog
  • The proof reads each Sentry envelope at a local ingest sink instead of on a sentry.io issue page, because the Before leg would otherwise ship the dev master key and database URL to sentry.io; the envelope is the exact payload sentry.io stores, so a page screenshot adds no evidence
  • The After leg ran at 28ce1ad, before main was merged in at 5dbc9fb and again at a2bfb20: the merged ranges cbba146..6b76888 and 6b76888..8327cd6 touch nothing Sentry-related, the second touches none of this PR's files at all, the first's hunks in the shared files are disjoint from this PR's, and the targeted tests pass on each merged tree, so re-running both legs for a merge commit would spend real provider calls for no new evidence
  • With PII off, any sk- value carrying 13 or more key characters and any 64-hex token read [Filtered] wherever they appear in an event, so a model alias or content digest of that shape is masked too; an allowlist for those shapes would let a real key of the same shape through, and a masked alias costs a reader nothing

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR

  • 28ce1ad passes /live-pr-risk


Note

Medium Risk
Changes what operators see in Sentry (more [Filtered] fields, optional PII opt-in) and adds per-event scrubbing on the error/transaction path; client API behavior is unchanged but observability and empty-env sample-rate parsing differ slightly.

Overview
Centralizes Sentry setup in litellm_core_utils/sentry_scrubbing.py and wires it from set_callbacks(["sentry"]) via build_sentry_init_options instead of inline sentry_sdk.init.

Expands what gets redacted: SENTRY_DENYLIST / SENTRY_PII_DENYLIST gain proxy auth headers and LiteLLM identity fields; the SDK’s default denylists are merged (not replaced). A recursive before_send / before_send_transaction pass scrubs every string in the event—object reprs, nested locals, breadcrumbs, transactions—for secret field names, sk- keys, emails, and 64-char hashes, while real stack-frame source lines stay readable.

Adds SENTRY_SEND_DEFAULT_PII=true to opt into identity fields; secrets stay [Filtered] either way. proxy-dev pins sentry-sdk==2.21.0; tests move to the dedicated scrubbing module with integration-style coverage.

Reviewed by Cursor Bugbot for commit a2bfb20. Bugbot is set up for automated code reviews on this repo. Configure here.

@devin-ai-integration

devin-ai-integration Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@greptile-apps

greptile-apps Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium risk] Adds Sentry error scrubbing for secrets and personal data.

The PR appears safe to merge based on the reviewed changes.

Summary

This PR adds Sentry event scrubbing and an opt-in for sending identity fields. Changes since the previous review also move streamed Responses container-ownership recording ahead of the terminal chunk, adjust provider-budget accounting, and add coverage for those paths.

Reviews (8) · Last reviewed commit: "Merge remote-tracking branch 'origin/mai..."

Comment thread litellm/litellm_core_utils/sentry_scrubbing.py
@codspeed

codspeed Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_sentry_scrub_pii_reprs (a2bfb20) with main (8327cd6)

Open in CodSpeed

@codecov

codecov Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

Comment thread litellm/litellm_core_utils/sentry_scrubbing.py Outdated
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread litellm/litellm_core_utils/sentry_scrubbing.py Outdated
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

Comment thread litellm/litellm_core_utils/sentry_scrubbing.py Outdated
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit a2bfb20. Configure here.

@mateo-berri mateo-berri left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@mateo-berri
mateo-berri merged commit a09f8b8 into main Sep 25, 2026
115 of 116 checks passed
@mateo-berri
mateo-berri deleted the litellm_sentry_scrub_pii_reprs branch September 25, 2026 21:52
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request Oct 13, 2026
…105.0) (#866)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/berriai/litellm](https://images.chainguard.dev/directory/image/wolfi-base/overview) ([source](https://github.com/BerriAI/litellm)) | minor | `v1.104.0` → `v1.105.0` |

---

### Release Notes

<details>
<summary>BerriAI/litellm (ghcr.io/berriai/litellm)</summary>

### [`v1.105.0`](https://github.com/BerriAI/litellm/releases/tag/v1.105.0)

[Compare Source](https://github.com/BerriAI/litellm/compare/v1.104.3...v1.105.0)

##### Verify Docker Image Signature

All LiteLLM Docker images are signed with [cosign](https://docs.sigstore.dev/cosign/overview/). Every release is signed with the same key introduced in [commit `0112e53`](https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0).

**Verify using the pinned commit hash (recommended):**

A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
  ghcr.io/berriai/litellm:v1.105.0
```

**Verify using the release tag (convenience):**

Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.105.0/cosign.pub \
  ghcr.io/berriai/litellm:v1.105.0
```

Expected output:

```
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
```

***

##### What's Changed

- feat(mcp): share compatibility-aware result conversion across tool surfaces by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43089](https://github.com/BerriAI/litellm/pull/43089)
- fix(caching): propagate auth cache invalidation over Redis Cluster via a node-level pub/sub client by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43110](https://github.com/BerriAI/litellm/pull/43110)
- feat(model-catalog): add Rust registry validation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43136](https://github.com/BerriAI/litellm/pull/43136)
- test(rust): reorganize core crate tests and split cache and OCR suites by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43177](https://github.com/BerriAI/litellm/pull/43177)
- fix(proxy): give SpendLogToolIndex its own share of the cleanup budget and log a per-run summary by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41768](https://github.com/BerriAI/litellm/pull/41768)
- feat(rust): hand upstream response headers to the native Messages stream by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43178](https://github.com/BerriAI/litellm/pull/43178)
- feat(testkit): agent clients for Claude Code, Codex and opencode by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43181](https://github.com/BerriAI/litellm/pull/43181)
- ci: run migrated unit selections on every event in legacy GHA shards by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43182](https://github.com/BerriAI/litellm/pull/43182)
- test: move tests/test_litellm root and small trees into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43186](https://github.com/BerriAI/litellm/pull/43186)
- fix(sso): gate /sso/debug routes behind ENABLE_SSO_DEBUG, off by default by [@&#8203;ojensen-berri](https://github.com/ojensen-berri) in [#&#8203;43150](https://github.com/BerriAI/litellm/pull/43150)
- refactor(framer): replace Framer trait with tokio-util codecs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43193](https://github.com/BerriAI/litellm/pull/43193)
- fix(anthropic): surface Responses bridge stream failures as Anthropic error events by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43126](https://github.com/BerriAI/litellm/pull/43126)
- test: move tests/test_litellm/llms into tests/unit/llms by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43191](https://github.com/BerriAI/litellm/pull/43191)
- test: move tests/test_litellm integrations and secret_managers into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43194](https://github.com/BerriAI/litellm/pull/43194)
- feat(mcp): configure protocol versions and capability discovery by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43169](https://github.com/BerriAI/litellm/pull/43169)
- fix(proxy): record streamed /v1/responses container ownership before the response.completed frame by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43140](https://github.com/BerriAI/litellm/pull/43140)
- fix(tests): drop the repeated UNIT_FLAG key in test_unit_shard_missing_paths by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43212](https://github.com/BerriAI/litellm/pull/43212)
- fix(router): count provider budget spend on every API surface by [@&#8203;daqiangganjun](https://github.com/daqiangganjun) in [#&#8203;38172](https://github.com/BerriAI/litellm/pull/38172)
- fix(responses): fall back on pre-output stream drops, fail truncated streams, honor request_timeout by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43133](https://github.com/BerriAI/litellm/pull/43133)
- fix(sentry): scrub PII and secrets inside object reprs and nested locals, add SENTRY_SEND_DEFAULT_PII opt-in by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43123](https://github.com/BerriAI/litellm/pull/43123)
- fix(bedrock): surface a converse-stream 200 that decodes to no events as a 502 instead of an empty turn by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43213](https://github.com/BerriAI/litellm/pull/43213)
- fix(jwt): let x-litellm-team-id select DB membership teams when the token also carries a team claim by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43206](https://github.com/BerriAI/litellm/pull/43206)
- feat(integrations): add Databricks Zerobus trace logging callback by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42013](https://github.com/BerriAI/litellm/pull/42013)
- fix(vertex_ai): keep legacy bucket_name in credential resolution and add GCS_BATCH_BUCKET_NAME env var by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;42803](https://github.com/BerriAI/litellm/pull/42803)
- feat(xai): add native xAI batches and files support by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42812](https://github.com/BerriAI/litellm/pull/42812)
- fix(proxy): send a real error event when a /v1/messages stream fails by [@&#8203;4refael](https://github.com/4refael) in [#&#8203;41826](https://github.com/BerriAI/litellm/pull/41826)
- fix(logging): redact raw_request when turn_off_message_logging is set in the proxy config by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43219](https://github.com/BerriAI/litellm/pull/43219)
- fix(router): parse the classifier verdict out of surrounding prose instead of falling to the default tier by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43215](https://github.com/BerriAI/litellm/pull/43215)
- test(zerobus): move tests into active CI selection by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43235](https://github.com/BerriAI/litellm/pull/43235)
- fix(proxy): keep the submitted body out of 422 validation errors by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43231](https://github.com/BerriAI/litellm/pull/43231)
- test: move tests/test_litellm core utils, routing, responses, caching and rust_bridge into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43199](https://github.com/BerriAI/litellm/pull/43199)
- chore(cost-map): add fireworks us-only deepseek v4.1 flash priority prices by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43247](https://github.com/BerriAI/litellm/pull/43247)
- chore(cost-map): sync openrouter prices and add perceptron-mk1.5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43246](https://github.com/BerriAI/litellm/pull/43246)
- fix(cost-map): correct fireworks_ai deepseek-v4p1-flash pricing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43253](https://github.com/BerriAI/litellm/pull/43253)
- feat(openrouter): add typesafe/jev-router to the cost map by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43248](https://github.com/BerriAI/litellm/pull/43248)
- chore(cost-map): add fireworks priority prices for muse glimmer 30b and deepseek v4 flash vision exp by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43252](https://github.com/BerriAI/litellm/pull/43252)
- refactor(rust): move credential inheritance and SDK limits into a driver preflight by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43259](https://github.com/BerriAI/litellm/pull/43259)
- fix(router): hold Responses lifecycle events until output so a pre-output fallback announces one response by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43238](https://github.com/BerriAI/litellm/pull/43238)
- refactor(http): hand out an owned Client and route all providers through the pool by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43245](https://github.com/BerriAI/litellm/pull/43245)
- test: fix stale and state-leaking tests red on scheduled CircleCI by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43266](https://github.com/BerriAI/litellm/pull/43266)
- fix(cost-map): retirement dates, chatgpt reasoning flags, bing pricing, bedrock mantle and mythos, azure gpt-5.6 alias, anthropic batch rates, new nebius, openrouter and xai rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42951](https://github.com/BerriAI/litellm/pull/42951)
- refactor(rust): promote anthropic messages out of experimental_pass_through by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43269](https://github.com/BerriAI/litellm/pull/43269)
- test: stop CI tests from downloading tokenizer files and images by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43257](https://github.com/BerriAI/litellm/pull/43257)
- fix(rust): preserve nested optional import failures by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43265](https://github.com/BerriAI/litellm/pull/43265)
- ci: drop main and litellm\_\* branch filters from the CircleCI litellm-main workflows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43272](https://github.com/BerriAI/litellm/pull/43272)
- feat(proxy): email alerts at configured percentages of a team member budget by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42665](https://github.com/BerriAI/litellm/pull/42665)
- fix(callbacks-legacy-python): traverse and release the retained headers dict by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43274](https://github.com/BerriAI/litellm/pull/43274)
- test(integration): port langfuse callbacks-in-db coverage to the local harness by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43282](https://github.com/BerriAI/litellm/pull/43282)
- test(e2e): accept the otel cost write as a linked root trace by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42931](https://github.com/BerriAI/litellm/pull/42931)
- test: finish the non-proxy half of tests/test_litellm by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43281](https://github.com/BerriAI/litellm/pull/43281)
- refactor(rust): prepare inference and auth foundations for the gateway by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43287](https://github.com/BerriAI/litellm/pull/43287)
- feat(rust): add config, router and gateway crates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43289](https://github.com/BerriAI/litellm/pull/43289)
- fix(cost-map): remove duplicate openrouter/perceptron/perceptron-mk1.5 entry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43273](https://github.com/BerriAI/litellm/pull/43273)
- fix(e2e): resolve the blank-S3 gateway repo root from the litellm package location by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42911](https://github.com/BerriAI/litellm/pull/42911)
- test(integration): run the Langfuse DB-callback test on its own scratch database by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43288](https://github.com/BerriAI/litellm/pull/43288)
- refactor(rust): expand logging and test coverage across gateway and Anthropic messages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43295](https://github.com/BerriAI/litellm/pull/43295)
- refactor: daily fresh tech debt cleanup, rolling PR (2026-09-25) by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43151](https://github.com/BerriAI/litellm/pull/43151)
- test(proxy_behavior): scope the management proxy fixture to its package so its spend monitor cannot race the spend tests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43302](https://github.com/BerriAI/litellm/pull/43302)
- fix(cost-map): registry audit 2026-09-26, MAI-Image-2.5-Flash price, Databricks Claude Opus 5.5, Azure Foundry retirement dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43254](https://github.com/BerriAI/litellm/pull/43254)
- fix(cost-map): price fireworks deepseek v4.1 flash at the prices api value by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43311](https://github.com/BerriAI/litellm/pull/43311)
- fix(ci): stop stale CI reds, keep unit tests off the host env, retry CyberArk policy conflicts by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43294](https://github.com/BerriAI/litellm/pull/43294)
- fix(otel): detach post-response service spans by request phase, name redis spans by operation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43237](https://github.com/BerriAI/litellm/pull/43237)
- test(e2e): assert only litellm-owned batch behavior and move the blank S3 env pin to an integration test by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43321](https://github.com/BerriAI/litellm/pull/43321)
- test(integration): pin the team-admin status-code matrix across every management route by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43249](https://github.com/BerriAI/litellm/pull/43249)
- feat(proxy): add fail_closed_rate_limit_enforcement to reject requests with 503 while Redis rate limit counters are unreachable by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43251](https://github.com/BerriAI/litellm/pull/43251)
- fix(responses): run stream failure and success hooks on the iterating loop instead of blocking it by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43270](https://github.com/BerriAI/litellm/pull/43270)
- fix(guardrails): block private destinations in custom code http_request and bound guardrail execution time by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43280](https://github.com/BerriAI/litellm/pull/43280)
- feat(sail): add Sail as a provider with service_tier mapped to its completion window by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42840](https://github.com/BerriAI/litellm/pull/42840)
- test(mcp): pin server resolution and authorization behavior by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43261](https://github.com/BerriAI/litellm/pull/43261)
- refactor(anthropic): rename experimental_pass_through to pass_through by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43329](https://github.com/BerriAI/litellm/pull/43329)
- refactor(mcp): add shared server resolver without changing callers by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43262](https://github.com/BerriAI/litellm/pull/43262)
- ci: fail on new unbounded SQL IN lists and add a Prisma chunking helper by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42629](https://github.com/BerriAI/litellm/pull/42629)
- test(logging): drain the logging worker after each logging callback test so no later test inherits its events by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43344](https://github.com/BerriAI/litellm/pull/43344)
- feat(guardrails): scan retrieved vector store chunks with the request's pre-call guardrails by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43271](https://github.com/BerriAI/litellm/pull/43271)
- fix(mcp): adopt shared server resolution and caller authorization by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43263](https://github.com/BerriAI/litellm/pull/43263)
- fix(s3_v2): upload fresh events first, drop terminal failures and hour-old retries by default, opt-in adaptive concurrency by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43022](https://github.com/BerriAI/litellm/pull/43022)
- feat(proxy): add maximum_daily_tag_spend_retention_period cleanup setting by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39221](https://github.com/BerriAI/litellm/pull/39221)
- fix(cost-map): sync OpenRouter, Together, Cohere and Azure AI registry values with official sources by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43337](https://github.com/BerriAI/litellm/pull/43337)
- docs(pr-template): add the backport-stable label only for a P0 regression by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43351](https://github.com/BerriAI/litellm/pull/43351)
- fix(params): keep *litellm*\* kwargs out of provider request bodies by construction by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43221](https://github.com/BerriAI/litellm/pull/43221)
- test: remove substring guard test_default_api_base by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43355](https://github.com/BerriAI/litellm/pull/43355)
- ci: cut CircleCI wall time without loosening test isolation by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43347](https://github.com/BerriAI/litellm/pull/43347)
- fix(cost-map): correct azure gpt-4o-mini tts, transcribe, alias and MAI-Image-2.5 prices by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43357](https://github.com/BerriAI/litellm/pull/43357)
- fix(tests): stop VCR recording and replaying a test's own localhost upstream by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43346](https://github.com/BerriAI/litellm/pull/43346)
- test(integration): group /v1/messages contracts under tests/integration/messages_endpoint by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43352](https://github.com/BerriAI/litellm/pull/43352)
- fix(params): validate stream_chunk_size once, before any provider call by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43222](https://github.com/BerriAI/litellm/pull/43222)
- fix(openai): exclude fine-tuned and custom gpt-5-chat aliases from gpt-5 reasoning path by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43185](https://github.com/BerriAI/litellm/pull/43185)
- fix(langtrace): deliver spans to app.langtrace.ai/api/trace with x-api-key by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43322](https://github.com/BerriAI/litellm/pull/43322)
- fix(caching): stand default cache points down when extra_body hides a direct client mark by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43341](https://github.com/BerriAI/litellm/pull/43341)
- fix(mcp): report reachability without stored credentials by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43240](https://github.com/BerriAI/litellm/pull/43240)
- fix(mcp): align hub publication status and controls by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43241](https://github.com/BerriAI/litellm/pull/43241)
- chore(cost-map): sync openrouter prices for deepseek, minimax, qwen and glm rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43384](https://github.com/BerriAI/litellm/pull/43384)
- chore(cost-map): drop stale cache hit field from openrouter deepseek-v4-pro-0813 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43389](https://github.com/BerriAI/litellm/pull/43389)
- fix(responses): stream guardrail pre-call block as SSE with a typed output item by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42507](https://github.com/BerriAI/litellm/pull/42507)
- feat(e2e): read management routes back from the control plane replicas by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43373](https://github.com/BerriAI/litellm/pull/43373)
- feat(rust): add the openai_like chat config foundation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43379](https://github.com/BerriAI/litellm/pull/43379)
- feat(router): opt in to prompt-cache cost routing by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43232](https://github.com/BerriAI/litellm/pull/43232)
- feat(otel): add SigNoz preset for OpenTelemetry v2 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43296](https://github.com/BerriAI/litellm/pull/43296)
- feat(cli): reuse saved agent setup and add reconfigure by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43392](https://github.com/BerriAI/litellm/pull/43392)
- fix(streaming): keep litellm Usage on text-completion usage chunks by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43047](https://github.com/BerriAI/litellm/pull/43047)
- fix(vertex_ai): consider tools when validating context caching min tokens by [@&#8203;agustin18](https://github.com/agustin18) in [#&#8203;43319](https://github.com/BerriAI/litellm/pull/43319)
- fix(anthropic): drop thinking blocks with empty thinking text, not just missing signature by [@&#8203;shoemoney](https://github.com/shoemoney) in [#&#8203;38049](https://github.com/BerriAI/litellm/pull/38049)
- test(e2e): report batch cleanup leftovers as a plain UserWarning by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43405](https://github.com/BerriAI/litellm/pull/43405)
- fix(tools): salvage concatenated JSON tool call arguments by [@&#8203;kumarpriyanshu09](https://github.com/kumarpriyanshu09) in [#&#8203;43260](https://github.com/BerriAI/litellm/pull/43260)
- fix(gemini): forward seed to the Gemini API instead of rejecting it by [@&#8203;YaseenBashaT](https://github.com/YaseenBashaT) in [#&#8203;43197](https://github.com/BerriAI/litellm/pull/43197)
- fix(vertex_ai): make Gemma fake streams work with traced Responses by [@&#8203;stewartpark](https://github.com/stewartpark) in [#&#8203;43147](https://github.com/BerriAI/litellm/pull/43147)
- fix(responses): emit the reasoning item on streaming /v1/responses for signature-only thinking by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43414](https://github.com/BerriAI/litellm/pull/43414)
- fix(anthropic): forward the per-turn-control beta to Azure AI Foundry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43415](https://github.com/BerriAI/litellm/pull/43415)
- test(vertex_ai): assert the usage the Gemma responses stream actually reports by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43422](https://github.com/BerriAI/litellm/pull/43422)
- fix(bedrock): keep the provider status code on unprocessable image errors by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43416](https://github.com/BerriAI/litellm/pull/43416)
- fix(vertex_ai): stop importing the vertexai SDK in partner-model completion by [@&#8203;anmolg1997](https://github.com/anmolg1997) in [#&#8203;42274](https://github.com/BerriAI/litellm/pull/42274)
- fix(token_counter): count Gemini function_declarations tools by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43417](https://github.com/BerriAI/litellm/pull/43417)
- refactor(types): replace Any with proven types in 5 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43304](https://github.com/BerriAI/litellm/pull/43304)
- chore(cost-map): update azure_ai/grok-4.6 input price from Azure pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43440](https://github.com/BerriAI/litellm/pull/43440)
- chore(cost-map): add azure_ai/MAI-Cyber-1-Flash by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43446](https://github.com/BerriAI/litellm/pull/43446)
- refactor(rust): share anthropic types, request helpers, and streaming contracts across crates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43426](https://github.com/BerriAI/litellm/pull/43426)
- feat(rust): expand gateway configuration parsing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43460](https://github.com/BerriAI/litellm/pull/43460)
- refactor(rust): share call lifecycle across route-owned inference by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43461](https://github.com/BerriAI/litellm/pull/43461)
- feat(rust): add the HTTP host driver by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43462](https://github.com/BerriAI/litellm/pull/43462)
- build(rust): package the gateway container by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43471](https://github.com/BerriAI/litellm/pull/43471)
- refactor(rust): use shared execution in gateway inference by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43463](https://github.com/BerriAI/litellm/pull/43463)
- fix(cost-map): add deprecation_date to together_ai Salesforce/Llama-Rank-V1 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43507](https://github.com/BerriAI/litellm/pull/43507)
- feat(rust): support the HTTP Responses API by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43464](https://github.com/BerriAI/litellm/pull/43464)
- fix(cost-map): sync openrouter prices from the models API by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43506](https://github.com/BerriAI/litellm/pull/43506)
- fix(cost-map): set together_ai gpt-oss-20b and gemma-4-31B-it deprecation_date to 2026-09-15 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43509](https://github.com/BerriAI/litellm/pull/43509)
- feat(rust): add litellm-db and litellm-db-testing workspace scaffolding by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43504](https://github.com/BerriAI/litellm/pull/43504)
- feat(rust): connect Python inference bindings to shared routes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43465](https://github.com/BerriAI/litellm/pull/43465)
- feat(rust): add structured route lifecycle tracing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43466](https://github.com/BerriAI/litellm/pull/43466)
- feat(rust): separate gateway authentication and authorization by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43467](https://github.com/BerriAI/litellm/pull/43467)
- feat(rust): add virtual key storage contracts by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43468](https://github.com/BerriAI/litellm/pull/43468)
- feat(rust): add gateway UI login and sessions by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43469](https://github.com/BerriAI/litellm/pull/43469)
- feat(rust): add the MCP gateway by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43470](https://github.com/BerriAI/litellm/pull/43470)
- refactor(rust): remove delivery routing abstraction by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43514](https://github.com/BerriAI/litellm/pull/43514)
- feat(azure): add mistral ocr pricing and azure max output limits by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43530](https://github.com/BerriAI/litellm/pull/43530)
- refactor: clean up fresh tech debt from 2026-09-27 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43538](https://github.com/BerriAI/litellm/pull/43538)
- refactor(types): replace Any with proven types in 8 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43551](https://github.com/BerriAI/litellm/pull/43551)
- test(rust): enforce shared upstream error contract in wheel checks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43520](https://github.com/BerriAI/litellm/pull/43520)
- fix(proxy): log key owner identity on expired key auth failures by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43105](https://github.com/BerriAI/litellm/pull/43105)
- fix(cost-map): registry audit 2026-09-28, openai deep-research shutdown dates, azure deepseek v4.1 flash direct price, vertex gemini 3.8 live avatar price, drop azure_ai/muse-spark-1.3 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43566](https://github.com/BerriAI/litellm/pull/43566)
- security(proxy): keep team callback credentials out of the stored request body by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43217](https://github.com/BerriAI/litellm/pull/43217)
- feat(model_prices): add claude-sonnet-5-5 model pricing by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;43586](https://github.com/BerriAI/litellm/pull/43586)
- test(integration): pin org-admin status codes in the team-admin matrix by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43592](https://github.com/BerriAI/litellm/pull/43592)
- refactor(guardrails): fix agent 365 to the production endpoint and log the opt-in fail_open at error level by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43189](https://github.com/BerriAI/litellm/pull/43189)
- fix(model_prices): correct Claude Sonnet 5.5 capabilities and provider keys by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43587](https://github.com/BerriAI/litellm/pull/43587)
- test(unit): stop test modules from putting their own directory on sys.path by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43421](https://github.com/BerriAI/litellm/pull/43421)
- refactor(rust): centralize host execution and compose callbacks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43515](https://github.com/BerriAI/litellm/pull/43515)
- fix(proxy): unregister logging callbacks removed from the stored config by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43428](https://github.com/BerriAI/litellm/pull/43428)
- chore(cost-map): take azure limits for deepseek-v4-flash-0731 and v3.2-speciale by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43597](https://github.com/BerriAI/litellm/pull/43597)
- revert: "feat(proxy): server-side Team Usage export beyond the top-N key cap ([#&#8203;42996](https://github.com/BerriAI/litellm/issues/42996))" by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;43376](https://github.com/BerriAI/litellm/pull/43376)
- fix(cost-map): add web search flag and model page source to anthropic claude-sonnet-5-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43584](https://github.com/BerriAI/litellm/pull/43584)
- refactor(mcp): consolidate hub publication predicate by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43394](https://github.com/BerriAI/litellm/pull/43394)
- fix(provider): accept 2xx status codes in unified_access_group create by [@&#8203;Louis-Vauterin](https://github.com/Louis-Vauterin) in [#&#8203;42461](https://github.com/BerriAI/litellm/pull/42461)
- fix(panw_prisma_airs): honor experimental_use_latest_role_message_only on every request shape by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42447](https://github.com/BerriAI/litellm/pull/42447)
- fix(cost-map): add Vertex batch cache prices to vertex_ai/claude-sonnet-5-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43602](https://github.com/BerriAI/litellm/pull/43602)
- revert: "feat(usage): search team keys beyond the top-N in the Team usage view ([#&#8203;42857](https://github.com/BerriAI/litellm/issues/42857))" by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;43377](https://github.com/BerriAI/litellm/pull/43377)
- feat(providers): add Prism provider (internal copy of [#&#8203;40914](https://github.com/BerriAI/litellm/issues/40914)) by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41961](https://github.com/BerriAI/litellm/pull/41961)
- test(integration): credential canary suite harness by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43300](https://github.com/BerriAI/litellm/pull/43300)
- feat(bedrock): add xai grok-4.7 pricing and sync llama, mistral large 2407 and minimax m2.5 prices by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43623](https://github.com/BerriAI/litellm/pull/43623)
- ci: sync the weekly release cycle with Linear releases by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43636](https://github.com/BerriAI/litellm/pull/43636)
- feat(cache): select Rust caching through explicit cache objects by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43601](https://github.com/BerriAI/litellm/pull/43601)
- test(integration): credential canary slots for MCP and pass-through credentials by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43308](https://github.com/BerriAI/litellm/pull/43308)
- test(integration): stored-config credential canary slots by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43309](https://github.com/BerriAI/litellm/pull/43309)
- fix(guardrails): preserve Presidio output selection and restoration by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43401](https://github.com/BerriAI/litellm/pull/43401)
- fix(ui): rename All Models tab to Deployed Models and model filters to All Proxy Models by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43638](https://github.com/BerriAI/litellm/pull/43638)
- feat(mcp): scan and pin upstream tool descriptions by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43283](https://github.com/BerriAI/litellm/pull/43283)
- feat(cost-map): add bedrock_mantle rows for claude opus 5.5 and sonnet 5.5 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43647](https://github.com/BerriAI/litellm/pull/43647)
- chore(codeowners): drop UI, migration, and CODEOWNERS self owners by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43653](https://github.com/BerriAI/litellm/pull/43653)
- feat(fireworks_ai): route and list the auto, auto-instant and firerouter routers by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43641](https://github.com/BerriAI/litellm/pull/43641)
- feat: add model leaderboard page by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;43649](https://github.com/BerriAI/litellm/pull/43649)
- fix(google_genai): preserve proxy_server_request in completion adapter by [@&#8203;hsm207](https://github.com/hsm207) in [#&#8203;43536](https://github.com/BerriAI/litellm/pull/43536)
- fix(otel): send cache and reasoning tokens in langfuse usage_details by [@&#8203;ankit373](https://github.com/ankit373) in [#&#8203;43553](https://github.com/BerriAI/litellm/pull/43553)
- fix(vertex_ai): forward the per-turn-control beta for per-message output_config by [@&#8203;DeviaVir](https://github.com/DeviaVir) in [#&#8203;43558](https://github.com/BerriAI/litellm/pull/43558)
- fix(cost-map): add tool calling and reasoning flags, correct max output for nebius DeepSeek-V4.1-Flash by [@&#8203;Flexomatic81](https://github.com/Flexomatic81) in [#&#8203;43588](https://github.com/BerriAI/litellm/pull/43588)
- fix(proxy): resolve model_group_alias in the zero-cost budget predicate by [@&#8203;fedaeho](https://github.com/fedaeho) in [#&#8203;43512](https://github.com/BerriAI/litellm/pull/43512)
- refactor: clean up fresh tech debt from 2026-09-28 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43674](https://github.com/BerriAI/litellm/pull/43674)
- refactor(types): replace Any with proven types in 7 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43704](https://github.com/BerriAI/litellm/pull/43704)
- docs(security): point readers to the security announcements mailing list signup by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43713](https://github.com/BerriAI/litellm/pull/43713)
- refactor(rust): add shared llms wire type derives by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43730](https://github.com/BerriAI/litellm/pull/43730)
- fix(router): stream /v1/messages lifecycle frames live when no fallback can take over by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43600](https://github.com/BerriAI/litellm/pull/43600)
- feat(cost-map): add baseten DeepSeek-V4.1-Flash-Fast by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43735](https://github.com/BerriAI/litellm/pull/43735)
- feat(guardrails): send a configured gateway_name from noma_v2 to Noma by [@&#8203;itaimodi](https://github.com/itaimodi) in [#&#8203;43678](https://github.com/BerriAI/litellm/pull/43678)
- chore(cost-map): add openai gpt-6.1-sol from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43738](https://github.com/BerriAI/litellm/pull/43738)
- test(integration): callback credential canary slots C1-C3 and D5 by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43630](https://github.com/BerriAI/litellm/pull/43630)
- test(integration): request-path credential canary slots D1-D4 by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43307](https://github.com/BerriAI/litellm/pull/43307)
- test(integration): sweep proxy logs, metrics, a Datadog intake and the Logs drawer for credential canaries by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43306](https://github.com/BerriAI/litellm/pull/43306)
- chore(cost-map): add azure and openrouter gpt-6.1-sol rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43744](https://github.com/BerriAI/litellm/pull/43744)
- test(proxy): classify every credential-bearing param for the canary suite by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43298](https://github.com/BerriAI/litellm/pull/43298)
- fix(cost-map): lower fireworks up-to-4b size tier to the pricing page price by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43740](https://github.com/BerriAI/litellm/pull/43740)
- fix(cost_calculator): bill chat per-second pricing once with a new cost_per_second field by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43614](https://github.com/BerriAI/litellm/pull/43614)
- chore(cost-map): add openai gpt-6-astra ultrafast tier prices from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43745](https://github.com/BerriAI/litellm/pull/43745)
- fix(autorouter): compare historical and new savings consistently by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43348](https://github.com/BerriAI/litellm/pull/43348)
- fix(model-prices): align Azure, Bedrock, Copilot, Gemini, Groq, OpenAI and OpenRouter entries with official docs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43598](https://github.com/BerriAI/litellm/pull/43598)
- fix(guardrails): enable explicit PANW MCP output scanning by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43109](https://github.com/BerriAI/litellm/pull/43109)
- refactor(rust): orchestrate Messages route execution by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43719](https://github.com/BerriAI/litellm/pull/43719)
- fix(streaming): keep the served service_tier on streamed chunks and spend rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42870](https://github.com/BerriAI/litellm/pull/42870)
- feat(bedrock): add openai gpt-6.1-sol global and base rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43758](https://github.com/BerriAI/litellm/pull/43758)
- perf(router): fetch cooldown state and usage counters in one Redis round trip by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43320](https://github.com/BerriAI/litellm/pull/43320)
- perf(proxy): hold one spend counter batch across admission and across post-call accounting by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43369](https://github.com/BerriAI/litellm/pull/43369)
- perf(responses): run aresponses through the async wrapper so the cache is read once by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43769](https://github.com/BerriAI/litellm/pull/43769)
- fix(router): bind Claude Code background sessions to their auto-router by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43767](https://github.com/BerriAI/litellm/pull/43767)
- feat(bedrock): add openai.gpt-6.1-sol us geo cris and Mantle rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43763](https://github.com/BerriAI/litellm/pull/43763)
- fix(proxy): recover session key owners from daily spend for usage attribution by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43642](https://github.com/BerriAI/litellm/pull/43642)
- chore(cost-map): take azure context limits from models-sold-directly by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43759](https://github.com/BerriAI/litellm/pull/43759)
- perf(proxy): one request-scoped Redis pipeline for auth, spend, rate-limit and routing reads by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43407](https://github.com/BerriAI/litellm/pull/43407)
- fix(mcp): scope OpenAPI listings to the exact server prefix and drop upstream OAuth metadata when a server is saved by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43608](https://github.com/BerriAI/litellm/pull/43608)
- perf(proxy): one post-call Redis pipeline per backend for spend, rate-limit, routing and response-cache writes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43779](https://github.com/BerriAI/litellm/pull/43779)
- fix(bedrock): set gpt-6.1-sol max output tokens to 131072 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43782](https://github.com/BerriAI/litellm/pull/43782)
- perf(proxy): refresh auth management objects through the request Redis pipeline by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43776](https://github.com/BerriAI/litellm/pull/43776)
- feat(agents): add identity storage and validation contracts by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43720](https://github.com/BerriAI/litellm/pull/43720)
- chore: bump litellm-enterprise 0.1.71 -> 0.1.72, litellm-proxy-extras 0.4.102 -> 0.4.103, litellm 1.104.0 -> 1.105.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43789](https://github.com/BerriAI/litellm/pull/43789)
- fix(auth): give UI/CLI session tokens their own AES-GCM context and header-safe shape by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43790](https://github.com/BerriAI/litellm/pull/43790)
- chore(deps): bump pyjwt, moment and brace-expansion to clear osv-scan by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43792](https://github.com/BerriAI/litellm/pull/43792)
- fix(ui): surface x-litellm-call-id in Logs search, table and drawer by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42436](https://github.com/BerriAI/litellm/pull/42436)
- fix(proxy): look up hashed key names with two spend log rows per key by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43656](https://github.com/BerriAI/litellm/pull/43656)
- fix(cost-map): add deprecation_date to two together_ai nvidia rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43809](https://github.com/BerriAI/litellm/pull/43809)
- test(ci): refresh retired OpenAI tool-call models by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43676](https://github.com/BerriAI/litellm/pull/43676)
- fix(ui): keep MCP permissions visible after key, team and MCP server saves by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43810](https://github.com/BerriAI/litellm/pull/43810)
- test(ci): repair MCP Responses and budget fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43788](https://github.com/BerriAI/litellm/pull/43788)
- test(bedrock): accept regional aliases that inherit Converse routing by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43785](https://github.com/BerriAI/litellm/pull/43785)
- fix(params): categorize internal param appropriately to prevent leaking into request by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43783](https://github.com/BerriAI/litellm/pull/43783)
- perf(router): honour the cooldown read interval in the routing prefetch by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43815](https://github.com/BerriAI/litellm/pull/43815)
- fix(router): carry per-request routing reads on context variables instead of public method kwargs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43814](https://github.com/BerriAI/litellm/pull/43814)
- fix(bedrock): add beta header for output config in message by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43778](https://github.com/BerriAI/litellm/pull/43778)
- refactor: clean up fresh tech debt from 2026-09-29 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43830](https://github.com/BerriAI/litellm/pull/43830)
- test(router): settle the shared logging worker before recording shadow callbacks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43847](https://github.com/BerriAI/litellm/pull/43847)
- chore(model_prices): add Gemini Veo, Mistral and Azure Claude 4.5 deprecation dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43857](https://github.com/BerriAI/litellm/pull/43857)
- fix(cost_calculator): bill ultrafast prompts above 272k at the ultrafast long-context rates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43764](https://github.com/BerriAI/litellm/pull/43764)
- refactor(rust): centralize Python bridge execution wrappers by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43871](https://github.com/BerriAI/litellm/pull/43871)
- chore(cost-map): add openai gpt-image-2.5 batch prices from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43869](https://github.com/BerriAI/litellm/pull/43869)
- chore(cost-map): add fireworks priority prices for ember-1, nemotron and glm 5.3 us rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43811](https://github.com/BerriAI/litellm/pull/43811)
- fix(proxy): attribute completed batch cost rows to /batches in daily activity by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43870](https://github.com/BerriAI/litellm/pull/43870)
- fix(router): strip encrypted reasoning the pinned deployment cannot decrypt by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43781](https://github.com/BerriAI/litellm/pull/43781)
- fix(cost_calculator): stop copying optional_params into response hidden params by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43637](https://github.com/BerriAI/litellm/pull/43637)
- feat(pricing): add vertex_ai gemini-3.8 flash tts rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43876](https://github.com/BerriAI/litellm/pull/43876)
- fix(proxy): keep request-body credentials out of stored spend-log requests by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43635](https://github.com/BerriAI/litellm/pull/43635)
- fix(ui): right-align money and count columns across tables by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;37889](https://github.com/BerriAI/litellm/pull/37889)
- feat(agents): enforce authoritative agent permissions by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43721](https://github.com/BerriAI/litellm/pull/43721)
- fix(proxy): strip caller credentials from websocket passthrough by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43855](https://github.com/BerriAI/litellm/pull/43855)
- fix(ui): render access group MCP and agent selections as wrapping chips by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41228](https://github.com/BerriAI/litellm/pull/41228)
- fix(responses): scan and mask top-level instructions with guardrails by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43629](https://github.com/BerriAI/litellm/pull/43629)
- feat(traces): add Rust storage foundation by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43819](https://github.com/BerriAI/litellm/pull/43819)
- feat(ui): agent traces tab on logs with timeline and otel setup guide by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;43891](https://github.com/BerriAI/litellm/pull/43891)
- feat(otel v2): excluded_services opt-out for datastore spans on tenant destinations by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43278](https://github.com/BerriAI/litellm/pull/43278)
- fix(traces): correct ClickHouse rollup partitioning, dedupe keys, and retention changes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43901](https://github.com/BerriAI/litellm/pull/43901)
- fix(bedrock): keep applicable beta headers by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43829](https://github.com/BerriAI/litellm/pull/43829)
- feat(agents): authenticate Entra identities and delegated requests by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43722](https://github.com/BerriAI/litellm/pull/43722)
- fix(hosted_vllm): keep reasoning_content on replayed assistant messages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43599](https://github.com/BerriAI/litellm/pull/43599)
- fix(proxy): delete large teams without per-member transaction fan-out by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42998](https://github.com/BerriAI/litellm/pull/42998)
- feat(tracing): port OTLP ingestion to current trace foundation by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43915](https://github.com/BerriAI/litellm/pull/43915)
- feat(proxy): add native ROI calculator for gateway spend vs merged PRs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43669](https://github.com/BerriAI/litellm/pull/43669)
- test(e2e): repair completion, SAIL, and spend-log fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43902](https://github.com/BerriAI/litellm/pull/43902)
- test(s3_v2): pin async 5xx retry through the production AsyncHTTPHandler by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43080](https://github.com/BerriAI/litellm/pull/43080)
- feat(ui): adopt the new LiteLLM logo and monogram by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43913](https://github.com/BerriAI/litellm/pull/43913)
- fix(proxy): relay Azure passthrough body model groups through the router by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43896](https://github.com/BerriAI/litellm/pull/43896)
- fix(proxy): register a UI-configured arize callback next to otel under OTel v2 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43906](https://github.com/BerriAI/litellm/pull/43906)
- fix(transcription): honor base_url alias for Groq Whisper and report it as the api base by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43917](https://github.com/BerriAI/litellm/pull/43917)
- feat(tracing): store spend in ClickHouse automatically by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43928](https://github.com/BerriAI/litellm/pull/43928)
- fix(packaging): keep wheel paths under Windows MAX_PATH for Store Python by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43903](https://github.com/BerriAI/litellm/pull/43903)
- feat(agents): add identity registration and dashboard controls by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43723](https://github.com/BerriAI/litellm/pull/43723)
- refactor(proxy): answer every team access check with TeamAccess.allows by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43364](https://github.com/BerriAI/litellm/pull/43364)
- test(bedrock): restore the AWS env after a failed live call in the auth tests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43921](https://github.com/BerriAI/litellm/pull/43921)
- feat(lens): analyze agent activity with a separate worker by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;43889](https://github.com/BerriAI/litellm/pull/43889)
- fix(router): bill service tiers at catalog rates for custom-priced deployments by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43890](https://github.com/BerriAI/litellm/pull/43890)
- test(ci): refresh qualified retired OpenAI fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43938](https://github.com/BerriAI/litellm/pull/43938)
- fix(anthropic): forward the dangerous-tool-use beta to Azure AI Foundry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43934](https://github.com/BerriAI/litellm/pull/43934)
- test(proxy): scope user_api_key_auth overrides in proxy_server tests by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43952](https://github.com/BerriAI/litellm/pull/43952)
- fix(wandb): set supports_vision true on GLM-5.3-Flash by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43951](https://github.com/BerriAI/litellm/pull/43951)
- chore(cost-map): sync openrouter prices from the models API by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43950](https://github.com/BerriAI/litellm/pull/43950)
- fix(grayswan): send request conversation and tool calls to post-call monitor by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43770](https://github.com/BerriAI/litellm/pull/43770)
- fix(azure_storage): name Data Lake objects without base64 padding or slashes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43914](https://github.com/BerriAI/litellm/pull/43914)
- fix(guardrails): treat an unknown straiker api_version as unset instead of skipping the guardrail by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43956](https://github.com/BerriAI/litellm/pull/43956)
- chore(deps): bump gitpython and tornado, extend diskcache osv ignore to Nov 1 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43961](https://github.com/BerriAI/litellm/pull/43961)
- fix(azure_storage): keep the DataLakeServiceClient alive until its TTL elapses by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43082](https://github.com/BerriAI/litellm/pull/43082)
- feat(proxy): record in spend logs whether a request used a client-forwarded Anthropic OAuth token by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43063](https://github.com/BerriAI/litellm/pull/43063)
- test(ci): repair stale tests and move retired OpenAI text-completion fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43958](https://github.com/BerriAI/litellm/pull/43958)
- feat(e2e): record each e2e test's steps, starting with ProxyClient by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42393](https://github.com/BerriAI/litellm/pull/42393)
- feat(providers): add Cortecs as an OpenAI-compatible provider by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43872](https://github.com/BerriAI/litellm/pull/43872)
- feat(ui): filter tags by name and description on the Tag Management page by [@&#8203;galovics](https://github.com/galovics) in [#&#8203;42949](https://github.com/BerriAI/litellm/pull/42949)
- fix(caching): write the response-cache SET to Redis at once instead of on the post-call batch by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43973](https://github.com/BerriAI/litellm/pull/43973)
- test(e2e): typed per-test metadata for the e2e suite by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42044](https://github.com/BerriAI/litellm/pull/42044)
- feat(guardrails): honor litellm_params.timeout in every HTTP guardrail by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43134](https://github.com/BerriAI/litellm/pull/43134)
- chore(cost-map): add fireworks inkling priority prices from the prices api by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43949](https://github.com/BerriAI/litellm/pull/43949)
- chore(cost-map): add deprecation date for anthropic claude-sonnet-4-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43898](https://github.com/BerriAI/litellm/pull/43898)
- fix(cost-map): raise baseten DeepSeek-V4.1-Flash max output to 262144 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43916](https://github.com/BerriAI/litellm/pull/43916)
- fix(proxy): restore pre-config-wins handling of pass-through endpoints by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43962](https://github.com/BerriAI/litellm/pull/43962)
- feat(lens): investigate sampled traces and retain batch results by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;43942](https://github.com/BerriAI/litellm/pull/43942)
- fix(guardrails): scan Responses API input in Azure Prompt Shield by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43786](https://github.com/BerriAI/litellm/pull/43786)
- fix(guardrails): scan Responses API input in Azure Text Moderation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43965](https://github.com/BerriAI/litellm/pull/43965)
- refactor: clean up fresh tech debt from 2026-09-30 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43993](https://github.com/BerriAI/litellm/pull/43993)
- test: inject the HIBP client and the MCP loop clock so two backend tests stop flaking by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;44007](https://github.com/BerriAI/litellm/pull/44007)
- fix(cost-map): reprice fireworks deepseek v4.1 flash to the 2026-10-01 pricing up…
Exikle pushed a commit to Exikle/Artemis-Cluster that referenced this pull request Oct 14, 2026
…105.0) (#2711)

🔵 **minor** · ghcr.io/berriai/litellm

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/berriai/litellm](https://images.chainguard.dev/directory/image/wolfi-base/overview) ([source](https://github.com/BerriAI/litellm)) | minor | `v1.104.2` → `v1.105.0` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/107) for more information.

> ⛔ **Do not automerge.** v1.99.0 silently flipped the MCP `allow_all_keys` default and emptied every tool list.

---

### Release Notes

<details>
<summary>BerriAI/litellm (ghcr.io/berriai/litellm)</summary>

### [`v1.105.0`](https://github.com/BerriAI/litellm/releases/tag/v1.105.0)

[Compare Source](https://github.com/BerriAI/litellm/compare/v1.104.3...v1.105.0)

#### Verify Docker Image Signature

All LiteLLM Docker images are signed with [cosign](https://docs.sigstore.dev/cosign/overview/). Every release is signed with the same key introduced in [commit `0112e53`](https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0).

**Verify using the pinned commit hash (recommended):**

A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \
  ghcr.io/berriai/litellm:v1.105.0
```

**Verify using the release tag (convenience):**

Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:

```bash
cosign verify \
  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.105.0/cosign.pub \
  ghcr.io/berriai/litellm:v1.105.0
```

Expected output:

```
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
```

***

#### What's Changed

- feat(mcp): share compatibility-aware result conversion across tool surfaces by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43089](https://github.com/BerriAI/litellm/pull/43089)
- fix(caching): propagate auth cache invalidation over Redis Cluster via a node-level pub/sub client by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43110](https://github.com/BerriAI/litellm/pull/43110)
- feat(model-catalog): add Rust registry validation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43136](https://github.com/BerriAI/litellm/pull/43136)
- test(rust): reorganize core crate tests and split cache and OCR suites by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43177](https://github.com/BerriAI/litellm/pull/43177)
- fix(proxy): give SpendLogToolIndex its own share of the cleanup budget and log a per-run summary by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41768](https://github.com/BerriAI/litellm/pull/41768)
- feat(rust): hand upstream response headers to the native Messages stream by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43178](https://github.com/BerriAI/litellm/pull/43178)
- feat(testkit): agent clients for Claude Code, Codex and opencode by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43181](https://github.com/BerriAI/litellm/pull/43181)
- ci: run migrated unit selections on every event in legacy GHA shards by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43182](https://github.com/BerriAI/litellm/pull/43182)
- test: move tests/test_litellm root and small trees into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43186](https://github.com/BerriAI/litellm/pull/43186)
- fix(sso): gate /sso/debug routes behind ENABLE_SSO_DEBUG, off by default by [@&#8203;ojensen-berri](https://github.com/ojensen-berri) in [#&#8203;43150](https://github.com/BerriAI/litellm/pull/43150)
- refactor(framer): replace Framer trait with tokio-util codecs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43193](https://github.com/BerriAI/litellm/pull/43193)
- fix(anthropic): surface Responses bridge stream failures as Anthropic error events by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43126](https://github.com/BerriAI/litellm/pull/43126)
- test: move tests/test_litellm/llms into tests/unit/llms by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43191](https://github.com/BerriAI/litellm/pull/43191)
- test: move tests/test_litellm integrations and secret_managers into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43194](https://github.com/BerriAI/litellm/pull/43194)
- feat(mcp): configure protocol versions and capability discovery by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43169](https://github.com/BerriAI/litellm/pull/43169)
- fix(proxy): record streamed /v1/responses container ownership before the response.completed frame by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43140](https://github.com/BerriAI/litellm/pull/43140)
- fix(tests): drop the repeated UNIT_FLAG key in test_unit_shard_missing_paths by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43212](https://github.com/BerriAI/litellm/pull/43212)
- fix(router): count provider budget spend on every API surface by [@&#8203;daqiangganjun](https://github.com/daqiangganjun) in [#&#8203;38172](https://github.com/BerriAI/litellm/pull/38172)
- fix(responses): fall back on pre-output stream drops, fail truncated streams, honor request_timeout by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43133](https://github.com/BerriAI/litellm/pull/43133)
- fix(sentry): scrub PII and secrets inside object reprs and nested locals, add SENTRY_SEND_DEFAULT_PII opt-in by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43123](https://github.com/BerriAI/litellm/pull/43123)
- fix(bedrock): surface a converse-stream 200 that decodes to no events as a 502 instead of an empty turn by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43213](https://github.com/BerriAI/litellm/pull/43213)
- fix(jwt): let x-litellm-team-id select DB membership teams when the token also carries a team claim by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43206](https://github.com/BerriAI/litellm/pull/43206)
- feat(integrations): add Databricks Zerobus trace logging callback by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42013](https://github.com/BerriAI/litellm/pull/42013)
- fix(vertex_ai): keep legacy bucket_name in credential resolution and add GCS_BATCH_BUCKET_NAME env var by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;42803](https://github.com/BerriAI/litellm/pull/42803)
- feat(xai): add native xAI batches and files support by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42812](https://github.com/BerriAI/litellm/pull/42812)
- fix(proxy): send a real error event when a /v1/messages stream fails by [@&#8203;4refael](https://github.com/4refael) in [#&#8203;41826](https://github.com/BerriAI/litellm/pull/41826)
- fix(logging): redact raw_request when turn_off_message_logging is set in the proxy config by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43219](https://github.com/BerriAI/litellm/pull/43219)
- fix(router): parse the classifier verdict out of surrounding prose instead of falling to the default tier by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43215](https://github.com/BerriAI/litellm/pull/43215)
- test(zerobus): move tests into active CI selection by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43235](https://github.com/BerriAI/litellm/pull/43235)
- fix(proxy): keep the submitted body out of 422 validation errors by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43231](https://github.com/BerriAI/litellm/pull/43231)
- test: move tests/test_litellm core utils, routing, responses, caching and rust_bridge into tests/unit by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43199](https://github.com/BerriAI/litellm/pull/43199)
- chore(cost-map): add fireworks us-only deepseek v4.1 flash priority prices by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43247](https://github.com/BerriAI/litellm/pull/43247)
- chore(cost-map): sync openrouter prices and add perceptron-mk1.5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43246](https://github.com/BerriAI/litellm/pull/43246)
- fix(cost-map): correct fireworks_ai deepseek-v4p1-flash pricing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43253](https://github.com/BerriAI/litellm/pull/43253)
- feat(openrouter): add typesafe/jev-router to the cost map by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43248](https://github.com/BerriAI/litellm/pull/43248)
- chore(cost-map): add fireworks priority prices for muse glimmer 30b and deepseek v4 flash vision exp by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43252](https://github.com/BerriAI/litellm/pull/43252)
- refactor(rust): move credential inheritance and SDK limits into a driver preflight by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43259](https://github.com/BerriAI/litellm/pull/43259)
- fix(router): hold Responses lifecycle events until output so a pre-output fallback announces one response by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43238](https://github.com/BerriAI/litellm/pull/43238)
- refactor(http): hand out an owned Client and route all providers through the pool by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43245](https://github.com/BerriAI/litellm/pull/43245)
- test: fix stale and state-leaking tests red on scheduled CircleCI by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43266](https://github.com/BerriAI/litellm/pull/43266)
- fix(cost-map): retirement dates, chatgpt reasoning flags, bing pricing, bedrock mantle and mythos, azure gpt-5.6 alias, anthropic batch rates, new nebius, openrouter and xai rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42951](https://github.com/BerriAI/litellm/pull/42951)
- refactor(rust): promote anthropic messages out of experimental_pass_through by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43269](https://github.com/BerriAI/litellm/pull/43269)
- test: stop CI tests from downloading tokenizer files and images by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43257](https://github.com/BerriAI/litellm/pull/43257)
- fix(rust): preserve nested optional import failures by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43265](https://github.com/BerriAI/litellm/pull/43265)
- ci: drop main and litellm\_\* branch filters from the CircleCI litellm-main workflows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43272](https://github.com/BerriAI/litellm/pull/43272)
- feat(proxy): email alerts at configured percentages of a team member budget by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42665](https://github.com/BerriAI/litellm/pull/42665)
- fix(callbacks-legacy-python): traverse and release the retained headers dict by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43274](https://github.com/BerriAI/litellm/pull/43274)
- test(integration): port langfuse callbacks-in-db coverage to the local harness by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43282](https://github.com/BerriAI/litellm/pull/43282)
- test(e2e): accept the otel cost write as a linked root trace by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42931](https://github.com/BerriAI/litellm/pull/42931)
- test: finish the non-proxy half of tests/test_litellm by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43281](https://github.com/BerriAI/litellm/pull/43281)
- refactor(rust): prepare inference and auth foundations for the gateway by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43287](https://github.com/BerriAI/litellm/pull/43287)
- feat(rust): add config, router and gateway crates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43289](https://github.com/BerriAI/litellm/pull/43289)
- fix(cost-map): remove duplicate openrouter/perceptron/perceptron-mk1.5 entry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43273](https://github.com/BerriAI/litellm/pull/43273)
- fix(e2e): resolve the blank-S3 gateway repo root from the litellm package location by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42911](https://github.com/BerriAI/litellm/pull/42911)
- test(integration): run the Langfuse DB-callback test on its own scratch database by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43288](https://github.com/BerriAI/litellm/pull/43288)
- refactor(rust): expand logging and test coverage across gateway and Anthropic messages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43295](https://github.com/BerriAI/litellm/pull/43295)
- refactor: daily fresh tech debt cleanup, rolling PR (2026-09-25) by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43151](https://github.com/BerriAI/litellm/pull/43151)
- test(proxy_behavior): scope the management proxy fixture to its package so its spend monitor cannot race the spend tests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43302](https://github.com/BerriAI/litellm/pull/43302)
- fix(cost-map): registry audit 2026-09-26, MAI-Image-2.5-Flash price, Databricks Claude Opus 5.5, Azure Foundry retirement dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43254](https://github.com/BerriAI/litellm/pull/43254)
- fix(cost-map): price fireworks deepseek v4.1 flash at the prices api value by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43311](https://github.com/BerriAI/litellm/pull/43311)
- fix(ci): stop stale CI reds, keep unit tests off the host env, retry CyberArk policy conflicts by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43294](https://github.com/BerriAI/litellm/pull/43294)
- fix(otel): detach post-response service spans by request phase, name redis spans by operation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43237](https://github.com/BerriAI/litellm/pull/43237)
- test(e2e): assert only litellm-owned batch behavior and move the blank S3 env pin to an integration test by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43321](https://github.com/BerriAI/litellm/pull/43321)
- test(integration): pin the team-admin status-code matrix across every management route by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43249](https://github.com/BerriAI/litellm/pull/43249)
- feat(proxy): add fail_closed_rate_limit_enforcement to reject requests with 503 while Redis rate limit counters are unreachable by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43251](https://github.com/BerriAI/litellm/pull/43251)
- fix(responses): run stream failure and success hooks on the iterating loop instead of blocking it by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43270](https://github.com/BerriAI/litellm/pull/43270)
- fix(guardrails): block private destinations in custom code http_request and bound guardrail execution time by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43280](https://github.com/BerriAI/litellm/pull/43280)
- feat(sail): add Sail as a provider with service_tier mapped to its completion window by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42840](https://github.com/BerriAI/litellm/pull/42840)
- test(mcp): pin server resolution and authorization behavior by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43261](https://github.com/BerriAI/litellm/pull/43261)
- refactor(anthropic): rename experimental_pass_through to pass_through by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43329](https://github.com/BerriAI/litellm/pull/43329)
- refactor(mcp): add shared server resolver without changing callers by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43262](https://github.com/BerriAI/litellm/pull/43262)
- ci: fail on new unbounded SQL IN lists and add a Prisma chunking helper by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42629](https://github.com/BerriAI/litellm/pull/42629)
- test(logging): drain the logging worker after each logging callback test so no later test inherits its events by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43344](https://github.com/BerriAI/litellm/pull/43344)
- feat(guardrails): scan retrieved vector store chunks with the request's pre-call guardrails by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43271](https://github.com/BerriAI/litellm/pull/43271)
- fix(mcp): adopt shared server resolution and caller authorization by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43263](https://github.com/BerriAI/litellm/pull/43263)
- fix(s3_v2): upload fresh events first, drop terminal failures and hour-old retries by default, opt-in adaptive concurrency by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43022](https://github.com/BerriAI/litellm/pull/43022)
- feat(proxy): add maximum_daily_tag_spend_retention_period cleanup setting by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39221](https://github.com/BerriAI/litellm/pull/39221)
- fix(cost-map): sync OpenRouter, Together, Cohere and Azure AI registry values with official sources by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43337](https://github.com/BerriAI/litellm/pull/43337)
- docs(pr-template): add the backport-stable label only for a P0 regression by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43351](https://github.com/BerriAI/litellm/pull/43351)
- fix(params): keep *litellm*\* kwargs out of provider request bodies by construction by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43221](https://github.com/BerriAI/litellm/pull/43221)
- test: remove substring guard test_default_api_base by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43355](https://github.com/BerriAI/litellm/pull/43355)
- ci: cut CircleCI wall time without loosening test isolation by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43347](https://github.com/BerriAI/litellm/pull/43347)
- fix(cost-map): correct azure gpt-4o-mini tts, transcribe, alias and MAI-Image-2.5 prices by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43357](https://github.com/BerriAI/litellm/pull/43357)
- fix(tests): stop VCR recording and replaying a test's own localhost upstream by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43346](https://github.com/BerriAI/litellm/pull/43346)
- test(integration): group /v1/messages contracts under tests/integration/messages_endpoint by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43352](https://github.com/BerriAI/litellm/pull/43352)
- fix(params): validate stream_chunk_size once, before any provider call by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43222](https://github.com/BerriAI/litellm/pull/43222)
- fix(openai): exclude fine-tuned and custom gpt-5-chat aliases from gpt-5 reasoning path by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43185](https://github.com/BerriAI/litellm/pull/43185)
- fix(langtrace): deliver spans to app.langtrace.ai/api/trace with x-api-key by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43322](https://github.com/BerriAI/litellm/pull/43322)
- fix(caching): stand default cache points down when extra_body hides a direct client mark by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43341](https://github.com/BerriAI/litellm/pull/43341)
- fix(mcp): report reachability without stored credentials by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43240](https://github.com/BerriAI/litellm/pull/43240)
- fix(mcp): align hub publication status and controls by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43241](https://github.com/BerriAI/litellm/pull/43241)
- chore(cost-map): sync openrouter prices for deepseek, minimax, qwen and glm rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43384](https://github.com/BerriAI/litellm/pull/43384)
- chore(cost-map): drop stale cache hit field from openrouter deepseek-v4-pro-0813 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43389](https://github.com/BerriAI/litellm/pull/43389)
- fix(responses): stream guardrail pre-call block as SSE with a typed output item by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42507](https://github.com/BerriAI/litellm/pull/42507)
- feat(e2e): read management routes back from the control plane replicas by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43373](https://github.com/BerriAI/litellm/pull/43373)
- feat(rust): add the openai_like chat config foundation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43379](https://github.com/BerriAI/litellm/pull/43379)
- feat(router): opt in to prompt-cache cost routing by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43232](https://github.com/BerriAI/litellm/pull/43232)
- feat(otel): add SigNoz preset for OpenTelemetry v2 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43296](https://github.com/BerriAI/litellm/pull/43296)
- feat(cli): reuse saved agent setup and add reconfigure by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43392](https://github.com/BerriAI/litellm/pull/43392)
- fix(streaming): keep litellm Usage on text-completion usage chunks by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43047](https://github.com/BerriAI/litellm/pull/43047)
- fix(vertex_ai): consider tools when validating context caching min tokens by [@&#8203;agustin18](https://github.com/agustin18) in [#&#8203;43319](https://github.com/BerriAI/litellm/pull/43319)
- fix(anthropic): drop thinking blocks with empty thinking text, not just missing signature by [@&#8203;shoemoney](https://github.com/shoemoney) in [#&#8203;38049](https://github.com/BerriAI/litellm/pull/38049)
- test(e2e): report batch cleanup leftovers as a plain UserWarning by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43405](https://github.com/BerriAI/litellm/pull/43405)
- fix(tools): salvage concatenated JSON tool call arguments by [@&#8203;kumarpriyanshu09](https://github.com/kumarpriyanshu09) in [#&#8203;43260](https://github.com/BerriAI/litellm/pull/43260)
- fix(gemini): forward seed to the Gemini API instead of rejecting it by [@&#8203;YaseenBashaT](https://github.com/YaseenBashaT) in [#&#8203;43197](https://github.com/BerriAI/litellm/pull/43197)
- fix(vertex_ai): make Gemma fake streams work with traced Responses by [@&#8203;stewartpark](https://github.com/stewartpark) in [#&#8203;43147](https://github.com/BerriAI/litellm/pull/43147)
- fix(responses): emit the reasoning item on streaming /v1/responses for signature-only thinking by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43414](https://github.com/BerriAI/litellm/pull/43414)
- fix(anthropic): forward the per-turn-control beta to Azure AI Foundry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43415](https://github.com/BerriAI/litellm/pull/43415)
- test(vertex_ai): assert the usage the Gemma responses stream actually reports by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43422](https://github.com/BerriAI/litellm/pull/43422)
- fix(bedrock): keep the provider status code on unprocessable image errors by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43416](https://github.com/BerriAI/litellm/pull/43416)
- fix(vertex_ai): stop importing the vertexai SDK in partner-model completion by [@&#8203;anmolg1997](https://github.com/anmolg1997) in [#&#8203;42274](https://github.com/BerriAI/litellm/pull/42274)
- fix(token_counter): count Gemini function_declarations tools by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43417](https://github.com/BerriAI/litellm/pull/43417)
- refactor(types): replace Any with proven types in 5 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43304](https://github.com/BerriAI/litellm/pull/43304)
- chore(cost-map): update azure_ai/grok-4.6 input price from Azure pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43440](https://github.com/BerriAI/litellm/pull/43440)
- chore(cost-map): add azure_ai/MAI-Cyber-1-Flash by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43446](https://github.com/BerriAI/litellm/pull/43446)
- refactor(rust): share anthropic types, request helpers, and streaming contracts across crates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43426](https://github.com/BerriAI/litellm/pull/43426)
- feat(rust): expand gateway configuration parsing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43460](https://github.com/BerriAI/litellm/pull/43460)
- refactor(rust): share call lifecycle across route-owned inference by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43461](https://github.com/BerriAI/litellm/pull/43461)
- feat(rust): add the HTTP host driver by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43462](https://github.com/BerriAI/litellm/pull/43462)
- build(rust): package the gateway container by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43471](https://github.com/BerriAI/litellm/pull/43471)
- refactor(rust): use shared execution in gateway inference by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43463](https://github.com/BerriAI/litellm/pull/43463)
- fix(cost-map): add deprecation_date to together_ai Salesforce/Llama-Rank-V1 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43507](https://github.com/BerriAI/litellm/pull/43507)
- feat(rust): support the HTTP Responses API by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43464](https://github.com/BerriAI/litellm/pull/43464)
- fix(cost-map): sync openrouter prices from the models API by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43506](https://github.com/BerriAI/litellm/pull/43506)
- fix(cost-map): set together_ai gpt-oss-20b and gemma-4-31B-it deprecation_date to 2026-09-15 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43509](https://github.com/BerriAI/litellm/pull/43509)
- feat(rust): add litellm-db and litellm-db-testing workspace scaffolding by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43504](https://github.com/BerriAI/litellm/pull/43504)
- feat(rust): connect Python inference bindings to shared routes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43465](https://github.com/BerriAI/litellm/pull/43465)
- feat(rust): add structured route lifecycle tracing by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43466](https://github.com/BerriAI/litellm/pull/43466)
- feat(rust): separate gateway authentication and authorization by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43467](https://github.com/BerriAI/litellm/pull/43467)
- feat(rust): add virtual key storage contracts by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43468](https://github.com/BerriAI/litellm/pull/43468)
- feat(rust): add gateway UI login and sessions by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43469](https://github.com/BerriAI/litellm/pull/43469)
- feat(rust): add the MCP gateway by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43470](https://github.com/BerriAI/litellm/pull/43470)
- refactor(rust): remove delivery routing abstraction by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43514](https://github.com/BerriAI/litellm/pull/43514)
- feat(azure): add mistral ocr pricing and azure max output limits by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43530](https://github.com/BerriAI/litellm/pull/43530)
- refactor: clean up fresh tech debt from 2026-09-27 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43538](https://github.com/BerriAI/litellm/pull/43538)
- refactor(types): replace Any with proven types in 8 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43551](https://github.com/BerriAI/litellm/pull/43551)
- test(rust): enforce shared upstream error contract in wheel checks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43520](https://github.com/BerriAI/litellm/pull/43520)
- fix(proxy): log key owner identity on expired key auth failures by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43105](https://github.com/BerriAI/litellm/pull/43105)
- fix(cost-map): registry audit 2026-09-28, openai deep-research shutdown dates, azure deepseek v4.1 flash direct price, vertex gemini 3.8 live avatar price, drop azure_ai/muse-spark-1.3 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43566](https://github.com/BerriAI/litellm/pull/43566)
- security(proxy): keep team callback credentials out of the stored request body by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43217](https://github.com/BerriAI/litellm/pull/43217)
- feat(model_prices): add claude-sonnet-5-5 model pricing by [@&#8203;krrish-berri-2](https://github.com/krrish-berri-2) in [#&#8203;43586](https://github.com/BerriAI/litellm/pull/43586)
- test(integration): pin org-admin status codes in the team-admin matrix by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43592](https://github.com/BerriAI/litellm/pull/43592)
- refactor(guardrails): fix agent 365 to the production endpoint and log the opt-in fail_open at error level by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43189](https://github.com/BerriAI/litellm/pull/43189)
- fix(model_prices): correct Claude Sonnet 5.5 capabilities and provider keys by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43587](https://github.com/BerriAI/litellm/pull/43587)
- test(unit): stop test modules from putting their own directory on sys.path by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43421](https://github.com/BerriAI/litellm/pull/43421)
- refactor(rust): centralize host execution and compose callbacks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43515](https://github.com/BerriAI/litellm/pull/43515)
- fix(proxy): unregister logging callbacks removed from the stored config by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43428](https://github.com/BerriAI/litellm/pull/43428)
- chore(cost-map): take azure limits for deepseek-v4-flash-0731 and v3.2-speciale by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43597](https://github.com/BerriAI/litellm/pull/43597)
- revert: "feat(proxy): server-side Team Usage export beyond the top-N key cap ([#&#8203;42996](https://github.com/BerriAI/litellm/issues/42996))" by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;43376](https://github.com/BerriAI/litellm/pull/43376)
- fix(cost-map): add web search flag and model page source to anthropic claude-sonnet-5-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43584](https://github.com/BerriAI/litellm/pull/43584)
- refactor(mcp): consolidate hub publication predicate by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43394](https://github.com/BerriAI/litellm/pull/43394)
- fix(provider): accept 2xx status codes in unified_access_group create by [@&#8203;Louis-Vauterin](https://github.com/Louis-Vauterin) in [#&#8203;42461](https://github.com/BerriAI/litellm/pull/42461)
- fix(panw_prisma_airs): honor experimental_use_latest_role_message_only on every request shape by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42447](https://github.com/BerriAI/litellm/pull/42447)
- fix(cost-map): add Vertex batch cache prices to vertex_ai/claude-sonnet-5-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43602](https://github.com/BerriAI/litellm/pull/43602)
- revert: "feat(usage): search team keys beyond the top-N in the Team usage view ([#&#8203;42857](https://github.com/BerriAI/litellm/issues/42857))" by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;43377](https://github.com/BerriAI/litellm/pull/43377)
- feat(providers): add Prism provider (internal copy of [#&#8203;40914](https://github.com/BerriAI/litellm/issues/40914)) by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41961](https://github.com/BerriAI/litellm/pull/41961)
- test(integration): credential canary suite harness by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43300](https://github.com/BerriAI/litellm/pull/43300)
- feat(bedrock): add xai grok-4.7 pricing and sync llama, mistral large 2407 and minimax m2.5 prices by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43623](https://github.com/BerriAI/litellm/pull/43623)
- ci: sync the weekly release cycle with Linear releases by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43636](https://github.com/BerriAI/litellm/pull/43636)
- feat(cache): select Rust caching through explicit cache objects by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43601](https://github.com/BerriAI/litellm/pull/43601)
- test(integration): credential canary slots for MCP and pass-through credentials by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43308](https://github.com/BerriAI/litellm/pull/43308)
- test(integration): stored-config credential canary slots by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43309](https://github.com/BerriAI/litellm/pull/43309)
- fix(guardrails): preserve Presidio output selection and restoration by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43401](https://github.com/BerriAI/litellm/pull/43401)
- fix(ui): rename All Models tab to Deployed Models and model filters to All Proxy Models by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43638](https://github.com/BerriAI/litellm/pull/43638)
- feat(mcp): scan and pin upstream tool descriptions by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43283](https://github.com/BerriAI/litellm/pull/43283)
- feat(cost-map): add bedrock_mantle rows for claude opus 5.5 and sonnet 5.5 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43647](https://github.com/BerriAI/litellm/pull/43647)
- chore(codeowners): drop UI, migration, and CODEOWNERS self owners by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43653](https://github.com/BerriAI/litellm/pull/43653)
- feat(fireworks_ai): route and list the auto, auto-instant and firerouter routers by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43641](https://github.com/BerriAI/litellm/pull/43641)
- feat: add model leaderboard page by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;43649](https://github.com/BerriAI/litellm/pull/43649)
- fix(google_genai): preserve proxy_server_request in completion adapter by [@&#8203;hsm207](https://github.com/hsm207) in [#&#8203;43536](https://github.com/BerriAI/litellm/pull/43536)
- fix(otel): send cache and reasoning tokens in langfuse usage_details by [@&#8203;ankit373](https://github.com/ankit373) in [#&#8203;43553](https://github.com/BerriAI/litellm/pull/43553)
- fix(vertex_ai): forward the per-turn-control beta for per-message output_config by [@&#8203;DeviaVir](https://github.com/DeviaVir) in [#&#8203;43558](https://github.com/BerriAI/litellm/pull/43558)
- fix(cost-map): add tool calling and reasoning flags, correct max output for nebius DeepSeek-V4.1-Flash by [@&#8203;Flexomatic81](https://github.com/Flexomatic81) in [#&#8203;43588](https://github.com/BerriAI/litellm/pull/43588)
- fix(proxy): resolve model_group_alias in the zero-cost budget predicate by [@&#8203;fedaeho](https://github.com/fedaeho) in [#&#8203;43512](https://github.com/BerriAI/litellm/pull/43512)
- refactor: clean up fresh tech debt from 2026-09-28 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43674](https://github.com/BerriAI/litellm/pull/43674)
- refactor(types): replace Any with proven types in 7 files by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43704](https://github.com/BerriAI/litellm/pull/43704)
- docs(security): point readers to the security announcements mailing list signup by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43713](https://github.com/BerriAI/litellm/pull/43713)
- refactor(rust): add shared llms wire type derives by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43730](https://github.com/BerriAI/litellm/pull/43730)
- fix(router): stream /v1/messages lifecycle frames live when no fallback can take over by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43600](https://github.com/BerriAI/litellm/pull/43600)
- feat(cost-map): add baseten DeepSeek-V4.1-Flash-Fast by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43735](https://github.com/BerriAI/litellm/pull/43735)
- feat(guardrails): send a configured gateway_name from noma_v2 to Noma by [@&#8203;itaimodi](https://github.com/itaimodi) in [#&#8203;43678](https://github.com/BerriAI/litellm/pull/43678)
- chore(cost-map): add openai gpt-6.1-sol from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43738](https://github.com/BerriAI/litellm/pull/43738)
- test(integration): callback credential canary slots C1-C3 and D5 by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43630](https://github.com/BerriAI/litellm/pull/43630)
- test(integration): request-path credential canary slots D1-D4 by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43307](https://github.com/BerriAI/litellm/pull/43307)
- test(integration): sweep proxy logs, metrics, a Datadog intake and the Logs drawer for credential canaries by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43306](https://github.com/BerriAI/litellm/pull/43306)
- chore(cost-map): add azure and openrouter gpt-6.1-sol rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43744](https://github.com/BerriAI/litellm/pull/43744)
- test(proxy): classify every credential-bearing param for the canary suite by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43298](https://github.com/BerriAI/litellm/pull/43298)
- fix(cost-map): lower fireworks up-to-4b size tier to the pricing page price by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43740](https://github.com/BerriAI/litellm/pull/43740)
- fix(cost_calculator): bill chat per-second pricing once with a new cost_per_second field by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43614](https://github.com/BerriAI/litellm/pull/43614)
- chore(cost-map): add openai gpt-6-astra ultrafast tier prices from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43745](https://github.com/BerriAI/litellm/pull/43745)
- fix(autorouter): compare historical and new savings consistently by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43348](https://github.com/BerriAI/litellm/pull/43348)
- fix(model-prices): align Azure, Bedrock, Copilot, Gemini, Groq, OpenAI and OpenRouter entries with official docs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43598](https://github.com/BerriAI/litellm/pull/43598)
- fix(guardrails): enable explicit PANW MCP output scanning by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43109](https://github.com/BerriAI/litellm/pull/43109)
- refactor(rust): orchestrate Messages route execution by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43719](https://github.com/BerriAI/litellm/pull/43719)
- fix(streaming): keep the served service_tier on streamed chunks and spend rows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42870](https://github.com/BerriAI/litellm/pull/42870)
- feat(bedrock): add openai gpt-6.1-sol global and base rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43758](https://github.com/BerriAI/litellm/pull/43758)
- perf(router): fetch cooldown state and usage counters in one Redis round trip by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43320](https://github.com/BerriAI/litellm/pull/43320)
- perf(proxy): hold one spend counter batch across admission and across post-call accounting by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43369](https://github.com/BerriAI/litellm/pull/43369)
- perf(responses): run aresponses through the async wrapper so the cache is read once by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43769](https://github.com/BerriAI/litellm/pull/43769)
- fix(router): bind Claude Code background sessions to their auto-router by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;43767](https://github.com/BerriAI/litellm/pull/43767)
- feat(bedrock): add openai.gpt-6.1-sol us geo cris and Mantle rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43763](https://github.com/BerriAI/litellm/pull/43763)
- fix(proxy): recover session key owners from daily spend for usage attribution by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43642](https://github.com/BerriAI/litellm/pull/43642)
- chore(cost-map): take azure context limits from models-sold-directly by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43759](https://github.com/BerriAI/litellm/pull/43759)
- perf(proxy): one request-scoped Redis pipeline for auth, spend, rate-limit and routing reads by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43407](https://github.com/BerriAI/litellm/pull/43407)
- fix(mcp): scope OpenAPI listings to the exact server prefix and drop upstream OAuth metadata when a server is saved by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43608](https://github.com/BerriAI/litellm/pull/43608)
- perf(proxy): one post-call Redis pipeline per backend for spend, rate-limit, routing and response-cache writes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43779](https://github.com/BerriAI/litellm/pull/43779)
- fix(bedrock): set gpt-6.1-sol max output tokens to 131072 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43782](https://github.com/BerriAI/litellm/pull/43782)
- perf(proxy): refresh auth management objects through the request Redis pipeline by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43776](https://github.com/BerriAI/litellm/pull/43776)
- feat(agents): add identity storage and validation contracts by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43720](https://github.com/BerriAI/litellm/pull/43720)
- chore: bump litellm-enterprise 0.1.71 -> 0.1.72, litellm-proxy-extras 0.4.102 -> 0.4.103, litellm 1.104.0 -> 1.105.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43789](https://github.com/BerriAI/litellm/pull/43789)
- fix(auth): give UI/CLI session tokens their own AES-GCM context and header-safe shape by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43790](https://github.com/BerriAI/litellm/pull/43790)
- chore(deps): bump pyjwt, moment and brace-expansion to clear osv-scan by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43792](https://github.com/BerriAI/litellm/pull/43792)
- fix(ui): surface x-litellm-call-id in Logs search, table and drawer by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42436](https://github.com/BerriAI/litellm/pull/42436)
- fix(proxy): look up hashed key names with two spend log rows per key by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43656](https://github.com/BerriAI/litellm/pull/43656)
- fix(cost-map): add deprecation_date to two together_ai nvidia rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43809](https://github.com/BerriAI/litellm/pull/43809)
- test(ci): refresh retired OpenAI tool-call models by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43676](https://github.com/BerriAI/litellm/pull/43676)
- fix(ui): keep MCP permissions visible after key, team and MCP server saves by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43810](https://github.com/BerriAI/litellm/pull/43810)
- test(ci): repair MCP Responses and budget fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43788](https://github.com/BerriAI/litellm/pull/43788)
- test(bedrock): accept regional aliases that inherit Converse routing by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43785](https://github.com/BerriAI/litellm/pull/43785)
- fix(params): categorize internal param appropriately to prevent leaking into request by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43783](https://github.com/BerriAI/litellm/pull/43783)
- perf(router): honour the cooldown read interval in the routing prefetch by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43815](https://github.com/BerriAI/litellm/pull/43815)
- fix(router): carry per-request routing reads on context variables instead of public method kwargs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43814](https://github.com/BerriAI/litellm/pull/43814)
- fix(bedrock): add beta header for output config in message by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43778](https://github.com/BerriAI/litellm/pull/43778)
- refactor: clean up fresh tech debt from 2026-09-29 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43830](https://github.com/BerriAI/litellm/pull/43830)
- test(router): settle the shared logging worker before recording shadow callbacks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43847](https://github.com/BerriAI/litellm/pull/43847)
- chore(model_prices): add Gemini Veo, Mistral and Azure Claude 4.5 deprecation dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43857](https://github.com/BerriAI/litellm/pull/43857)
- fix(cost_calculator): bill ultrafast prompts above 272k at the ultrafast long-context rates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43764](https://github.com/BerriAI/litellm/pull/43764)
- refactor(rust): centralize Python bridge execution wrappers by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43871](https://github.com/BerriAI/litellm/pull/43871)
- chore(cost-map): add openai gpt-image-2.5 batch prices from the pricing page by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43869](https://github.com/BerriAI/litellm/pull/43869)
- chore(cost-map): add fireworks priority prices for ember-1, nemotron and glm 5.3 us rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43811](https://github.com/BerriAI/litellm/pull/43811)
- fix(proxy): attribute completed batch cost rows to /batches in daily activity by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43870](https://github.com/BerriAI/litellm/pull/43870)
- fix(router): strip encrypted reasoning the pinned deployment cannot decrypt by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43781](https://github.com/BerriAI/litellm/pull/43781)
- fix(cost_calculator): stop copying optional_params into response hidden params by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43637](https://github.com/BerriAI/litellm/pull/43637)
- feat(pricing): add vertex_ai gemini-3.8 flash tts rows by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43876](https://github.com/BerriAI/litellm/pull/43876)
- fix(proxy): keep request-body credentials out of stored spend-log requests by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;43635](https://github.com/BerriAI/litellm/pull/43635)
- fix(ui): right-align money and count columns across tables by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;37889](https://github.com/BerriAI/litellm/pull/37889)
- feat(agents): enforce authoritative agent permissions by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43721](https://github.com/BerriAI/litellm/pull/43721)
- fix(proxy): strip caller credentials from websocket passthrough by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43855](https://github.com/BerriAI/litellm/pull/43855)
- fix(ui): render access group MCP and agent selections as wrapping chips by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;41228](https://github.com/BerriAI/litellm/pull/41228)
- fix(responses): scan and mask top-level instructions with guardrails by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43629](https://github.com/BerriAI/litellm/pull/43629)
- feat(traces): add Rust storage foundation by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43819](https://github.com/BerriAI/litellm/pull/43819)
- feat(ui): agent traces tab on logs with timeline and otel setup guide by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;43891](https://github.com/BerriAI/litellm/pull/43891)
- feat(otel v2): excluded_services opt-out for datastore spans on tenant destinations by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43278](https://github.com/BerriAI/litellm/pull/43278)
- fix(traces): correct ClickHouse rollup partitioning, dedupe keys, and retention changes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43901](https://github.com/BerriAI/litellm/pull/43901)
- fix(bedrock): keep applicable beta headers by [@&#8203;shrey-berri](https://github.com/shrey-berri) in [#&#8203;43829](https://github.com/BerriAI/litellm/pull/43829)
- feat(agents): authenticate Entra identities and delegated requests by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43722](https://github.com/BerriAI/litellm/pull/43722)
- fix(hosted_vllm): keep reasoning_content on replayed assistant messages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43599](https://github.com/BerriAI/litellm/pull/43599)
- fix(proxy): delete large teams without per-member transaction fan-out by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;42998](https://github.com/BerriAI/litellm/pull/42998)
- feat(tracing): port OTLP ingestion to current trace foundation by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43915](https://github.com/BerriAI/litellm/pull/43915)
- feat(proxy): add native ROI calculator for gateway spend vs merged PRs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43669](https://github.com/BerriAI/litellm/pull/43669)
- test(e2e): repair completion, SAIL, and spend-log fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43902](https://github.com/BerriAI/litellm/pull/43902)
- test(s3_v2): pin async 5xx retry through the production AsyncHTTPHandler by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43080](https://github.com/BerriAI/litellm/pull/43080)
- feat(ui): adopt the new LiteLLM logo and monogram by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43913](https://github.com/BerriAI/litellm/pull/43913)
- fix(proxy): relay Azure passthrough body model groups through the router by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43896](https://github.com/BerriAI/litellm/pull/43896)
- fix(proxy): register a UI-configured arize callback next to otel under OTel v2 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43906](https://github.com/BerriAI/litellm/pull/43906)
- fix(transcription): honor base_url alias for Groq Whisper and report it as the api base by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43917](https://github.com/BerriAI/litellm/pull/43917)
- feat(tracing): store spend in ClickHouse automatically by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;43928](https://github.com/BerriAI/litellm/pull/43928)
- fix(packaging): keep wheel paths under Windows MAX_PATH for Store Python by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43903](https://github.com/BerriAI/litellm/pull/43903)
- feat(agents): add identity registration and dashboard controls by [@&#8203;joshua-berri](https://github.com/joshua-berri) in [#&#8203;43723](https://github.com/BerriAI/litellm/pull/43723)
- refactor(proxy): answer every team access check with TeamAccess.allows by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;43364](https://github.com/BerriAI/litellm/pull/43364)
- test(bedrock): restore the AWS env after a failed live call in the auth tests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43921](https://github.com/BerriAI/litellm/pull/43921)
- feat(lens): analyze agent activity with a separate worker by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;43889](https://github.com/BerriAI/litellm/pull/43889)
- fix(router): bill service tiers at catalog rates for custom-priced deployments by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43890](https://github.com/BerriAI/litellm/pull/43890)
- test(ci): refresh qualified retired OpenAI fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43938](https://github.com/BerriAI/litellm/pull/43938)
- fix(anthropic): forward the dangerous-tool-use beta to Azure AI Foundry by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43934](https://github.com/BerriAI/litellm/pull/43934)
- test(proxy): scope user_api_key_auth overrides in proxy_server tests by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43952](https://github.com/BerriAI/litellm/pull/43952)
- fix(wandb): set supports_vision true on GLM-5.3-Flash by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43951](https://github.com/BerriAI/litellm/pull/43951)
- chore(cost-map): sync openrouter prices from the models API by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43950](https://github.com/BerriAI/litellm/pull/43950)
- fix(grayswan): send request conversation and tool calls to post-call monitor by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43770](https://github.com/BerriAI/litellm/pull/43770)
- fix(azure_storage): name Data Lake objects without base64 padding or slashes by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43914](https://github.com/BerriAI/litellm/pull/43914)
- fix(guardrails): treat an unknown straiker api_version as unset instead of skipping the guardrail by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43956](https://github.com/BerriAI/litellm/pull/43956)
- chore(deps): bump gitpython and tornado, extend diskcache osv ignore to Nov 1 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43961](https://github.com/BerriAI/litellm/pull/43961)
- fix(azure_storage): keep the DataLakeServiceClient alive until its TTL elapses by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43082](https://github.com/BerriAI/litellm/pull/43082)
- feat(proxy): record in spend logs whether a request used a client-forwarded Anthropic OAuth token by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43063](https://github.com/BerriAI/litellm/pull/43063)
- test(ci): repair stale tests and move retired OpenAI text-completion fixtures by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43958](https://github.com/BerriAI/litellm/pull/43958)
- feat(e2e): record each e2e test's steps, starting with ProxyClient by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42393](https://github.com/BerriAI/litellm/pull/42393)
- feat(providers): add Cortecs as an OpenAI-compatible provider by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43872](https://github.com/BerriAI/litellm/pull/43872)
- feat(ui): filter tags by name and description on the Tag Management page by [@&#8203;galovics](https://github.com/galovics) in [#&#8203;42949](https://github.com/BerriAI/litellm/pull/42949)
- fix(caching): write the response-cache SET to Redis at once instead of on the post-call batch by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43973](https://github.com/BerriAI/litellm/pull/43973)
- test(e2e): typed per-test metadata for the e2e suite by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;42044](https://github.com/BerriAI/litellm/pull/42044)
- feat(guardrails): honor litellm_params.timeout in every HTTP guardrail by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43134](https://github.com/BerriAI/litellm/pull/43134)
- chore(cost-map): add fireworks inkling priority prices from the prices api by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43949](https://github.com/BerriAI/litellm/pull/43949)
- chore(cost-map): add deprecation date for anthropic claude-sonnet-4-5 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43898](https://github.com/BerriAI/litellm/pull/43898)
- fix(cost-map): raise baseten DeepSeek-V4.1-Flash max output to 262144 by [@&#8203;berriai-litellm-provider-info-sync](https://github.com/berriai-litellm-provider-info-sync)\[bot] in [#&#8203;43916](https://github.com/BerriAI/litellm/pull/43916)
- fix(proxy): restore pre-config-wins handling of pass-through endpoints by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;43962](https://github.com/BerriAI/litellm/pull/43962)
- feat(lens): investigate sampled traces and retain batch results by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;43942](https://github.com/BerriAI/litellm/pull/43942)
- fix(guardrails): scan Responses API input in Azure Prompt Shield by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43786](https://github.com/BerriAI/litellm/pull/43786)
- fix(guardrails): scan Responses API input in Azure Text Moderation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43965](https://github.com/BerriAI/litellm/pull/43965)
- refactor: clean up fresh tech debt from 2026-09-30 by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;43993](https://github.com/BerriAI/litellm/pull/43993)
- test: inject the H…

This branch was successfully deployed

1 active deployment
e2e-changed — a2bfb20d Deployed Sep 25, 2026 by mateo-berri via oauth #1191
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant