Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
217 commits
Select commit Hold shift + click to select a range
e2932d2
fix(spend-tracking): hash raw api keys before persisting to spend log…
nitishagar Jun 18, 2026
b5c59b6
feat(providers): add SCX.ai as OpenAI-compatible provider
bhuvan2134686 Jul 27, 2026
912c7c7
feat(providers): register scx-ai in the endpoint support matrix
bhuvan2134686 Jul 27, 2026
8f61073
feat(ui): add SCX.ai to the dashboard provider list with logo
bhuvan2134686 Jul 27, 2026
7f48431
feat(models): add pricing and metadata for 5 scx-ai models
bhuvan2134686 Jul 27, 2026
b8e2848
fix(ui): make SCX.ai selectable in the Add Model provider dropdown
bhuvan2134686 Jul 27, 2026
cabbc7e
feat(ui): default the SCX.ai Add Model placeholder to MiniMax-M2.7
bhuvan2134686 Jul 27, 2026
8aa9d3d
feat(models): swap SCX.ai catalog to GLM-5.2 and Qwen3.8 Max
bhuvan2134686 Aug 7, 2026
1e24f93
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
bhuvan2134686 Aug 7, 2026
a028c88
fix(scx-ai): correct the temperature ceiling to match the endpoint
bhuvan2134686 Aug 7, 2026
0e3f52a
feat(model_prices): add gemini-3.1-flash-lite-image
emerzon Aug 14, 2026
d499e68
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
bhuvan2134686 Aug 14, 2026
9c922f4
fix(bedrock): forward provider response headers on chat completions
devin-ai-integration[bot] Aug 15, 2026
726db1a
test(bedrock): cover async header forwarding for converse and invoke
devin-ai-integration[bot] Aug 15, 2026
5d5dc45
fix(cost): price streamed Messages usage via calculate_usage and the …
mateo-berri Aug 19, 2026
6f4844b
refactor(cost): trim streamed cost helper docstrings to the non-obvio…
mateo-berri Aug 19, 2026
b6ee138
fix(responses-bridge): preserve reasoning input items as reasoning_co…
harryzhou2000 Aug 9, 2026
3a77556
fix(responses-bridge): preserve reasoning merge order when assistant …
harryzhou2000 Aug 9, 2026
5911124
fix(responses-bridge): satisfy ruff strict-rule budget in reasoning m…
harryzhou2000 Aug 9, 2026
438c185
fix(responses-bridge): satisfy type-discipline budget in reasoning merge
harryzhou2000 Aug 9, 2026
de95372
fix(responses-bridge): type-safe reasoning_content assignment in merg…
harryzhou2000 Aug 9, 2026
2d4e6af
fix(guardrails): inspect responses reasoning content and summary text
harryzhou2000 Aug 18, 2026
34e692c
fix(batches): decode model-encoded output file id so completed batche…
mateo-berri Aug 20, 2026
42cffe9
Add moonshot/kimi-k3 to model prices and context window map
tin-berri Aug 19, 2026
f8b31f4
fix: don't retire a completed batch from cost recovery while output_f…
syahra712 Aug 20, 2026
67d16a4
Type the batch-retire helpers and rename test helper to avoid shadowi…
syahra712 Aug 20, 2026
a3b6762
fix(streaming): price partial-stream spend rows at the real model and…
mateo-berri Aug 20, 2026
de7dcbb
Carry real cache counts up instead of zeroing them on partial rows
mateo-berri Aug 21, 2026
27c3f87
fix(fal_ai): price gpt-image-2 per size and quality from request params
mateo-berri Aug 21, 2026
12ed364
Merge branch 'litellm_internal_staging' into litellm_fix_messages_str…
mateo-berri Aug 21, 2026
2471e85
chore(lint): note why the streamed cost fallback swallows pricing errors
mateo-berri Aug 21, 2026
d5e6a0c
fix(fal_ai): strip provider prefix before keyed cost lookup
github-actions[bot] Aug 21, 2026
03a253a
Keep the model Azure Model Router recovered from later chunks
mateo-berri Aug 21, 2026
101ef7e
test(cost): cover the chat.completion.chunk and raising-pricer branches
mateo-berri Aug 21, 2026
655d107
fix(cost): keep mid-stream pricing from leaking a breakdown into the …
mateo-berri Aug 21, 2026
c010bd6
Only keep the builder's model when the client did not ask for it
mateo-berri Aug 21, 2026
0801493
Match the client-name check to the name the proxy actually stamps
mateo-berri Aug 21, 2026
f1c4145
fix(scim): resolve group members by SSO identity or email before crea…
devin-ai-integration[bot] Aug 21, 2026
a4dd1be
Merge pull request #35114 from BerriAI/litellm_fix_messages_stream_co…
mateo-berri Aug 21, 2026
a112ba5
test: enforce PT012 so a pytest.raises block cannot hide dead asserti…
ryan-crabbe-berri Aug 21, 2026
7d999a1
fix(cognition): price swe-1.7 at the standard tier, add swe-1.7-light…
mateo-berri Aug 21, 2026
16cd080
fix: populate team member emails missing from the roster snapshot
ryan-crabbe-berri Aug 21, 2026
722c650
test: cover generic HTTP streaming provider header forwarding
mateo-berri Aug 21, 2026
a66a10b
Merge pull request #37734 from BerriAI/litellm_fix_partial_stream_spe…
mateo-berri Aug 21, 2026
8a40aff
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
devin-ai-integration[bot] Aug 21, 2026
58c4fa6
chore: merge litellm_internal_staging into litellm_forward_bedrock_re…
devin-ai-integration[bot] Aug 21, 2026
354f497
Merge pull request #37751 from BerriAI/litellm_fal_gpt_image_2_keyed_…
mateo-berri Aug 21, 2026
2ea633d
fix(sagemaker_chat): send the inference component header and honor hf…
mateo-berri Aug 21, 2026
b76def0
test: require a `match=` on broad pytest.raises, and drop duplicate p…
ryan-crabbe-berri Aug 21, 2026
b64f180
Merge pull request #37759 from BerriAI/litellm_team_info_member_email
ryan-crabbe-berri Aug 21, 2026
4b29702
Merge pull request #37003 from BerriAI/litellm_forward_bedrock_respon…
mateo-berri Aug 21, 2026
ecd18c5
Merge pull request #37763 from BerriAI/litellm_fix_cognition_swe_1_7_…
mateo-berri Aug 21, 2026
e17988f
Merge pull request #37766 from BerriAI/litellm_sagemaker_chat_inferen…
mateo-berri Aug 21, 2026
2f40eb5
Merge litellm_internal_staging into litellm_fix_raw_key_log_persistence
mateo-berri Aug 21, 2026
471b6a4
Merge remote-tracking branch 'origin/litellm_internal_staging' into p…
mateo-berri Aug 21, 2026
9697748
test: gate the already-hashed pass-through on the provenance flag
mateo-berri Aug 21, 2026
fb417a5
fix(spend-tracking): tie the already-hashed pass-through to provenance
mateo-berri Aug 21, 2026
c7b34da
test(proxy): keep a leaked llm_router out of the next test in the worker
mateo-berri Aug 21, 2026
a50590f
fix(spend-tracking): keep the master key alias readable in spend logs
mateo-berri Aug 21, 2026
ff02d5c
Merge pull request #30736 from nitishagar/litellm_fix_raw_key_log_per…
mateo-berri Aug 21, 2026
aef09ac
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
bhuvan2134686 Aug 21, 2026
7d9e375
fix(scx-ai): use the published scx.ai rates and the scx_ai docs url
bhuvan2134686 Aug 21, 2026
86efa2b
feat(bedrock): serve gpt-5.6 cross-region inference profiles on bedro…
longwind48 Aug 21, 2026
13d4074
test(mcp): retire the last file of the dead tests/litellm mirror
yuneng-berri Aug 21, 2026
f9f8320
fix(files): list unscoped managed files
rimysore Aug 21, 2026
7da34e8
fix(proxy): make per-model budgets track spend, enforce, and report t…
yassin-berriai Aug 21, 2026
40b8300
fix(spend): bound each spend-log write statement by row count as well…
yassin-berriai Aug 21, 2026
f9a8c96
feat(proxy): add router_model_name to auto-routed response bodies (#3…
tin-berri Aug 21, 2026
c166225
fix(responses): preserve Bedrock Mantle validation status (#36580)
uuzzrm Aug 21, 2026
4307b34
fix: omit thinking.type=disabled for always-on thinking Claude models…
tin-berri Aug 21, 2026
ae1eea1
test(lint): clear the two PT011/PT012 violations left on the test tre…
tin-berri Aug 21, 2026
01a32a3
fix(proxy): read batch records the same way the upload validation doe…
yucheng-berri Aug 21, 2026
d4a3277
fix(proxy): scan batch records with the content hooks that are not gu…
yucheng-berri Aug 21, 2026
8122cfc
fix(ptu): require an operator-declared id on a config.yaml reservatio…
yucheng-berri Aug 21, 2026
34c0c70
revert(spend-logs): drop the endTime backfill migration for spend log…
yuneng-berri Aug 21, 2026
0a5fa4f
fix(ptu): never retract a flat charge for a deployment the run cannot…
yucheng-berri Aug 21, 2026
cce6562
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Aug 21, 2026
6f73e5f
chore(codeowners): own the proxy-extras migrations directory
yuneng-berri Aug 21, 2026
247eaaa
Merge pull request #37876 from BerriAI/litellm_/migrations-code-owner…
yuneng-berri Aug 21, 2026
e9d40a8
test: enforce F811 so a duplicate definition cannot silently replace …
ryan-crabbe-berri Aug 21, 2026
f6c19ea
Merge pull request #37875 from BerriAI/litellm_/revert-pr-37554-migra…
yuneng-berri Aug 21, 2026
6a75bbd
fix(mcp): deny the interactive dcr_bridge authorize for a user withou…
tin-berri Aug 21, 2026
bb99f57
fix(responses): map Bedrock Mantle context overflow to ContextWindowE…
yassin-berriai Aug 21, 2026
e6a6016
fix(model-costs): apply GPT-5.6 Sol promotional pricing cut
Aug 21, 2026
ed02a12
Merge pull request #37878 from BerriAI/litellm_ruff_no_duplicate_defi…
ryan-crabbe-berri Aug 21, 2026
f48d219
fix(guardrails): run policy pipelines when the caller sends its own m…
devin-ai-integration[bot] Aug 21, 2026
52e181d
fix(vertex_ai): convert messages to contents in gemini count_tokens (…
sailikhithk Aug 21, 2026
243ed43
test: reject assertions on a caught error inside except (ruff PT017)
ryan-crabbe-berri Aug 21, 2026
04113aa
fix(router): don't log 'Could not identify azure model' when the depl…
tin-berri Aug 21, 2026
4d8346a
test: wrap the raising call, not the print that follows it
ryan-crabbe-berri Aug 21, 2026
9821b45
fix(ui): drive auto-router usage from the shared cost-optimization ti…
tin-berri Aug 21, 2026
02fd2e5
chore(ci): ratchet TQ004 to the 757 raw env writes this branch leaves
ryan-crabbe-berri Aug 21, 2026
6266b3d
test: keep a real assertion where the tolerance handler lost its last…
ryan-crabbe-berri Aug 21, 2026
277ed88
Merge remote-tracking branch 'origin/litellm_internal_staging' into d…
mateo-berri Aug 21, 2026
0c50286
feat(ui): add per-key Savings tab to key detail page (#37693)
tin-berri Aug 21, 2026
91f2382
fix(redis): reset only the failed node on a cluster client timeout, n…
yassin-berriai Aug 21, 2026
dd64331
Merge pull request #37887 from BerriAI/litellm_ruff_no_assert_in_except
ryan-crabbe-berri Aug 21, 2026
d193c7a
fix(mcp): strip root_path before matching the per-server MCP route sp…
tin-berri Aug 21, 2026
4e88ab6
feat(spend): surface per-request auto-router savings to logging callb…
tin-berri Aug 21, 2026
fa2186f
fix(proxy): group Codex turns under one session id (#37895)
mubashir1osmani Aug 21, 2026
66b930b
fix(logging): preserve uvicorn color_message args during secret redac…
mubashir1osmani Aug 21, 2026
5ed2307
test: escape the literal match= patterns PT017 minted
ryan-crabbe-berri Aug 21, 2026
91599ae
test: say whether a match= pattern is a regex or a literal (ruff RUF043)
ryan-crabbe-berri Aug 21, 2026
9c558df
Merge pull request #37552 from BerriAI/litellm_add_kimi_k3_pricing
mateo-berri Aug 21, 2026
73e1863
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
dc63c72
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
3029f7e
Merge pull request #34752 from SouthernCrossAI/litellm_scx_ai_provider
mateo-berri Aug 22, 2026
e917e4b
fix(model_cost): dedupe gemini-3.1-flash-lite-image and correct its c…
mateo-berri Aug 22, 2026
ce11d39
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
601d6ff
[e2e] Pin the OpenAI websocket passthrough prefixes
mateo-berri Aug 22, 2026
31c207a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
6f07119
Merge pull request #37821 from longwind48/litellm_bedrock_gpt56_runti…
mateo-berri Aug 22, 2026
75fd4b1
fix(files): paginate the unscoped managed file listing
mateo-berri Aug 22, 2026
138b0da
chore(dashboard): regenerate api types for the files list params
mateo-berri Aug 22, 2026
2ad2bec
fix(model-costs): apply the Sol promo cut to the gpt-5.6 alias
mateo-berri Aug 22, 2026
9b27d7a
test(e2e): drop the REALTIME_MODEL comment
Aug 22, 2026
71400e1
test(model-costs): record that azure gpt-5.6 keeps its own pricing
mateo-berri Aug 22, 2026
a15b81d
fix(files): keep the list cursor usable on a filtered page
mateo-berri Aug 22, 2026
6b088f4
style: wrap the escaped messages under 120 columns
ryan-crabbe-berri Aug 22, 2026
2cb85da
Merge pull request #37573 from BerriAI/litellm_lit_5730_batches_compl…
mateo-berri Aug 22, 2026
1a55418
test(model-costs): use the local_model_cost_map fixture in the alias …
mateo-berri Aug 22, 2026
a78e1a2
Merge pull request #36849 from emerzon/litellm_add_gemini_3_1_flash_l…
mateo-berri Aug 22, 2026
843e90c
Merge pull request #37901 from BerriAI/litellm_ruff_raises_literal_pa…
ryan-crabbe-berri Aug 22, 2026
48aba5f
fix(proxy): stop forwarding a client Anthropic OAuth token to Bedrock…
mateo-berri Aug 22, 2026
81cdf1a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
7cb100a
fix(mcp): resolve admin OAuth sessions to the same server set the con…
tin-berri Aug 22, 2026
ba64a1c
fix(files): return 400 for a limit outside the documented range
mateo-berri Aug 22, 2026
770bd40
fix(anthropic_messages): gate sampling params on /v1/messages like /c…
tin-berri Aug 22, 2026
a59e611
Merge pull request #37903 from BerriAI/litellm_lit_5902_ws_passthroug…
mateo-berri Aug 22, 2026
76d4627
Merge pull request #37880 from BerriAI/litellm_gpt56_sol_promo_pricing
mateo-berri Aug 22, 2026
4e19127
fix(pricing): add undated azure aliases for gpt-audio-mini and gpt-re…
tin-berri Aug 22, 2026
d4162bd
test(e2e): record and replay the non-streaming provider flows
mateo-berri Aug 22, 2026
6b63623
fix(files): never hand the sdk an empty page while matches remain
mateo-berri Aug 22, 2026
23a9300
fix(websearch_interception): end the turn when the agentic loop hits …
mateo-berri Aug 22, 2026
b1b29e5
test: fold oauth credential scoping tests into the mapped pre-call suite
mateo-berri Aug 22, 2026
b9f5c45
fix(files): bound the queries a filtered file page can cost
mateo-berri Aug 22, 2026
f5df60f
test(e2e): key multipart uploads by structured part identity
mateo-berri Aug 22, 2026
060e400
fix(anthropic): resolve the provider exactly once on /v1/messages (#3…
tin-berri Aug 22, 2026
7c02c08
docs: scope the loop-ceiling docs to the paths the fix actually covers
mateo-berri Aug 22, 2026
4314393
fix: stop provider-scoped headers leaking across fallback hops
mateo-berri Aug 22, 2026
0d1e2a5
docs: correct which surfaces the loop ceiling covers
Aug 22, 2026
1461375
Merge pull request #37909 from BerriAI/litellm_lit_5974_nonstreaming_…
mateo-berri Aug 22, 2026
6760379
test: pin the capped turn that carries only the refused call
Aug 22, 2026
6d34de5
Merge pull request #37824 from BerriAI/litellm_retire_dead_test_mirror
yuneng-berri Aug 22, 2026
afec9b8
perf(ci): cache the Rust build the unit shards compile from scratch (…
yuneng-berri Aug 22, 2026
35fcc9f
test(proxy): pin the request-body rules `proxy/_types.py` enforces (#…
yuneng-berri Aug 22, 2026
b416bda
test(main): pin what a streamed response costs, end to end (#37812)
yuneng-berri Aug 22, 2026
89649e4
test(proxy): pin what a failed request records as usage and spend (#3…
yuneng-berri Aug 22, 2026
f88421b
test(llm_http_handler): pin the websocket and callback gates the requ…
yuneng-berri Aug 22, 2026
9146667
fix(ci): stop the mutation report publishing a score it never measure…
yuneng-berri Aug 22, 2026
4a008b6
test(bedrock): let monkeypatch own bedrock_request_metadata_fields (#…
yuneng-berri Aug 22, 2026
49da936
test(audit-logs): let monkeypatch own the audit log and s3 callback g…
yuneng-berri Aug 22, 2026
6937974
test: unwind environment writes in tests/test_litellm with monkeypatc…
yuneng-berri Aug 22, 2026
5695370
fix(files): hand post-call hooks a page object, not a bare dict
mateo-berri Aug 22, 2026
7481649
test(datadog): restore an empty DD_API_KEY instead of unsetting it (#…
yuneng-berri Aug 22, 2026
0c97eea
test(cost-calc): stop 182 global writes leaking out of the cost-calc …
yuneng-berri Aug 22, 2026
7330707
test(key-management): unwind the global writes the key tests scaffold…
yuneng-berri Aug 22, 2026
6bce3dc
test(callbacks): unwind the callbacks global the policy engine and re…
yuneng-berri Aug 22, 2026
39a580a
test(guardrails): stop five guardrail test files leaking env vars on …
yuneng-berri Aug 22, 2026
add2d23
test(e2e): bypass the proxy response cache in the mid-conversation sy…
yuneng-berri Aug 22, 2026
d74fc77
docs(terraform/provider): the provider now ships at the LiteLLM versi…
yuneng-berri Aug 22, 2026
3ac339c
test: stop the zai tests from leaking env and litellm globals into th…
yuneng-berri Aug 22, 2026
092d977
test(s3): stop the logger tests leaking s3_callback_params on failure…
yuneng-berri Aug 22, 2026
ce13214
test(http-handler): drop the save/restore scaffolding around litellm …
yuneng-berri Aug 22, 2026
322293a
test(interactions): drop the save/restore scaffolding around the lega…
yuneng-berri Aug 22, 2026
b9bff09
test(bedrock): drop the leftover set_verbose from the embedding tests…
yuneng-berri Aug 22, 2026
7dff995
test: drop the leftover set_verbose from eleven test files (#37845)
yuneng-berri Aug 22, 2026
5285ae8
fix(ptu): warn when config.yaml declares PTU while attribution is off…
yucheng-berri Aug 22, 2026
349e7e6
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
092449b
Merge branch 'litellm_internal_staging' of https://github.com/BerriAI…
mateo-berri Aug 22, 2026
2adccb3
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
206e3b8
docs: say the loop ceiling covers non-streaming /v1/messages
mateo-berri Aug 22, 2026
89187cd
test(anthropic): let monkeypatch own litellm.callbacks in the cache c…
yuneng-berri Aug 22, 2026
174c28a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
d369c95
test(router): let monkeypatch own expose_router_debug_in_errors (#37848)
yuneng-berri Aug 22, 2026
d6f5ea2
Merge pull request #37905 from BerriAI/litellm_fix_oauth_credential_f…
mateo-berri Aug 22, 2026
fa9fe5a
bump: litellm-enterprise 0.1.58 -> 0.1.59, litellm-proxy-extras 0.4.8…
yuneng-berri Aug 22, 2026
de1bc29
test: unshadow the module handles the F811 sweep left behind (#37914)
yuneng-berri Aug 22, 2026
6a0d039
test: drop the cwd-relative sys.path.insert calls from the test suite…
yuneng-berri Aug 22, 2026
7d61d9d
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
7a1afa1
chore(codeowners): add yuneng-berri as owner of the CODEOWNERS file (…
yuneng-berri Aug 22, 2026
e71a48c
fix(files): accept OpenAI's evals purpose on the files routes
mateo-berri Aug 22, 2026
840b031
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
mateo-berri Aug 22, 2026
4f4edea
test(files): update the managed-files test doubles to the current afi…
mateo-berri Aug 22, 2026
0485b3f
fix: emit content_block_start for every block in the rebuilt stream
mateo-berri Aug 22, 2026
005f04e
fix(responses): mint Responses API item IDs in the completion bridge
mateo-berri Aug 22, 2026
a7afe98
fix(responses): replay signed thinking blocks through the completion …
mateo-berri Aug 22, 2026
19e077a
fix: validate max_agentic_loops wherever it is set
mateo-berri Aug 22, 2026
076eebb
Merge pull request #37855 from rimysore/litellm_fix_unscoped_managed_…
mateo-berri Aug 22, 2026
28887f1
fix(otel): emit LLM Call spans for speech, image, moderation, ocr and…
devin-ai-integration[bot] Aug 22, 2026
05ee575
refactor(responses): rebuild the streaming snapshot output instead of…
mateo-berri Aug 22, 2026
da09e21
fix(types): silence pydantic ReadOnly warning on StandardLoggingRouti…
mateo-berri Aug 22, 2026
b103edb
fix: keep accepting a loop ceiling that spells a whole number
mateo-berri Aug 22, 2026
1c421f3
fix(ui): keep completion-mode models in the playground chat dropdown …
yuneng-berri Aug 22, 2026
ae25da3
fix(responses-bridge): keep reasoning text visible to inspection-only…
Aug 22, 2026
21d30fc
Merge pull request #37949 from BerriAI/litellm_fix_pydantic_readonly_…
mateo-berri Aug 22, 2026
abf99e3
Merge pull request #37911 from BerriAI/litellm_fix_agentic_loop_cap_r…
mateo-berri Aug 22, 2026
6d2b7db
fix: keep one reasoning item id across a bridged stream
mateo-berri Aug 22, 2026
deab367
fix(proxy): keep a failed prisma generate from failing the migration …
yuneng-berri Aug 22, 2026
490c9f9
fix(docker): bump wolfi-base digest for busybox 1.38.0-r1 and openssl…
yuneng-berri Aug 22, 2026
9cd6240
Merge remote-tracking branch 'origin/litellm_internal_staging' into HEAD
mateo-berri Aug 22, 2026
af18f77
fix(check_batch_cost): leave a lagging-output completed batch for the…
mateo-berri Aug 22, 2026
0fca861
Merge pull request #37715 from syahra712/fix/batch-processed-guard
mateo-berri Aug 22, 2026
9349b22
fix(guardrails): stop PII/PCI masking gaps in SpendLogs, debug logs, …
yassin-berriai Aug 22, 2026
6a55683
refactor: drop the unused response argument from the image item extra…
mateo-berri Aug 22, 2026
7ed91df
fix(proxy): make /team/member_delete's four cleanups atomic (#37959)
yassin-berriai Aug 22, 2026
15510f0
fix(auth): resolve team object_permission independently in the unreso…
yassin-berriai Aug 22, 2026
ba876c9
fix(auth): stop the team fallback from widening model access (#37962)
yassin-berriai Aug 22, 2026
a44bb47
fix(prometheus): fold auth/pre-call time into litellm_request_total_l…
yassin-berriai Aug 22, 2026
3d69ec3
fix(responses-bridge): keep summary-only reasoning text scannable
mateo-berri Aug 22, 2026
98dfb78
Merge pull request #37946 from BerriAI/litellm_fix_27333_bridge_item_ids
mateo-berri Aug 22, 2026
7aef79b
test(e2e): harden the suite against response-cache cross-talk, slow p…
yuneng-berri Aug 22, 2026
8a7c873
fix(proxy): omit litellm_batch_guardrail when no guardrail acted (#37…
yucheng-berri Aug 22, 2026
19a3fe1
fix(responses-bridge): fall back to summary text when content carries…
mateo-berri Aug 22, 2026
11cbe47
Merge pull request #36355 from harryzhou2000/fix/responses-bridge-pre…
mateo-berri Aug 22, 2026
ba07340
chore: update Next.js build artifacts (2026-08-22 22:11 UTC, node v24…
yuneng-berri Aug 22, 2026
75613bf
test: add regression coverage for twelve closed issues (#37974)
mateo-berri Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 4 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
/ui/ @yuneng-jiang @ryan-crabbe-berri
/litellm/proxy/_experimental/out/ @yuneng-jiang @ryan-crabbe-berri
/ui/ @yuneng-berri @ryan-crabbe-berri
/litellm/proxy/_experimental/out/ @yuneng-berri @ryan-crabbe-berri
/ui/litellm-dashboard/src/lib/http/schema.d.ts
/model_prices_and_context_window.json @mateo-berri
/litellm/model_prices_and_context_window_backup.json @mateo-berri
/litellm-proxy-extras/litellm_proxy_extras/migrations/ @yuneng-berri @ryan-crabbe-berri
/.github/CODEOWNERS @yuneng-berri
31 changes: 31 additions & 0 deletions .github/actions/cache-cargo-build/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: "Cache the Rust build"
description: >-
Cache the Cargo registry and target directory the root package's build needs,
so only the first job on a given Cargo.lock compiles the bridge from scratch.

litellm builds through maturin, which compiles litellm-rust/crates/python-bridge
in release mode before it can produce a wheel. `uv sync` therefore pays a full
build in every job that installs the workspace: measured at 2m40s per unit shard
on 2026-08-21, more than the whole unit tier spends running tests. Nothing caught
it, because the uv cache holds wheels uv downloads rather than wheels it builds,
and a path dependency whose source moves every commit could never hit that cache
anyway. Cargo rebuilds only what changed when its target directory survives, so a
warm job pays for the bridge crate alone.

The key namespace is separate from test-rust.yml's. Both cache the same directory,
but that workflow fills it with debug and clippy artifacts, which a release build
cannot reuse, and a shared key would let whichever ran first deny the other a save.

runs:
using: composite
steps:
- name: Restore the Cargo registry and target directory
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
~/.cargo/registry
~/.cargo/git
litellm-rust/target
key: ${{ runner.os }}-cargo-release-${{ hashFiles('litellm-rust/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-release-
10 changes: 0 additions & 10 deletions .github/ci-coverage-allowlist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,6 @@ test_paths:
choice it informed is settled
paths:
- tests/code_coverage_tests/test_aio_http_image_conversion.py
- reason: >-
The last file of a second mirror that sat beside tests/test_litellm and ran nowhere. Its
other 33 files landed in the real mirror during August 2026, 30 as moves and 3 by merging
their bodies into the live file of the same name. This one cannot follow either route yet:
its live twin was rewritten from 1268 lines to 9434, and of the 19 tests here 5 have no
counterpart while 25 assertions fail against today's code, so what survives that rewrite
is a judgement about the endpoints, not a merge. Revisit by deciding which of the five
behaviours still hold
paths:
- tests/litellm/proxy/_experimental/mcp_server/test_discoverable_endpoints.py
- reason: >-
No job invokes this suite and its files mix pure transformation tests with ones driving live
vendor vector stores, so assigning them needs a per-file decision
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/_test-unit-base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ on:
default: 20
job-timeout-minutes:
description: >-
Backstop for the whole job. Keep it >= `timeout-minutes` plus 35: 30 for
Backstop for the whole job. Keep it >= `timeout-minutes` plus 40: 35 for
the per-step ceilings on the setup steps below, and 5 for the runner
overhead the job clock charges but no step owns (job init, step
transitions, post-job cleanup). That headroom is what makes the test
Expand All @@ -36,7 +36,7 @@ on:
arithmetic, so the sum is passed in rather than computed.
required: false
type: number
default: 55
default: 60
max-failures:
description: "Stop after this many failures"
required: false
Expand Down Expand Up @@ -103,6 +103,11 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
if: steps.changes.outputs.decision != 'skip'
timeout-minutes: 5
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
if: steps.changes.outputs.decision != 'skip'
timeout-minutes: 8
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/check-ui-api-types.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
if: steps.changes.outputs.relevant == 'true'
uses: ./.github/actions/cache-cargo-build

- name: Install backend dependencies
if: steps.changes.outputs.relevant == 'true'
run: .github/scripts/uv_sync_with_retries.sh --frozen --group ci --group proxy-dev --extra google --extra proxy --extra semantic-router
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/image-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ on:
- backend/Dockerfile
- backend/main.py
- docker/component_entrypoint.sh
- docker/entrypoint.sh
- litellm/proxy/prisma_migration.py
- litellm-proxy-extras/**
- tests/proxy_migration_tests/**
- uv.lock
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/mutation-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
run: |
.github/scripts/uv_sync_with_retries.sh --frozen --group ci --group proxy-dev --extra google --extra proxy --extra semantic-router --extra saml
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/publish-basedpyright-base-counts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ jobs:
with:
version: "0.10.9"

- name: Cache the Rust build
uses: ./.github/actions/cache-cargo-build

- name: Cache Prisma binaries
uses: ./.github/actions/cache-prisma-binaries

Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/test-code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
run: uv sync --frozen --all-groups --all-extras

Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/test-linting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ jobs:
run: |
uv lock --check || (echo "❌ uv.lock is out of sync with pyproject.toml. Run 'uv lock' locally and commit the result." && exit 1)

- name: Cache the Rust build
if: steps.changes.outputs.decision != 'skip'
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
if: steps.changes.outputs.decision != 'skip'
run: |
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/test-mcp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ jobs:
with:
version: "0.10.9"

- name: Cache the Rust build
if: steps.changes.outputs.decision != 'skip'
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
if: steps.changes.outputs.decision != 'skip'
run: |
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/test-terraform-provider.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
run: |
.github/scripts/uv_sync_with_retries.sh --frozen --group ci --group proxy-dev --extra google --extra proxy --extra semantic-router
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/test-unit-documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ jobs:
restore-keys: |
${{ runner.os }}-uv-

- name: Cache the Rust build
if: steps.changes.outputs.decision != 'skip'
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
if: steps.changes.outputs.decision != 'skip'
run: |
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/test-unit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
workers: 2
reruns: 1
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: enterprise-routing
artifact-name: enterprise-routing
Expand All @@ -67,31 +67,31 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: integrations
artifact-name: integrations
test-path: "tests/test_litellm/integrations"
workers: 2
reruns: 3
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: Vertex AI
artifact-name: llm-vertex-ai
test-path: "tests/test_litellm/llms/vertex_ai"
workers: 1
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: All Other Providers
artifact-name: llm-other-providers
test-path: "tests/test_litellm/llms --ignore=tests/test_litellm/llms/vertex_ai"
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: misc
artifact-name: misc
Expand Down Expand Up @@ -122,7 +122,7 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: proxy-auth
artifact-name: proxy-auth
Expand All @@ -134,7 +134,7 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: proxy-endpoints
artifact-name: proxy-endpoints
Expand Down Expand Up @@ -171,15 +171,15 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: proxy-server
artifact-name: proxy-server
test-path: "tests/test_litellm/proxy/proxy_server"
workers: 4
reruns: 2
timeout-minutes: 60
job-timeout-minutes: 95
job-timeout-minutes: 100

- shard: proxy-infra
artifact-name: proxy-infra
Expand All @@ -198,7 +198,7 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60

- shard: responses-caching-types
artifact-name: responses-caching-types
Expand All @@ -209,7 +209,7 @@ jobs:
workers: 2
reruns: 2
timeout-minutes: 20
job-timeout-minutes: 55
job-timeout-minutes: 60
uses: ./.github/workflows/_test-unit-base.yml
with:
test-path: ${{ matrix.test-path }}
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/weekly_load_anomaly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ jobs:
with:
version: "0.10.9"

- name: Cache the Rust build
uses: ./.github/actions/cache-cargo-build

- name: Install dependencies
run: |
.github/scripts/uv_sync_with_retries.sh --frozen --group ci --group proxy-dev --extra proxy
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# syntax=docker/dockerfile:1.7

# Base image for building
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72

# Runtime image
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.11.7@sha256:240fb85ab0f263ef12f492d8476aa3a2e4e1e333f7d67fbdd923d00a506a516a
# Pinned by digest like the other base images; bump explicitly on Node upgrades.
ARG UI_BUILD_IMAGE=node:24.19-alpine3.24@sha256:d32cdf619f63fe0471182d08996dd516c6275bb5fd31ae06e55a570bd9e1ad43
Expand Down
4 changes: 2 additions & 2 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.11.7@sha256:240fb85ab0f263ef12f492d8476aa3a2e4e1e333f7d67fbdd923d00a506a516a

FROM $UV_IMAGE AS uvbin
Expand Down
2 changes: 1 addition & 1 deletion basedpyright-code-budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@
"limit": 56
},
"reportPrivateUsage": {
"limit": 1823
"limit": 1822
},
"reportRedeclaration": {
"limit": 8
Expand Down
1 change: 1 addition & 0 deletions ci_cd/generate_model_prices_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"uses_embed_content",
"use_openai_responses_path",
"bedrock_converse_supports_strict_tools",
"thinking_always_on",
}
)

Expand Down
4 changes: 2 additions & 2 deletions docker/Dockerfile.database
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# syntax=docker/dockerfile:1.7

# Base image for building
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72

# Runtime image
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.11.7@sha256:240fb85ab0f263ef12f492d8476aa3a2e4e1e333f7d67fbdd923d00a506a516a
# Pinned by digest like the other base images; bump explicitly on Node upgrades.
ARG UI_BUILD_IMAGE=node:24.19-alpine3.24@sha256:d32cdf619f63fe0471182d08996dd516c6275bb5fd31ae06e55a570bd9e1ad43
Expand Down
4 changes: 2 additions & 2 deletions docker/Dockerfile.non_root
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# syntax=docker/dockerfile:1.7

# Base images
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:42df77a9974d6ec8b17a5ee8bc23b532600a44d705acef2409e0933c1251b45f
ARG LITELLM_BUILD_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG LITELLM_RUNTIME_IMAGE=cgr.dev/chainguard/wolfi-base@sha256:a31344ab2cb8618db84f535eec56f76f6178b142cb92cb2e48676cc2dcebea72
ARG PROXY_EXTRAS_SOURCE=published
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.11.7@sha256:240fb85ab0f263ef12f492d8476aa3a2e4e1e333f7d67fbdd923d00a506a516a
# Pinned by digest like the other base images; bump explicitly on Node upgrades.
Expand Down
1 change: 1 addition & 0 deletions enterprise/enterprise_hooks/banned_keywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@


class _ENTERPRISE_BannedKeywords(CustomLogger):
enforces_request_content: bool = True
# Class variables or attributes
def __init__(self):
banned_keywords_list = litellm.banned_keywords_list
Expand Down
1 change: 1 addition & 0 deletions enterprise/enterprise_hooks/blocked_user_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@


class _ENTERPRISE_BlockedUserList(CustomLogger):
enforces_request_content: bool = True
# Class variables or attributes
def __init__(self, prisma_client: Optional[PrismaClient]):
self.prisma_client = prisma_client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,16 @@ async def check_batch_cost(self):
)

elif response.status in PROVIDER_TERMINAL_BATCH_STATUSES:
from litellm.proxy.openai_files_endpoints.common_utils import (
_completed_batch_safe_to_retire,
)

if response.status in ("completed", "complete") and not _completed_batch_safe_to_retire(response):
verbose_proxy_logger.info(
f"CheckBatchCost: batch {batch_id} is completed but its output file id "
f"has not appeared yet; leaving job {job.id} for the next poll cycle"
)
continue
await self._finalize_unbilled_terminal_job(job, response)

# Record polling run metrics (always, even if nothing was processed)
Expand Down
Loading
Loading