Skip to content

fix(guardrails): block private destinations in custom code http_request and bound guardrail execution time - #43280

Merged
mateo-berri merged 3 commits into
mainfrom
litellm_custom_code_guardrail_ssrf_and_timeout
Sep 26, 2026
Merged

mateo-berri merged 3 commits into
mainfrom
litellm_custom_code_guardrail_ssrf_and_timeout

Conversation

@devin-ai-integration

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

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • http_request in a custom code guardrail could reach loopback, private and cloud metadata addresses
  • Guardrail code had no execution limit, so one busy loop stalled every request on the proxy
  • The admin "test custom code" endpoint hung forever on an infinite loop
  • A guardrail whose code failed to compile was still saved to the DB by POST /guardrails

How it solves it:

  • http_request, http_get, http_post go through the shared SSRF validator, every redirect hop included
  • litellm_settings.user_url_allowed_hosts opts an internal host back in, user_url_validation: false turns the check off
  • New timeout on the guardrail (default 30s) bounds each run, module-level code included
  • Every while test, for iteration and comprehension in guardrail code checks the budget, so a loop that never yields or awaits still stops
  • Sync guardrail code runs on a worker thread, so the event loop keeps serving while it runs
  • A run that finishes after its deadline is reported as a timeout, even if the code swallowed the interrupt
  • The test endpoint returns "Execution timeout" promptly and awaits async guardrails instead of returning a coroutine
  • A compile failure at POST /guardrails now rolls the DB write back and returns 400, and any guardrail type whose configuration fails validation there now gets a 400 instead of a 500 wrapping it
  • A caller-supplied Host header on http_* is dropped when validation is on, so only the validated host is sent

Intentional product change: a guardrail that called a private or loopback address now gets {"success": false, "error": "Blocked URL: ..."} from the primitive until the host is allowlisted, and a run longer than 30s now fails the request

User Flow

Before: a proxy admin's custom code guardrail can read an internal-only service on the proxy host, and a busy loop in another guardrail stalls every request on the proxy

  1. The admin configures a custom_code guardrail whose apply_guardrail calls await http_get("http://127.0.0.1:40023/internal.txt") and starts the proxy
  2. A developer sends POST http://litellm-domain/v1/chat/completions with "guardrails": ["loopback-probe"]
  3. The reply is 200 with finish_reason: content_filter, and the guardrail's message carries the internal service's body, which the service logged as a hit
  4. A second guardrail whose code is while n < 550000000: n += 1 with timeout: 5 takes 22s to answer, and GET http://litellm-domain/health/liveliness sent 3s into it waits 17s
  5. Anyone who can edit guardrails can read whatever the proxy host can reach, a cloud metadata endpoint included

After: the same loopback call is refused unless the host is allowlisted, and the busy loop fails its own request at 5s while the proxy keeps answering

  1. The admin configures a custom_code guardrail whose apply_guardrail calls await http_get("http://127.0.0.1:40023/internal.txt") and starts the proxy
  2. A developer sends POST http://litellm-domain/v1/chat/completions with "guardrails": ["loopback-probe"]
  3. The reply is 200 with finish_reason: content_filter, and the message reads Blocked URL: URL targets a blocked address (127.0.0.1); the internal service logs no hit, and litellm_settings.user_url_allowed_hosts: ["127.0.0.1:40023"] lets that one host through again
  4. The busy-loop guardrail's request fails at 5s with exceeded its 5s execution timeout, GET http://litellm-domain/health/liveliness sent meanwhile answers in milliseconds, and an async while True: pass guardrail fails the same way
  5. Anyone who can edit guardrails can only reach hosts the proxy admin allowlisted

Relevant issues

Supersedes #36983, #32870 and #32897, which covered the SSRF half without redirect validation or the execution limit

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)

Screenshots / Proof of Fix

Before (4adbc13)

Proxy booted from 4adbc13, proxy on :41917 with --num_workers 2, real OpenAI calls (gpt-6-luna), curl as the client

Control: no guardrail

$ curl -s http://127.0.0.1:41917/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"Say hi in three words."}]}'
{"id":"chatcmpl-ESDwJhz1FOviIfBGXQXFqLzWt9zQV","created":1790395475,"model":"gpt-6-luna","object":"chat.completion","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi there, friend.","role":"assistant","provider_specific_fields":{"refusal":null},"annotations":[]},"provider_specific_fields":{}}],"usage":{"completion_tokens":25,"prompt_tokens":12,"total_tokens":37,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":11,"rejected_prediction_tokens":0},"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"cache_write_tokens":0,"cache_creation_tokens":0}},"service_tier":"default"}
-> http 200 in 16.213023s

Case 1: guardrail http_get to a loopback address, on every unified endpoint

