Commit graph

52881 commits

Author SHA1 Message Date
yucheng-berri
ac281507fd
Merge pull request #41991 from BerriAI/litellm_otel_v2_langfuse_responses_output
fix(otel v2): map Responses API output onto the Langfuse generation output
2026-09-19 14:23:59 -07:00
ryan-crabbe-berri
fdd614d759 fix(proxy): tell users with an already exported master key to replace it in place, because it wins over .env 2026-09-19 14:22:52 -07:00
kerry
f038a0558c Merge remote-tracking branch 'origin/litellm_cost_shard_harness_extensions' into litellm_cost_shard_embeddings_rerank
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

# Conflicts:
#	tests/integration/contracts.json
#	tests/integration/cost_calculation/cost_tracking_case.py
#	tests/integration/cost_calculation/cost_tracking_cases.json
2026-09-19 21:22:26 +00:00
Yuneng Jiang
e5398e7e30
test: drop two inert type: ignore comments
pyrightconfig.json sets enableTypeIgnoreComments to false and does not
include tests/, so neither comment suppressed anything.
2026-09-19 14:22:19 -07:00
kerry-berri
8323bef0e3
Merge pull request #42010 from BerriAI/litellm_cost_shard_responses_messages
test(integration): native responses and messages cost cases
2026-09-19 14:20:31 -07:00
kerry
c0c5cc84f8 test(integration): audio, image and per-unit cost cases
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 21:19:29 +00:00
ryan-crabbe-berri
3c9c860de7 test(proxy): set the unsafe-proxy override at the remaining test boot sites and isolate the boot test from a leaked scheduler 2026-09-19 14:16:52 -07:00
mateo-berri
0ae5d7c2fa Merge remote-tracking branch 'origin/main' into litellm_pr41781_azure_tool_choice
# Conflicts:
#	tests/test_litellm/llms/azure/chat/test_azure_chat_gpt_transformation.py
2026-09-19 14:15:19 -07:00
kerry
23f5df05f2 test(integration): require a zero cost header to read zero when the case bills nothing
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 21:03:51 +00:00
Yassin Kortam
884351168a
Merge pull request #42003 from BerriAI/litellm_fix_terraform_registry_docs_links 2026-09-19 14:02:05 -07:00
mateo-berri
a61bceb0cf fix(files): read storage-backed managed files from their storage backend
The managed files hook's content read looped the file's model mappings and asked each deployment for the file. A file LiteLLM stored itself maps every model to its storage url, so the read sent that internal id to the upstream server, failed, and the batch rate limiter failed open: a key's TPM limit did not apply to a LiteLLM-executed batch. The hook now returns the stored bytes from the file's storage backend before it consults any deployment
2026-09-19 14:00:51 -07:00
kerry
8137d878a0 test(integration): drop contract nodes left behind by case renames
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 20:59:05 +00:00
kerry
125bda30e9 test(integration): embeddings, rerank, completions and moderations cost cases
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 20:58:13 +00:00
ryan-crabbe-berri
0049a51f9b fix(proxy): import assert_never from typing_extensions for Python 3.10 and keep the lazy OpenAPI snapshot as generated by CI's Python 2026-09-19 13:56:43 -07:00
ryan-crabbe-berri
186ba50bce fix(proxy): point users who must rotate at the rotation guide before they save a new key 2026-09-19 13:49:32 -07:00
yujonglee
d675c1285b
Merge pull request #41987 from BerriAI/litellm_rust_fork_safety
fix(rust): refuse native routes in processes forked after the runtime started
2026-09-19 13:47:54 -07:00
ryan-crabbe-berri
0415382f9e fix(proxy): word the config step so it also fits a config that already reads the environment 2026-09-19 13:45:11 -07:00
ryan-crabbe-berri
fe480533e8 feat(proxy)!: refuse to start with an unset, empty, or publicly known master key
The proxy used to boot with no master key (every request accepted without
authentication) and with sk-1234, the key every example used. It now stops at
startup, before it connects to the database, and prints how to fix it: where the
bad key came from, a copy-pastable command that generates a secure key, and,
when the public key is also encrypting a database, a link to the rotation guide

general_settings.dangerously_allow_unsafe_proxy: true or
LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true starts the proxy anyway, for local
development. CI and test boots that rely on sk-1234 or on no key set it

BREAKING CHANGE: deployments with no master key, an empty one, or sk-1234 no
longer start until they set a real key or opt in to the override
2026-09-19 13:44:00 -07:00
Shivam Rawat
c02399b29d fix(terraform): unlink the registry docs entries that 404 on click
The resource and data source links on the provider's registry docs
overview page 404 when clicked. They are written as relative paths like
./resources/team, and the registry serves the overview at
.../latest/docs with no trailing slash and passes hrefs through
unrewritten, so the browser resolves them to .../latest/resources/team.

