Commit graph

18941 commits

Author SHA1 Message Date
Moe Khalil
503ab0b373 Merge remote-tracking branch 'origin/main' into litellm_jev_test_budget_1789764884 2026-09-19 17:36:21 +00:00
yuneng-jiang
d0f60fcdec
Merge pull request #41985 from BerriAI/litellm_config_shadows_db_warning
feat(proxy): say when a stored setting is ignored because the config file owns it
2026-09-19 10:36:01 -07:00
Moe Khalil
e0545a787b Merge remote-tracking branch 'origin/main' into litellm_jev_autorouter_launch_1789767495 2026-09-19 17:35:42 +00:00
kerry
e0b455e94e fix(fal_ai): read only the documented FAL_AI_API_KEY env var
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 17:27:44 +00:00
Yassin Kortam
4487a9915b
Merge pull request #41915 from BerriAI/litellm_distributed_tpm_shared_redis_check
fix(router): enforce model tpm limits against shared redis usage across replicas
2026-09-19 10:22:25 -07:00
Yuneng Jiang
7353b779c2
feat(proxy): say when a stored setting is ignored because the config file owns it
The config file winning over the database was silent. An admin who had set
a value through the UI and later pinned the same key in the file saw their
stored value quietly stop applying, with nothing said at boot and nothing
said when a later write was refused.

Startup now warns once per key whose stored value differs from the file's,
naming the key and what to do about it. The refusal raised on a write to a
config-owned key carries the same sentence, so the log and the 400 read
identically, and both call out that a stored value exists and will never be
applied. The /config/update refusal gained the same detail.

Keys the file does not declare are untouched: the database still owns them,
and a stored value equal to the file's is not worth a warning.
2026-09-19 10:20:31 -07:00
kerry
aa5f0858f7 test(pricing): allow video endpoint and rates
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 17:13:41 +00:00
kerry
c359ef763e fix(fal_ai): keep model in polled video ids and pick resolution from the short side
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 17:01:09 +00:00
Tin Chi Lo
2b086dc7aa fix(caching): scope automatic breakpoints to supported Claude transports 2026-09-19 09:55:38 -07:00
kerry
141548dcf3 fix(fal_ai): keep status ids pollable and size resolution by the short side
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 16:54:11 +00:00
yujonglee
209a780992
Merge pull request #41977 from BerriAI/litellm_rust_sealed_request_textract
feat(rust): add Amazon Textract to litellm.ocr and sign provider requests after host hooks
2026-09-19 09:53:07 -07:00
yucheng
c5181f6178 fix(otel v2): summarize embedding vectors as Langfuse observation output
The v2 LLM span built its output only from response choices, so /v1/embeddings
rendered a Langfuse generation with input, usage and cost but a blank output.
Embedding calls now carry an EmbeddingOutput(count, dimensions) summary that the
Langfuse mapper serializes as the observation output, and they are exported with
the embedding observation type instead of generation. Chat and Responses output
mapping is unchanged.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 16:52:25 +00:00
Joshua Valluru
fb56a14cd4 chore(mcp): merge main with unit test timeout safeguards 2026-09-19 09:42:08 -07:00
Joshua Valluru
166a05f810 chore: merge main into MCP OAuth E2E branch 2026-09-19 09:40:42 -07:00
kerry
5f54f87d98 feat(fal_ai): add Seedance video generation via fal queue API
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 16:40:10 +00:00
kerry-berri
6718fd67fb
Merge pull request #41328 from BerriAI/litellm_e2e_cost_calculation_scripted_provider
test(integration): literal request/response cost tracking suite on a test-owned cost map
2026-09-19 09:40:04 -07:00
Mateo Wang
f9d4979d21
Merge pull request #41946 from BerriAI/litellm_deflake_20260919 2026-09-19 09:38:25 -07:00
yucheng
13b05af06e fix(proxy): validate responses input after prompt template expansion
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 16:34:53 +00:00
yucheng
012d82d85d fix(llmguard): scan input and prompt even when messages is present
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-19 16:30:11 +00:00
joshua-berri
f08b787685
Merge pull request #41975 from BerriAI/litellm_fix_azure_snapshot_fallback_test
test(utils): isolate dated model fallback from pricing additions
2026-09-19 16:20:51 +00:00
Yujong Lee
c404bed9f0 feat(rust): add Amazon Textract to litellm.ocr and sign provider requests after host hooks
Add an aws_textract OCR provider on the Rust route, with no Python path. The
detect-document-text model returns plain lines and analyze-document renders
layout and tables as markdown. Both use Textract's synchronous API, so a
multi-page PDF or TIFF is rejected with an error that names the single-page
limit. A call with no region fails instead of falling back to Bedrock's default