$ curl -s http://127.0.0.1:41917/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["loopback-probe"]}'
{"id":"chatcmpl-af8c1813-b374-4d18-bd53-e73c72082337","created":1790395476,"model":"gpt-6-luna","object":"chat.completion","system_fingerprint":null,"choices":[{"finish_reason":"content_filter","index":0,"message":{"content":"guardrail reached loopback: HTTP 200 body=internal-only marker: this loopback service is not reachable from the internet\n","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields":null}}],"usage":{"completion_tokens":0,"prompt_tokens":0,"total_tokens":0,"completion_tokens_details":null,"prompt_tokens_details":null}}
-> http 200 in 0.061830s

$ curl -s http://127.0.0.1:41917/v1/messages -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","max_tokens":32,"messages":[{"role":"user","content":"hi"}],"guardrails":["loopback-probe"]}'
{"id":"msg_78a99bc4-8ab4-495e-9cc2-97d4e9a780cb","type":"message","role":"assistant","content":[{"type":"text","text":"guardrail reached loopback: HTTP 200 body=internal-only marker: this loopback service is not reachable from the internet\n"}],"model":"gpt-6-luna","stop_reason":"end_turn","usage":{"input_tokens":0,"output_tokens":0}}
-> http 200 in 0.055958s

$ curl -s http://127.0.0.1:41917/v1/responses -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","input":"hi","guardrails":["loopback-probe"]}'
{"id":"resp_8f683fb0-c281-4fa6-8721-3ed1f8472437","created_at":1790395476,"error":null,"incomplete_details":null,"instructions":null,"metadata":null,"model":"gpt-6-luna","object":"response","output":[{"content":[{"type":"text","text":"guardrail reached loopback: HTTP 200 body=internal-only marker: this loopback service is not reachable from the internet\n"}]}],"parallel_tool_calls":null,"temperature":null,"tool_choice":null,"tools":null,"top_p":null,"max_output_tokens":null,"previous_response_id":null,"reasoning":null,"status":"completed","text":null,"truncation":null,"usage":{"input_tokens":0,"input_tokens_details":null,"output_tokens":0,"output_tokens_details":null,"total_tokens":0,"cost":null},"user":null,"store":null}
-> http 200 in 0.048169s

$ # loopback service access log: hits during the three calls above
3 hits
  127.0.0.1 - - [25/Sep/2026 21:04:36] "GET /internal.txt HTTP/1.1" 200 -
  127.0.0.1 - - [25/Sep/2026 21:04:36] "GET /internal.txt HTTP/1.1" 200 -
  127.0.0.1 - - [25/Sep/2026 21:04:36] "GET /internal.txt HTTP/1.1" 200 -

Case 2: sync busy loop with timeout: 5, two concurrent requests (one per worker) and a liveliness probe 3s in

$ for i in 1 2; do curl -s http://127.0.0.1:41917/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["busy-loop"]}' -o busy_$i.json -w "busy $i: http %{http_code} in %{time_total}s\n" & sleep 0.5; done
$ sleep 3; curl -s http://127.0.0.1:41917/health/liveliness -w " <- liveliness: http %{http_code} in %{time_total}s\n"; wait; cat busy_1.json
"I'm alive!" <- liveliness: http 200 in 19.425880s
busy 1: http 200 in 24.259038s
busy 2: http 200 in 24.939655s
{"id":"chatcmpl-ESDwiLyhWrD0eMZ10nHQ8H8RJ3Yr7","created":1790395500,"model":"gpt-6-luna","object":"chat.completion","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi! How can I help you today?","role":"assistant","provider_specific_fields":{"refusal":null},"annotations":[]},"provider_specific_fields":{}}],"usage":{"completion_tokens":27,"prompt_tokens":7,"total_tokens":34,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":9,"rejected_prediction_tokens":0},"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"cache_write_tokens":0,"cache_creation_tokens":0}},"service_tier":"default"}

Case 3: the same busy loop on /v1/messages and /v1/responses

$ curl -s http://127.0.0.1:41917/v1/messages -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","max_tokens":32,"messages":[{"role":"user","content":"hi"}],"guardrails":["busy-loop"]}'
{"id":"resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOm9wZW5haTttb2RlbF9pZDo5MzQzYThjY2I3OGVhZjVjNGE5MGIxN2M3ZTg1NDI1MDc2MzFjNTkxYTQ1ZjRhNjE4MWEwMmM1NDJkNGI4NDY3O3Jlc3BvbnNlX2lkOnJlc3BfMDM4NGIzYTY4MTcxNTMyMTAwNmFiNzQ0ODJjYjRjODdkMDlhYzI3YzA2YjE2M2JmZGQ=","type":"message","role":"assistant","model":"gpt-6-luna","stop_sequence":null,"usage":{"input_tokens":7,"output_tokens":13},"content":[{"type":"text","text":"Hi! How can I help you today?"}],"stop_reason":"end_turn","stop_details":null}
-> http 200 in 21.743134s