Drops the link markup and keeps both lists and their descriptions. No
relative form works in both places: only a docs/-prefixed target
resolves correctly on the registry, and that same path is wrong when
reading the file on GitHub. The registry sidebar already links every
resource and data source for the version being read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-19 13:39:47 -07:00
mateo-berri
cae6634192 fix(auth): keep the last-known org copy when the auth prefetch warmed the org row
The last-known org copy was written only on get_org_object's DB-read path. The
virtual-key auth prefetch fills the same 5s org entry directly, so with keys and
JWTs of one org on the same worker the JWT lookup always hit the cache, never
wrote the copy, and a DB outage turned that JWT traffic into 503s again.

get_org_object_for_request now writes the copy itself whenever this worker holds
none, under the management-object TTL, and get_org_object is back to its shape
on main.
2026-09-19 13:36:37 -07:00
Joshua Valluru
742a3ad93d ci(e2e): trigger OAuth acceptance on relevant pull requests 2026-09-19 13:30:36 -07:00
mateo-berri
549548de62 fix(files): keep an explicit target_storage on its old path and refuse litellm_db as a caller choice
An explicit target_storage=litellm_db upload was accepted for any model, so an OpenAI model's litellm_db://<uuid> id was sent to OpenAI as input_file_id and a model-less upload left a content row nothing can read; it now answers 400 on target_storage. An explicit target_storage skips the files api probe and the purpose and single-target gates, which only decide whether LiteLLM keeps the file itself, so an azure_storage user_data upload for a vLLM model reaches the storage path again as it did before this branch. cancel_batch authorizes the model of every LiteLLM-managed batch id before it branches, the way retrieve_batch already does, so the LiteLLM-executed branch gets the check its provider sibling had. Restores the test_afile_delete_passes_trusted_model_credentials_to_router definition line an earlier commit dropped
2026-09-19 13:20:02 -07:00
kerry
ca8d0e500c test(integration): correct responses reasoning and messages tiered expectations
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 20:11:24 +00:00
Yuneng Jiang
8dab23f6ac
test: cover the no-database and failed-reinit paths of the web search settings endpoints 2026-09-19 13:10:43 -07:00
Devin AI
a65b0c2136 registry: regen schema.d.ts for cache_read_input_image_token_cost
Some checks failed
LiteLLM Rust / rust-lint (push) Waiting to run
LiteLLM Rust / rust-test (push) Waiting to run
LiteLLM Rust / rust-wheel (push) Waiting to run
Terraform Provider / gofmt, vet, build, test (push) Waiting to run
Terraform Provider / Provider endpoints vs proxy OpenAPI schema (push) Waiting to run
Terraform Modules / fmt, validate, test (aws) (push) Has been cancelled
Terraform Modules / fmt, validate, test (gcp) (push) Has been cancelled
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 20:08:25 +00:00
Devin AI
4a4475fd70 registry: add cache_read_input_image_token_cost to CustomPricingLiteLLMParams denylist
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 20:03:58 +00:00
Joshua Valluru
a41b60cf77 test(mcp): align live regressions with discovery and error contracts 2026-09-19 13:03:00 -07:00
Yuneng Jiang
d5ae810ea9
fix: let operators allowlist web search interception settings
Peer pods gate the settings poll on general_settings.supported_db_objects,
which validates against SupportedDBObjectType. Without a member for this
name an operator could not opt in, so a configured allowlist left every
pod but the one that served the write on stale settings.

Also types the dashboard's settings payload off the generated schema
instead of Record<string, any>.
2026-09-19 13:02:29 -07:00
Mateo Wang
a93bfdc749
Merge pull request #41995 from BerriAI/litellm_ci_google_genai_vertex_global_retry
test(unified_google_tests): use the Vertex global endpoint and retry 429s with backoff
2026-09-19 13:00:47 -07:00
ryan-crabbe-berri
c8e0f2ddb4 docs: stop advertising sk-1234 as the master key in shipped configs and examples
Shipped proxy configs now read general_settings.master_key from
os.environ/LITELLM_MASTER_KEY, the .env examples ship a blank value with
the openssl generate command above it, and READMEs, the missing env vars
page and Admin UI code snippets show a generate command or the
<your-master-key> placeholder instead of the literal sk-1234

The two CircleCI docker runs that mount proxy_server_config.yaml and
oai_misc_config.yaml now pass LITELLM_MASTER_KEY so their runtime key is
unchanged
2026-09-19 12:59:48 -07:00
Moe Khalil
a30e0d14ea test(auto-router): preserve classifier literal in context fixture
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:56:54 +00:00
Yuneng Jiang
3c6a2f258a
test(proxy): capture the saved config with an AsyncMock instead of a mutable list
Greptile flagged the unannotated list and append against the repository's
immutable-state and Final-local rules (LIT001/LIT010). Recording the call on an
AsyncMock removes the accumulator entirely and matches how the neighbouring
audit-log tests in this file read their captured arguments.
2026-09-19 12:56:51 -07:00
Joshua Valluru
434659e72c Merge remote-tracking branch 'origin/main' into litellm_mcp_integration_regressions_4506 2026-09-19 12:55:50 -07:00
mateo-berri
854f5d959e Merge remote-tracking branch 'origin/main' into litellm_org_alias_from_team 2026-09-19 12:55:15 -07:00
mateo-berri
9075cafb98 fix(auth): serve the last-known org through a database outage
A JWT whose team sits in an org resolves the org on every request, and the
org row is cached for only DEFAULT_IN_MEMORY_TTL seconds while the team and
user rows ride the 60s management-object TTL. A few seconds into a database
outage the org lookup failed closed and that traffic got 503s while the same
request through a virtual key kept succeeding on its cached team.

