Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
341 commits
Select commit Hold shift + click to select a range
50a6324
Merge pull request #25904 from stuxf/fix/org-boundary-enforcement
yuneng-berri Apr 17, 2026
32714a4
Merge pull request #25905 from stuxf/fix/metadata-security-controls
yuneng-berri Apr 17, 2026
7c66edb
Merge pull request #25906 from stuxf/fix/ssrf-url-validation
yuneng-berri Apr 17, 2026
bd5f560
Merge pull request #25930 from BerriAI/litellm_xai_grok-4.20-0309-rea…
ishaan-berri Apr 17, 2026
f31d4fa
Merge origin/main into litellm_ishaan_april6
ishaan-berri Apr 17, 2026
a508a96
docs(key_management): add budget_limits param to generate_key_fn docs…
ishaan-berri Apr 17, 2026
665306b
fix(ui): fix TypeScript error - publicPage === true in narrowed false…
ishaan-berri Apr 17, 2026
b2aa186
docs(key_management): add budget_limits param to update_key_fn docstring
ishaan-berri Apr 17, 2026
4423d09
fix(ui): add missing Accordion imports to TeamInfo.tsx
ishaan-berri Apr 17, 2026
8e77f9e
resolving code comments to move helper logic to ```prometheus_helper.…
harish-berri Apr 17, 2026
09e0137
docs(user_management): add budget_limits param to new_user docstring
ishaan-berri Apr 17, 2026
2893301
docs(team_management): add budget_limits and default_team_member_mode…
ishaan-berri Apr 17, 2026
375cfb7
chore: update uv.lock after merging main
ishaan-berri Apr 17, 2026
ab44df2
docs(team_management): add budget_limits and default_team_member_mode…
ishaan-berri Apr 17, 2026
e8461b5
style: run black formatter on files from main merge
ishaan-berri Apr 17, 2026
dd76cc5
docs: add "Copy Page as Markdown" + llms.txt to docs site (#25975)
krrish-berri-2 Apr 17, 2026
77767f5
docs(org_management): add allowed_models param to new_organization do…
ishaan-berri Apr 17, 2026
d369f0a
docs(user_management): add budget_limits param to user_update docstring
ishaan-berri Apr 17, 2026
3aa63d5
style(github_copilot): simplify _get_github_headers return type annot…
ishaan-berri Apr 17, 2026
6ed2929
Merge pull request #25934 from BerriAI/litellm_prometheus_improvements
ishaan-berri Apr 17, 2026
66167f5
[Feature] UI - Settings: add forward_llm_provider_auth_headers toggle
yuneng-berri Apr 17, 2026
d0f1706
[Test] pre-call utils: regression coverage for BYOK x-api-key forwarding
yuneng-berri Apr 17, 2026
ad48af6
[Feature] UI - Models: allow empty api_key for Anthropic provider (BYOK)
yuneng-berri Apr 17, 2026
9a8aa4f
[Feature] UI - Models: add api_base field for Anthropic provider form
yuneng-berri Apr 17, 2026
7eae18d
[Feature] UI - Settings: toggle row for forward_llm_provider_auth_hea…
yuneng-berri Apr 17, 2026
1e25a00
[Docs] BYOK tutorial: document the UI-only configuration path
yuneng-berri Apr 17, 2026
b7aa045
style(github_copilot): shorten __init__ docstring to avoid Black edge…
ishaan-berri Apr 17, 2026
2395a2d
style(prometheus): sync prometheus.py formatting with origin/main
ishaan-berri Apr 17, 2026
9de041f
style(prometheus): sync types/integrations/prometheus.py formatting w…
ishaan-berri Apr 17, 2026
7867497
style(github_copilot): revert authenticator.py to origin/main formatting
ishaan-berri Apr 17, 2026
2808cb9
style(prometheus): apply Black formatting to prometheus.py
ishaan-berri Apr 17, 2026
b4df07a
style(prometheus): apply Black formatting to types/integrations/prome…
ishaan-berri Apr 17, 2026
6636329
fix(proxy): revert budget exceeded error code from 429 to 400
ishaan-berri Apr 17, 2026
574633f
fix(key_delete): exclude budget_limits from deleted verification toke…
ishaan-berri Apr 17, 2026
7b3480a
fix(team_delete): exclude budget_limits and default_team_member_model…
ishaan-berri Apr 17, 2026
7239ed6
fix(schema): add budget_limits Json? to LiteLLM_TeamTable and LiteLLM…
ishaan-berri Apr 17, 2026
b91a6f5
fix(schema): add budget_limits Json? to LiteLLM_TeamTable and LiteLLM…
ishaan-berri Apr 17, 2026
9281147
fix(schema): add budget_limits Json? to LiteLLM_TeamTable and LiteLLM…
ishaan-berri Apr 17, 2026
6a9f8f7
Merge pull request #25972 from BerriAI/litellm_yj_apr16
yuneng-berri Apr 17, 2026
7c47bbd
fix(migration): run schema sanity check after P3009/P3018 idempotent …
ishaan-berri Apr 17, 2026
ee2cf0e
fix: address three CI failures from recent security PR merges
yuneng-berri Apr 17, 2026
33a2cee
fix(proxy-extras): use DIRECT_URL for prisma migrate diff, tempfile f…
ishaan-berri Apr 17, 2026
70456fb
fix(ui): update add_plugin_form tests to match rewritten smart URL form
ishaan-berri Apr 17, 2026
33175a8
fix(proxy-extras): fall back to prisma db execute when migrate diff f…
ishaan-berri Apr 17, 2026
e073fee
fix(ui): rename claude-code-plugins to skills in page_metadata.ts
ishaan-berri Apr 17, 2026
e6a20af
fix(proxy-extras): skip post-deploy sanity check when no migrations p…
ishaan-berri Apr 17, 2026
1c128a8
Merge pull request #25256 from BerriAI/litellm_ishaan_april6
ishaan-berri Apr 17, 2026
779a9fa
feat: add configurable multi-threshold budget alerts for virtual keys
ryan-crabbe-berri Apr 18, 2026
b9f5be8
Merge pull request #25922 from BerriAI/litellm_a2a_agent_acl
yuneng-berri Apr 18, 2026
ea509ec
Run key budget alert check before max-budget enforcement
ryan-crabbe-berri Apr 18, 2026
11c3270
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 18, 2026
8936562
[Fix] Persist default end-user budget_id to DB so budget reset job pi…
krrish-berri-2 Apr 4, 2026
41a719a
feat: add global fallback config, fix no-owner crash, improve email g…
ryan-crabbe-berri Apr 18, 2026
bb9955b
[Fix] Budget reset job now resets implicitly-created end users with N…
krrish-berri-2 Apr 5, 2026
44eb2ea
fix: address Greptile review β€” empty recipients guard, type annotatio…
ryan-crabbe-berri Apr 18, 2026
6fd49f1
fix: enforce project-level model-specific rate limits in parallel_req…
shivamrawat1 Apr 18, 2026
a282ac4
[Fix] Remove unresolved merge conflict markers in bedrock test file
yuneng-berri Apr 18, 2026
0b50a29
Merge pull request #25995 from BerriAI/litellm_fixBedrockTestMergeMar…
yuneng-berri Apr 18, 2026
c1503d3
fix: escape user-controlled greeting in max budget alert email template
ryan-crabbe-berri Apr 18, 2026
fad884e
Merge branch 'litellm_internal_staging' into litellm_persist_default_…
shivamrawat1 Apr 18, 2026
a449fc1
Merge branch 'litellm_internal_staging' into litellm_project_rate_lim…
shivamrawat1 Apr 18, 2026
37765e6
Merge branch 'litellm_internal_staging' into litellm_pages_support_fo…
shivamrawat1 Apr 18, 2026
e8c3340
test: add coverage for get_project_model_rpm/tpm_limit and check_comp…
shivamrawat1 Apr 18, 2026
acb4f89
[Fix] UI - Models: clarify Anthropic api_base label and tooltip to pr…
yuneng-berri Apr 18, 2026
6fe7903
[Fix] UI - Settings: clarify Max-subscription vs BYOK toggle descript…
yuneng-berri Apr 18, 2026
e004876
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 18, 2026
ec564f5
fix: resolve mypy errors in multi-threshold budget alerts
ryan-crabbe-berri Apr 18, 2026
c288777
fix(ui): extra_headers not persisting on MCP server edit
ryan-crabbe-berri Apr 18, 2026
e2e5b63
fix(ui): revert submit guard to allow intentional extra_headers clearing
ryan-crabbe-berri Apr 18, 2026
48fb19b
fix: align test assertion with additive merge semantics
ryan-crabbe-berri Apr 18, 2026
ecf65f5
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 18, 2026
18a5fe5
Merge pull request #25998 from BerriAI/litellm_/wonderful-bouman
yuneng-berri Apr 18, 2026
746d10f
Merge remote-tracking branch 'origin/main' into litellm_chore-migrate…
ryan-crabbe-berri Apr 18, 2026
545db8c
Merge remote-tracking branch 'origin/main' into litellm_chore-migrate…
ryan-crabbe-berri Apr 18, 2026
2a76f10
Merge pull request #25749 from BerriAI/litellm_chore-migrate-guardrai…
ryan-crabbe-berri Apr 18, 2026
55d3229
Merge pull request #25879 from BerriAI/litellm_chore-migrate-router-s…
ryan-crabbe-berri Apr 18, 2026
d042b44
Merge pull request #25929 from BerriAI/litellm_pages_support_for_ocr
ishaan-berri Apr 18, 2026
5c0d0cb
Merge remote-tracking branch 'origin/main' into litellm_feat-add-relo…
ryan-crabbe-berri Apr 18, 2026
319839d
Merge pull request #25494 from jlav/jl/helm-tpl-extra-containers
ishaan-berri Apr 18, 2026
6bf90fb
fix(mypy): cast msg and pending_delta in _promote_message_stop_usage …
ishaan-berri Apr 18, 2026
46a04e2
fix: increment model_per_project TPM counter in async_log_success_event
shivamrawat1 Apr 18, 2026
9c0b73e
[Fix] should_create_missing_views returns False for reltuples=0 (fals…
yuneng-berri Apr 18, 2026
f476447
Merge pull request #25846 from BerriAI/litellm_bedrock_cache_start_ne…
ishaan-berri Apr 18, 2026
d03c301
Merge pull request #25936 from BerriAI/litellm_health-check-reasoning…
ishaan-berri Apr 18, 2026
0d95061
refactor: extract success pipeline ops to fix PLR0915 in parallel_req…
shivamrawat1 Apr 18, 2026
f870095
Merge pull request #25991 from BerriAI/litellm_persist_default_router…
shivamrawat1 Apr 18, 2026
fc35c68
Merge pull request #26003 from BerriAI/litellm_fix-extra-headers-not-…
ryan-crabbe-berri Apr 18, 2026
1c29c5e
chore: bump proxy deps and raise python floor to 3.11
yuneng-berri Apr 18, 2026
2c41f3c
[Fix] UI - Keys: strip empty premium fields from key update payload
yuneng-berri Apr 18, 2026
cae8b74
Fall back to top-level keyData when resolving previous premium value
yuneng-berri Apr 18, 2026
d1e6657
chore: drop stale python_version markers after floor raise
yuneng-berri Apr 18, 2026
9bdb3b1
chore: lower python floor from 3.11 to 3.10
yuneng-berri Apr 18, 2026
f24c8db
chore: bump CircleCI conda envs from python 3.9 to 3.10
yuneng-berri Apr 18, 2026
8e00f61
Merge pull request #26023 from BerriAI/litellm_/eloquent-feistel-b346ec
yuneng-berri Apr 18, 2026
cfdf893
[Fix] Merge prometheus_helpers.py into prometheus_helpers/__init__.py…
yuneng-berri Apr 18, 2026
643e941
Merge pull request #26026 from BerriAI/litellm_fixPrometheusHelpersPa…
yuneng-berri Apr 18, 2026
ec590f9
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 18, 2026
f483f1e
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 18, 2026
dbf4f96
Merge remote-tracking branch 'upstream/litellm_internal_staging' into…
shivamrawat1 Apr 18, 2026
09a524a
fix: narrow CallInfo.max_budget_alert_emails to Dict[str, List[str]]
ryan-crabbe-berri Apr 18, 2026
8b86a3b
fix: normalize alert-email configs at merge boundary
ryan-crabbe-berri Apr 18, 2026
029d9bc
refactor: inline _parse_email_list in auth_checks to drop enterprise dep
ryan-crabbe-berri Apr 18, 2026
b7813aa
fix(mcp): restore PKCE-triggering 401 when no stored per-user token e…
ishaan-berri Apr 18, 2026
0a4b02f
fix: tighten recipient_emails guard to reject empty list
ryan-crabbe-berri Apr 18, 2026
63313bc
Merge pull request #25994 from BerriAI/litellm_project_rate_limiting
yuneng-berri Apr 18, 2026
e690519
Merge pull request #25983 from BerriAI/litellm_yj_apr17
yuneng-berri Apr 18, 2026
85b1b93
Merge pull request #26022 from BerriAI/litellm_/reverent-kirch-7cf0a6
shin-berri Apr 18, 2026
de790fd
chore: update Next.js build artifacts (2026-04-18 21:49 UTC, node v22…
yuneng-berri Apr 18, 2026
ecff06d
Merge pull request #26032 from BerriAI/litellm_mcp_pkce_fix_v2
ishaan-berri Apr 18, 2026
eb6fd98
Merge remote-tracking branch 'origin/main' into litellm_feat-multi_th…
ryan-crabbe-berri Apr 18, 2026
c8b7c1b
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
ryan-crabbe-berri Apr 18, 2026
67bf18d
Merge pull request #25989 from BerriAI/litellm_feat-multi_threshold_b…
ryan-crabbe-berri Apr 18, 2026
9bea02c
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
ryan-crabbe-berri Apr 18, 2026
dd4a1d2
feat: add adaptive routing to litellm
krrish-berri-2 Apr 18, 2026
ba24e4a
remove next env
yuneng-berri Apr 18, 2026
aab3ef8
chore: update Next.js build artifacts (2026-04-18 23:46 UTC, node v22…
yuneng-berri Apr 18, 2026
0278d73
Merge remote-tracking branch 'origin/litellm_internal_staging' into y…
yuneng-berri Apr 18, 2026
4d63a13
bump: version 1.83.9 β†’ 1.83.10
yuneng-berri Apr 19, 2026
e16bd15
Merge pull request #26033 from BerriAI/yj_ui_build_apr18
yuneng-berri Apr 19, 2026
49ba6b8
add uv lock
yuneng-berri Apr 19, 2026
9e77e25
Merge pull request #26038 from BerriAI/yj_bump_apr18
yuneng-berri Apr 19, 2026
2f22a12
bump litellm-proxy-extras to 0.4.67 (#26043)
ishaan-berri Apr 19, 2026
26fcbc9
Merge pull request #26044 from BerriAI/litellm_internal_staging
yuneng-berri Apr 19, 2026
65a60db
[Infra] CI: add UI drift guard + regenerate _experimental/out
cursoragent Apr 19, 2026
004c6b1
[Infra] Dockerfile.non_root: stage pre-built UI from _experimental/out
cursoragent Apr 19, 2026
924fa6a
feat: commit new adaptive routing
krrish-berri-2 Apr 19, 2026
70caf5a
docs: update docs
krrish-berri-2 Apr 19, 2026
78485f5
[Infra] Dockerfile.non_root: remove unused npm from runtime stage
cursoragent Apr 19, 2026
ca52e34
[Infra] Dockerfile.non_root: slim C toolchain in builder stage
cursoragent Apr 19, 2026
e24c02f
[Infra] Dockerfile.non_root: add BuildKit uv cache mount
cursoragent Apr 19, 2026
4c8cbaf
[Refactor] Dockerfile.non_root: drop dead lines and shrink build context
cursoragent Apr 19, 2026
43d23e9
chore: revert UI build artifacts
krrish-berri-2 Apr 20, 2026
dedc219
fix: minor improvements
krrish-berri-2 Apr 20, 2026
3cf0460
chore: revert uv.lock to match main
krrish-berri-2 Apr 20, 2026
f0efc5f
test: cover _finalize_adaptive_router_if_configured
krrish-berri-2 Apr 20, 2026
ea12bae
Merge pull request #25901 from BerriAI/litellm_feat-add-reload-flag-p…
ryan-crabbe-berri Apr 20, 2026
db49885
[Refactor] Dockerfile.non_root: drop UI drift guard approach
yuneng-berri Apr 20, 2026
995bff0
[Fix] Dockerfile.non_root: drop prisma --version sanity call
yuneng-berri Apr 20, 2026
a19bff4
Feature/add audio support for scaleway (#26110)
nhyy244 Apr 20, 2026
24a2e3e
fix: address CI violations for adaptive router
krrish-berri-2 Apr 20, 2026
386f334
Prompt Compression - add it to the proxy (#25729)
krrish-berri-2 Apr 20, 2026
fba736c
fix(adaptive_router): 3 P1 review defects
krrish-berri-2 Apr 20, 2026
4f823ce
Add supported providers to prompt caching doc (#26124)
Michael-RZ-Berri Apr 20, 2026
0cfcec6
fix(adaptive_router/hooks): populate tool_results so failure signal f…
krrish-berri-2 Apr 20, 2026
b6fc75b
Merge branch 'litellm_internal_staging' into litellm_adaptive_routing
krrish-berri-2 Apr 20, 2026
9aee0da
fix: /health/readiness 503 loop when DB is unreachable (#26134)
ishaan-berri Apr 20, 2026
3bae051
[Refactor] revert _experimental/out regeneration; leave to release ru…
yuneng-berri Apr 20, 2026
3745ba2
replace retired claude-3-haiku-20240307 with claude-haiku-4-5-2025100…
ryan-crabbe-berri Apr 20, 2026
353e406
[Refactor] remove orphaned _experimental/out build artifacts
yuneng-berri Apr 20, 2026
505f6e0
[Fix] Apply black formatting to fix CI lint failures
yuneng-berri Apr 20, 2026
7979044
Merge pull request #26140 from BerriAI/litellm_fix_black_formatting
yuneng-berri Apr 20, 2026
d053355
style: apply black formatting
krrish-berri-2 Apr 20, 2026
e99955a
test(adaptive_router/hooks): align stale tests with current hook API
krrish-berri-2 Apr 20, 2026
74169b1
replace retired claude-3-haiku-20240307 with claude-haiku-4-5-2025100…
ryan-crabbe-berri Apr 20, 2026
eee51a9
replace retired claude-3-haiku-20240307 with claude-haiku-4-5-2025100…
ryan-crabbe-berri Apr 20, 2026
bb62099
[Fix] CI - auth_ui_unit_tests: use Postgres sidecar instead of shared DB
yuneng-berri Apr 20, 2026
e7bc316
Litellm krrish staging 04 20 2026 (#26138)
krrish-berri-2 Apr 20, 2026
60d3796
Merge pull request #26139 from BerriAI/litellm_fix-retired-haiku-model
ryan-crabbe-berri Apr 20, 2026
ba82016
Merge pull request #26141 from BerriAI/litellm_/relaxed-moser-92f086
yuneng-berri Apr 20, 2026
0ecc89c
Merge branch 'litellm_internal_staging' into litellm_non-root-dockerf…
yuneng-berri Apr 20, 2026
9deefc0
fix: align MCP broker endpoint access controls with existing auth pat…
yuneng-berri Apr 20, 2026
7b43f59
[Fix] CI: split test_proxy_utils.py into its own proxy-db matrix entry
yuneng-berri Apr 20, 2026
99f007f
refactor: consolidate redirect_uri scheme check into shared handler
yuneng-berri Apr 20, 2026
b6de470
fix: add access control to register endpoint to match authorize and t…
yuneng-berri Apr 21, 2026
b9bedc8
Merge pull request #26055 from BerriAI/litellm_non-root-dockerfile-op…
yuneng-berri Apr 21, 2026
1702b51
Merge pull request #26142 from BerriAI/litellm_mcp_broker_endpoint_auth
yuneng-berri Apr 21, 2026
bcc093d
fix(adaptive_router): enforce satisfaction gate, stop false-flagging …
krrish-berri-2 Apr 21, 2026
bd3ee98
fix(adaptive_router): bound owner cache, drop PK from upsert update, …
krrish-berri-2 Apr 21, 2026
ccf9283
[Infra] Speed up proxy unit tests by replacing litellm reload with st…
yuneng-berri Apr 21, 2026
c770756
fix(bedrock_guardrails): route apply_guardrail to OUTPUT for response…
shivamrawat1 Apr 21, 2026
6beba97
test(bedrock_guardrails): assert apply_guardrail maps response to OUT…
shivamrawat1 Apr 21, 2026
378d80a
Merge branch 'litellm_internal_staging' into litellm_wildcard_order_f…
Sameerlite Apr 21, 2026
5411ebe
[Fix] conftest snapshot: also reset scalar module attributes
yuneng-berri Apr 21, 2026
0f5d503
fix(ci): make e2e_ui_testing actually test the freshly built UI bundle
yuneng-berri Apr 21, 2026
4b3f5d7
[Fix] conftest: flush cache instances and warn on silent skips
yuneng-berri Apr 21, 2026
7656e26
fix: align user and org spend checks with atomic counter pattern
yuneng-berri Apr 21, 2026
c2b7c4b
fix: skip personal budget check in MaxBudgetLimiter for team-key requ…
yuneng-berri Apr 21, 2026
7cc22db
Merge pull request #26047 from BerriAI/litellm_ui-api-double-prefix-a8a3
shin-berri Apr 21, 2026
583bdd3
fix(bedrock): allowlist Bedrock Invoke body fields and filter all ant…
SwiftWinds Apr 21, 2026
6da9ee9
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
SwiftWinds Apr 21, 2026
11b7769
chore: make `uv` newer than 0.10 allowable
SwiftWinds Apr 21, 2026
62c2c55
Merge remote-tracking branch 'upstream/litellm_internal_staging' into…
shivamrawat1 Apr 21, 2026
bb46d36
Merge pull request #26182 from BerriAI/litellm_budget_spend_counter_a…
yuneng-berri Apr 21, 2026
b39f210
[Infra] Add freshness and destructive guards to migration workflow
yuneng-berri Apr 21, 2026
5b007ad
[Docs] Fix docstring inaccuracies in run_migration.py
yuneng-berri Apr 21, 2026
165c503
Merge pull request #26150 from BerriAI/litellm_/serene-bohr-4bb54c
shin-berri Apr 21, 2026
e0cc158
Merge remote-tracking branch 'upstream/litellm_internal_staging' into…
shivamrawat1 Apr 21, 2026
df9d6c7
Merge pull request #26148 from BerriAI/litellm_fix-bedrock-invoke-all…
mateo-berri Apr 21, 2026
e5f3e15
Track per-member total spend on team memberships
ryan-crabbe-berri Apr 21, 2026
a16c00e
[Feature] Proxy: opt-in v2 migration resolver (--use_v2_migration_res…
yuneng-berri Apr 21, 2026
ee550e1
[Test] CI: add v2 migration resolver coverage with local Postgres
yuneng-berri Apr 21, 2026
7752683
Merge pull request #26185 from BerriAI/litellm_/interesting-wright-95…
yuneng-berri Apr 21, 2026
88b1823
[Test] Fix setup_database call-signature assertions for v2 flag
yuneng-berri Apr 21, 2026
8a9457e
style: apply black to litellm/router.py
shivamrawat1 Apr 21, 2026
8a4a775
fix(logging): add litellm_call_id to StandardLoggingPayload and OTel …
ishaan-berri Apr 21, 2026
731c549
[Fix] Docker: restore pre-uv Prisma cache path for /app/.cache mounts
yuneng-berri Apr 21, 2026
9049f37
[Fix] v2 migration resolver: address Greptile review findings
yuneng-berri Apr 21, 2026
1a0ac96
Keep budget_reset_at off the user-settable budget allowlist
ryan-crabbe-berri Apr 21, 2026
a302613
feat(bedrock): add support for bedrock-mantle endpoint (Claude Mythos…
ishaan-berri Apr 21, 2026
ce75504
Docker: drop env overrides from builder, COPY /root/.cache to runtime
yuneng-berri Apr 21, 2026
9a6ddef
fmt: apply black to _types.py
ryan-crabbe-berri Apr 21, 2026
67567d1
Merge branch 'litellm_internal_staging' into litellm_wildcard_order_f…
shivamrawat1 Apr 21, 2026
2b8b950
[Fix] v2 resolver: swallow non-connection DB errors; wrap resolve fai…
yuneng-berri Apr 21, 2026
8d52b1e
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 21, 2026
220a5ac
Merge remote-tracking branch 'origin/litellm_internal_staging' into l…
yuneng-berri Apr 21, 2026
c7342bd
Merge branch 'litellm_internal_staging' into litellm_adaptive_routing
krrish-berri-2 Apr 21, 2026
ecd9a83
fix(adaptive_router): P2 review items β€” @updatedAt + snapshot samples
krrish-berri-2 Apr 21, 2026
93cb065
Merge pull request #26197 from BerriAI/litellm_yj_apr20
yuneng-berri Apr 21, 2026
5dc2926
Merge pull request #26194 from BerriAI/litellm_fix_migration_thrashing
yuneng-berri Apr 21, 2026
f1da202
fix(adaptive_router): P1 flusher hot-reload + P2 hook accumulation + CI
krrish-berri-2 Apr 22, 2026
d9494b6
Merge pull request #26144 from BerriAI/litellm_post_call_non_streaming
yuneng-berri Apr 22, 2026
37fc6f6
fix(adaptive_router/signals): rename 'args' to 'call_args' in _signature
krrish-berri-2 Apr 22, 2026
1965c67
style: black format signals.py
krrish-berri-2 Apr 22, 2026
27a105b
fix: give each team member an independent budget instead of sharing t…
shivamrawat1 Apr 22, 2026
5770af0
Merge branch 'litellm_internal_staging' into litellm_individual-team-…
shivamrawat1 Apr 22, 2026
e50f945
refactor(adaptive_router): move update_queue out of litellm.proxy
krrish-berri-2 Apr 22, 2026
5837d4a
bump: version 1.83.10 β†’ 1.83.11
yuneng-berri Apr 22, 2026
e65d547
adding uv lock
yuneng-berri Apr 22, 2026
e3ed136
Merge pull request #26209 from BerriAI/yj_bump_apr21_2
yuneng-berri Apr 22, 2026
eebb80f
Merge pull request #26208 from BerriAI/litellm_individual-team-member…
yuneng-berri Apr 22, 2026
09cd7e3
Merge pull request #26211 from BerriAI/litellm_internal_staging
shin-berri Apr 22, 2026
e6897f5
add moonshot/kimi-k2.6 to model registry (#26203)
ishaan-berri Apr 22, 2026
0e42d4c
April 21st Ishaan Branch (#26213)
ishaan-berri Apr 22, 2026
439bbd2
[Infra] Clean up unused CCI jobs and pin docker images by digest
yuneng-berri Apr 22, 2026
f490340
[Refactor] Add install_uv reusable command and migrate all call sites
yuneng-berri Apr 22, 2026
344be27
[Refactor] Add start_postgres reusable command and migrate call sites
yuneng-berri Apr 22, 2026
0a65d2c
[Infra] Standardize default Python to 3.12 and remove miniconda setup
yuneng-berri Apr 22, 2026
61fd4e9
[Infra] CCI config cleanup β€” dead step, filter dupe, cache keys, mach…
yuneng-berri Apr 22, 2026
24aec61
Merge pull request #26049 from BerriAI/litellm_adaptive_routing
yuneng-berri Apr 22, 2026
fc4fe34
Merge pull request #26201 from BerriAI/litellm_prismaCacheRuntime
yuneng-berri Apr 22, 2026
c95cac5
Merge pull request #26226 from BerriAI/litellm_/stoic-shamir-0ab13f
shin-berri Apr 22, 2026
ec73507
fix(proxy): reapply Bedrock guardrail spend logging (#25854)
milan-berri Apr 22, 2026
9577d87
fix(proxy): guardrail header dedupe, mypy during_call, test mock kwargs
milan-berri Apr 22, 2026
1b74c35
[Infra] Move non-API-key CCI jobs to GitHub Actions
yuneng-berri Apr 22, 2026
5445297
[Fix] Stabilize flaky spend accuracy tests with local ground truth
yuneng-berri Apr 22, 2026
288d403
[Fix] Preserve in-memory spend updates when Redis rpush fails
yuneng-berri Apr 22, 2026
3df9780
fix(core_helpers): make redact_nested_match_and_regex_keys iterative
milan-berri Apr 22, 2026
3f42295
[Fix] Satisfy mypy on spend buffer restore helper
yuneng-berri Apr 22, 2026
41145e2
Merge pull request #26266 from BerriAI/litellm_bedrock_guardrail_spen…
yuneng-berri Apr 22, 2026
8340f6f
Merge pull request #26261 from BerriAI/litellm_code_quality_to_gha
shin-berri Apr 22, 2026
b6fdd46
Merge pull request #26270 from BerriAI/litellm_/lucid-kowalevski-de832f
shin-berri Apr 22, 2026
fb39683
Merge pull request #25772 from BerriAI/litellm_wildcard_order_fallback
yuneng-berri Apr 22, 2026
a292845
[Fix] Harden spend accuracy test against transient aiohttp connection…
yuneng-berri Apr 23, 2026
c67d193
fix(docker.non_root): use numeric UID 65534 for K8s runAsNonRoot (#26…
michelligabriele Apr 23, 2026
c4c1861
Merge pull request #26195 from BerriAI/litellm_team_member_total_spend
ryan-crabbe-berri Apr 23, 2026
3ddb3cb
bump: version 0.4.67 β†’ 0.4.68
yuneng-berri Apr 23, 2026
9f46d83
bump: version 1.83.11 β†’ 1.83.12
yuneng-berri Apr 23, 2026
95fa767
uv lock
yuneng-berri Apr 23, 2026
8bc6948
Merge pull request #26290 from BerriAI/litellm_/bold-goldstine-b86b67
yuneng-berri Apr 23, 2026
6a25866
Merge pull request #26295 from BerriAI/yj_bump_apr22
yuneng-berri Apr 23, 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
  •  
  •  
  •  
1,193 changes: 254 additions & 939 deletions .circleci/config.yml

Large diffs are not rendered by default.

40 changes: 31 additions & 9 deletions .github/scripts/close_duplicate_issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ def gh(*args: str) -> str:
def fetch_open_issues(repo: str | None) -> list[dict]:
"""Fetch all open issues (excluding PRs) via gh api --paginate."""
if repo:
endpoint = f"repos/{repo}/issues?state=open&per_page=100&sort=created&direction=asc"
endpoint = (
f"repos/{repo}/issues?state=open&per_page=100&sort=created&direction=asc"
)
else:
endpoint = "repos/{owner}/{repo}/issues?state=open&per_page=100&sort=created&direction=asc"
cmd = ["api", "--paginate", endpoint]
Expand Down Expand Up @@ -71,7 +73,9 @@ def close_as_duplicate(
repo_args = ["--repo", repo] if repo else []

if dry_run:
print(f" [DRY RUN] Would close #{issue_number} as duplicate of #{duplicate_of}")
print(
f" [DRY RUN] Would close #{issue_number} as duplicate of #{duplicate_of}"
)
return

# Add comment
Expand Down Expand Up @@ -115,7 +119,9 @@ def find_duplicate(
return None


def scan_all(issues: list[dict], threshold: float, repo: str | None, dry_run: bool) -> int:
def scan_all(
issues: list[dict], threshold: float, repo: str | None, dry_run: bool
) -> int:
"""Compare every issue against all older issues. Returns count of duplicates found."""
# Sort oldest first
issues.sort(key=lambda i: i["number"])
Expand Down Expand Up @@ -144,7 +150,11 @@ def scan_all(issues: list[dict], threshold: float, repo: str | None, dry_run: bo


def check_single(
issue_number: int, issues: list[dict], threshold: float, repo: str | None, dry_run: bool
issue_number: int,
issues: list[dict],
threshold: float,
repo: str | None,
dry_run: bool,
) -> bool:
"""Check a single issue against all older open issues. Returns True if duplicate found."""
target = None
Expand Down Expand Up @@ -178,13 +188,23 @@ def check_single(


def main() -> None:
parser = argparse.ArgumentParser(description="Detect and close duplicate GitHub issues")
parser = argparse.ArgumentParser(
description="Detect and close duplicate GitHub issues"
)
mode = parser.add_mutually_exclusive_group(required=True)
mode.add_argument("--scan", action="store_true", help="Scan all open issues")
mode.add_argument("--issue-number", type=int, help="Check a single issue number")
parser.add_argument("--threshold", type=float, default=0.85, help="Similarity threshold (0-1)")
parser.add_argument("--close", action="store_true", help="Actually close duplicates (default is dry-run)")
parser.add_argument("--repo", type=str, help="Repository (owner/repo). Auto-detected if omitted.")
parser.add_argument(
"--threshold", type=float, default=0.85, help="Similarity threshold (0-1)"
)
parser.add_argument(
"--close",
action="store_true",
help="Actually close duplicates (default is dry-run)",
)
parser.add_argument(
"--repo", type=str, help="Repository (owner/repo). Auto-detected if omitted."
)
args = parser.parse_args()

dry_run = not args.close
Expand All @@ -200,7 +220,9 @@ def main() -> None:
count = scan_all(issues, args.threshold, args.repo, dry_run)
print(f"\nTotal duplicates {'found' if dry_run else 'closed'}: {count}")
else:
found = check_single(args.issue_number, issues, args.threshold, args.repo, dry_run)
found = check_single(
args.issue_number, issues, args.threshold, args.repo, dry_run
)
sys.exit(0 if found else 0) # Always exit 0; finding no dup is not an error


Expand Down
20 changes: 14 additions & 6 deletions .github/scripts/scan_keywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,13 @@ def send_webhook(webhook_url: str, payload: dict) -> None:
def _excerpt(text: str, max_len: int = 400) -> str:
if not text:
return ""

# Keep original formatting
if len(text) <= max_len:
return text
return text[: max_len - 1] + "…"



def main() -> int:
event = read_event_payload()
if not event:
Expand All @@ -87,8 +86,19 @@ def main() -> int:

# Keywords from env or defaults
keywords_env = os.environ.get("KEYWORDS", "")
default_keywords = ["azure", "openai", "bedrock", "vertexai", "vertex ai", "anthropic"]
keywords = [k.strip() for k in keywords_env.split(",")] if keywords_env else default_keywords
default_keywords = [
"azure",
"openai",
"bedrock",
"vertexai",
"vertex ai",
"anthropic",
]
keywords = (
[k.strip() for k in keywords_env.split(",")]
if keywords_env
else default_keywords
)

matches = detect_keywords(combined_text, keywords)
found = bool(matches)
Expand Down Expand Up @@ -129,5 +139,3 @@ def main() -> int:

if __name__ == "__main__":
raise SystemExit(main())


136 changes: 136 additions & 0 deletions .github/workflows/test-code-quality.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
name: Code Quality Checks

on:
pull_request:
branches:
- main
- litellm_internal_staging
- litellm_oss_branch
- "litellm_**"

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
code-quality:
runs-on: ubuntu-latest
timeout-minutes: 15

steps:
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false

- name: Checkout litellm-docs (for documentation_tests)
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
repository: BerriAI/litellm-docs
path: _litellm_docs_checkout
persist-credentials: false

- name: Wire up docs path expected by documentation_tests/*
run: |
# documentation_tests scripts read from docs/my-website/docs/...
# In litellm-docs the same files live at docs/... (repo root).
# Point docs/my-website -> litellm-docs checkout so the paths resolve.
rm -rf docs/my-website
ln -s ../_litellm_docs_checkout docs/my-website

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12"

- name: Set up uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "0.10.9"

- name: Cache uv dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
~/.cache/uv
.venv
key: ${{ runner.os }}-uv-${{ hashFiles('uv.lock') }}
restore-keys: |
${{ runner.os }}-uv-

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

- name: check_licenses
run: uv run --no-sync python ./tests/code_coverage_tests/check_licenses.py

- name: check_provider_folders_documented
run: uv run --no-sync python ./tests/code_coverage_tests/check_provider_folders_documented.py

- name: router_code_coverage
run: uv run --no-sync python ./tests/code_coverage_tests/router_code_coverage.py

- name: test_chat_completion_imports
run: uv run --no-sync python ./tests/code_coverage_tests/test_chat_completion_imports.py

- name: info_log_check
run: uv run --no-sync python ./tests/code_coverage_tests/info_log_check.py

- name: check_guardrail_apply_decorator
run: uv run --no-sync python ./tests/code_coverage_tests/check_guardrail_apply_decorator.py

- name: test_ban_set_verbose
run: uv run --no-sync python ./tests/code_coverage_tests/test_ban_set_verbose.py

- name: code_qa_check_tests
run: uv run --no-sync python ./tests/code_coverage_tests/code_qa_check_tests.py

- name: check_get_model_cost_key_performance
run: uv run --no-sync python ./tests/code_coverage_tests/check_get_model_cost_key_performance.py

- name: test_proxy_types_import
run: uv run --no-sync python ./tests/code_coverage_tests/test_proxy_types_import.py

- name: callback_manager_test
run: uv run --no-sync python ./tests/code_coverage_tests/callback_manager_test.py

- name: recursive_detector
run: uv run --no-sync python ./tests/code_coverage_tests/recursive_detector.py

- name: test_router_strategy_async
run: uv run --no-sync python ./tests/code_coverage_tests/test_router_strategy_async.py

- name: litellm_logging_code_coverage
run: uv run --no-sync python ./tests/code_coverage_tests/litellm_logging_code_coverage.py

- name: ensure_async_clients_test
run: uv run --no-sync python ./tests/code_coverage_tests/ensure_async_clients_test.py

- name: enforce_llms_folder_style
run: uv run --no-sync python ./tests/code_coverage_tests/enforce_llms_folder_style.py

- name: prevent_key_leaks_in_exceptions
run: uv run --no-sync python ./tests/code_coverage_tests/prevent_key_leaks_in_exceptions.py

- name: check_unsafe_enterprise_import
run: uv run --no-sync python ./tests/code_coverage_tests/check_unsafe_enterprise_import.py

- name: ban_copy_deepcopy_kwargs
run: uv run --no-sync python ./tests/code_coverage_tests/ban_copy_deepcopy_kwargs.py

- name: check_fastuuid_usage
run: uv run --no-sync python ./tests/code_coverage_tests/check_fastuuid_usage.py

- name: memory_test
run: uv run --no-sync python ./tests/code_coverage_tests/memory_test.py

- name: documentation_test_env_keys
run: uv run --no-sync python ./tests/documentation_tests/test_env_keys.py

- name: documentation_test_router_settings
run: uv run --no-sync python ./tests/documentation_tests/test_router_settings.py

- name: documentation_test_api_docs
run: uv run --no-sync python ./tests/documentation_tests/test_api_docs.py
39 changes: 39 additions & 0 deletions .github/workflows/test-semgrep.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Semgrep

on:
pull_request:
branches:
- main
- litellm_internal_staging
- litellm_oss_branch
- "litellm_**"

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
semgrep:
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.12"

- name: Set up uv
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
with:
version: "0.10.9"

- name: Run Semgrep (custom rules)
run: uv tool run --from 'semgrep==1.157.0' semgrep scan --config .semgrep/rules . --error
9 changes: 8 additions & 1 deletion .github/workflows/test-unit-proxy-db.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,15 @@ jobs:
test-path: "tests/proxy_unit_tests/test_auth_checks.py tests/proxy_unit_tests/test_user_api_key_auth.py"
workers: 8
timeout: 20
# test_proxy_utils.py is large (168+ parametrized tests) β€” run it on its
# own matrix so --dist=loadscope doesn't pin all of it to a single xdist
# worker and push the "remaining" group past the job timeout.
- test-group: proxy-utils
test-path: "tests/proxy_unit_tests/test_proxy_utils.py"
workers: 8
timeout: 20
- test-group: remaining
test-path: "tests/proxy_unit_tests --ignore=tests/proxy_unit_tests/test_key_generate_prisma.py --ignore=tests/proxy_unit_tests/test_auth_checks.py --ignore=tests/proxy_unit_tests/test_user_api_key_auth.py"
test-path: "tests/proxy_unit_tests --ignore=tests/proxy_unit_tests/test_key_generate_prisma.py --ignore=tests/proxy_unit_tests/test_auth_checks.py --ignore=tests/proxy_unit_tests/test_user_api_key_auth.py --ignore=tests/proxy_unit_tests/test_proxy_utils.py"
workers: 8
timeout: 30
uses: ./.github/workflows/_test-unit-services-base.yml
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ LiteLLM is a unified interface for 100+ LLM providers with two main components:
- When wiring a new UI entity type to an existing backend endpoint, verify the backend API contract (single value vs. array, required vs. optional params) and ensure the UI controls match β€” e.g., use a single-select dropdown when the backend accepts a single value, not a multi-select

### UI Component Library
- **Always use `antd` for new UI components** β€” we are migrating off of `@tremor/react`. Do not introduce new `Badge`, `Text`, `Card`, `Grid`, `Title`, or other imports from `@tremor/react` in any new or modified file. Use `antd` equivalents: `Tag` for labels, plain `<span>`/`<div>` with Tailwind classes (or `Typography.Text`) for text, `Card` from `antd`, etc. Note that `antd` has no `"yellow"` Tag color β€” use `"gold"` for amber/yellow.
- **Always use `antd` for new UI components** β€” we are migrating off of `@tremor/react`. Do not introduce new `Badge`, `Text`, `Card`, `Grid`, `Title`, or other imports from `@tremor/react` in any new or modified file. Use `antd` equivalents: `Tag` for labels, `Typography.Text` / `Typography.Title` / `Typography.Paragraph` for textual content (avoid plain text-only `<span>`, `<p>`, `<h*>` when Typography fits), and `Card` from `antd`. Note that `antd` has no `"yellow"` Tag color β€” use `"gold"` for amber/yellow.

### MCP OAuth / OpenAPI Transport Mapping
- `TRANSPORT.OPENAPI` is a UI-only concept. The backend only accepts `"http"`, `"sse"`, or `"stdio"`. Always map it to `"http"` before any API call (including pre-OAuth temp-session calls).
Expand Down
13 changes: 7 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,8 @@ RUN apk add --no-cache \
npm \
libsndfile

ENV PRISMA_BINARY_CACHE_DIR=/app/.cache/prisma-python/binaries \
UV_PROJECT_ENVIRONMENT=/app/.venv \
ENV UV_PROJECT_ENVIRONMENT=/app/.venv \
UV_LINK_MODE=copy \
XDG_CACHE_HOME=/app/.cache \
PATH="/app/.venv/bin:${PATH}"

# Copy dependency metadata first for layer caching
Expand Down Expand Up @@ -94,11 +92,14 @@ RUN apk add --no-cache bash openssl tzdata nodejs npm python3 libsndfile supervi
{ apk del --no-cache npm 2>/dev/null || true; }

WORKDIR /app
ENV PRISMA_BINARY_CACHE_DIR=/app/.cache/prisma-python/binaries \
XDG_CACHE_HOME=/app/.cache \
PATH="/app/.venv/bin:${PATH}"
ENV PATH="/app/.venv/bin:${PATH}"

COPY --from=builder /app /app
# Prisma binaries live in $HOME/.cache (default prisma-python location),
# which is /root/.cache here. Copy them from the builder so they survive
# deployments that volume-mount /app/.cache (e.g. readOnlyRootFilesystem
# + emptyDir) β€” otherwise the mount would shadow the baked-in query engine.
COPY --from=builder /root/.cache /root/.cache

RUN find /app/.venv -type f -path "*/tornado/test/*" -delete && \
find /app/.venv -type d -path "*/tornado/test" -delete
Expand Down
Loading
Loading