SigV4 covers the request body, and host hooks can rewrite that body before it
is sent. litellm-http now has OutboundRequest, which serializes the body once,
shows those bytes to a RequestSigner and is the only thing a route can send.
Chat, audio transcription and OCR build it after their hooks ran, so a callback
that redacts the body still produces a valid Bedrock or Textract signature

ChatCompletionsAuth and AudioTranscriptionAuth are replaced by
litellm_auth::RequestAuth, and one helper in core turns it into a signed or
unsigned request. Audio transcription now signs only the AWS header set and
rejects a forwarded header that SigV4 computes, the same as chat

The OCR catalog routes aws_textract as Rust required, and the dispatch context
reads the provider from the model prefix so a provider scoped rule can match
2026-09-19 09:11:52 -07:00
yujonglee
362be56bb0
Merge pull request #41969 from BerriAI/litellm_rust_settings_layers
refactor(rust): centralize layered settings resolution
2026-09-19 09:00:19 -07:00
yuneng-jiang
6ed9deb4d7
Merge pull request #41931 from BerriAI/litellm_settings_store_immutable
fix(proxy): refuse runtime writes to config-owned settings
2026-09-19 09:00:13 -07:00
Joshua Valluru
0e7ba74f95 test(utils): isolate dated model fallback from pricing additions 2026-09-19 08:39:02 -07:00
mateo-berri
2863559ba8 fix(proxy): wait for the spend-log table before creating startup views
On a fresh database where the migrations run in a separate job while the
proxy boots with DISABLE_SCHEMA_UPDATE=true, the startup view check ran
as a fire-and-forget task, used up its three 10 second retries before
LiteLLM_SpendLogs existed, and died with an unretrieved exception. The
spend views were never created, so the /global/spend routes returned 500
until the pod was restarted

PrismaClient now holds a view setup task. It polls to_regclass for the
spend-log table every 5 seconds, creates the views and loads the spend
log row count once the table is there, keeps polling if an attempt raises
while the schema is still settling, and logs an ERROR with the last
failure if nothing worked after 15 minutes. Proxy shutdown cancels the
task

The spend route e2e tests for the five view-backed routes are no longer
skipped and wait for the views through the harness convergence helper
2026-09-19 08:36:22 -07:00
Yujong Lee
1669213eb5 fix(rust): read OCR secrets from the process environment and decline when a secret manager is readable
The OCR route called back into Python's get_secret_str for every env
fallback. With no secret manager configured that is os.environ behind a GIL
hop, and with one configured it blocked a tokio worker on vault I/O and also
sent the Azure and GCP identity variables, which Python reads with os.getenv,
to the vault. The other Rust routes already read the process environment.