get_org_object now also keeps a last-known copy of the org row under the
management-object TTL, and get_org_object_for_request serves that copy when
the database is unreachable, so JWT traffic degrades the same way the team
lookup does. A missing copy keeps the previous behaviour: fail closed unless
allow_requests_on_db_unavailable is set.
2026-09-19 12:55:14 -07:00
yassin
e49e6bc660 fix(proxy): stop re-sending un-resendable spend batches from the Redis buffer 2026-09-19 19:54:11 +00:00
kerry
22d3441789 Merge branch 'litellm_cost_shard_harness_extensions' into litellm_cost_shard_responses_messages 2026-09-19 19:53:49 +00:00
Devin AI
7b3e8afaec registry: add cache_read_input_image_token_cost field for azure_ai/gpt-image-2
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:52:56 +00:00
kerry
8907a1d1fc test: add native responses and messages cost cases
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:52:43 +00:00
Joshua Valluru
b7bab56d4d test(e2e): report safe OAuth failure locations 2026-09-19 12:52:28 -07:00
Yuneng Jiang
bf9c717d77
test(e2e): stop the config suite locking itself out of the shared proxy
Two tests in the config/misc management suite were failing every run against
the Buildkite e2e stack, and one of them took the rest of the build with it.

test_add_allowed_ip_does_not_store_unrelated_config_value posted 127.0.0.1 to
/add/allowed_ip. That route sets the live general_settings["allowed_ips"] that
auth_utils._check_valid_ip reads before it persists anything, and the check is
exact string membership with no CIDR support, so from the moment the POST
returns only 127.0.0.1 can reach the proxy. The runner 403s on its very next
call, and the deferred /delete/allowed_ip sits behind the same auth dependency,
so the cleanup is locked out too and every later test in the build 403s. Build
254's first attempt lost 459 of its 465 failures to that one cascade.

There is no safe way to exercise the route against a shared proxy: nothing
reports the caller's address as the proxy sees it, so a test cannot allowlist
itself first. Move the claim to the route's own TestClient suite, where the
auth dependency is overridden and general_settings is per-test, and record the
route in the module docstring beside /cache/settings and the Vault override so
it is not re-added. save_config's end of the contract was already covered by
test_ProxyConfig_save_config_merges_changed_keys_without_copying_file_settings;
the new test covers the route's end, that what it hands save_config differs
from the loaded config in allowed_ips and nothing else.

The unrelated-key probe also only ever worked on one lane: max_parallel_requests
was added to tests/e2e/gateway/stage_mirror_ci_config.yml and never to the
Buildkite stack's config, where resolve() reports it as "unset" rather than
"config". That key is now unused, so drop it again.

test_config_update_persists_router_setting_to_get wrote router_settings.
num_retries, which both lanes declare in their config file, so the config-
ownership work correctly refuses it with a 400. Switch to retry_after, which is
declared by neither lane, is accepted by /config/update, and is reported back by
GET /router/settings. Verified against a live proxy: max_fallbacks also takes
the write but never reads back, so the read-back poll is what picks the key.
2026-09-19 12:51:54 -07:00
Yuneng Jiang
5de9fc6961
test: give the new proxy_server-global patches a test-quality reason 2026-09-19 12:49:17 -07:00
Moe Khalil
afde938a67 docs(auto-router): disclose shared JEV context defaults
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:46:46 +00:00
Tin Chi Lo
ed40241d26 fix(proxy): estimate auto-router baseline costs from durable cache history 2026-09-19 12:44:47 -07:00
Devin AI
c55e9a4924 registry audit: fireworks/together/openrouter fixes, absorb #28853 #27064
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:40:27 +00:00
mateo-berri
020cbba4dd refactor(batches): annotate the stored file row so its model import is a real use 2026-09-19 12:39:44 -07:00
yucheng
e8f2ee8200 fix(redaction): redact Responses refusal parts under turn_off_message_logging
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:35:08 +00:00
yucheng
7d93821e41 fix(otel v2): keep Responses refusal text on the folded assistant message
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 19:30:57 +00:00
Yuneng Jiang
d15ceab174
fix(proxy): declare the web search settings auth dependency with Annotated 2026-09-19 12:30:39 -07:00
mateo-berri
9f0eb5082a fix(batches): authorize executed upload targets before the files api probe
A batch upload naming a model on a LiteLLM-executed provider now checks
that the key may call that model before the upstream server is probed for
a Files API, matching the order batch create already uses. Only targets on
an executed provider are checked here, so provider-model uploads keep
their existing behavior.

File content reads and writes move out of the storage backend into
ManagedFileContentRepository, so the backend no longer queries Prisma
directly.
2026-09-19 12:26:11 -07:00