$ curl -s http://127.0.0.1:41917/v1/responses -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","input":"hi","guardrails":["busy-loop"]}'
{"id":"resp_ZXqkqssODLxxRp17YxWzserjs1fS5IAegTtu4j_a6GH4dlMSVfsKv1q_cT66rgBY9wpvlvSFt_7tVjk7hWEiMuxtqhYzB0YaMIYpOKTnfeWeA6zKgn9LnWbKwWewcSIHvO2Q8tTmZYcpjhXjvBucMrNybMJXHjW3bjgQOdFDKeE5HfHaJNgN54iYyoS19KojZK0nmRVmjv-UFG5wVRwHC8yn6LQcX9On8WoN7_5X5zOYgdIwqQj2qhwhdBIoLfFqAVNeA3y6Prfw8X7m_EfXtnURovRHJJAjCz_N9ogg0xpLhuMYLyS57_2szlrApasz6WriPncpJyw8x8iPGbEh42n41nwLC1MOMbrE9L4xhczMiWM0hQGVTaEbdlbaWW8FW4WhbCuY0tFRO1i0W44UvczMN7TjGXjMPAiSbhTXQx9szxzgPHxQsYez9JnbxgKqL7qAhmSnDufk-9_4Pmrl1DFB","created_at":1790395545,"error":null,"incomplete_details":null,"instructions":null,"metadata":{},"model":"gpt-6-luna","object":"response","output":[{"id":"msg_029b5986c7d57e04006ab7449a1d5c87d0a7c673033bbc872a","content":[{"annotations":[],"text":"Hi! How can I help?","type":"output_text","logprobs":[]}],"role":"assistant","status":"completed","type":"message","phase":"final_answer"}],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","tools":[],"top_p":0.98,"max_output_tokens":null,"previous_response_id":null,"reasoning":{"context":"all_turns","effort":"medium","mode":"standard","summary":null},"status":"completed","text":{"format":{"type":"text"},"verbosity":"medium"},"truncation":"disabled","usage":{"input_tokens":7,"input_tokens_details":{"audio_tokens":null,"cached_tokens":0,"cached_tokens_details":null,"image_tokens":null,"text_tokens":null,"video_tokens":null,"cache_write_tokens":0},"output_tokens":11,"output_tokens_details":{"audio_tokens":null,"reasoning_tokens":0,"text_tokens":null},"total_tokens":18,"cost":null},"user":null,"store":true,"access_programs":{"cyber":"daybreak_blue"},"background":false,"billing":{"payer":"developer"},"completed_at":1790395546,"frequency_penalty":0.0,"max_tool_calls":null,"moderation":null,"presence_penalty":0.0,"prompt_cache_key":null,"prompt_cache_retention":"24h","safety_identifier":null,"service_tier":"default","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"top_logprobs":0}
-> http 200 in 22.799320s

Case 4: admin test endpoint with an infinite loop (curl gives up after 20s)

$ curl -s --max-time 20 -X POST http://127.0.0.1:41917/guardrails/test_custom_code -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"custom_code":"def apply_guardrail(inputs, request_data, input_type):\n    while True:\n        pass","test_input":{"texts":["hi"]},"input_type":"request"}'; echo "curl exit=$?"

-> http 000 in 20.007649s
curl exit=28

Case 5: async guardrail that loops without ever awaiting, timeout: 5 (curl gives up after 30s)

$ curl -s --max-time 30 http://127.0.0.1:41917/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["async-busy-loop"]}'; echo "curl exit=$?"

-> http 000 in 30.001686s
curl exit=28

Case 6: is the proxy still alive after cases 4 and 5?

$ curl -s --max-time 5 http://127.0.0.1:41917/health/liveliness -w " <- liveliness: http %{http_code} in %{time_total}s\n"; echo "curl exit=$?"
 <- liveliness: http 000 in 5.009352s
curl exit=28

After (649e590)

Commit since: 5372792 adds tests only (git diff 649e590f9e..5372792aa7 -- litellm is empty), so this run at 649e590 stands

Proxy booted from 649e590, proxy on :35334 with --num_workers 2, real OpenAI calls (gpt-6-luna), curl as the client

Control: no guardrail

$ curl -s http://127.0.0.1:35334/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"Say hi in three words."}]}'
{"id":"chatcmpl-ESEUfjogJtHya0DsIJepiQvp6mW5U","created":1790397605,"model":"gpt-6-luna","object":"chat.completion","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hi there, friend.","role":"assistant","provider_specific_fields":{"refusal":null},"annotations":[]},"provider_specific_fields":{}}],"usage":{"completion_tokens":32,"prompt_tokens":12,"total_tokens":44,"completion_tokens_details":{"accepted_prediction_tokens":0,"audio_tokens":0,"reasoning_tokens":18,"rejected_prediction_tokens":0},"prompt_tokens_details":{"audio_tokens":0,"cached_tokens":0,"cache_write_tokens":0,"cache_creation_tokens":0}},"service_tier":"default"}
-> http 200 in 1.288322s

