Skip to content

fix(vector_stores): s3 vectors search router bypass + rag query config drop + ui error swallow - #34788

Merged
mateo-berri merged 8 commits into
litellm_internal_stagingfrom
litellm_fix_s3_vectors_search
Sep 2, 2026
Merged

mateo-berri merged 8 commits into
litellm_internal_stagingfrom
litellm_fix_s3_vectors_search

Conversation

@michelligabriele

@michelligabriele michelligabriele commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • S3 Vectors stores ingest fine but cannot be queried
  • Search-time embeddings bypass the Router, so virtual model names fail
  • /v1/rag/query drops store config: "aws_region_name is required"
  • UI renders any backend search error as "No results found"

How it solves it:

  • Threads the Router down to vector store search transforms
  • S3 Vectors resolves query embeddings via Router iff it serves the model
  • /v1/rag/query reads the managed-store registry; store config always wins
  • Only allowlisted retrieval_config keys reach the search call
  • Proxy query surfaces reject caller-picked embedding model/credential keys
  • Search region falls back env, then default, matching ingestion
  • UI surfaces the backend error message in the test tab

User Flow

Before: an S3 Vectors store that ingests fine cannot be queried through /v1/rag/query, direct search, or the Admin UI test tab

  1. The proxy admin ingests a document into a new S3 Vectors store: POST https://litellm-domain/v1/rag/ingest with a file and ingest_options naming custom_llm_provider: "s3_vectors", their bucket, region eu-central-1, and their gateway-served embedding model qa-team-embeddings; 200 with a fresh vector_store_id like my-bucket:litellm-index-5049eabb, and the store shows up on https://litellm-domain/ui/?page=vector-stores with its region and embedding model
  2. They query it: POST https://litellm-domain/v1/rag/query with model: "gpt-4o-mini" and retrieval_config: {"vector_store_id": "..."}; 500 with an OpenAI "Invalid 'vector_store_id'" error, because the search went to OpenAI instead of their S3 Vectors store
  3. They retry naming custom_llm_provider: "s3_vectors" in retrieval_config; 500 "aws_region_name is required for S3 Vectors" even though the store carries the region
  4. They retry again with aws_region_name: "eu-central-1" pasted into retrieval_config; the same 500, the region never reaches the search
  5. They try the store directly: POST https://litellm-domain/v1/vector_stores/{id}/search with a query; 400 "LLM Provider NOT provided ... model=qa-team-embeddings", so the ingested data is unreachable everywhere
  6. On https://litellm-domain/ui/?page=vector-stores they open the store's Test Vector Store tab and run a search; the panel shows "No results found" even though the search actually errored with that same 400
  7. Extra retrieval_config keys (api_base, api_key, embedding_model, litellm_credential_name) change nothing, since every key but the id is dropped on the way to the search, which is also why the region never arrives

After: the same store answers through /v1/rag/query and direct search, and the test tab shows results or the real error

  1. The proxy admin ingests a document into a new S3 Vectors store: POST https://litellm-domain/v1/rag/ingest with the same file and ingest_options; 200 with a fresh vector_store_id like my-bucket:litellm-index-5a1ed2ac, and the store shows up on https://litellm-domain/ui/?page=vector-stores with its region and embedding model
  2. They query it: POST https://litellm-domain/v1/rag/query with model: "gpt-4o-mini" and retrieval_config: {"vector_store_id": "..."} only; 200 with the matching chunk under choices[0].message.provider_specific_fields.search_results and the model's answer built from it, the store's provider, region, bucket, and embedding model applied automatically
  3. Naming custom_llm_provider: "s3_vectors" in retrieval_config gives the same 200
  4. Pasting aws_region_name: "eu-central-1" too gives the same 200
  5. They try the store directly: POST https://litellm-domain/v1/vector_stores/{id}/search with a query; 200 with the matching chunk and its score
  6. On https://litellm-domain/ui/?page=vector-stores the Test Vector Store tab lists the matching chunk with its score, and a search against a store whose index does not exist reads "Search failed: " instead of "No results found"
  7. A caller who adds api_base, api_key, or another custom_llm_provider to retrieval_config gets the same 200 from the real store, since the store's own settings win, and one who adds embedding_model, litellm_credential_name, litellm_embedding_model, or litellm_embedding_config to retrieval_config or to the direct search body gets a 400 naming the key, so nobody can point a shared store's search at another host or spend a restricted embedding deployment through it

Relevant issues

Linear ticket

Resolves LIT-6612

Pre-Submission checklist

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

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

Delays in PR merge?

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

Screenshots / Proof of Fix

Live e2e run against a real S3 Vectors bucket (lit6612-qa-vectors, eu-central-1) with real OpenAI embeddings and chat completions. Each leg is 2 separate proxy processes x 2 uvicorn workers (--num_workers 2) sharing one Postgres, requests alternating between the two processes (ingest on process 1, the store then read back through process 2), so the managed-store registry is proven across processes. Before: process 1 on port 47468, process 2 on 52978. After: process 1 on 51101, process 2 on 54746. AWS_BEARER_TOKEN_BEDROCK is unset in both legs so S3 Vectors signs with SigV4

config.yaml (both legs):

model_list:
  - model_name: gpt-4o-mini
    litellm_params:
      model: openai/gpt-4o-mini
      api_key: os.environ/OPENAI_API_KEY
  - model_name: qa-team-embeddings
    litellm_params:
      model: openai/text-embedding-3-small
      api_key: os.environ/OPENAI_API_KEY
general_settings:
  master_key: sk-lit6612

lit6612-doc.txt (the ingested file): The Kyoto failover runbook: drain the Osaka queue before flipping DNS, then page the on-call owl.

Admin UI leg: the dashboard dev server (npm run dev in ui/litellm-dashboard) pointed at process 1 of each leg, vector stores page, Test Vector Store tab, query What must be drained before flipping DNS?. The broken-store case is a store registered through /vector_store/new with an index that does not exist (lit6612-qa-vectors:does-not-exist)

Before (695d943)

Ingest and cross-process listing

  1. Ingest on process 1
$ curl -s http://127.0.0.1:47468/v1/rag/ingest -H 'Authorization: Bearer sk-lit6612' -F file=@lit6612-doc.txt -F 'request={"ingest_options":{"embedding":{"model":"qa-team-embeddings"},"vector_store":{"custom_llm_provider":"s3_vectors","vector_bucket_name":"lit6612-qa-vectors","aws_region_name":"eu-central-1","embedding_model":"qa-team-embeddings"}}}'
{"id":"ingest_34d0bc86-6e31-45d4-b6b6-005983bd40f9","status":"completed","vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","file_id":"c2ae781e04ee4e7f8bfe833563ed4ccd.txt"}
  1. The store is listed with its region and embedding model on process 2