Read the process environment here too. When litellm would read secrets from
a secret manager, decline the Rust route so the Python route serves the call
with the vault-backed keys
2026-09-19 08:32:46 -07:00
mateo-berri
8a33b37c39 fix(proxy): charge a finished batch once against per-model budgets
A completed batch reports its whole cost on every retrieve, and the
per-model budget limiter added that cost to the key, user, team, and
end-user counters on each poll. Stamping model_group on plain-id
retrieves widened this from model-encoded batch ids to every poll, so
a key ran out of a budget it never spent. A marker per counter and
batch id now lets the first poll charge and later polls skip.
2026-09-19 08:20:14 -07:00
mateo-berri
c735cc3db1 test(cost): point dated snapshot tests at a date the cost map cannot carry
The azure row of test_get_model_info_falls_back_from_dated_snapshot_to_undated_entry used gpt-5.6-luna-2026-07-09, which main's cost map carries as an exact azure key, so the lookup returned the dated key and the required misc test job failed on main. All three dated snapshot tests now use a 2099-01-01 snapshot date, so they keep exercising the strip path whatever real snapshots the map gains
2026-09-19 08:00:12 -07:00
Mateo Wang
8c4c394ecc
Merge pull request #41960 from BerriAI/litellm_deepseek_off_peak_pricing
fix(cost): bill DeepSeek V4.1 Flash and V4 Pro at off-peak rates outside peak hours
2026-09-19 06:45:46 -07:00
mateo-berri
7520925924 fix: forward a tool_config point only while the cap has a slot left 2026-09-19 06:28:16 -07:00
mateo-berri
2ee8c1bd0e fix(batches): enforce the completion window and guard executed-batch id parsing 2026-09-19 06:25:42 -07:00
Mateo Wang
12593788a2
Merge pull request #41949 from BerriAI/litellm_bulk_update_keys_keep_unset_fields
fix(proxy): /key/bulk_update writes only the fields each item carries
2026-09-19 06:08:54 -07:00
Mateo Wang
aa0ffee00f
Merge pull request #41423 from BerriAI/litellm_strip_dated_snapshot_cost_lookup
fix(cost): resolve dated openai/azure snapshots to their undated cost map entry
2026-09-19 05:51:46 -07:00
Mateo Wang
f15dba2e2f
Merge pull request #41943 from BerriAI/litellm_unknown_model_spend_logs_outside_router
fix(proxy): keep the raw client model out of spend logs for rejections outside the router
2026-09-19 05:15:26 -07:00
mateo-berri
dc02e5f5fb test(proxy): stub the existing key's team in the bulk item policy tests 2026-09-19 05:12:12 -07:00
mateo-berri
df6a222cb8 fix(proxy): validate bulk object_permission against the key's team as /key/update does 2026-09-19 04:59:26 -07:00
mateo-berri
171b33abfe fix: leave tool-search tool marks out of the chat-path cache breakpoint census 2026-09-19 04:53:15 -07:00
mateo-berri
42271b282a fix(batches): guard batch status writes against stale reads and disable per-line fallbacks 2026-09-19 04:44:26 -07:00
Mateo Wang
b8d837b2ef
Merge pull request #40147 from abhirup7/fix/azure-image-generation-entra-id-auth
fix(azure): send the resolved Entra ID token on image generation requests
2026-09-19 04:44:07 -07:00
mateo-berri
aadadc647d Merge remote-tracking branch 'origin/main' into litellm_unknown_model_spend_logs_outside_router
# Conflicts:
#	litellm/proxy/openai_files_endpoints/common_utils.py
2026-09-19 04:43:19 -07:00
Mateo Wang
dad8c32d23
Merge pull request #41940 from BerriAI/litellm_rag_ingest_registry_store
fix(rag): resolve registry stores on /v1/rag/ingest and reject providers without ingestion
2026-09-19 04:42:54 -07:00
Mateo Wang
40f51df90f
Merge pull request #41953 from BerriAI/litellm_bridge_drop_tool_search
fix(responses): drop tool_search and local_shell in the chat completions bridge
2026-09-19 04:42:28 -07:00
mateo-berri
e0db862781 fix(cost): bill DeepSeek V4.1 Flash and V4 Pro at their off-peak rates outside peak hours
DeepSeek charges half the listed rate outside 01:00-04:00 and 06:00-10:00 UTC
Monday to Friday, so every deepseek-flash, deepseek-v4-flash,
deepseek-v4-flash-vision-exp, and deepseek-v4-pro entry now carries an
off_peak_pricing block with those windows and the halved input, output, and
cache-hit rates. The generated cost map schema picks up the block, and the
regression tests pin the peak and off-peak cost of one call at fixed moments.
2026-09-19 04:31:55 -07:00
mateo-berri
aef209963a fix(s3_vectors): embed registered-store ingests with the store's embedding model
The S3 Vectors ingestion embedded every chunk with the request's
embedding.model or the default, never the embedding_model the store was
registered with, while search on the same store embeds with the
registered model. A registered store uploaded to by id alone therefore
embedded with the wrong model and AWS rejected the vectors on the
dimension mismatch. The store's embedding model now wins for S3 Vectors
ingestion through a helper next to the one search already uses
2026-09-19 04:31:15 -07:00
mateo-berri
952cafea7d chore: merge main into fix/batch-retrieve-model-group 2026-09-19 04:30:50 -07:00
mateo-berri
608f8e2184 Merge remote-tracking branch 'origin/main' into litellm_vllm_batch_runner
# Conflicts:
#	tests/test_litellm/proxy/batches_endpoints/test_endpoints.py
2026-09-19 04:23:28 -07:00
Mateo Wang
1f6e5b60b5
Merge pull request #41952 from BerriAI/litellm_masker_memo_depth_fail_closed
fix(masker): memoize shared nodes and fail closed past the depth cap
2026-09-19 04:20:17 -07:00
mateo-berri
ec59078ad9 fix: apply configured cache_control_injection_points beside client cache_control marks
Configured injection points were dropped whenever the request already
carried a client-set cache_control anywhere, so an operator's rolling
tail checkpoint silently never landed once a caller marked its own
system prompt. Only the automatic defaults stand down now. Configured
points skip a target the client already marked and stay under the
provider's 4-block cap, counting the client's marks on messages, system,
tools and the root cache_control first. The chat path carries the tool
count as a stamp on the points because the prompt-management hook never
receives tools.

Fixes #40675
2026-09-19 04:17:38 -07:00
mateo-berri
e74a5e0c21 test(rag): drop the docstrings from the registered-store ingest tests 2026-09-19 04:10:49 -07:00
Mateo Wang
43e835c3ca
Merge pull request #41950 from BerriAI/litellm_cost_callback_bounded_error_msg
fix(proxy): keep request metadata out of the cost tracking failure alert
2026-09-19 04:08:14 -07:00