Case 1: guardrail http_get to a loopback address, on every unified endpoint

$ curl -s http://127.0.0.1:35334/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["loopback-probe"]}'
{"id":"chatcmpl-32dca52a-4be8-4d45-8778-b3b8ac9bad92","created":1790397605,"model":"gpt-6-luna","object":"chat.completion","system_fingerprint":null,"choices":[{"finish_reason":"content_filter","index":0,"message":{"content":"guardrail could not reach loopback: Blocked URL: URL targets a blocked address (127.0.0.1). If this is a legitimate internal service, add the host to `user_url_allowed_hosts` in litellm_settings.","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields":null}}],"usage":{"completion_tokens":0,"prompt_tokens":0,"total_tokens":0,"completion_tokens_details":null,"prompt_tokens_details":null}}
-> http 200 in 0.212458s

$ curl -s http://127.0.0.1:35334/v1/messages -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","max_tokens":32,"messages":[{"role":"user","content":"hi"}],"guardrails":["loopback-probe"]}'
{"id":"msg_51b81a2e-a458-4bbb-8e67-5c538fd44ad0","type":"message","role":"assistant","content":[{"type":"text","text":"guardrail could not reach loopback: Blocked URL: URL targets a blocked address (127.0.0.1). If this is a legitimate internal service, add the host to `user_url_allowed_hosts` in litellm_settings."}],"model":"gpt-6-luna","stop_reason":"end_turn","usage":{"input_tokens":0,"output_tokens":0}}
-> http 200 in 0.066397s

$ curl -s http://127.0.0.1:35334/v1/responses -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","input":"hi","guardrails":["loopback-probe"]}'
{"id":"resp_4010a589-536f-436b-b266-367d0e7065f2","created_at":1790397606,"error":null,"incomplete_details":null,"instructions":null,"metadata":null,"model":"gpt-6-luna","object":"response","output":[{"content":[{"type":"text","text":"guardrail could not reach loopback: Blocked URL: URL targets a blocked address (127.0.0.1). If this is a legitimate internal service, add the host to `user_url_allowed_hosts` in litellm_settings."}]}],"parallel_tool_calls":null,"temperature":null,"tool_choice":null,"tools":null,"top_p":null,"max_output_tokens":null,"previous_response_id":null,"reasoning":null,"status":"completed","text":null,"truncation":null,"usage":{"input_tokens":0,"input_tokens_details":null,"output_tokens":0,"output_tokens_details":null,"total_tokens":0,"cost":null},"user":null,"store":null}
-> http 200 in 0.032011s

$ # loopback service access log: hits during the three calls above
0 hits

Case 2: sync busy loop with timeout: 5, two concurrent requests (one per worker) and a liveliness probe 3s in

$ for i in 1 2; do curl -s http://127.0.0.1:35334/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["busy-loop"]}' -o busy_$i.json -w "busy $i: http %{http_code} in %{time_total}s\n" & sleep 0.5; done
$ sleep 3; curl -s http://127.0.0.1:35334/health/liveliness -w " <- liveliness: http %{http_code} in %{time_total}s\n"; wait; cat busy_1.json
"I'm alive!" <- liveliness: http 200 in 0.014826s
busy 1: http 500 in 5.066307s
busy 2: http 500 in 5.176780s
{"error":{"message":"Custom code guardrail 'busy-loop' exceeded its 5s execution timeout","type":"internal_server_error","param":null,"code":"500"}}

Case 3: the same busy loop on /v1/messages and /v1/responses

$ curl -s http://127.0.0.1:35334/v1/messages -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","max_tokens":32,"messages":[{"role":"user","content":"hi"}],"guardrails":["busy-loop"]}'
{"type":"error","error":{"type":"api_error","message":"Custom code guardrail 'busy-loop' exceeded its 5s execution timeout"}}
-> http 500 in 5.114956s

$ curl -s http://127.0.0.1:35334/v1/responses -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","input":"hi","guardrails":["busy-loop"]}'
{"error":{"message":"Custom code guardrail 'busy-loop' exceeded its 5s execution timeout","type":"internal_server_error","param":null,"code":"500"}}
-> http 500 in 5.061354s

Case 4: admin test endpoint with an infinite loop (curl gives up after 20s)

$ curl -s --max-time 20 -X POST http://127.0.0.1:35334/guardrails/test_custom_code -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"custom_code":"def apply_guardrail(inputs, request_data, input_type):\n    while True:\n        pass","test_input":{"texts":["hi"]},"input_type":"request"}'; echo "curl exit=$?"
{"success":false,"result":null,"error":"Execution timeout: code took longer than 5 seconds","error_type":"execution"}
-> http 200 in 5.102163s
curl exit=0

Case 5: async guardrail that loops without ever awaiting, timeout: 5 (curl gives up after 30s)

