Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
244 commits
Select commit Hold shift + click to select a range
5e2df55
fix(cost): store cost breakdown for /v1/realtime sessions
shivamrawat1 Jun 10, 2026
f883d6b
Merge branch 'litellm_internal_staging' into litellm_realtime_cost_me…
shivamrawat1 Jun 24, 2026
0669d1b
bump: version 0.1.43 → 0.1.44
yuneng-berri Jun 26, 2026
2c8cd6a
uv lock
yuneng-berri Jun 26, 2026
4a6f0db
fix(ui): size Request Logs table columns so it scrolls instead of ove…
yuneng-berri Jun 26, 2026
93aca51
Merge branch 'litellm_internal_staging' of github.com:BerriAI/litellm…
yuneng-berri Jun 26, 2026
fa9664e
fix(ci): exclude deleted files from ruff format check
yuneng-berri Jun 26, 2026
014754b
fix(ui): let dashboard main pane shrink so wide tables scroll instead…
yuneng-berri Jun 27, 2026
76be446
feat(ui): give Request Logs columns explicit widths and tighten the d…
yuneng-berri Jun 27, 2026
2a5790f
fix(proxy): reject team-scoped object_permission on personal keys for…
yucheng-berri Jun 26, 2026
f2d7cb1
refactor(proxy): type object_permission dict with ObjectPermissionDict
yucheng-berri Jun 26, 2026
453aede
chore(router): simplify unknown-model error message construction
stuxf Jun 28, 2026
9b4442c
chore(router): drop unreachable unknown-model error branch
stuxf Jun 28, 2026
d7654d0
feat(proxy): add AES-256-GCM at-rest credential encryption with versi…
michelligabriele Jun 29, 2026
f042919
Merge pull request #31566 from stuxf/litellm_router_unknown_model_err…
yuneng-berri Jun 29, 2026
f5e7f99
Merge pull request #31629 from BerriAI/litellm_yj_june29
yuneng-berri Jun 29, 2026
0e5aee1
fix(ui): keep virtual-keys filters across delete and refresh (LIT-408…
ryan-crabbe-berri Jun 29, 2026
5e5b097
perf(ui): load virtual-keys team filter from the fast v2 endpoint (#3…
ryan-crabbe-berri Jun 29, 2026
20dabb7
fix(databricks): split parallel tool calls so each tool message follo…
mateo-berri Jun 29, 2026
7a1ba95
fix(proxy): gate non-admin /key/generate budget_limits and permission…
yucheng-berri Jun 29, 2026
829bfeb
perf(auth): gather independent pre-call budget-enforcement reads (#31…
yassin-berriai Jun 29, 2026
be6b28f
fix(proxy): reject non-finite budget_limits windows on /key/generate …
yucheng-berri Jun 29, 2026
971a1be
fix(proxy): hard-reject CLI session token personal-key budget_limits …
yucheng-berri Jun 29, 2026
b9e5875
refactor(types): host ObjectPermissionDict in litellm/types/ for SDK …
yucheng-berri Jun 27, 2026
5b029ec
fix: preserve normalized mcp permissions on key regenerate
cursoragent Jun 29, 2026
85840ae
fix(vertex_ai/files): single media upload for batch files to fix 499s…
mubashir1osmani Jun 30, 2026
e195532
fix(proxy): count only active users toward license seat limit (#31227)
ryan-crabbe-berri Jun 30, 2026
ec808ed
fix(mcp): resolve per-user OAuth identity authoritatively at the toke…
tin-berri Jun 30, 2026
494d04c
Merge pull request #31471 from BerriAI/litellm_veria_218_personal_key…
yuneng-berri Jun 30, 2026
ddba2e2
refactor(ui): colocate search-tools into route-level _components (#31…
ryan-crabbe-berri Jun 30, 2026
26ee5dd
fix(passthrough): drop top-level additional_drop_params on /v1/messag…
mateo-berri Jun 30, 2026
10849c8
fix(guardrails): scan file and document attachments with Model Armor …
yucheng-berri Jun 30, 2026
ea7be19
fix: skip health check for semantic auto_router deployments (#31668)
krrish-berri-2 Jun 30, 2026
8a55e9e
fix(bedrock): drop unmappable Responses tools instead of failing the …
mateo-berri Jun 30, 2026
d295b76
ci(linting): generate prisma client before basedpyright typecheck (#3…
mateo-berri Jun 30, 2026
375659e
fix(proxy): emit x-litellm-response-cost header on /messages and /gen…
mateo-berri Jun 30, 2026
7baf255
fix(mcp): support client_secret_basic for upstream OAuth token endpoi…
tin-berri Jun 30, 2026
6d5de74
feat(cost_calculator): log per-token-type reasoning and cache cost br…
Sameerlite Jun 30, 2026
884cdc1
fix(anthropic): drop unsignable thinking blocks and allow null signat…
mateo-berri Jun 30, 2026
84d7a32
fix(ui): revert Duration and TTFT column widths to default
yuneng-berri Jun 30, 2026
256b5aa
fix(ui): revert Request ID width to default, tighten Session ID
yuneng-berri Jun 30, 2026
adf6eb7
chore(docs): remove docs accidentally committed to litellm repo (#31691)
yuneng-berri Jun 30, 2026
72bcb74
chore: remove _experimental/out (#31546)
mateo-berri Jun 30, 2026
70eb4e5
feat(prometheus): add litellm_total_overhead_latency_metric (SDK over…
yassin-berriai Jun 30, 2026
0965a4d
chore: shift CI lint left with an opt-in `make pre-commit` and CLAUDE…
mateo-berri Jun 30, 2026
3dce3da
feat(proxy): type Customer Management response_model for OpenAPI cove…
ryan-crabbe-berri Jun 30, 2026
f8a2ea7
Merge pull request #31426 from BerriAI/litellm_/cranky-hamilton-21b5d0
yuneng-berri Jun 30, 2026
2e575d3
perf(otel): memoize per-request lazy import of otel runtime hooks (#3…
yassin-berriai Jun 30, 2026
468d11f
feat(otel): emit a tools/list CLIENT span for MCP discovery under ote…
ryan-crabbe-berri Jun 30, 2026
1eb7122
test(benchmarks): add CodSpeed benchmarks for inference, MCP and A2A …
yassin-berriai Jun 30, 2026
7ed25de
fix(ui): allow any git host on the skills add form (LIT-4053) (#31652)
ryan-crabbe-berri Jun 30, 2026
6ab3742
perf(spend): move cost-callback payload deepcopy off the request even…
yassin-berriai Jun 30, 2026
59f51b2
chore: prevent CLAUDE.md comment bloat (#31729)
mateo-berri Jun 30, 2026
1815636
feat(guardrails): expose streaming knobs on generic_guardrail_api (#3…
yucheng-berri Jun 30, 2026
fecaf5c
feat(router): tag routing denylist support via ! prefix (#31728)
mateo-berri Jun 30, 2026
9968499
fix(ui): fix Router Settings Loadbalancing tab save (LIT-4057)
ryan-crabbe-berri Jun 30, 2026
30141f8
test(ui): make router settings save tests resilient to async timing
ryan-crabbe-berri Jun 30, 2026
a126cdf
feat(anthropic): add Claude Sonnet 5
cursoragent Jun 30, 2026
540c860
test(ui): add typed e2e for Router Settings Loadbalancing save (LIT-4…
ryan-crabbe-berri Jun 30, 2026
87de0e8
fix(mcp): stop one unauthenticated server from emptying the aggregate…
tin-berri Jun 30, 2026
d6f09c4
test(reasoning-effort-grid): bump cell-count assertion for claude-son…
mateo-berri Jun 30, 2026
87f035b
perf(spend): gather independent per-scope spend-counter increments (#…
yassin-berriai Jun 30, 2026
3971469
test(ui): harden Router Settings e2e and make its typing a real CI gate
ryan-crabbe-berri Jun 30, 2026
88c34a5
fix(email): apply EMAIL_SIGNATURE to budget alert emails (#31712)
michelligabriele Jun 30, 2026
6d828e5
feat(messages): passthrough /v1/messages to native endpoints via supp…
mateo-berri Jun 30, 2026
6d43c21
fix(anthropic): drop redundant supports_output_config from Vertex/Azu…
mateo-berri Jun 30, 2026
52dc15a
fix(proxy): isolate poison spend-log rows so one bad record can't dro…
yassin-berriai Jun 30, 2026
be4d0d8
fix(redis): re-establish async cluster connections after a node resta…
yassin-berriai Jun 30, 2026
4f41a9e
test(ui): drop the e2e typecheck CI gate, keep the typed import for t…
ryan-crabbe-berri Jun 30, 2026
d4c33b2
fix(logging): route realtime success logging through the bounded work…
mubashir1osmani Jun 30, 2026
94936a3
fix(presidio): stream SSE output incrementally instead of buffering t…
yassin-berriai Jun 30, 2026
8beb68a
Merge pull request #31740 from BerriAI/litellm_add-claude-sonnet-5-c71c
yuneng-berri Jun 30, 2026
86fbe90
bump: version 1.91.0 → 1.92.0
yuneng-berri Jun 30, 2026
c736ec5
bump: version 0.1.44 → 0.1.45
yuneng-berri Jun 30, 2026
aaa58a7
chore: rebuild uv lock for version bumps
yuneng-berri Jun 30, 2026
e337df4
Merge pull request #31757 from BerriAI/litellm_/gracious-bardeen-d32d47
yuneng-berri Jun 30, 2026
5d4bb75
fix(token_counter): count legacy function_call.arguments (VERIA-492) …
yucheng-berri Jun 30, 2026
a0b26d2
Revert "fix(presidio): stream SSE output incrementally instead of buf…
tin-berri Jun 30, 2026
ae8084d
ci(codspeed): pin benchmark runner to ubuntu-24.04 (#31746)
yuneng-berri Jun 30, 2026
a7d8c6f
test(pass-through): de-flake vertex spend-log test by routing through…
mateo-berri Jun 30, 2026
41f9d8d
fix(proxy): extend banned-params + admin-clear lists for NVIDIA Riva …
yucheng-berri Jun 30, 2026
776b272
Merge pull request #31735 from BerriAI/litellm_lit_4057_router_settin…
yuneng-berri Jun 30, 2026
833406a
fix(ui): rotate model credentials in a dedicated modal so a normal sa…
ryan-crabbe-berri Jul 1, 2026
2860dad
feat(proxy): audit default user settings updates (#31753)
yucheng-berri Jul 1, 2026
ada9ef8
fix(websearch): websearch_interception agentic loop fixes for chat co…
krrish-berri-2 Jul 1, 2026
6c21029
feat(sandbox): reuse e2b container across requests when metadata.sess…
krrish-berri-2 Jul 1, 2026
846dbec
feat(proxy): support object_permission in default_key_generate_params…
krrish-berri-2 Jul 1, 2026
50b936c
feat(guardrails/headroom): add CCR (compress-cache-retrieve) via agen…
krrish-berri-2 Jul 1, 2026
23af784
feat: add cache control injection support for v1/messages endpoint (#…
devin-ai-integration[bot] Jul 1, 2026
bfb8ffc
feat(proxy): audit remaining system-wide settings updates (#31754)
yucheng-berri Jul 1, 2026
c4a77bd
fix(prometheus): expose project_alias in custom metadata labels (LIT-…
devin-ai-integration[bot] Jul 1, 2026
cca71a0
feat(mcp): add mcp_tool_search virtual tools for large tool catalogs …
krrish-berri-2 Jul 1, 2026
13b590c
fix(proxy): hydrate MCP server registry from DB on startup when store…
tin-berri Jul 1, 2026
e141596
refactor(lint): collapse type/lint budgets to a single per-rule limit…
mateo-berri Jul 1, 2026
3e0bd71
feat(ui): disclaim that the Update API Key modal only rotates api_key…
ryan-crabbe-berri Jul 1, 2026
1fe76dc
Revert "chore: remove _experimental/out (#31546)"
yuneng-berri Jul 1, 2026
34039df
Merge pull request #31904 from BerriAI/litellm_/competent-mestorf-165751
yuneng-berri Jul 1, 2026
ae6dbb4
fix(scripts): resolve worktree root before relative_to in type_check_…
yuneng-berri Jul 1, 2026
7e99344
feat(bedrock_mantle): add xai.grok-4.3 to model cost map for SigV4 au…
devin-ai-integration[bot] Jul 1, 2026
700afbb
chore: make CLAUDE.md rules more concise (#31892)
mateo-berri Jul 1, 2026
a2f5bb1
fix(proxy): authorize /health/test_connection against loaded deployme…
yucheng-berri Jul 2, 2026
99c65ea
fix(proxy): admin-gate `permissions` on /key/update and /key/regenera…
yucheng-berri Jul 2, 2026
0b0fd6a
feat(github_copilot): route /v1/messages to Copilot native Anthropic …
mateo-berri Jul 2, 2026
fde4c7c
feat(gdc): implement Google Distributed Cloud (GDC) Gemini provider (…
mateo-berri Jul 2, 2026
6e023f7
fix(model_prices): apply claude-sonnet-5 introductory pricing through…
mateo-berri Jul 2, 2026
68a8fc2
feat(s3_v2): send Content-MD5 on PUT and optional server-side encryption
Jul 2, 2026
8ce6b4d
fix(proxy): tighten role gating on /get/config/callbacks response (#3…
yucheng-berri Jul 2, 2026
e542be1
fix(s3_v2): pass usedforsecurity=False to hashlib.md5 for FIPS envs
Jul 2, 2026
29cc4e3
fix: allow S3 Content-MD5 on FIPS hosts
cursoragent Jul 2, 2026
bd9db36
chore(lint): remove dead E501 config, fix stale blame-ignore SHAs, no…
mateo-berri Jul 2, 2026
85f9241
fix(bedrock/converse): drop toolSpec.strict for Opus 4.7/4.8 (#31582)…
mateo-berri Jul 2, 2026
c4f28ce
fix(bedrock): trigger Nova Sonic generation on response.create so rea…
mateo-berri Jul 2, 2026
2a9dbc4
chore(ui): remove unused dep, delete dead file, and unblock knip (#31…
ryan-crabbe-berri Jul 2, 2026
3d644e1
refactor(ui): colocate users page into route-level _components (#31897)
ryan-crabbe-berri Jul 2, 2026
912ca62
test(bedrock): switch image gen live test off EOL Titan to Nova Canva…
devin-ai-integration[bot] Jul 2, 2026
a2a951a
feat(vertex_ai): pass full imageConfig dict for Gemini image generati…
Sameerlite Jul 2, 2026
64dc508
fix(bedrock): drop strict/additionalProperties from toolSpec for Clau…
Sameerlite Jul 2, 2026
85db18e
feat(prometheus): expose MCP tool metadata in Prometheus metrics (#31…
devin-ai-integration[bot] Jul 2, 2026
b96f1aa
fix(mcp): byom visibility, preview UX, and admin settings gating (#31…
Sameerlite Jul 2, 2026
a16d9c6
test(e2e): add live batches suite across providers and routing scenar…
Sameerlite Jul 2, 2026
8d0dc92
fix(logging): resolve model_map_value for proxy custom pricing (#31940)
Sameerlite Jul 2, 2026
fabe5c2
fix(mcp): roll up MCP tool spend to user counters and usage UI (#31576)
Sameerlite Jul 2, 2026
6d796d0
feat(proxy): track cost for unmanaged Vertex AI batch jobs (#31442)
Sameerlite Jul 2, 2026
f5f8ba9
fix(mcp): tighten role-based visibility on /v1/mcp/server/submissions…
yucheng-berri Jul 2, 2026
09f611e
fix: include realtime transcription cost in breakdown
cursoragent Jul 2, 2026
c370503
fix(mcp): gate OAuth authorize/token/register/discovery on auth_type=…
tin-berri Jul 2, 2026
bea8c93
refactor(ui): drive cache settings form from a typed frontend schema …
yuneng-berri Jul 2, 2026
d40021c
fix: merge metadata.tags into litellm_metadata on /v1/responses route…
devin-ai-integration[bot] Jul 2, 2026
8e6098a
fix(proxy): restore admin key/team callback_vars.turn_off_message_log…
yucheng-berri Jul 2, 2026
58de920
feat(mcp): bound outbound tool-call concurrency per MCP server (#31641)
tin-berri Jul 2, 2026
b38c290
fix(release): make Create Release reliable for stable maintenance cut…
yuneng-berri Jul 2, 2026
9b6d0b0
Merge pull request #31928 from BerriAI/litellm_s3_v2_content_md5
mubashir1osmani Jul 2, 2026
1543725
fix(bedrock): honor ttl for tool_config cache injection points (#31929)
shivamrawat1 Jul 2, 2026
ef03023
test(e2e): add vertex_ai passthrough spend-log coverage (#31781)
mubashir1osmani Jul 3, 2026
b9df7fa
fix(mcp): surface tools/list 401 auth failures as a challenge on sing…
tin-berri Jul 3, 2026
8bb4e62
feat(tencent): add Tencent TokenHub as a provider (#31903)
mateo-berri Jul 3, 2026
138a69b
fix(bedrock): map guardrailConfig to InvokeModel guardrail headers (#…
mateo-berri Jul 3, 2026
27069bd
feat(ui): shadcn migration foundation: Tailwind v4, shadcn init, antd…
ryan-crabbe-berri Jul 3, 2026
a86dc4c
chore(e2e): untrack gateway config and document e2e test location (#3…
mubashir1osmani Jul 3, 2026
cf6fdac
perf(lint): skip and cache base gate passes, parallelize make lint, s…
mateo-berri Jul 3, 2026
2633e8f
fix(ui): include cache token columns in usage export (#32015)
mateo-berri Jul 3, 2026
30ddef7
fix(a2a): record agent cost_per_query and input tokens on native send…
michelligabriele Jul 3, 2026
321345d
feat: litellm oss staging (#31935)
Sameerlite Jul 3, 2026
cbe23d6
fix(a2a): populate response usage in a2a chat transformation (#31980)
michelligabriele Jul 3, 2026
dfbbda4
fix(auth): deny model access for teamless keys with all-team-models (…
devin-ai-integration[bot] Jul 3, 2026
659127b
feat(guardrails): add unreachable_fallback fail-open option to headro…
krrish-berri-2 Jul 3, 2026
6dcbac8
fix(proxy): admin-gate `permissions` on /user/new and /user/update (L…
yucheng-berri Jul 3, 2026
b426925
fix(proxy): admin-gate `allowed_routes` presence on /key/update and /…
yucheng-berri Jul 3, 2026
b61fae3
fix(proxy): admin-gate `permissions` on _process_single_key_update (L…
yucheng-berri Jul 3, 2026
00dffcd
fix(guardrails): catch httpx.HTTPStatusError in headroom compress call
krrish-berri-2 Jul 3, 2026
ae356cf
fix(azure_ai): preserve content, tables, and keyValuePairs in doc-int…
mateo-berri Jul 3, 2026
4e53ae9
bump: litellm-proxy-extras 0.4.74 -> 0.4.75, litellm-enterprise 0.1.4…
yuneng-berri Jul 3, 2026
d0e7851
feat(tinyfish): make search provider permissive, attribute errors (#3…
tin-berri Jul 3, 2026
b59ad21
feat(ui): add token endpoint auth method selector to MCP OAuth forms …
tin-berri Jul 3, 2026
15ff389
fix(mcp): persist DCR client_id so interactive OAuth token refresh wo…
tin-berri Jul 3, 2026
93cdcca
fix(azure_sentinel): resolve audit stream from AZURE_SENTINEL_AUDIT_S…
yucheng-berri Jul 3, 2026
53d2331
fix: catch litellm.Timeout in HeadroomGuardrail to support fail_open …
cursoragent Jul 3, 2026
3235f4a
fix(mcp): persist DCR client_id from on-create MCP OAuth Authorize & …
tin-berri Jul 3, 2026
70785b9
fix(e2e): define SpendTagsResponse/TagSpend so spend suite collects
mubashir1osmani Jul 3, 2026
28ddad2
feat(proxy): add key-level budget_fallbacks to reroute requests when …
krrish-berri-2 Jul 3, 2026
e06adb5
feat(ui): re-add chat UI, allow simple UI for MCP OBO auth (#31893)
krrish-berri-2 Jul 3, 2026
01dfbf7
fix(guardrails): address review comments on headroom fail_open
krrish-berri Jul 3, 2026
8713771
fix: restore schema.d.ts from base branch
krrish-berri Jul 3, 2026
ed51c96
feat(ui): add budget fallbacks configuration to key create/edit forms
krrish-berri Jul 3, 2026
680f15f
fix(proxy): stop leaking master_key and database_url in startup DEBUG…
yucheng-berri Jul 2, 2026
64d6a15
fix(proxy): redact secrets on the db-config and litellm_settings log …
yucheng-berri Jul 2, 2026
89d3f2a
fix: redact db environment variable debug logs
yucheng-berri Jul 2, 2026
bd6ae9e
fix(proxy): stop the decrypt-failure debug log from leaking the raw v…
yucheng-berri Jul 2, 2026
11314f4
feat(ui): migrate chat UI from antd to shadcn/ui
krrish-berri Jul 3, 2026
0b3e327
fix(ui): use project cva config instead of class-variance-authority i…
krrish-berri Jul 3, 2026
ef758e6
fix(proxy): route realtime HTTP endpoints through router for credenti…
Jul 3, 2026
640ee93
fix: prevent stale budget fallback entries after form reset and guard…
krrish-berri Jul 3, 2026
57ca48a
feat(mcp): add all-proxy-mcpservers sentinel to grant teams every MCP…
ryan-crabbe-berri Jul 3, 2026
fff6a53
fix(ci): stop ui_unit_tests vitest onTaskUpdate RPC timeout flake
yuneng-berri Jul 3, 2026
682d55a
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Jul 3, 2026
2e1d8d2
fix(anthropic): keep context_management working when drop_params is e…
mateo-berri Jul 3, 2026
23e83f8
Merge pull request #32078 from BerriAI/litellm_/distracted-banach-e3481f
yuneng-berri Jul 3, 2026
5f4b9ad
chore: clarify the linear ticket instruction in pr template (#32076)
mateo-berri Jul 3, 2026
a55cc3a
fix: allow clearing budget_fallbacks in edit view when key had existi…
krrish-berri Jul 3, 2026
0115bfa
test(ui): quiet vitest CI logs by silencing passing-test console output
yuneng-berri Jul 3, 2026
fc17ea3
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Jul 3, 2026
b42cd37
style: format key_edit_view.tsx with prettier
krrish-berri Jul 3, 2026
b723dfb
fix(realtime): preserve nested transcription model and session-first …
Jul 3, 2026
8e4e37d
Merge pull request #32079 from BerriAI/litellm_/dreamy-lovelace-4a90c8
yuneng-berri Jul 3, 2026
76a9f7b
chore(ui): add no-console lint ratchet and strip console from prod bu…
yuneng-berri Jul 3, 2026
2e44691
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Jul 3, 2026
5b7c73a
chore(ui): sync no-console budget to 484 after staging merge
yuneng-berri Jul 3, 2026
68d52ac
chore(ui): preserve console.warn in prod builds to match lint allow-list
yuneng-berri Jul 3, 2026
099bc97
fix: prevent duplicate budget alert emails on concurrent threshold cr…
yucheng-berri Jul 3, 2026
36cbc3a
Merge pull request #32082 from BerriAI/litellm_/eloquent-swanson-d634ca
yuneng-berri Jul 3, 2026
15d6a29
merge: resolve eslint-metrics.json conflict with litellm_internal_sta…
krrish-berri Jul 3, 2026
55e3296
Merge pull request #32026 from BerriAI/litellm_headroom_unreachable_f…
yuneng-berri Jul 3, 2026
c58e226
Merge pull request #32072 from BerriAI/litellm_budget_fallbacks_ui
yuneng-berri Jul 3, 2026
afa739b
fix(ui): design polish and per-tab routing for chat UI
krrish-berri-2 Jul 3, 2026
a58930e
Merge remote-tracking branch 'origin/litellm_chat-keys-usage' into li…
krrish-berri-2 Jul 3, 2026
7109b2f
fix(ui): view-switcher navigation from chat route, add beta banner
krrish-berri-2 Jul 3, 2026
f19bf2c
feat(mcp): migrate the token_exchange (OBO) arm to the v2 resolver (#…
tin-berri Jul 3, 2026
0e56fc3
feat(mcp): make token_exchange (OBO) production-ready - discovery thr…
tin-berri Jul 4, 2026
1e7dbe5
fix(anthropic): bill streaming 1h prompt-cache writes at the 1h rate …
mateo-berri Jul 4, 2026
8563677
fix(ui): design-system audit, single-model picker, scroll fix
krrish-berri-2 Jul 4, 2026
aca2428
chore(ui): remove debug console.log statements from dashboard (#32087)
ryan-crabbe-berri Jul 4, 2026
718e9cf
fix(router): mask provider credentials embedded in fallback error mes…
yucheng-berri Jul 4, 2026
5ece78f
revert: undo teamless all-team-models denial from #32022 and #29746 (…
devin-ai-integration[bot] Jul 4, 2026
c737789
feat(mcp): discover the OBO token endpoint via RFC 9728 -> RFC 8414 (…
tin-berri Jul 4, 2026
5211c73
build: restore maturin backend to bundle the Rust bridge in the wheel
yuneng-berri Jul 4, 2026
29c23db
fix(responses/mcp): execute follow-up tool calls instead of dropping …
krrish-berri-2 Jul 4, 2026
08c009c
fix(ui): forward ref on shadcn Input so rename auto-focus works on Re…
krrish-berri-2 Jul 4, 2026
8f6abb5
Merge pull request #32077 from BerriAI/litellm_realtime_internal_user…
shivamrawat1 Jul 4, 2026
47f493a
Merge pull request #32074 from BerriAI/litellm_chat-keys-usage
yuneng-berri Jul 4, 2026
0932dde
Merge pull request #31462 from BerriAI/litellm_/stoic-euclid-c3b07c
yuneng-berri Jul 4, 2026
8c98780
fix(proxy): return upstream error bodies unchanged in passthrough
Jul 4, 2026
4bd579c
Merge pull request #31944 from BerriAI/litellm_lit4152_key_url_redaction
yuneng-berri Jul 4, 2026
e738715
fix(proxy): fire failure hooks and log response bodies for passthroug…
Jul 4, 2026
23873f8
fix(policies): reject non-existent team/key/model scope entries on at…
ryan-crabbe-berri Jul 4, 2026
07b9ea8
fix(anthropic): require caller api_key and SSRF-validate api_base in …
yucheng-berri Jul 4, 2026
8edfaa9
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
Jul 4, 2026
f0d41e4
fix: attribute realtime transcription cost in cost breakdown
Jul 4, 2026
44a0f57
fix(proxy): stop double-logging and false-alerting on passthrough ups…
Jul 4, 2026
cbb6411
fix(proxy): keep serving reads from the read replica when the primary…
yassin-berriai Jul 4, 2026
7c954ce
Merge pull request #32097 from BerriAI/litellm_/focused-moore-292bcc
yuneng-berri Jul 4, 2026
cbfba17
test(proxy): set status_code on chunk_processor response mocks
Jul 4, 2026
bd5059f
Merge pull request #30069 from BerriAI/litellm_realtime_cost_metrics
shivamrawat1 Jul 4, 2026
a3a3201
Merge pull request #32133 from BerriAI/litellm_passthrough_error_norm…
yuneng-berri Jul 4, 2026
daf1aab
ci: run proxy containers without debug logging (#32128)
ryan-crabbe-berri Jul 4, 2026
96089d7
chore: update Next.js build artifacts (2026-07-04 21:21 UTC, node v20…
yuneng-berri Jul 4, 2026
c293696
bump: litellm-enterprise 0.1.46 -> 0.1.47
yuneng-berri Jul 4, 2026
4f12b20
Merge pull request #32150 from BerriAI/litellm_/epic-cannon-f16c3e
yuneng-berri Jul 4, 2026
e619259
Merge pull request #32151 from BerriAI/litellm_yj_build_july4
yuneng-berri Jul 4, 2026
7a6a070
feat(prometheus): add api_provider label to token, latency, request a…
yucheng-berri Jul 4, 2026
2e38da6
feat(mcp): add entra_obo profile to the token_exchange (OBO) arm (#31…
tin-berri Jul 4, 2026
5f864c8
chore(lint): zero out crash-class pyright rules and ban new type: ign…
mateo-berri Jul 4, 2026
26c0c93
fix(headroom guardrail): log real token/compression stats instead of …
krrish-berri-2 Jul 5, 2026
160a249
fix(anthropic_messages): forward provider response headers on streami…
mateo-berri Jul 5, 2026
7e43b3f
fix(bedrock): emit SSE error event when invoke Messages stream ends w…
mateo-berri Jul 5, 2026
4bae64e
test(e2e): migrate access-control and inference-endpoint regression t…
mubashir1osmani Jul 5, 2026
31c1ffc
test(e2e): close coverage gaps across chat/responses, provider featur…
mubashir1osmani Jul 5, 2026
03271de
chore: add latest model rule to CLAUDE.md (#32164)
mateo-berri Jul 5, 2026
b905682
test: de-flake langfuse callbacks-in-db e2e test
yuneng-berri Jul 5, 2026
91676c4
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Jul 5, 2026
f5438d1
ci: gate CircleCI jobs on changed paths (#32080)
ryan-crabbe-berri Jul 5, 2026
ed07aec
Merge pull request #32166 from BerriAI/litellm_e2e_batches_ocr_model_…
mubashir1osmani Jul 5, 2026
2967bc9
fix: merge websearch tool params (#32162)
krrish-berri-2 Jul 5, 2026
2e076b1
Merge pull request #32167 from BerriAI/litellm_/suspicious-jennings-5…
yuneng-berri Jul 5, 2026
5b93ba0
feat(router): add separate ITPM/OTPM deployment rate limits (#31952)
Sameerlite Jul 5, 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
  •  
  •  
  •  
108 changes: 85 additions & 23 deletions .circleci/config.yml

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions .circleci/scripts/classify_changes.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -uo pipefail

category="${1:?usage: classify_changes.sh <backend|client>}"

has_client=false
has_backend=false
while IFS= read -r file || [ -n "$file" ]; do
[ -n "$file" ] || continue
case "$file" in
ui/*) has_client=true ;;
docs/* | *.md | *.mdx) : ;;
*) has_backend=true ;;
esac
done

case "$category" in
backend)
[ "$has_backend" = true ] && echo run || echo skip
;;
client)
{ [ "$has_client" = true ] || [ "$has_backend" = true ]; } && echo run || echo skip
;;
*)
echo run
;;
esac
40 changes: 40 additions & 0 deletions .circleci/scripts/path_filter.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
set -uo pipefail

category="${1:?usage: path_filter.sh <backend|client>}"
here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

run_full() {
echo "path-filter[$category]: running job ($1)"
exit 0
}

[ -n "${CIRCLE_PULL_REQUEST:-}" ] || run_full "not a pull request"

candidate_bases="main litellm_internal_staging litellm_oss_staging"
merge_base=""
for base in $candidate_bases; do
git fetch --quiet origin "$base" 2>/dev/null || continue
candidate="$(git merge-base HEAD FETCH_HEAD 2>/dev/null)" || continue
[ -n "$candidate" ] || continue
if [ -z "$merge_base" ] || git merge-base --is-ancestor "$merge_base" "$candidate" 2>/dev/null; then
merge_base="$candidate"
fi
done

[ -n "$merge_base" ] || run_full "could not resolve a merge base against $candidate_bases"

changed="$(git diff --name-only "$merge_base" HEAD 2>/dev/null)" || run_full "git diff failed"
[ -n "$changed" ] || run_full "no files changed vs $merge_base"

echo "path-filter[$category]: changed files vs ${merge_base}:"
printf '%s\n' "$changed" | sed 's/^/ /' || true

decision="$(printf '%s\n' "$changed" | bash "$here/classify_changes.sh" "$category")" || run_full "classify_changes.sh failed"

if [ "$decision" = run ]; then
run_full "$category-relevant changes detected"
fi

echo "path-filter[$category]: only unrelated (docs/client) changes detected; halting job as successful"
circleci-agent step halt
4 changes: 2 additions & 2 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
7edf3a9cb55548b143df1692f4ed7c4681d7fcf7

# style: reformat litellm/ with ruff format (#31317)
430b5b8f1b12dc261a49fda99ac5d1b22381a428
17bfd415aeb5a57fb646b5cc67da1c730aa7c50b

# style: unify ruff format width on 120 (#31518)
3dfbeabe626d203ac9de86024519d9a96c484ce4
48b5a5a0cc5a694a11219416ee0b6eb6e620e74e
2 changes: 1 addition & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## Linear ticket

<!-- if you are an internal contributor (e.g., your username is postfixed with -berri or -berriai), add "Resolves " followed by the Linear ticket e.g., "Resolves LIT-1234" to magically link the Linear ticket to the GitHub PR -->
<!-- if you are an internal contributor, add "Resolves " followed by the Linear ticket e.g., "Resolves LIT-1234" to link the Linear ticket to the GitHub PR. If you don't have one, leave the section blank rather than guessing -->

## Pre-Submission checklist

Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/codspeed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ concurrency:

jobs:
benchmarks:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
timeout-minutes: 15

steps:
Expand All @@ -48,6 +48,8 @@ jobs:
uv run --frozen --no-default-groups
--with pytest==8.3.5
--with pytest-codspeed==4.3.0
--with "mcp>=1.26.0,<2.0"
--with "a2a-sdk>=1.1.0,<2.0"
pytest
-p pytest_codspeed.plugin
tests/benchmarks/
Expand Down
32 changes: 30 additions & 2 deletions .github/workflows/create-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,28 @@ jobs:
makeLatest = (!latestVersion || isAtLeast(newVersion, latestVersion)) ? "true" : "false";
}

try {
await github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${tag}`,
sha: commitHash,
});
} catch (error) {
if (error.status !== 422) throw error;
const existing = await github.rest.git.getRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${tag}`,
});
if (existing.data.object.sha !== commitHash) {
throw new Error(`Tag ${tag} already exists at ${existing.data.object.sha}, expected ${commitHash}`);
}
}

const response = await github.rest.repos.createRelease({
draft: true,
generate_release_notes: true,
target_commitish: commitHash,
name: tag,
owner: context.repo.owner,
prerelease: isPrerelease,
Expand All @@ -138,11 +156,21 @@ jobs:
owner: context.repo.owner,
repo: context.repo.repo,
release_id: response.data.id,
tag_name: tag,
body: updatedBody,
draft: false,
make_latest: makeLatest,
});

if (!isPrerelease) {
await github.rest.repos.updateRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: response.data.id,
tag_name: tag,
make_latest: makeLatest,
});
}

} catch (error) {
core.setFailed(error.message);
}
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/test-linting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,22 @@ jobs:

- name: Install dependencies
run: |
uv sync --frozen
uv sync --frozen --group proxy-dev

# basedpyright resolves Prisma's generated client (litellm/proxy/schema.prisma)
# only after `prisma generate` writes prisma/client.py et al. Without this the
# DB wrappers typed against the generated client would degrade to Unknown.
- name: Generate Prisma client
env:
PRISMA_BINARY_CACHE_DIR: ${{ runner.temp }}/prisma-cache
run: |
uv run --no-sync prisma generate --schema litellm/proxy/schema.prisma

- name: Check ruff format
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
git diff --name-only "$BASE_SHA"...HEAD -- 'litellm/**/*.py' | grep -v '^litellm/enterprise/' > "$RUNNER_TEMP/ruff_format_files.txt" || true
git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- 'litellm/**/*.py' | grep -v '^litellm/enterprise/' > "$RUNNER_TEMP/ruff_format_files.txt" || true
if [ ! -s "$RUNNER_TEMP/ruff_format_files.txt" ]; then
echo "No changed litellm Python files to check with ruff format."
exit 0
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,5 @@ crash.*.log

# pytest coverage data
.coverage

ui/litellm-dashboard/out/
24 changes: 16 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
Do not write comments unless they are absolutely necessary to explain some very complex business logic. Please clean up if there are comments that are not absolutely necessary. Do not remove comments that are unrelated to the addition of the code of this PR

Explanation: code comments are, in a way, a violation of DRY code. You must update logic in two locations to change the code and "hard to change" is literally the definition of tech debt. We should instead aim to write code that is intuitive to the reader, while being both easy to maintain and high performance
Do not write any comments (existing comments can stay) unless explicitly asked to in a user (not system) prompt

Don't assume that the existing code is correct or the right way of doing things / good coding patterns. In fact, there are a lot of bad coding practices, overly complex code, code smells, etc. If something doesn't look right, speak up. Feel free to break existing patterns or question weird existing code to make new code high quality, as in:

- correct
- secure
- performant
Expand All @@ -18,9 +17,13 @@ Same thing for bug fixes. The tests should make it so that this specific bug can

`tests/test_litellm/` mirrors `litellm/` in a parallel path (see `tests/test_litellm/readme.md`). Name tests `test_<filename>.py`, but always match the existing test file in the directory you touch — many provider dirs use longer descriptive names (e.g. `test_anthropic_chat_transformation.py`) to avoid ambiguity across sibling folders. For bug fixes, extend the existing mapped test file rather than creating a new one. Only create a new test file for a new feature (provider, endpoint, or transformation module) that has no mapped test yet, following that directory's naming convention (or `test_<filename>.py` if you're the first test there). One focused regression test beats many shallow ones

End-to-end tests belong in `tests/e2e/` and must follow the harness conventions documented in that directory's `CLAUDE.md`

When creating PRs, don't set base to `main`. `litellm_internal_staging` serves that purpose

Always use @.github/pull_request_template.md as a guide for your PR body
When writing a PR body, treat the comments and imperative instructions inside @.github/pull_request_template.md as rules to follow, not just layout

If you're resolving a linear ticket, in the "## Linear ticket" section of the PR, say "Resolves LIT-1234", replacing "LIT-1234" with the actual ticket id that you're resolving. If you don't have the ticket id, don't make one up or search for it. Just leave the section blank

Never use `pytest` commands or the like as "Screenshots / Proof of Fix". We prefer curl'ing a live proxy instance running on localhost:4000 (I like to run it with `python litellm/proxy/proxy_cli.py --config litellm/proxy/dev_config.yaml --detailed_debug --reload --use_v2_migration_resolver 2>&1 | tee litellm.log`) and showing both the command run and the output. Also, it should hit real LLM provider APIs, not mocks, and cost real $$$ because that is the most realistic test. The proof of fix should be exactly what the end user / customer would see / do. The run logs in PR #27703 is a prime example of how to do it (not a huge fan of using a python test script that future me and the team will have no visibility into; I prefer just curl commands or a short list of bash commands (e.g., using `for`)). If it's a UI thing, just tell me which URLs to go to (e.g., http://localhost:4000/ui/?page=logs), where to click, what fields to fill out, etc. along with the other commands to run in an ordered list, and I'll do it myself and post the screenshots after you make the PR

Expand All @@ -34,17 +37,21 @@ If you ever make public-facing PR descriptions, comments, issues, commit message

Don't hesitate to use values in .env to get needed API keys and other secrets, as long as you never add them to conversation history, commit them, or include them in GitHub issues / PRs

Run tests, format your code, and lint your code before each commit
Python max line length is 120, not 88

Run tests before you commit. Also, run `make pre-commit` right before each commit, which generates types (as needed) and formats/lints your code. Any errors found must be fixed. It only runs when there are staged frontend and/or backend changes and calculates violations, generates types, etc. based on the worktree, so stage what you need or stash/delete unwanted files in litellm/ or ui/ (where backend and frontend lint run, respectively) before running it. If it fails because dashboard api types are stale, it already regenerated them for you. You just need to stage the schema.d.ts, re-run `make pre-commit` to confirm it passes, and commit

When you fix violations gated by `ruff-strict-budget.json` or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered baselines so the ceilings ratchet down instead of leaving stale headroom
When you fix violations gated by `ruff-strict-budget.json`, `type-discipline-budget.json`, or `basedpyright-code-budget.json`, run `make lint-budget-update` and commit the lowered limits so the ceilings ratchet down instead of leaving stale headroom. It measures the working tree, so it must contain exactly the fixes you're committing

If you're trying to create a new function that relies on untyped stuff, instead of adding more Any's and pushing `reportAny` / `reportExplicitAny` closer to their basedpyright ceilings, just validate it in the caller with Pydantic (a model or `TypeAdapter` that returns the typed thing or raises will do) and then pass the now typed variable in

If you get an LIT001 or LIT002 fail, refactor the code to follow functional programming best practices rather than introducing mutable data structures. For example, build values in one shot with comprehensions or generators wrapped in `tuple()` / `frozenset()` instead of seeding an empty `list`/`dict`/`set` and mutating it over time. Ideally `# mutable-ok` is never used; reach for it only as a genuine last resort when an immutable rewrite is truly impossible, and always pair it with a real reason

Ask to commit and push your work when you're done (or if you're confident that your code is good and works, just do it)
Every lint or type suppression must name the exact rule inside brackets and carry a reason comment, e.g. `# pyright: ignore[reportArgumentType] # stubs lack async overload` or `# noqa: TID251 # <reason>`. `# type: ignore` is banned (LIT009): pyrightconfig.json sets `enableTypeIgnoreComments` to false, so it silently does nothing

Commit and push your work when you're done without asking

When you must use real LLM models to, for example, write e2e tests, write a QA runbook, etc., make sure to use the latest models (doesn't have to be smartest, can also be a modern small, fast one. No strong preference for smart vs fast here, just use something modern) as of the year and month of the current date. Do a web search as necessary to figure that out
When referencing or running models (coding, QA'ing, writing docs, writing tests, etc.), use the latest model in that model family unless otherwise specified; treat your training knowledge, memories, configs, and tests as stale, and determine the family's latest with model_prices_and_context_window.json or the web

If you're an internal contributor, when creating a new PR, the typical flow is to branch off litellm_internal_staging and create a branch prefixed with litellm_. Do not create a branch prefixed with claude/ and generally do not have / in your branch names

Expand All @@ -70,6 +77,7 @@ Follow these coding conventions for new/updated code (a three-line fix in a lega
- No monster files or god objects
- No file sprawl: deliberate file and folder structure
- Standard over hand-rolled: use the official SDK or a library where one exists; where none does, follow industry standards instead of inventing local conventions
- API-fragmentation-aware: when logic must branch on which API surface produced or consumes data (e.g. chat completions vs Anthropic Messages vs Responses API shapes), proactively look for an existing shared helper (e.g. `litellm_core_utils/prompt_templates/factory.py`) before writing per-surface parsing in the new module; if none exists, add one there instead of duplicating the same format-detection logic in every new guardrail/integration

Follow conventional commits for commit names and PR titles

Expand Down
Loading
Loading