$ curl -s http://127.0.0.1:52978/vector_store/list -H "Authorization: Bearer sk-lit6612" | jq -c '.data[] | select(.vector_store_id=="lit6612-qa-vectors:litellm-index-5049eabb") | {vector_store_id, custom_llm_provider, litellm_params: (.litellm_params | {vector_bucket_name, aws_region_name, embedding_model})}'
{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","custom_llm_provider":"s3_vectors","litellm_params":{"vector_bucket_name":"lit6612-qa-vectors","aws_region_name":"eu-central-1","embedding_model":"qa-team-embeddings"}}

RAG query with bare retrieval_config

  1. Only vector_store_id in retrieval_config, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:52978/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb"}}'
{"detail":{"error":"litellm.BadRequestError: OpenAIException - {\n  \"error\": {\n    \"message\": \"Invalid 'vector_store_id': 'lit6612-qa-vectors:litellm-index-5049eabb'. Expected an ID that contains letters, numbers, underscores, or dashes, but this value contained additional characters.\",\n    \"type\": \"invalid_request_error\",\n    \"param\": \"vector_store_id\",\n    \"code\": \"invalid_value\"\n  }\n}"}}
HTTP 500

RAG query naming the provider and region

  1. custom_llm_provider: s3_vectors added, on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:47468/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","custom_llm_provider":"s3_vectors"}}' | cut -c1-400
{"detail":{"error":"litellm.APIConnectionError: aws_region_name is required for S3 Vectors\nTraceback (most recent call last):\n  File \".../litellm/vector_stores/main.py\", line 319, in asearch\n    response = await init_response\n ...
HTTP 500
  1. aws_region_name: eu-central-1 pasted in too, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:52978/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","custom_llm_provider":"s3_vectors","aws_region_name":"eu-central-1"}}' | cut -c1-400
{"detail":{"error":"litellm.APIConnectionError: aws_region_name is required for S3 Vectors\nTraceback (most recent call last):\n  File \".../litellm/vector_stores/main.py\", line 319, in asearch\n    response = await init_response\n ...
HTTP 500

RAG query with hostile connection overrides

  1. custom_llm_provider: openai, api_base pointing at a dead port, and a bogus api_key in retrieval_config, on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:47468/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","custom_llm_provider":"openai","api_base":"http://127.0.0.1:9/v1","api_key":"sk-attacker"}}' | cut -c1-400
{"detail":{"error":"litellm.BadRequestError: OpenAIException - {\n  \"error\": {\n    \"message\": \"Invalid 'vector_store_id': 'lit6612-qa-vectors:litellm-index-5049eabb'. Expected an ID that contains letters, numbers, underscores, or dashes, but this value contained additional characters.\",\n    \"type\": \"invalid_request_error\",\n    \"param\": \"vector_store_id\",\n    \"code\": \"invalid_v
HTTP 500

Caller-picked embedding keys

  1. embedding_model in retrieval_config, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:52978/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","embedding_model":"text-embedding-3-large"}}' | cut -c1-400
{"detail":{"error":"litellm.BadRequestError: OpenAIException - {\n  \"error\": {\n    \"message\": \"Invalid 'vector_store_id': 'lit6612-qa-vectors:litellm-index-5049eabb'. Expected an ID that contains letters, numbers, underscores, or dashes, but this value contained additional characters.\",\n    \"type\": \"invalid_request_error\",\n    \"param\": \"vector_store_id\",\n    \"code\": \"invalid_v
HTTP 500
  1. litellm_credential_name in retrieval_config, on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:47468/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5049eabb","litellm_credential_name":"someone-elses-aws-creds"}}' | cut -c1-400
{"detail":{"error":"litellm.BadRequestError: OpenAIException - {\n  \"error\": {\n    \"message\": \"Invalid 'vector_store_id': 'lit6612-qa-vectors:litellm-index-5049eabb'. Expected an ID that contains letters, numbers, underscores, or dashes, but this value contained additional characters.\",\n    \"type\": \"invalid_request_error\",\n    \"param\": \"vector_store_id\",\n    \"code\": \"invalid_v
HTTP 500
  1. litellm_embedding_model in the direct search body, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:52978/v1/vector_stores/lit6612-qa-vectors:litellm-index-5049eabb/search -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"query":"Kyoto failover","litellm_embedding_model":"text-embedding-3-large"}' | cut -c1-400
{"error":{"message":"litellm.BadRequestError: LLM Provider NOT provided. Pass in the LLM provider you are trying to call. You passed model=qa-team-embeddings\n Pass model as E.g. For 'Huggingface' inference endpoints pass in `completion(model='huggingface/starcoder',..)` Learn more: https://docs.litellm.ai/docs/providers","type":null,"param":null,"code":"400"}}
HTTP 400

Direct vector store search

  1. Plain search on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:47468/v1/vector_stores/lit6612-qa-vectors:litellm-index-5049eabb/search -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"query":"What must be drained before flipping DNS?"}'
{"error":{"message":"litellm.BadRequestError: LLM Provider NOT provided. Pass in the LLM provider you are trying to call. You passed model=qa-team-embeddings\n Pass model as E.g. For 'Huggingface' inference endpoints pass in `completion(model='huggingface/starcoder',..)` Learn more: https://docs.litellm.ai/docs/providers","type":null,"param":null,"code":"400"}}
HTTP 400

Admin UI Test Vector Store tab

  1. Open the vector stores page, click lit6612-qa-vectors:litellm-index-5049eabb, open the Test Vector Store tab, enter the query, click Search: the panel reads "No results found" while the browser console shows the search request answered HTTP 400 with the "LLM Provider NOT provided ... model=qa-team-embeddings" error above. Screenshot: lit6612-before-ui-working-store.png
  2. Same steps on lit6612-qa-vectors:does-not-exist: the panel reads "No results found" again, the 404 from S3 Vectors is swallowed. Screenshot: lit6612-before-ui-broken-store.png

After (8b0441a)

Ingest and cross-process listing

  1. Ingest on process 1
$ curl -s http://127.0.0.1:51101/v1/rag/ingest -H 'Authorization: Bearer sk-lit6612' -F file=@lit6612-doc.txt -F 'request={"ingest_options":{"embedding":{"model":"qa-team-embeddings"},"vector_store":{"custom_llm_provider":"s3_vectors","vector_bucket_name":"lit6612-qa-vectors","aws_region_name":"eu-central-1","embedding_model":"qa-team-embeddings"}}}'
{"id":"ingest_680305fd-6de6-4ce2-b1fd-219f65985314","status":"completed","vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","file_id":"15937bc865d6498e99bb6fbee2b37d54.txt"}
  1. The store is listed with its region and embedding model on process 2
$ curl -s http://127.0.0.1:54746/vector_store/list -H "Authorization: Bearer sk-lit6612" | jq -c '.data[] | select(.vector_store_id=="lit6612-qa-vectors:litellm-index-5a1ed2ac") | {vector_store_id, custom_llm_provider, litellm_params: (.litellm_params | {vector_bucket_name, aws_region_name, embedding_model})}'
{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","custom_llm_provider":"s3_vectors","litellm_params":{"vector_bucket_name":"lit6612-qa-vectors","aws_region_name":"eu-central-1","embedding_model":"qa-team-embeddings"}}

RAG query with bare retrieval_config

  1. Only vector_store_id in retrieval_config, on process 2 (the process that did not ingest)
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:54746/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac"}}'
{"id":"chatcmpl-EJkRtYZZ2GC9tWf5SwrpItm0GwDV3","created":1788375489,"model":"gpt-4o-mini-2024-07-18","object":"chat.completion","system_fingerprint":"fp_7ffe4e4620","choices":[{"finish_reason":"stop","index":0,"message":{"content":"In the Kyoto failover runbook, the Osaka queue must be drained before flipping the DNS.","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields":{"refusal":null,"search_results":{"object":"vector_store.search_results.page","search_query":"What must be drained before flipping DNS in the Kyoto failover runbook?","data":[{"score":0.7760404944419861,"content":[{"text":"The Kyoto failover runbook: drain the Osaka queue before flipping DNS, then page the on-call owl.","type":"text"}],"file_id":"s3-vectors-chunk-0","filename":"15937bc865d6498e99bb6fbee2b37d54.txt", ...
HTTP 200

RAG query naming the provider and region

  1. custom_llm_provider: s3_vectors added, on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51101/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","custom_llm_provider":"s3_vectors"}}' | cut -c1-400
{"id":"chatcmpl-EJkRxEtdYyjYAvjO8CaZEXjs7KZJt","created":1788375493,"model":"gpt-4o-mini-2024-07-18","object":"chat.completion","system_fingerprint":"fp_7ffe4e4620","choices":[{"finish_reason":"stop","index":0,"message":{"content":"The Osaka queue must be drained before flipping DNS in the Kyoto failover runbook.","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields"
HTTP 200
  1. aws_region_name: eu-central-1 pasted in too, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:54746/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","custom_llm_provider":"s3_vectors","aws_region_name":"eu-central-1"}}' | cut -c1-400
{"id":"chatcmpl-EJkRzV0DI0TrD15BwB7sfKiLznfKr","created":1788375495,"model":"gpt-4o-mini-2024-07-18","object":"chat.completion","system_fingerprint":"fp_7ffe4e4620","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Before flipping DNS in the Kyoto failover runbook, the Osaka queue must be drained.","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields
HTTP 200

RAG query with hostile connection overrides

  1. custom_llm_provider: openai, api_base pointing at a dead port, and a bogus api_key in retrieval_config, on process 1: the real store answers, none of the overrides reach the search
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51101/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","custom_llm_provider":"openai","api_base":"http://127.0.0.1:9/v1","api_key":"sk-attacker"}}' | cut -c1-400
{"id":"chatcmpl-EJkS2cJFfzR35WqQFXlIqVTicPjqJ","created":1788375498,"model":"gpt-4o-mini-2024-07-18","object":"chat.completion","system_fingerprint":"fp_7ffe4e4620","choices":[{"finish_reason":"stop","index":0,"message":{"content":"The Osaka queue must be drained before flipping DNS in the Kyoto failover runbook.","role":"assistant","tool_calls":null,"function_call":null,"provider_specific_fields"
HTTP 200

Caller-picked embedding keys

  1. embedding_model in retrieval_config, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:54746/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","embedding_model":"text-embedding-3-large"}}'
{"detail":{"error":"'embedding_model' cannot be set in retrieval_config. Embedding configuration comes from the vector store's server-side registration."}}
HTTP 400
  1. litellm_credential_name in retrieval_config, on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51101/v1/rag/query -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"What must be drained before flipping DNS in the Kyoto failover runbook?"}],"retrieval_config":{"vector_store_id":"lit6612-qa-vectors:litellm-index-5a1ed2ac","litellm_credential_name":"someone-elses-aws-creds"}}'
{"detail":{"error":"'litellm_credential_name' cannot be set in retrieval_config. Embedding configuration comes from the vector store's server-side registration."}}
HTTP 400
  1. litellm_embedding_model in the direct search body, on process 2
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:54746/v1/vector_stores/lit6612-qa-vectors:litellm-index-5a1ed2ac/search -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"query":"Kyoto failover","litellm_embedding_model":"text-embedding-3-large"}'
{"detail":{"error":"'litellm_embedding_model' cannot be set in the search request body. Embedding configuration comes from the vector store's server-side registration."}}
HTTP 400

Direct vector store search

  1. Plain search on process 1
$ curl -s -w '\nHTTP %{http_code}\n' http://127.0.0.1:51101/v1/vector_stores/lit6612-qa-vectors:litellm-index-5a1ed2ac/search -H "Authorization: Bearer sk-lit6612" -H "Content-Type: application/json" -d '{"query":"What must be drained before flipping DNS?"}'
{"object":"vector_store.search_results.page","search_query":"What must be drained before flipping DNS?","data":[{"score":0.49791377782821655,"content":[{"text":"The Kyoto failover runbook: drain the Osaka queue before flipping DNS, then page the on-call owl.","type":"text"}],"file_id":"s3-vectors-chunk-0","filename":"15937bc865d6498e99bb6fbee2b37d54.txt","attributes":{"filename":"15937bc865d6498e99bb6fbee2b37d54.txt","source_text":"The Kyoto failover runbook: drain the Osaka queue before flipping DNS, then page the on-call owl.","chunk_index":"0"}}]}
HTTP 200

Admin UI Test Vector Store tab

  1. Open the vector stores page, click lit6612-qa-vectors:litellm-index-5a1ed2ac, open the Test Vector Store tab, enter the query, click Search: the panel reads "1 results" with "Result 1 - The Kyoto failover runbook: drain the Osaka queue before flipping DNS, then page the on-call owl...." and "Score: 0.4979". Screenshot: lit6612-after-ui-working-store.png
  2. Same steps on lit6612-qa-vectors:does-not-exist: the panel reads Search failed: {"error":{"message":"litellm.NotFoundError: S3_vectorsException - {\"message\":\"The specified index could not be found\"}","type":null,"param":null,"code":"404"}} instead of "No results found". Screenshot: lit6612-after-ui-broken-store.png

QA observations:

  • Chat completions vector_store_ids gets no S3 context; pre-existing, left alone
  • filters ignored by S3 Vectors search on both surfaces; pre-existing, left alone
  • RAG query and direct search use different error envelopes; pre-existing, left alone
  • AWS_BEARER_TOKEN_BEDROCK in the env breaks S3 Vectors SigV4; pre-existing, left alone
  • Dashboard session token expires after ten minutes; pre-existing, left alone

Type

🐛 Bug Fix

Caveats (if any)

Medium

  • litellm.rag.aquery now drops non-allowlisted retrieval_config keys (api_key, api_base, filters) before search
  • Chat completions vector_store_ids still resolves S3 Vectors query embeddings without the Router
    • The same store that now works on /v1/rag/query gives no context there, tracked in LIT-6752

Low

  • Nine provider search transforms accept a router parameter they ignore
  • S3 Vectors search without a region now uses the env, then us-west-2, instead of erroring
  • RAG query errors come back as {"detail": {"error": ...}}, direct search as {"error": {...}}

Changes

Router threading (defect 1): search-time query embeddings could not resolve Router-managed (virtual) embedding model names because the S3 Vectors transform called bare litellm.embedding():

  • litellm/router.py: _init_vector_store_api_endpoints now receives call_type and injects router=self for avector_store_search only (assignment via kwargs also overrides any client-supplied router key). The sync wrapper matches: model-less sync vector_store_search/vector_store_create go straight to the SDK function (the fallback path requires a model and raised a TypeError), with the router injected for search only
  • litellm/vector_stores/main.py: explicit router: Optional["Router"] param on search/asearch, kept out of **kwargs so it never enters GenericLiteLLMParams or logging params (the fix(rag): use router for completion in RAG query pipeline #19550 serialization trap, regression-tested)
  • litellm/llms/custom_httpx/llm_http_handler.py + litellm/llms/base_llm/vector_store/transformation.py: router threaded through both search handlers into the search-transform contract
  • 9 other provider transforms: signature-only router param (accepted, unused, no behavior change)
  • litellm/llms/s3_vectors/vector_stores/transformation.py: resolves the query embedding via the Router iff it serves embedding_model (existing resolve_embedding_router helper, same policy as the semantic caches); bare-call fallback preserved for provider-prefixed models with env creds. Also: get_complete_url resolves the region via get_aws_region_name_for_non_llm_api_calls (dynamic, then AWS_REGION_NAME, then AWS_REGION, then us-west-2), matching the ingestion path instead of raising. Intended behavior change, ingest/query parity

RAG query pipeline (defect 2): /v1/rag/query failed for stores that work via direct /v1/vector_stores/{id}/search:

  • litellm/proxy/rag_endpoints/endpoints.py: merges the managed vector store registry into retrieval_config, reusing the store already resolved during the access check (one registry lookup per request). Store-managed keys win on conflict, so a caller cannot override a shared store's provider or credentials from the request body. The debug log names the model and store id instead of dumping the merged config, which can carry resolved credentials
  • litellm/proxy/vector_store_endpoints/endpoints.py: the registry merge used by the direct search endpoint is split into a reusable build_request_data_from_managed_vector_store helper (same behavior: embedding config resolved per request, never persisted back to the registry cache)
  • litellm/rag/main.py: forwards only an explicit allowlist of retrieval_config keys (region, bucket, embedding model, credential refs) plus the router to vector_stores.asearch, keeping caller-supplied connection overrides like api_base/api_key away from the search call. filters/retrieval_filter stay reserved so this composes with open PR fix(rag): forward retrieval_filter from retrieval_config to vector store search #34427 in either merge order
  • litellm/proxy/vector_store_endpoints/endpoints.py + litellm/proxy/rag_endpoints/endpoints.py: both proxy query surfaces (/v1/rag/query retrieval_config and the /v1/vector_stores/{id}/search body) reject caller-supplied embedding_model/litellm_embedding_model/litellm_embedding_config/litellm_credential_name with a 400. Search-time embeddings resolve through the Router with the proxy's credentials without a key-permission check, so letting a caller pick the model was an authorization bypass (review finding); these keys now only come from the store's server-side registration, matching the documented contract and the ingest-side credential blocklist

UI (defect 3):

  • networking.tsx: vectorStoreSearchCall throws on non-OK responses instead of returning null (single caller, verified)
  • VectorStoreTester.tsx: failed searches render "Search failed: " in history; "No results found" now means an actually-empty result

Tests: new regression tests across all three defects (all verified to fail pre-fix), backward-compat pins (no-router path, router-not-serving fallback, non-search call types, serialization guard, store-wins merge, connection-override allowlist, sync router injection), parametrized 400s for every blocked embedding-selection key on both query surfaces, un-skipped test_transform_search_request placeholder, updated region-fallback tests, UI error-state + empty-results tests:

tests/test_litellm/llms/s3_vectors/vector_stores/test_s3_vectors_transformation.py::TestS3VectorsVectorStoreConfig::test_atransform_search_uses_router_for_virtual_model
tests/test_litellm/rag/test_main.py::test_aquery_forwards_provider_retrieval_config_and_router_to_search
tests/test_litellm/rag/test_main.py::test_aquery_does_not_forward_connection_override_keys_to_search
tests/test_litellm/proxy/rag_endpoints/test_rag_endpoints.py::test_rag_query_merges_managed_store_params
tests/test_litellm/proxy/rag_endpoints/test_rag_endpoints.py::test_rag_query_store_params_win_over_user_retrieval_config
tests/test_litellm/proxy/rag_endpoints/test_rag_endpoints.py::test_rag_query_rejects_caller_embedding_selection_params
tests/test_litellm/proxy/vector_store_endpoints/test_vector_store_endpoints.py::test_vector_store_search_rejects_caller_embedding_selection_params
tests/test_litellm/test_router.py::test_avector_store_search_injects_router
tests/test_litellm/test_router.py::test_vector_store_search_injects_router

Final Attestation

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

Note

Medium Risk
Touches proxy RAG/search auth (embedding model selection, credential merge, allowlists) and Router injection on search paths; behavior changes are intentional but affect security-sensitive retrieval flows.

Overview
Fixes S3 Vectors and managed-store RAG/search by passing the LiteLLM Router through vector store search (SDK → HTTP handler → provider transforms) so query-time embeddings can use router-managed virtual embedding models; S3 Vectors resolves embeddings via the router when it serves the model and aligns AWS region resolution with ingestion.

/v1/rag/query now merges managed vector store registry params (same helper as direct search), with store values winning over caller retrieval_config. litellm.aquery forwards only an allowlisted set of retrieval keys plus router to search, blocking connection overrides like api_base/api_key. Proxy /v1/rag/query and /vector_stores/{id}/search return 400 if callers set embedding model/credential keys that must come from server-side store registration.

Dashboard vector store tester surfaces backend error text instead of treating failures as empty results (vectorStoreSearchCall throws on non-OK).

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

@greptile-apps

greptile-apps Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR restores managed S3 Vector Store querying across SDK, proxy RAG, direct-search, and dashboard paths.

  • Threads Router context through synchronous and asynchronous vector-store search so Router-managed embedding models resolve correctly.
  • Reuses the authorized managed-store lookup in RAG queries and merges server-side store configuration with precedence over caller input.
  • Restricts caller-controlled embedding-selection parameters and forwards only approved retrieval configuration.
  • Surfaces backend vector-search errors in the dashboard instead of displaying them as empty results.
  • Adds regression coverage for Router propagation, managed-store merging, parameter rejection, region fallback, and UI error handling.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the synchronous Router context loss and duplicate managed-store lookup reported previously are both corrected at the current head.

Important Files Changed

Filename Overview
litellm/router.py The synchronous and asynchronous model-less vector-store search paths now inject the Router, resolving the previously reported context loss.
litellm/vector_stores/main.py Search APIs explicitly accept Router context and pass it through to the shared HTTP handler without adding it to generic request parameters.
litellm/llms/custom_httpx/llm_http_handler.py Both search handlers propagate Router context into provider search transformations.
litellm/llms/s3_vectors/vector_stores/transformation.py S3 Vectors uses the Router for configured virtual embedding models and aligns search-region fallback with ingestion.
litellm/proxy/rag_endpoints/endpoints.py RAG queries reuse the authorization lookup and merge managed-store configuration before runtime dispatch.
litellm/proxy/vector_store_endpoints/endpoints.py Managed-store request construction is reusable and both proxy query surfaces reject caller-selected embedding configuration.
litellm/rag/main.py The RAG pipeline forwards Router context and an explicit allowlist of store-search configuration.
ui/litellm-dashboard/src/app/(dashboard)/vector-stores/_components/VectorStoreTester.tsx Search failures are retained in test history and rendered distinctly from successful empty results.
ui/litellm-dashboard/src/components/networking.tsx Non-successful vector-store search responses now raise their backend error message for the UI to display.

Reviews (4): Last reviewed commit: "fix(vector_stores): block caller-supplie..." | Re-trigger Greptile

Comment thread litellm/router.py Outdated
Comment on lines +662 to +666
store_data = await _update_request_data_with_litellm_managed_vector_store_registry(
data={},
vector_store_id=retrieval_config["vector_store_id"],
user_api_key_dict=user_api_key_dict,
)

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.

P2 Managed store lookup runs twice

_authorize_nested_vector_store_ids already resolves and authorizes this vector store before this helper resolves it and checks access again. This duplicates registry and cache work on every RAG query and repeats the database fallback on a cache miss, adding avoidable request latency and load.

Rule Used: What: Avoid creating new database requests or Rout... (source)

Comment thread litellm/rag/main.py Outdated
Comment thread litellm/proxy/rag_endpoints/endpoints.py Outdated
@veria-ai

veria-ai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

PR overview

All previously flagged issues have been addressed. No open security concerns remain on this pull request.

Security review

No open security issues remain on this pull request.

Fixed/addressed: 3 · PR risk: 0/10

@codecov

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 95.08197% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
litellm/proxy/vector_store_endpoints/endpoints.py 91.66% 2 Missing ⚠️
litellm/router.py 88.88% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@codspeed

codspeed Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_fix_s3_vectors_search (8b0441a) with litellm_internal_staging (8ce02c0)

Open in CodSpeed

@mateo-berri mateo-berri changed the title fix(vector_stores): S3 Vectors search router bypass + rag query config drop + UI error swallow fix(vector_stores): s3 vectors search router bypass + rag query config drop + ui error swallow Sep 1, 2026
_generic_api_call_with_fallbacks requires a model, so sync
vector_store_search and vector_store_create raised a TypeError whenever
the call carried no model. Model-less calls now go directly to the SDK
function, with the router injected for search, matching the async
wrapper's behavior
rag_query reuses the store resolved during authorization instead of a
second registry lookup, merges registry data store-wins so callers
cannot override a managed store's provider or credentials, and logs ids
instead of the merged config, which can carry resolved credentials.
aquery forwards only allowlisted retrieval_config keys to vector store
search, keeping caller-supplied connection overrides like api_base and
api_key away from the search call
@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@mateo-berri

Copy link
Copy Markdown
Contributor

@greptileai

Comment thread litellm/llms/s3_vectors/vector_stores/transformation.py
Comment thread litellm/rag/main.py
@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@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 8b5ae3d. Configure here.

@mateo-berri

Copy link
Copy Markdown
Contributor

bugbot run

@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 8b0441a. 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. Thanks!

@mateo-berri
mateo-berri merged commit b600f02 into litellm_internal_staging Sep 2, 2026
83 of 84 checks passed
@mateo-berri
mateo-berri deleted the litellm_fix_s3_vectors_search branch September 2, 2026 18:35
doonga pushed a commit to greyrock-labs/home-ops that referenced this pull request Sep 15, 2026
…101.0) (#201)

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.100.1` → `v1.101.0` |

---

### Release Notes

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

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

[Compare Source](https://github.com/BerriAI/litellm/compare/v1.100.1...v1.101.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.101.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.101.0/cosign.pub \
  ghcr.io/berriai/litellm:v1.101.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

- fix(proxy): emit timing headers and overhead for /v1/messages and /v1/responses by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;38840](https://github.com/BerriAI/litellm/pull/38840)
- fix(tests): derive the no-cache-read-rate savings baseline from the model map by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;38863](https://github.com/BerriAI/litellm/pull/38863)
- chore(typing): clear Any seams across 47 files, ratchet basedpyright ceilings -3,302 by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;37778](https://github.com/BerriAI/litellm/pull/37778)
- chore(typing): clear 1.2k basedpyright Any errors across 16 hotspot files by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;36722](https://github.com/BerriAI/litellm/pull/36722)
- feat(bedrock): honor streaming buffer/sampling config for unbuffered post\_call scans by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38722](https://github.com/BerriAI/litellm/pull/38722)
- feat(cli): set ENABLE\_TOOL\_SEARCH=true for lite claude by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38942](https://github.com/BerriAI/litellm/pull/38942)
- fix(proxy): deliver budget alerts on webhook-only alerting and accept ALERTING\_WEBHOOK\_URL by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38441](https://github.com/BerriAI/litellm/pull/38441)
- docs(claude.md): require tests to check behavior, not code structure by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;38772](https://github.com/BerriAI/litellm/pull/38772)
- chore(newrelic): cover static default\_team\_settings per-team routing by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;38857](https://github.com/BerriAI/litellm/pull/38857)
- fix: update stale source URLs and deprecation dates in model cost map by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38801](https://github.com/BerriAI/litellm/pull/38801)
- feat(ci): close duplicate issues after a 3-day grace period by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;38381](https://github.com/BerriAI/litellm/pull/38381)
- docs(proxy): clarify spend semantics on /v2/user/info and /user/daily/activity by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38883](https://github.com/BerriAI/litellm/pull/38883)
- fix(guardrails): configure Prompt Security file timeout policy by [@&#8203;davida-ps](https://github.com/davida-ps) in [#&#8203;38083](https://github.com/BerriAI/litellm/pull/38083)
- fix(bedrock): stop duplicating Converse config blocks inside inferenceConfig by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38993](https://github.com/BerriAI/litellm/pull/38993)
- fix(guardrails): exclude images from HiddenLayer v1 scans by [@&#8203;Ashton-Sidhu](https://github.com/Ashton-Sidhu) in [#&#8203;29210](https://github.com/BerriAI/litellm/pull/29210)
- feat(spend\_tracking): persist router metadata in spend logs for internal router models by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39001](https://github.com/BerriAI/litellm/pull/39001)
- fix(vertex\_ai): graft default vertex path when api\_base has a version-only path by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38986](https://github.com/BerriAI/litellm/pull/38986)
- fix(proxy): allow unblocking customers via /customer/update by [@&#8203;cat0825](https://github.com/cat0825) in [#&#8203;34696](https://github.com/BerriAI/litellm/pull/34696)
- feat(openai): support workload identity federation (OIDC token exchange) by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38995](https://github.com/BerriAI/litellm/pull/38995)
- fix(otel): emit cache token counts on OTel v2 LLM spans by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38716](https://github.com/BerriAI/litellm/pull/38716)
- feat(proxy): add /v1/responses/input\_tokens token counting endpoint by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38997](https://github.com/BerriAI/litellm/pull/38997)
- fix(docker): bump wolfi-base for glibc 2.44 and pin apk python to 3.13 by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38917](https://github.com/BerriAI/litellm/pull/38917)
- fix(docker): bump wolfi-base for glibc 2.44 and pin apk python to 3.13 in migrations image by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38973](https://github.com/BerriAI/litellm/pull/38973)
- feat(friendli): add zai-org/GLM-5.3-Flash model pricing by [@&#8203;Lee-Si-Yoon](https://github.com/Lee-Si-Yoon) in [#&#8203;38880](https://github.com/BerriAI/litellm/pull/38880)
- chore(techdebt): clear fresh debt from the 2026-08-29 and 2026-08-30 windows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38884](https://github.com/BerriAI/litellm/pull/38884)
- fix(bedrock): surface Nova Sonic user transcripts, speech events, and usage in realtime API by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38597](https://github.com/BerriAI/litellm/pull/38597)
- fix(guardrails): carry Anthropic url image sources through to guardrails by [@&#8203;samtsai15](https://github.com/samtsai15) in [#&#8203;38940](https://github.com/BerriAI/litellm/pull/38940)
- feat(friendli): add zai-org/GLM-5.3 model pricing by [@&#8203;Lee-Si-Yoon](https://github.com/Lee-Si-Yoon) in [#&#8203;38881](https://github.com/BerriAI/litellm/pull/38881)
- fix(router): apply model renames to the in-memory deployment list by [@&#8203;yatishgoel](https://github.com/yatishgoel) in [#&#8203;38479](https://github.com/BerriAI/litellm/pull/38479)
- test(e2e): cover SCIM token creation and SCIM API auth in the Admin UI suite by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39027](https://github.com/BerriAI/litellm/pull/39027)
- feat(gigachat): add native API passthrough routes with spend logging by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38913](https://github.com/BerriAI/litellm/pull/38913)
- feat(gigachat): add passthrough gigachat route by [@&#8203;KnyazSh](https://github.com/KnyazSh) in [#&#8203;25886](https://github.com/BerriAI/litellm/pull/25886)
- feat(complexity-router): add classification\_mode to skip classifier on continuation turns by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;38861](https://github.com/BerriAI/litellm/pull/38861)
- fix(proxy): preserve model table columns on master key rotation by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38878](https://github.com/BerriAI/litellm/pull/38878)
- fix(speech): stop forwarding response\_format as a chat param for Gemini TTS by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38819](https://github.com/BerriAI/litellm/pull/38819)
- fix(proxy): return 200 from /model/block and /model/unblock instead of 500 by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38873](https://github.com/BerriAI/litellm/pull/38873)
- feat(complexity\_router): escalate oversized prompts to a tier that fits before dispatch by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;38844](https://github.com/BerriAI/litellm/pull/38844)
- feat(shadow\_eval): target teams and users so JWT-auth traffic can be evaluated by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39015](https://github.com/BerriAI/litellm/pull/39015)
- fix(anthropic\_messages): drain upstream in a detached pump so client … by [@&#8203;nuernber](https://github.com/nuernber) in [#&#8203;36008](https://github.com/BerriAI/litellm/pull/36008)
- refactor(proxy): bound the budget window seed by time instead of request ids by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;38851](https://github.com/BerriAI/litellm/pull/38851)
- fix(proxy): ship psycopg so partitioned SpendLogs detection actually runs by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;38994](https://github.com/BerriAI/litellm/pull/38994)
- test(e2e): assert user-observable behavior instead of DOM structure by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39016](https://github.com/BerriAI/litellm/pull/39016)
- build(rust): configure native extension profiles by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39020](https://github.com/BerriAI/litellm/pull/39020)
- fix(ui): keep litellm\_credential\_name from LiteLLM Params JSON when no credential is selected by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39005](https://github.com/BerriAI/litellm/pull/39005)
- Revert "fix(ui): keep litellm\_credential\_name from LiteLLM Params JSON when no credential is selected" by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39046](https://github.com/BerriAI/litellm/pull/39046)
- fix(auth): quiet malformed virtual key rejections to stdout by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;38838](https://github.com/BerriAI/litellm/pull/38838)
- fix(proxy): wire team-level logging callbacks into passthrough endpoints by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;38979](https://github.com/BerriAI/litellm/pull/38979)
- feat(complexity\_router): opt-in modality-based capability routing for image requests by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39032](https://github.com/BerriAI/litellm/pull/39032)
- fix(ui): let the auto-router scoring tier list follow the theme by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39040](https://github.com/BerriAI/litellm/pull/39040)
- feat(ui): auto-router controls for context-window escalation by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39054](https://github.com/BerriAI/litellm/pull/39054)
- fix(redis): coerce env var string types and fix param discovery through decorator wrappers by [@&#8203;koladefaj](https://github.com/koladefaj) in [#&#8203;30644](https://github.com/BerriAI/litellm/pull/30644)
- feat(key management): show budget window usage on /key/info by [@&#8203;Thijmen](https://github.com/Thijmen) in [#&#8203;37044](https://github.com/BerriAI/litellm/pull/37044)
- fix(websearch): reject invalid explicit search tool selections by [@&#8203;georgeatparallel](https://github.com/georgeatparallel) in [#&#8203;38113](https://github.com/BerriAI/litellm/pull/38113)
- feat(shadow\_eval): compare several auto-routers on one job's sampled traffic by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39028](https://github.com/BerriAI/litellm/pull/39028)
- fix(speech): honor pcm/wav response\_format for Gemini TTS and reject unsupported containers by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38868](https://github.com/BerriAI/litellm/pull/38868)
- fix(proxy): match /v1/audio/speech content-type to the returned audio format by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38798](https://github.com/BerriAI/litellm/pull/38798)
- test(e2e): drop the two mgmt registry cells no shared-proxy test can cover by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39055](https://github.com/BerriAI/litellm/pull/39055)
- feat(ui): one classification frequency picker for complexity auto-routers by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39042](https://github.com/BerriAI/litellm/pull/39042)
- test(e2e/ui): automate 8 manual QA checklist flows by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39025](https://github.com/BerriAI/litellm/pull/39025)
- fix(key\_management): allow non-admin key\_type preset transitions on /key/update by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39051](https://github.com/BerriAI/litellm/pull/39051)
- chore(typing): clear 1.1k basedpyright Any errors across 53 backend files by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38796](https://github.com/BerriAI/litellm/pull/38796)
- fix(openai): forward reasoning\_effort for unknown model aliases instead of failing closed by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39065](https://github.com/BerriAI/litellm/pull/39065)
- test(e2e-ui): poll credential availability before Test Connect to deflake multi-instance runs by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39073](https://github.com/BerriAI/litellm/pull/39073)
- feat(ui): modality routing toggle on the auto-router create and edit forms by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39059](https://github.com/BerriAI/litellm/pull/39059)
- fix(proxy): include litellm\_model\_table in GET /v2/team/list by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39045](https://github.com/BerriAI/litellm/pull/39045)
- fix(bedrock): mask signed request headers in guardrail debug log by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39044](https://github.com/BerriAI/litellm/pull/39044)
- fix(bedrock): forward aws\_external\_id in files and batches credential loading by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39066](https://github.com/BerriAI/litellm/pull/39066)
- fix(mcp): persist alias MCP grants verbatim instead of rewriting to local server ids by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39119](https://github.com/BerriAI/litellm/pull/39119)
- fix(responses): json-encode object tool call arguments in the chat completions bridge by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;35417](https://github.com/BerriAI/litellm/pull/35417)
- fix(cost): bill OCR annotation pages via annotation\_cost\_per\_page by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38985](https://github.com/BerriAI/litellm/pull/38985)
- fix(policy\_engine): restore request guardrails list after pipeline allow by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39038](https://github.com/BerriAI/litellm/pull/39038)
- fix(embeddings): omit encoding\_format when the client omits it on OpenAI-compatible calls by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38774](https://github.com/BerriAI/litellm/pull/38774)
- test: deflake MCP registry state, savings cost map, and MCP identity env reload tests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38891](https://github.com/BerriAI/litellm/pull/38891)
- feat(helm): add Argo CD PreSync hook and rollout strategy knobs to the componentized chart by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39112](https://github.com/BerriAI/litellm/pull/39112)
- fix(registry): veo 3.1 pricing tiers + roll up open registry PRs (glm-5.2, Qwen3.8-Flash, gemma-4-31b, scribe\_v2, fireworks/databricks deepseek v4) + deprecation dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38990](https://github.com/BerriAI/litellm/pull/38990)
- test(ui): budget DOM-structure assertions in dashboard tests by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39082](https://github.com/BerriAI/litellm/pull/39082)
- test(ui): assert DataTable behavior instead of DOM structure by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39084](https://github.com/BerriAI/litellm/pull/39084)
- test(ui): query the screen instead of the render result by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39085](https://github.com/BerriAI/litellm/pull/39085)
- fix(ui): stop checkboxes stretching to the full width of a form field by [@&#8203;yatishgoel](https://github.com/yatishgoel) in [#&#8203;39108](https://github.com/BerriAI/litellm/pull/39108)
- chore: bump litellm-enterprise 0.1.62 -> 0.1.63, litellm-proxy-extras 0.4.91 -> 0.4.92, litellm 1.100.0 -> 1.101.0 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39140](https://github.com/BerriAI/litellm/pull/39140)
- revert: restore search tool fallback when no router is configured by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39146](https://github.com/BerriAI/litellm/pull/39146)
- test(websearch): register configured search tool in pre-request hook test by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39074](https://github.com/BerriAI/litellm/pull/39074)
- feat(proxy): default to the v2 migration resolver, keep v1 as an opt-out by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;31125](https://github.com/BerriAI/litellm/pull/31125)
- build(deps): bump browserslist to 4.28.8 to clear osv-scan by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39142](https://github.com/BerriAI/litellm/pull/39142)
- fix(ui): render the skill detail page with theme tokens by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39130](https://github.com/BerriAI/litellm/pull/39130)
- feat: add Azure AI DeepSeek V4 Flash 0731 pricing by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39023](https://github.com/BerriAI/litellm/pull/39023)
- fix(streaming): keep response id stable across streamed chunks by [@&#8203;Timik232](https://github.com/Timik232) in [#&#8203;38106](https://github.com/BerriAI/litellm/pull/38106)
- test(e2e/ui): cover the Budgets page create, edit and delete flows by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39052](https://github.com/BerriAI/litellm/pull/39052)
- feat(dashscope): add QwenCloud and Qwen AI Platform provider aliases by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39149](https://github.com/BerriAI/litellm/pull/39149)
- fix(bedrock): forward native structured outputs on Invoke instead of silently inlining the schema by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39070](https://github.com/BerriAI/litellm/pull/39070)
- test(e2e/ui): cover creating, testing and deleting a guardrail by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39053](https://github.com/BerriAI/litellm/pull/39053)
- refactor(types): replace Any with precise types across 73 modules by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39104](https://github.com/BerriAI/litellm/pull/39104)
- feat(models): add Claude Fable 5.1 across Anthropic, Bedrock, Vertex AI, and Azure AI by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39148](https://github.com/BerriAI/litellm/pull/39148)
- feat(guardrails): add Alice guardrail by [@&#8203;seanyasno-af](https://github.com/seanyasno-af) in [#&#8203;38898](https://github.com/BerriAI/litellm/pull/38898)
- test(e2e/ui): cover the Logs page filter drawer by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39056](https://github.com/BerriAI/litellm/pull/39056)
- test(e2e/ui): stop the suite failing on things that are not regressions by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39063](https://github.com/BerriAI/litellm/pull/39063)
- test(e2e/ui): cover the team Settings tab by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39058](https://github.com/BerriAI/litellm/pull/39058)
- test(e2e/ui): cover the Usage page activity tabs by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39061](https://github.com/BerriAI/litellm/pull/39061)
- fix(ui): render the guardrail garden detail page with theme tokens by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39131](https://github.com/BerriAI/litellm/pull/39131)
- fix(responses): tool call id shape breaks gpt-5 -> claude fallback conversations by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39144](https://github.com/BerriAI/litellm/pull/39144)
- fix(openai): drop tool\_choice when request has no tools on chat completions by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39147](https://github.com/BerriAI/litellm/pull/39147)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39141](https://github.com/BerriAI/litellm/pull/39141)
- test(ui): pick select options by role instead of by text by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39175](https://github.com/BerriAI/litellm/pull/39175)
- feat(cost): support time-based off-peak pricing in cost calculation by [@&#8203;Srivatsa03](https://github.com/Srivatsa03) in [#&#8203;31725](https://github.com/BerriAI/litellm/pull/31725)
- fix(openai): flatten top-level tool schema combinators on chat completions by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38839](https://github.com/BerriAI/litellm/pull/38839)
- fix(s3): bound s3 object keys and download filenames for long Responses API ids by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39164](https://github.com/BerriAI/litellm/pull/39164)
- revert: default the proxy back to the v1 migration resolver by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39178](https://github.com/BerriAI/litellm/pull/39178)
- fix(prometheus): bound requested\_model label cardinality on client failure paths by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39136](https://github.com/BerriAI/litellm/pull/39136)
- feat(ui): add search to the Agent Hub tab and admin agents table by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39155](https://github.com/BerriAI/litellm/pull/39155)
- fix(anthropic): fix response\_format for claude-fable-5-1 on Vertex AI and Bedrock by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39184](https://github.com/BerriAI/litellm/pull/39184)
- fix: keep litellm\_credential\_name from LiteLLM Params JSON and gate stored credential attach to proxy admins by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39047](https://github.com/BerriAI/litellm/pull/39047)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39186](https://github.com/BerriAI/litellm/pull/39186)
- test: exempt MockTransport request-shape embedding tests from VCR replay by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39185](https://github.com/BerriAI/litellm/pull/39185)
- fix(ui): render the logs Tools panel with theme tokens by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39129](https://github.com/BerriAI/litellm/pull/39129)
- fix(proxy): default max\_idle\_connection\_lifetime to 60s on DB URLs by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39134](https://github.com/BerriAI/litellm/pull/39134)
- fix(mcp): follow tools/list pagination from upstream servers by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39172](https://github.com/BerriAI/litellm/pull/39172)
- fix(proxy): resolve router model aliases in /utils/supported\_openai\_params by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39000](https://github.com/BerriAI/litellm/pull/39000)
- fix(azure): flatten top-level tool schema combinators on Azure chat completions by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38870](https://github.com/BerriAI/litellm/pull/38870)
- fix(bedrock): route streamed responses-API output through the unified guardrail by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38734](https://github.com/BerriAI/litellm/pull/38734)
- fix(ui): hide model write affordances from view-only admin sessions by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38872](https://github.com/BerriAI/litellm/pull/38872)
- fix(cli): quote the Claude Code apiKeyHelper for cmd.exe on Windows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39174](https://github.com/BerriAI/litellm/pull/39174)
- fix(logging): guarantee max\_parallel\_requests slot release when streaming logging fails by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39093](https://github.com/BerriAI/litellm/pull/39093)
- feat(alerting): slack alerts for per-user daily/monthly spend thresholds and spend anomaly detection by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38438](https://github.com/BerriAI/litellm/pull/38438)
- fix(docker): add public Wolfi apk repo to runtime image by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39033](https://github.com/BerriAI/litellm/pull/39033)
- fix(router): keep order fallback on the requested order level by [@&#8203;emerzon](https://github.com/emerzon) in [#&#8203;38969](https://github.com/BerriAI/litellm/pull/38969)
- test(e2e): cover retry-on-timeout and the context-window fallback by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39197](https://github.com/BerriAI/litellm/pull/39197)
- fix(budget): reject known estimates over remaining budget under fail\_closed\_budget\_enforcement by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39214](https://github.com/BerriAI/litellm/pull/39214)
- fix: stop a cleared Team field from blocking personal key creation by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39206](https://github.com/BerriAI/litellm/pull/39206)
- test: record each e2e test's source location in the JUnit report by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39209](https://github.com/BerriAI/litellm/pull/39209)
- feat(router): fall back on anthropic safeguard refusals on /v1/messages by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39157](https://github.com/BerriAI/litellm/pull/39157)
- fix(proxy): report requested model on Anthropic streaming message\_start by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;35816](https://github.com/BerriAI/litellm/pull/35816)
- fix(helm): reuse the generated master key Secret on helm upgrade by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39219](https://github.com/BerriAI/litellm/pull/39219)
- fix(mcp): report per-server outcomes in aggregate REST tools/list by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39232](https://github.com/BerriAI/litellm/pull/39232)
- fix(cost-map): retry transient boot fetch failures and recover config deployments dropped by a stale cost map by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39230](https://github.com/BerriAI/litellm/pull/39230)
- perf(scim): resolve group members with one user table read per member by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39228](https://github.com/BerriAI/litellm/pull/39228)
- fix(docker): install bedrock-realtime extra in monolith proxy images by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39223](https://github.com/BerriAI/litellm/pull/39223)
- fix(aiohttp\_transport): map transport-internal CancelledError to a retryable ConnectError by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39240](https://github.com/BerriAI/litellm/pull/39240)
- fix(bedrock): gate Converse cachePoint emission on model prompt caching support by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39210](https://github.com/BerriAI/litellm/pull/39210)
- fix(datadog\_llm\_obs): send tool calls, tool results and cache tokens in DD's own fields by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39222](https://github.com/BerriAI/litellm/pull/39222)
- feat(prometheus): expose per-key and per-team rate limit allowed and used gauges by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39236](https://github.com/BerriAI/litellm/pull/39236)
- feat(scim): add placeholder listing and merge so a shadowed account can be healed by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39231](https://github.com/BerriAI/litellm/pull/39231)
- fix: normalize provider-specific cache token fields in OTel v2 usage by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39202](https://github.com/BerriAI/litellm/pull/39202)
- fix: stop deployment default API key limits leaking into provider requests by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39211](https://github.com/BerriAI/litellm/pull/39211)
- fix(proxy): keep passthrough logging metadata and model\_info dicts when team callbacks are wired by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39216](https://github.com/BerriAI/litellm/pull/39216)
- fix(guardrails): deliver modify\_response block as valid SSE on streaming chat and Responses by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39036](https://github.com/BerriAI/litellm/pull/39036)
- fix(search): forward search-tool params through the router, complete Parallel AI v1 param mapping by [@&#8203;jliounis](https://github.com/jliounis) in [#&#8203;37883](https://github.com/BerriAI/litellm/pull/37883)
- fix(bedrock): stop Converse crashing on bearer-token auth without SigV4 credentials by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39166](https://github.com/BerriAI/litellm/pull/39166)
- fix(docker): install saml extra in litellm-backend image by [@&#8203;ojensen-berri](https://github.com/ojensen-berri) in [#&#8203;39291](https://github.com/BerriAI/litellm/pull/39291)
- fix(guardrails): run apply\_guardrail-only providers in logging\_only mode by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39297](https://github.com/BerriAI/litellm/pull/39297)
- feat(gemini): day-0 pricing for gemini-3.8-flash by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39340](https://github.com/BerriAI/litellm/pull/39340)
- fix(vertex): avoid duplicate DeepSeek OCR model namespace by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39194](https://github.com/BerriAI/litellm/pull/39194)
- feat(streaming): carry final response cost on streamed usage by default by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39069](https://github.com/BerriAI/litellm/pull/39069)
- fix(rerank): map provider errors with the resolved provider on sync and async paths by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39176](https://github.com/BerriAI/litellm/pull/39176)
- test(e2e): read JUnit properties off the real collected pytest Item by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39246](https://github.com/BerriAI/litellm/pull/39246)
- feat(proxy): configurable display\_name for the Anthropic-shaped /v1/models listing by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39238](https://github.com/BerriAI/litellm/pull/39238)
- fix(helm): scale the classic chart's HPA out at the documented 60 percent CPU by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;35975](https://github.com/BerriAI/litellm/pull/35975)
- fix(gemini): return enabled thinking content by default by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39160](https://github.com/BerriAI/litellm/pull/39160)
- fix: run access group key sync UPDATEs on the writer, not the read replica by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39128](https://github.com/BerriAI/litellm/pull/39128)
- fix(models): registry audit 2026-09-01: openai realtime and long-context tiers, mistral aliases, voyage, xai, fireworks, together, scaleway, azure ai, govcloud, azure gov, cloudflare whisper, deprecation dates by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39170](https://github.com/BerriAI/litellm/pull/39170)
- fix: apply optional\_pre\_call\_checks and reject unsupported router settings on /config/update by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39249](https://github.com/BerriAI/litellm/pull/39249)
- fix(vector\_stores): s3 vectors search router bypass + rag query config drop + ui error swallow by [@&#8203;michelligabriele](https://github.com/michelligabriele) in [#&#8203;34788](https://github.com/BerriAI/litellm/pull/34788)
- fix(models): key Azure DeepSeek V4 Flash 0731 by its Foundry catalog id by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39341](https://github.com/BerriAI/litellm/pull/39341)
- fix(deps): raise the tornado and pypdf floors for six new advisories by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39188](https://github.com/BerriAI/litellm/pull/39188)
- fix(headroom): stop re-compressing retrieved CCR content in client tool loops by [@&#8203;QuantumBreakz](https://github.com/QuantumBreakz) in [#&#8203;38591](https://github.com/BerriAI/litellm/pull/38591)
- feat(agentcore-a2a): derive runtime session id from A2A message.contextId by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39371](https://github.com/BerriAI/litellm/pull/39371)
- fix(proxy): share per-model budget counters across replicas through the spend counter cache by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39375](https://github.com/BerriAI/litellm/pull/39375)
- fix(proxy-extras): give prisma migrate deploy its own timeout budget by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39365](https://github.com/BerriAI/litellm/pull/39365)
- fix(proxy): route container create and list through model\_list deployments by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39220](https://github.com/BerriAI/litellm/pull/39220)
- test(build): validate release wheel contracts by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39021](https://github.com/BerriAI/litellm/pull/39021)
- refactor(rust): extract domain-neutral Python interop by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39026](https://github.com/BerriAI/litellm/pull/39026)
- refactor(rust): standardize the core Error type by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39331](https://github.com/BerriAI/litellm/pull/39331)
- fix(ui): preserve full AgentCore runtime ARN in agent edit form by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39382](https://github.com/BerriAI/litellm/pull/39382)
- feat(ui): update OpenAI preset model tiers by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39396](https://github.com/BerriAI/litellm/pull/39396)
- fix(router): resolve realtime session model to routed deployment by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;36811](https://github.com/BerriAI/litellm/pull/36811)
- fix(security): restrict and validate file uploads at /v1/files and /upload/logo by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39379](https://github.com/BerriAI/litellm/pull/39379)
- feat(auth): enforce configurable password policy and SSO-only login by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39381](https://github.com/BerriAI/litellm/pull/39381)
- fix(agents): redact secret litellm\_params fields from all /v1/agents responses by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39389](https://github.com/BerriAI/litellm/pull/39389)
- fix(otel): stamp Langfuse root observation input and output from the request task by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39369](https://github.com/BerriAI/litellm/pull/39369)
- fix(guardrails): track and tear down presidio sibling callbacks on delete and update by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39271](https://github.com/BerriAI/litellm/pull/39271)
- fix(spend): keep every-deployment scope on gateway cache-injection marks by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39241](https://github.com/BerriAI/litellm/pull/39241)
- fix(proxy/db): keep prisma predicates from raising TypeError under a mocked prisma module by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39253](https://github.com/BerriAI/litellm/pull/39253)
- fix(proxy): word database 503s by whether the fault is transient by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39256](https://github.com/BerriAI/litellm/pull/39256)
- refactor(utils): remove the dead get\_api\_key provider-key resolver by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39260](https://github.com/BerriAI/litellm/pull/39260)
- feat(mcp): semantic tool search for the native MCP Gateway by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39404](https://github.com/BerriAI/litellm/pull/39404)
- fix(logging): redact credential query params from the uvicorn access log by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39293](https://github.com/BerriAI/litellm/pull/39293)
- feat(model\_prices): add meta/muse-spark-1.3 and its contributor tier by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39417](https://github.com/BerriAI/litellm/pull/39417)
- refactor(core): move audio transcription into core by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39126](https://github.com/BerriAI/litellm/pull/39126)
- fix(proxy): build coordination Redis from REDIS\_\* env vars unconditionally by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39410](https://github.com/BerriAI/litellm/pull/39410)
- test: add interactive Rust Python parity harness by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;39419](https://github.com/BerriAI/litellm/pull/39419)
- test(proxy): verify NO\_DOCS/NO\_REDOC/NO\_OPENAPI restrict every doc surface by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39378](https://github.com/BerriAI/litellm/pull/39378)
- test(bedrock): accept the router kwarg in the knowledge base search fake by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39420](https://github.com/BerriAI/litellm/pull/39420)
- refactor(python-bridge): split routes and add shared function tracing by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39031](https://github.com/BerriAI/litellm/pull/39031)
- fix(python-bridge): harden sync and async execution boundaries by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39332](https://github.com/BerriAI/litellm/pull/39332)
- refactor(python-bridge): declare sync and async routes once by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39333](https://github.com/BerriAI/litellm/pull/39333)
- feat(python): unify Rust opt-in and bridge policy by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39334](https://github.com/BerriAI/litellm/pull/39334)
- feat(router): add heuristic v2 complexity routing by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39276](https://github.com/BerriAI/litellm/pull/39276)
- fix(anthropic): upgrade legacy thinking to adaptive on adaptive-only Claude models for chat, Bedrock Converse, Invoke, Vertex AI, and Databricks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39159](https://github.com/BerriAI/litellm/pull/39159)
- fix(proxy): mark session/SSO/SAML cookies Secure behind a TLS-terminating reverse proxy by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39391](https://github.com/BerriAI/litellm/pull/39391)
- fix(bedrock): honor BEDROCK\_MANTLE\_API\_BASE on bedrock/mantle messages and chat URLs by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39364](https://github.com/BerriAI/litellm/pull/39364)
- fix(bedrock): strip client\_metadata from converse additionalModelRequestFields by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;35967](https://github.com/BerriAI/litellm/pull/35967)
- chore(techdebt): clear fresh debt from the 2026-08-31 and 2026-09-01 windows by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39091](https://github.com/BerriAI/litellm/pull/39091)
- fix(mcp): cap tools preview and test-connection at the listing timeout and name the unreachable upstream by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38791](https://github.com/BerriAI/litellm/pull/38791)
- fix(hosted\_vllm): forward truncate\_prompt\_tokens on rerank requests by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39363](https://github.com/BerriAI/litellm/pull/39363)
- fix(messages): drop cache\_control ttl on non-Anthropic /v1/messages passthrough by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39355](https://github.com/BerriAI/litellm/pull/39355)
- fix(bedrock\_mantle): carry per-request AWS credentials into chat completions SigV4 signing by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39362](https://github.com/BerriAI/litellm/pull/39362)
- feat(router): add a hybrid classifier that defers near tier boundaries by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39403](https://github.com/BerriAI/litellm/pull/39403)
- fix: recover the v2 migration resolver from concurrent migrate deploy deadlocks by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39187](https://github.com/BerriAI/litellm/pull/39187)
- fix(ollama\_chat): stamp finish\_reason tool\_calls when tool calls streamed before the done chunk by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39010](https://github.com/BerriAI/litellm/pull/39010)
- fix(router): route Claude Code subagents through session router by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;39239](https://github.com/BerriAI/litellm/pull/39239)
- fix(responses): keep namespace tools intact when a guardrail returns them unchanged by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39366](https://github.com/BerriAI/litellm/pull/39366)
- fix(vector-store): resolve embedding credentials per request by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;38936](https://github.com/BerriAI/litellm/pull/38936)
- test(e2e/ui): give the seeded users passwords that pass the default password policy by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39442](https://github.com/BerriAI/litellm/pull/39442)
- fix(http\_handler): honor HTTP(S)\_PROXY / NO\_PROXY when force\_ipv4 uses the httpx transport by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39443](https://github.com/BerriAI/litellm/pull/39443)
- fix(proxy): stop leaking internal exception details to clients by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;39380](https://github.com/BerriAI/litellm/pull/39380)
- fix(guardrails): forward mode and streaming params to crowdstrike\_aidr handler by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39317](https://github.com/BerriAI/litellm/pull/39317)
- fix(mcp): gate the connect-time OBO pre-flight on the key's allowed servers by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39447](https://github.com/BerriAI/litellm/pull/39447)
- fix(responses): keep provider response headers in streaming logging callbacks by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38131](https://github.com/BerriAI/litellm/pull/38131)
- fix(mcp): fence an outbound-token write against an overlapping invalidation by [@&#8203;yassin-berriai](https://github.com/yassin-berriai) in [#&#8203;35398](https://github.com/BerriAI/litellm/pull/35398)
- feat(cli): pre-fill the SSO verification code in the browser when the proxy allows it by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39428](https://github.com/BerriAI/litellm/pull/39428)
- fix(ui): paginate request logs by session groups server-side by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39257](https://github.com/BerriAI/litellm/pull/39257)
- feat(proxy): serve the auto-router preset catalog at runtime by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39412](https://github.com/BerriAI/litellm/pull/39412)
- docs: define Rust Python harness structure by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39456](https://github.com/BerriAI/litellm/pull/39456)
- fix(guardrails): apply PUT /guardrails/{id} to the serving worker immediately and reject invalid configs with 422 by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38877](https://github.com/BerriAI/litellm/pull/38877)
- test(responses): expect the 404 OpenAI now returns for an unknown model by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39457](https://github.com/BerriAI/litellm/pull/39457)
- fix(guardrails): skip streaming guardrail rounds that re-scan cleared output by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39386](https://github.com/BerriAI/litellm/pull/39386)
- fix: keep litellm importable on Python 3.10 and guard 3.11-only typing imports in CI by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39448](https://github.com/BerriAI/litellm/pull/39448)
- fix(proxy): keep SpendLogs and callback session ids in sync when the request has none by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39450](https://github.com/BerriAI/litellm/pull/39450)
- feat(router): arm safeguard-refusal fallback on generic chains when no content-policy list exists by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39274](https://github.com/BerriAI/litellm/pull/39274)
- feat(azure): support credential chain for storage by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39229](https://github.com/BerriAI/litellm/pull/39229)
- chore(crowdstrike): expect the deduped end-of-stream scan in crowdstrike cadence test by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39467](https://github.com/BerriAI/litellm/pull/39467)
- fix(model\_armor): handle Anthropic Messages and Responses streams in post\_call by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39181](https://github.com/BerriAI/litellm/pull/39181)
- test: add OCR python-to-rust test parity ledger (WIP) by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;39434](https://github.com/BerriAI/litellm/pull/39434)
- feat(complexity\_router): opt-in modality override of a kept session-affinity pin by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39454](https://github.com/BerriAI/litellm/pull/39454)
- feat(datadog\_llm\_obs): cost tag dimensions, router decision fields, reasoning token metric, redaction gating by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39402](https://github.com/BerriAI/litellm/pull/39402)
- test(rust-python-harness): wire existing e2e SDK tests into the matrix by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;39463](https://github.com/BerriAI/litellm/pull/39463)
- fix(mcp): never exchange the LiteLLM virtual key as the upstream subject token by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39446](https://github.com/BerriAI/litellm/pull/39446)
- test: add mistral ocr transformation parity coverage by [@&#8203;ishaan-berri](https://github.com/ishaan-berri) in [#&#8203;39482](https://github.com/BerriAI/litellm/pull/39482)
- test(vector-store): accept embedding\_executor in the Bedrock KB hook fake handler by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39472](https://github.com/BerriAI/litellm/pull/39472)
- refactor(s3\_vectors): embed search queries through the shared vector store executor by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39474](https://github.com/BerriAI/litellm/pull/39474)
- fix(xai): bill from the cost xAI reports instead of recomputing it (internal copy of [#&#8203;36281](https://github.com/BerriAI/litellm/issues/36281)) by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39441](https://github.com/BerriAI/litellm/pull/39441)
- feat(ui): add 1M context auto-router preset by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39490](https://github.com/BerriAI/litellm/pull/39490)
- fix(ui): stop the create team form resetting organization and models by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39476](https://github.com/BerriAI/litellm/pull/39476)
- fix(ui): read the preset catalog at runtime in the dashboard tests by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39478](https://github.com/BerriAI/litellm/pull/39478)
- fix(sso): resolve multi-valued role claims to the highest privilege role by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39480](https://github.com/BerriAI/litellm/pull/39480)
- fix(guardrail): hide-secrets playground redaction and guardrail telemetry by [@&#8203;yucheng-berri](https://github.com/yucheng-berri) in [#&#8203;39398](https://github.com/BerriAI/litellm/pull/39398)
- fix(test): drop the duplicate embedding\_executor arg in the Bedrock KB fake handler by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39502](https://github.com/BerriAI/litellm/pull/39502)
- fix(ui): keep Virtual Keys list state in the URL so it survives leaving the page by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39481](https://github.com/BerriAI/litellm/pull/39481)
- fix(proxy): 404 a credential delete that matched nothing, and raise instead of return by [@&#8203;eeshsaxena](https://github.com/eeshsaxena) in [#&#8203;36260](https://github.com/BerriAI/litellm/pull/36260)
- fix(proxy-extras): only spend a migrate-deploy attempt when a pass made no progress by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39506](https://github.com/BerriAI/litellm/pull/39506)
- feat(cli): enable Claude Code gateway model discovery by default in lite claude by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39445](https://github.com/BerriAI/litellm/pull/39445)
- fix(docker): bump nginx runtime to 1.31.5-alpine3.24 and pin digest by [@&#8203;rakeshrepository](https://github.com/rakeshrepository) in [#&#8203;39561](https://github.com/BerriAI/litellm/pull/39561)
- fix: 1.99.0-rc2 UI bug batch (empty org on key create, session pagination, access group rename/delete) by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39436](https://github.com/BerriAI/litellm/pull/39436)
- feat(auto-router): support classifier reasoning effort by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;39372](https://github.com/BerriAI/litellm/pull/39372)
- fix(ui): replace the key detail URL entry when a virtual key is rotated by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39471](https://github.com/BerriAI/litellm/pull/39471)
- test(timeout): time out against the local fake endpoint instead of api.openai.com by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39583](https://github.com/BerriAI/litellm/pull/39583)
- test(harness): add OCR parity with migration strategy runners by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;38765](https://github.com/BerriAI/litellm/pull/38765)
- fix(databricks): strip thinking\_blocks and reasoning\_content from outbound messages by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39409](https://github.com/BerriAI/litellm/pull/39409)
- test(ocr): record provider fixtures in the migration harness by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39425](https://github.com/BerriAI/litellm/pull/39425)
- feat(ui): keyset-paginate request logs by session trace by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;38794](https://github.com/BerriAI/litellm/pull/38794)
- fix(proxy/db): translate libpq sslrootcert and verify-\* into Prisma's strict TLS params by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39563](https://github.com/BerriAI/litellm/pull/39563)
- fix(agents): keep the published agent in public\_agent\_groups by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39554](https://github.com/BerriAI/litellm/pull/39554)
- fix(mcp): scope allow-all servers to virtual keys by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39531](https://github.com/BerriAI/litellm/pull/39531)
- fix(team): generate team IDs for blank input by [@&#8203;yujonglee-berri](https://github.com/yujonglee-berri) in [#&#8203;39571](https://github.com/BerriAI/litellm/pull/39571)
- fix(bedrock\_mantle): stop dropping the web\_search tool on /v1/responses by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;35987](https://github.com/BerriAI/litellm/pull/35987)
- chore: bump litellm-enterprise 0.1.63 -> 0.1.64, litellm-proxy-extras 0.4.92 -> 0.4.93 by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39595](https://github.com/BerriAI/litellm/pull/39595)
- fix(images): forward gpt-image supported params like background to OpenAI and Azure by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39525](https://github.com/BerriAI/litellm/pull/39525)
- fix(proxy): return persisted team memberships from /user/new so first CLI login gets the default team by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39545](https://github.com/BerriAI/litellm/pull/39545)
- fix(spend\_tracking): add missing\_session\_id: omit to leave SpendLogs.session\_id null without a client session by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39458](https://github.com/BerriAI/litellm/pull/39458)
- fix: stop a cleared Organization field from failing key creation by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39316](https://github.com/BerriAI/litellm/pull/39316)
- fix(ui): show MCP servers and agents inherited from access groups on team overview by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39215](https://github.com/BerriAI/litellm/pull/39215)
- fix(proxy): expose configured mode for auto-router models by [@&#8203;moe-berri](https://github.com/moe-berri) in [#&#8203;39619](https://github.com/BerriAI/litellm/pull/39619)
- fix(ui): aggregate session token usage in the logs table by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39598](https://github.com/BerriAI/litellm/pull/39598)
- fix(cost): apply off\_peak\_pricing in the dashscope cost calculator by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39592](https://github.com/BerriAI/litellm/pull/39592)
- test(bedrock): drop EOL cohere.command-r-plus-v1:0 from local\_testing by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39608](https://github.com/BerriAI/litellm/pull/39608)
- fix(openai): default stream usage on PrivateLink and regional api.openai.com hosts by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39614](https://github.com/BerriAI/litellm/pull/39614)
- fix(proxy): drop anthropic-beta on the Vertex passthrough count-tokens route by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39597](https://github.com/BerriAI/litellm/pull/39597)
- fix(headroom): resolve CCR retrieval on streaming /v1/responses by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38808](https://github.com/BerriAI/litellm/pull/38808)
- fix(openai): bridge gpt-5.4+ tool calls to /v1/responses on every api.openai.com host by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39587](https://github.com/BerriAI/litellm/pull/39587)
- fix(router): pin JWT-authenticated callers by user id in deployment\_affinity by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39594](https://github.com/BerriAI/litellm/pull/39594)
- fix(cost): bill bedrock\_mantle web search at $12 per 1k queries using Bedrock's reported count by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39610](https://github.com/BerriAI/litellm/pull/39610)
- fix(azure\_ai): don't reclassify Foundry deployments as azure provider by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38975](https://github.com/BerriAI/litellm/pull/38975)
- fix(vector\_stores): only list vector stores the caller was granted by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39612](https://github.com/BerriAI/litellm/pull/39612)
- feat(models): add gpt-6-astra pricing and metadata by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39622](https://github.com/BerriAI/litellm/pull/39622)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39593](https://github.com/BerriAI/litellm/pull/39593)
- feat(router): limit heuristic\_v2 auto-routers to one without the auto\_router license feature by [@&#8203;tin-berri](https://github.com/tin-berri) in [#&#8203;39468](https://github.com/BerriAI/litellm/pull/39468)
- fix(ui): clear agents when updating team permissions by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39600](https://github.com/BerriAI/litellm/pull/39600)
- fix(auto\_router): bill the routing embedding to the caller's key and team by [@&#8203;devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#&#8203;39532](https://github.com/BerriAI/litellm/pull/39532)
- test(router): cover get\_configured\_mode so router\_code\_coverage passes by [@&#8203;mubashir1osmani](https://github.com/mubashir1osmani) in [#&#8203;39630](https://github.com/BerriAI/litellm/pull/39630)
- fix: treat gpt-6 names as the gpt-5 request family in OpenAI and Azure configs by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39631](https://github.com/BerriAI/litellm/pull/39631)
- fix(prompts): key the in-memory prompt registry by environment by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38440](https://github.com/BerriAI/litellm/pull/38440)
- fix(ui): let the Internal Users search box match user\_id as well as email by [@&#8203;ryan-crabbe-berri](https://github.com/ryan-crabbe-berri) in [#&#8203;39604](https://github.com/BerriAI/litellm/pull/39604)
- test(responses): bound the background stream cancel e2e so an upstream stall skips fast by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39617](https://github.com/BerriAI/litellm/pull/39617)
- fix(vertex): add the API version to versionless project routes on the Vertex passthrough by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39625](https://github.com/BerriAI/litellm/pull/39625)
- chore(ci): promote internal staging to main by [@&#8203;yuneng-berri](https://github.com/yuneng-berri) in [#&#8203;39648](https://github.com/BerriAI/litellm/pull/39648)
- fix(spend\_tracking): key /v1/messages spend rows on the msg\_ id the client received by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39511](https://github.com/BerriAI/litellm/pull/39511)
- ci(rust): build and test the ai-gateway server feature by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39493](https://github.com/BerriAI/litellm/pull/39493)
- ci(ui): run the UI build check through the image's ui-builder stage by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39496](https://github.com/BerriAI/litellm/pull/39496)
- fix(proxy): parse numeric multipart fields on /v1/images/edits back into numbers by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39510](https://github.com/BerriAI/litellm/pull/39510)
- fix(guardrails): remove the module-global translation mapping that leaked between tests by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39543](https://github.com/BerriAI/litellm/pull/39543)
- feat(azure\_ai): add grok-4.6 to the model cost map by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39426](https://github.com/BerriAI/litellm/pull/39426)
- fix: attach vector store search\_results when a guardrail is registered by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;38984](https://github.com/BerriAI/litellm/pull/38984)
- fix(proxy): stop putting the literal string "None" in error payloads by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39521](https://github.com/BerriAI/litellm/pull/39521)
- fix(router): keep retry breadcrumbs per request and out of the request snapshot by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39491](https://github.com/BerriAI/litellm/pull/39491)
- fix(vector-stores): survive a failing vector store search in the chat completions hook by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39495](https://github.com/BerriAI/litellm/pull/39495)
- fix(utils): redact credential kwargs from the set\_verbose request line by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39526](https://github.com/BerriAI/litellm/pull/39526)
- fix(bedrock): skip the SigV4 credential chain when a bearer token is configured by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39411](https://github.com/BerriAI/litellm/pull/39411)
- fix(proxy-extras): kill the whole Prisma process group when a command times out by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39466](https://github.com/BerriAI/litellm/pull/39466)
- fix(rag): forward the managed vector store's params to the search call by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39452](https://github.com/BerriAI/litellm/pull/39452)
- fix(utils): redact credentials nested in extra\_body on the verbose optional-params line by [@&#8203;mateo-berri](https://github.com/mateo-berri) in [#&#8203;39538](https://github.com/BerriAI/litellm/pull/39538)
- fix(cont…
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.

3 participants