$ curl -s --max-time 30 http://127.0.0.1:35334/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["async-busy-loop"]}'; echo "curl exit=$?"
{"error":{"message":"Custom code guardrail 'async-busy-loop' exceeded its 5s execution timeout","type":"internal_server_error","param":null,"code":"500"}}
-> http 500 in 5.639149s
curl exit=0

Case 6: is the proxy still alive after cases 4 and 5?

$ curl -s --max-time 5 http://127.0.0.1:35334/health/liveliness -w " <- liveliness: http %{http_code} in %{time_total}s\n"; echo "curl exit=$?"
"I'm alive!" <- liveliness: http 200 in 0.005205s
curl exit=0

Case 7: same guardrail with litellm_settings.user_url_allowed_hosts: ["127.0.0.1:40023"] (second proxy on :46446)

$ curl -s http://127.0.0.1:46446/v1/chat/completions -H "Authorization: Bearer $LITELLM_MASTER_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-6-luna","messages":[{"role":"user","content":"hi"}],"guardrails":["loopback-probe"]}'
{"id":"chatcmpl-da6b0cfe-5cbf-4da6-a740-dcc337647c94","created":1790397680,"model":"gpt-6-luna","object":"chat.completion","system_fingerprint":null,"choices":[{"finish_reason":"content_filter","index":0,"message":{"content":"guardrail reached loopback: HTTP 200 body=internal-only marker: this loopback service is not reachable from the internet\n","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields":null}}],"usage":{"completion_tokens":0,"prompt_tokens":0,"total_tokens":0,"completion_tokens_details":null,"prompt_tokens_details":null}}
-> http 200 in 0.025744s
$ # loopback service access log: hits during the call above
1 hits
  127.0.0.1 - - [25/Sep/2026 21:41:20] "GET /internal.txt HTTP/1.1" 200 -

Observations from the QA legs and the risk rig that the diff does not show:

  • Streaming post_call errors end without [DONE]; pre-existing, leaves alone
  • Streaming error chunk carries "type": "None"; pre-existing, leaves alone
  • /guardrails/apply_guardrail answers 500 to a block; pre-existing, leaves alone
  • 3M-iteration for loop 0.2s before, 0.5s after; PR causes
  • Test endpoint now awaits a returned coroutine; PR causes, intended
  • Async busy loop still stalls requests until deadline; PR improves

Type

🐛 Bug Fix

Caveats (if any)

Medium

  • An async guardrail that busy-loops without awaiting holds the event loop until its deadline (default 30s), then fails its request; before this PR it held the loop forever
  • A sync guardrail stuck inside one long C-level call (a catastrophic regex, a huge integer power) cannot be interrupted until that call returns
    • the request still fails at the deadline and the worker thread is logged as stuck; it keeps one core busy until the call ends
    • in an async guardrail the same call runs on the event loop, so it also holds every other request until it returns, as it did before this PR; only once it returns does the deadline fail the request
  • An async guardrail that keeps swallowing cancellation is given up after 1s of retries, logged, and left to finish on its own; its result is discarded

Low

  • Guardrails that legitimately run longer than 30s need timeout raised in their litellm_params
  • Non-GET requests never follow redirects when validation is on; a 3xx is returned as the response
  • Module-level guardrail code compiles synchronously on the thread that loads the guardrail, so a busy loop there holds that thread for up to timeout before the load fails; a config-file guardrail like that now stops startup after timeout seconds instead of hanging it
  • An allowlisted host still has to resolve through DNS, since the validator resolves before it consults the allowlist; a name only the proxy's own hosts file knows needs user_url_validation: false
  • Each sync guardrail run starts one daemon thread, and every loop iteration in guardrail code pays one budget check
  • The validator does not yet block the NAT64 range (64:ff9b::/96) or re-resolve a host between validation and the HTTPS connect; tracked as a follow-up

CI reds this PR did not introduce, each matched to main:

  • GitHub Actions misc / Run tests (not a required check) fails tests/unit/test_model_prices_schema.py::test_price_map_has_no_duplicate_keys on the duplicate cost-map key openrouter/perceptron/perceptron-mk1.5; main's own runs at 4eb340a, d08746f and c822c7f fail the same way, main removed the duplicate in 4d7aa89 (fix(cost-map): remove duplicate openrouter/perceptron/perceptron-mk1.5 entry #43273) after this branch's merge base, and this PR does not touch the cost map
  • CircleCI local_testing_part1 fails tests/local_testing/test_get_model_info.py::test_get_model_info_bedrock_cross_region_capability_parity (supports_prompt_caching differs between us.anthropic.claude-mythos-preview and anthropic.claude-mythos-preview in the branch's cost map) at both tips and on its rerun (job 2222678); main's pipeline 90441 at e0fb89b fails the same test and main passes from pipeline 90478 on, after 4179860 (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 #42951) aligned the two entries; the first run at 5372792 (job 2220583) also failed test_get_model_info_bedrock_region, a state-leaking test main fixed in 7fc2206 (test: fix stale and state-leaking tests red on scheduled CircleCI #43266), and that test passed on the rerun
  • CircleCI using_litellm_on_windows times out in its Install Dependencies step before any test runs (jobs 2220539 and 2220581 at this branch's two tips), as it does on main's pipeline 90441 (job 2218756); 7fc2206 (test: fix stale and state-leaking tests red on scheduled CircleCI #43266) raised that step's no-output limit on main after this branch's merge base, and main passes from pipeline 90478 on; its rerun (job 2222677) times out in the same Install Dependencies step at the same 10 minute no-output limit, right after the botocore and basedpyright downloads
  • CircleCI local_testing_part2 failed tests/local_testing/test_streaming.py::test_openai_stream_options_call_text_completion once at 649e590 with a pydantic MockValSer serializer error; it passes on main's pipeline 90441 and touches no guardrail code; its re-run at 5372792 (CircleCI job 2220610) passed
  • CircleCI unit fails 52 tests at 5372792 (job 2220608), none in a file this PR touches; 38 of them fail identically on main's own unit jobs 2218776 (e0fb89b), 2220817 (99655b6) and 2221978 (115668f), and the other 14 (test_prometheus_labels and test_prometheus_service_tier_label registry state, a test_token_counter event-loop lag check, a test_http_handler finalizer, two leaked-mock test_get_end_user_object cases and one test_complexity_router case) are the state-leak class main fixed in 7fc2206 (test: fix stale and state-leaking tests red on scheduled CircleCI #43266) and 14f4c34 (fix(ci): stop stale CI reds, keep unit tests off the host env, retry CyberArk policy conflicts #43294, tests/unit/conftest.py and those test files) after this branch's merge base; main's pipeline 90510 at d18fcb0, which carries both, fails one unrelated test (test_async_shadow_does_not_inherit_primary_deployment_tags); its rerun (job 2222676) fails 42 tests, 39 of them shared with the first run and matched to main the same way, with 13 of the first run's 14 state-leak cases passing this time; the 3 rerun-only failures (test_token_counter::test_huggingface_count_in_a_worker_thread_leaves_the_event_loop_free, a wall-clock event-loop lag check, and the two test_per_user_oauth_cache::TestMCPServerNewFields needs_user_oauth_token cases, which passed in the first run) sit in files this PR does not touch and pass on main's job 2222544
  • CircleCI langfuse_logging_unit_tests hits the 15 minute no-output limit at tests/local_testing/test_alangfuse.py::test_langfuse_logging_without_request_response[False] RETRY (job 2220593); main's jobs 2218773 (e0fb89b), 2220819 (99655b6) and 2221956 (115668f) hang at the same line, and main's pipeline 90510 at d18fcb0 passes after 14f4c34 (fix(ci): stop stale CI reds, keep unit tests off the host env, retry CyberArk policy conflicts #43294) rewrote that test against a local Langfuse; its rerun (job 2222674) hangs at the same RETRY line and hits the same 15 minute limit
  • CircleCI proxy_store_model_in_db_tests fails tests/store_model_in_db_tests/test_callbacks_in_db.py::test_e2e_langfuse_callbacks_in_db (the request is not found in Langfuse traces) at both tips and on its rerun (job 2222675); main's pipeline 90441 (job 2218794) fails the same test, and main passes from pipeline 90478 on after e11c3f5 (test(integration): port langfuse callbacks-in-db coverage to the local harness #43282) moved that coverage to the local integration harness
  • CircleCI build_and_test fails the two ocr cases of tests/test_rust_python_harness.py::test_implemented_namespace_case_modules_remain_importable (job 2220589), modules refactor(ocr): remove the Python OCR execution path and require the Rust route #43081 removed; main's pipeline 90441 (job 2218790) fails them the same way, and main passes from pipeline 90478 on after 7fc2206 (test: fix stale and state-leaking tests red on scheduled CircleCI #43266) dropped them from the parametrize list; the rerun at 5372792 (job 2222679) fails the same two cases and nothing else
  • CircleCI integration-extensions (integration workflow) fails test_passthrough_worker_sigkill_leaves_sibling_serving_and_logging and test_native_gemini_keeps_streaming_after_one_worker_is_killed, both worker-kill chaos tests (job 2220567); main's integration-extensions is red on every pipeline from 90394 to 90510 with a chaos test of that class (job 2218749 fails the same passthrough sigkill test, job 2222504 fails test_burst_survives_one_worker_kill); its rerun (job 2222681) was still running when this section was written, and the job is not a required check

Live PR risk (649e590)

Both sides booted with --num_workers 2, real OpenAI calls (gpt-6-luna), a loopback marker service on :40023 and a forwarding stub in front of a generic_guardrail_api guardrail; base is the merge base 4adbc13, head is 649e590, and the same scenarios re-run on 8017f9469c (head merged into main at 4eb340a) answered identically to the head leg. 5372792 adds tests only, so the code under test is 649e590 byte for byte. S-numbers refer to the risk rig scenarios, cases to the QA legs above

Breaking

None observed. Every path that worked on base answers the same on head: a call with no guardrail (200 both), a generic_guardrail_api guardrail whose vendor answers a 302 (200 both, the vendor stub logged the same 2 hits on both sides, S6), real https destinations through http_get and http_post (the OpenAI 401 and the httpbin echo came back identical, S7), a post_call guardrail raising a plain exception on a non-streaming and a streaming call (the 500 body and the streaming error chunk are identical on both sides, S9a), and a sync guardrail returning an un-awaited coroutine at request time (200 with the model's answer on both sides, S9b)

Backward incompatible

  • A guardrail run longer than timeout (default 30s) now fails its request: 500 exceeded its 5s execution timeout on pre_call and during_call (S1, S5, cases 2 and 3), 500 on a non-streaming post_call (S2), and an error chunk that closes the stream after the 200 on a streaming post_call (S3); on base the same requests waited 21s to 57s for the loop to end. The configurable timeout is what the ticket behind this PR asks for; Decision 2 sets fail closed
  • http_request, http_get and http_post to a private, loopback or link-local address now return {"success": false, "error": "Blocked URL: ..."} unless the host is in user_url_allowed_hosts (case 1: 0 loopback hits on head against 3 on base; case 7 shows the allowlist letting the host through). The block is what the ticket behind this PR asks for
  • A caller-supplied Host header is dropped from http_* requests while validation is on, and passes through untouched with validation off (test_caller_host_header_never_reaches_the_validated_destination, test_caller_headers_pass_through_untouched_when_url_validation_is_disabled). Decision 9; ships with this PR's review
  • POST /guardrails/test_custom_code now awaits a coroutine a sync apply_guardrail returns and reports its result: head answers with the primitive's blocked-URL result, base answered {"action": "allow", "warning": "Expected dict result, got coroutine. Treating as allow."} (S8). The request-time path already awaited it on both sides (S9b), so the endpoint now matches it
  • Every loop iteration in guardrail code pays a budget check: the 3M-iteration for loop bench went from 0.20s to 0.50s per run (S4). Decision 6

Regression risk

  • A sync guardrail stuck in one long C-level call keeps its worker thread busy past the deadline (Medium caveat); covered by the unit tests only (_spin_swallowing_exceptions, test_custom_code_bounded_execution.py), not driven on the rig, since the rig has no primitive that blocks in C for seconds
  • The POST /guardrails compile-failure rollback is covered by test_guardrail_endpoints.py and was not driven on a DB-backed proxy

Dependency graph

Dependent Entrypoint State
CustomCodeGuardrail.apply_guardrail pre_call, during_call, post_call /v1/chat/completions, /v1/messages, /v1/responses verified live (cases 1 to 3, S2, S3, S5)
POST /guardrails/apply_guardrail admin route verified live (S1)
POST /guardrails/test_custom_code admin route verified live (case 4, S8)
POST /guardrails compile-failure rollback admin route tested, not driven live
async_safe_get and validate_url, shared with other callers generic_guardrail_api vendor call verified live, unchanged (S6)
GuardrailCallback httpx client params every http_* primitive verified live (S7)
streaming post_call error path /v1/chat/completions with stream: true verified live (S3, S9a)
LitellmParams.timeout reuse config load, Admin UI guardrail form tested (test_init_guardrails.py), UI not driven
/health/liveliness during a busy loop health route verified live (case 2)

Not verified

  • POST /guardrails answering 400 for a non-custom_code guardrail whose parameters fail validation (no DB-backed proxy booted)
  • The Admin UI guardrail form showing timeout for a custom_code guardrail
  • MCP, realtime and logging_only guardrail modes running custom code
  • Budget-check cost beyond the one 3M-iteration bench

Decisions

  1. Default execution timeout 30s, matching the default http_request timeout so one default HTTP call fits; alternatives were 5s (the admin test endpoint's budget) and 60s (the http_request cap)
  2. Timeout fails closed: the request errors (CustomCodeExecutionError, HTTP 500 pre-call) instead of being allowed through
  3. timeout reuses LitellmParams.timeout (already shown in the Admin UI) instead of a new execution_timeout key; zero, negative and NaN values are rejected at load
  4. GET follows redirects with per-hop validation via async_safe_get; POST/PUT/PATCH/DELETE never follow redirects, since a validated destination that redirects elsewhere would re-open the hole
  5. Sync guardrail code moved off the event loop onto a daemon worker thread with PyThreadState_SetAsyncExc interruption, instead of a subprocess or a second event loop (the cached aiohttp-backed httpx client is loop-bound)
  6. Budget checks are compiled into loop headers (while tests, for and comprehension iterators) rather than into every statement, so straight-line code pays nothing and only loops are checked
  7. A result that arrives after the deadline counts as a timeout, so code that catches the interrupt cannot turn it into an allow
  8. POST /guardrails catches a compile failure by name and rolls back with a 400, while a config-file guardrail that does not compile still stops startup as before; only a bad parameter such as timeout: 0 is a ValueError, which the startup loader has skipped with a warning since feat(guardrails): add Lakera v2 skip-message honoring and advisory (inject_system_message) mode #34940
  9. A caller-supplied Host header is stripped from http_* requests while validation is on, so the validated host is the only one on the wire; with validation off the headers pass through untouched, as before
  10. GET keeps the shared client's 5s connect timeout and only the total timeout is per call, matching the previous behavior; the other methods pass the per-call timeout through as they did before

@devin-ai-integration

devin-ai-integration Bot commented Sep 26, 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 26, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[High risk] Adds execution timeout and SSRF validation to custom guardrail code.

The PR appears safe to merge based on this review; the latest changes introduce no established blocking issue.

Findings

  1. P1 Long regex calls outlive timeouts ▶
  2. P1 Timed-out tasks keep running ▶

Summary

The PR adds destination validation and execution limits for custom-code guardrails, improves guardrail creation and testing errors, and adds coverage for those behaviors. Since the previous review, the changes are tests only; no new actionable issue was found.

Reviews (3) · Last reviewed commit: "test(guardrails): cover the http_request..."

Comment on lines +153 to +160
def _interrupt(worker: _Worker[T]) -> None:
deadline: Final = time.monotonic() + _INTERRUPT_GRACE_SECONDS
while worker.gate.interrupt() and time.monotonic() < deadline:
worker.thread.join(_INTERRUPT_POLL_SECONDS)
if worker.gate.is_open():
verbose_proxy_logger.error(
"%s is still running after its timeout; it is stuck in a call Python cannot interrupt", worker.thread.name
)

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.

P1 Long regex calls outlive timeouts

If custom code calls the exposed regex_match primitive with a pattern that takes a long time to evaluate, these loop checks and thread interrupts cannot stop the regex while it is running. A worker can keep consuming CPU after the guardrail reports a timeout. In an async guardrail, the same call can stall the event loop before its timeout runs, so the new limit does not bound this supported primitive.

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.

Named as a Medium caveat: Python cannot interrupt a C-level call. The request still fails at the deadline; before, it stalled the proxy forever.

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.

The caveat correctly covers synchronous guardrails: their worker thread keeps the event loop responsive, although the C call may continue consuming CPU.

However, async guardrails take a different path. inspect.iscoroutinefunction() runs them as an event-loop task, while regex_match performs synchronous re.search(). A catastrophic regex executed before the next await can therefore block both the timeout waiter and other requests until the regex returns.

The caveat should also mention this async case, or synchronous primitives such as the regex helpers should be moved off the event loop.

Comment on lines +227 to +231
raise
if task.done():
return task.result()
await _cancel(task, label)
raise ExecutionTimeoutError(timeout)

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.

P1 Timed-out tasks keep running

If an async guardrail catches cancellation and continues awaiting work, _cancel stops trying after one second and this code reports a timeout while the task is still alive. Repeated requests can accumulate tasks that retain request data and resources. The added test confirms that a task survives this path.

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.

Named as a Medium caveat: after 1s of refused cancellation the task is logged and abandoned, its result discarded. Before, nothing bounded it at all.

Comment thread tests/test_litellm/proxy/guardrails/test_custom_code_security.py
@greptile-apps

This comment has been minimized.

return None, e
except ExecutionInterrupted:
return None, ExecutionTimeoutError(timeout)
except BaseException as e: # noqa: BLE001 # a SystemExit must reach the caller as a failure, not end the worker silently

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.

Intentional: sandboxed code can raise SystemExit or a bare BaseException, and this converts it to SandboxExit so it cannot stop the event loop.

@codecov

codecov Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.34711% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...s/guardrail_hooks/custom_code/bounded_execution.py 97.29% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

@codspeed

codspeed Bot commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_custom_code_guardrail_ssrf_and_timeout (5372792) with main (d08746f)1

Open in CodSpeed

Footnotes

  1. No successful run was found on main (e11c3f5) during the generation of this report, so d08746f was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩

…ror and report a load timeout on the test endpoint

A compile failure is no longer a ValueError, so a config-file custom code guardrail that does not compile
stops the proxy at startup as it did before, while POST /guardrails catches it by name and still rolls back.
The admin test endpoint reports a module-level timeout as an execution timeout instead of a compile error,
a caller-supplied Host header is stripped from http_* requests while validation is on, and GET keeps the
shared client's connect timeout.
@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

bugbot run

@mateo-berri mateo-berri added run-ci and removed run-ci labels Sep 26, 2026
@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

@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 5372792. 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 dfb5d90 into main Sep 26, 2026
155 of 166 checks passed
@mateo-berri
mateo-berri deleted the litellm_custom_code_guardrail_ssrf_and_timeout branch September 26, 2026 19:57
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…
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.

2 participants