kerry
88d1eb3b35
fix(cost): bill cache-read tokens at the input rate when the map has no cache-read rate
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:22:14 +00:00
ryan
4f86035a79
style(ui): format pricing test fixtures with prettier
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:16:28 +00:00
ryan
d197ca20fa
fix(ui): type transformModelData output as ModelData so the dashboard build typechecks
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:13:28 +00:00
kerry-berri
0bd8b7fe02
Merge pull request #41772 from BerriAI/litellm-providers/price-sync-openrouter
...
chore(prices): sync OpenRouter prices: 15 models, 6 deprecated
2026-09-18 09:12:05 -07:00
berriai-litellm-provider-info-sync[bot]
cc0342ac56
chore(prices): sync OpenRouter prices: 15 models, 6 deprecated
...
openrouter/~deepseek/deepseek-pro-latest: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/~deepseek/deepseek-v4-flash-latest: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/~z-ai/glm-latest: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/deepseek/deepseek-v4-flash: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/deepseek/deepseek-v4-pro: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/deepseek/deepseek-v4-pro-0813: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
openrouter/google/gemini-2.5-flash: deprecation_date
openrouter/google/gemini-2.5-flash-image: deprecation_date
openrouter/google/gemini-2.5-flash-lite: deprecation_date
openrouter/google/gemini-2.5-flash:batch: deprecation_date
openrouter/google/gemini-2.5-pro: deprecation_date
openrouter/google/gemini-2.5-pro:batch: deprecation_date
openrouter/meta/muse-glimmer-30b: input_cost_per_token, output_cost_per_token
openrouter/qwen/qwen-plus-2025-07-28: supports_prompt_caching
openrouter/z-ai/glm-5.2: input_cost_per_token, output_cost_per_token, cache_read_input_token_cost
2026-09-18 16:01:00 +00:00
ryan
817cdcef64
test(scim): drop redundant docstring from the valueless entitlements PUT test
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 16:00:54 +00:00
yujonglee
799673d5ba
Merge pull request #41829 from BerriAI/litellm_rust_crate_layering
...
refactor(rust): align crates with Python package layering
2026-09-18 08:55:10 -07:00
ryan
b5070408e7
refactor(ui): move per-second cost formatter to dataUtils and type transformModelData input
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 15:48:56 +00:00
Mateo Wang
861f79797f
Merge pull request #41663 from BerriAI/litellm_remove_legacy_interactions_schema_flag
...
refactor(interactions): remove expired use_legacy_interactions_schema shim
2026-09-18 08:48:30 -07:00
Mateo Wang
48c4204b43
Merge pull request #41658 from BerriAI/litellm_remove_orphaned_use_delete_project_hook
...
chore(ui): remove orphaned useDeleteProject hook and its test
2026-09-18 08:48:05 -07:00
Mateo Wang
444d345d69
Merge pull request #41657 from BerriAI/litellm_remove_dead_use_key_list_hook
...
refactor(ui): remove dead useKeyList hook from key_list.tsx
2026-09-18 08:47:56 -07:00
Mateo Wang
8ff4991583
Merge pull request #41656 from BerriAI/litellm_remove_dead_networking_and_marketplace_helpers
...
refactor(ui): remove dead networking exports and orphaned Claude Code marketplace helpers
2026-09-18 08:47:46 -07:00
Mateo Wang
e9823c6063
Merge pull request #41655 from BerriAI/litellm_remove_unused_access_group_types
...
chore(ui): remove unused access-groups type interfaces
2026-09-18 08:47:34 -07:00
Mateo Wang
c51bd68ef4
Merge pull request #41653 from BerriAI/litellm_remove_dead_role_exports
...
refactor(ui): drop unused rolesAllowedToSeeUsage, viewOnlyRoles and isViewOnlyRole exports
2026-09-18 08:47:25 -07:00
Mateo Wang
57a273b087
Merge pull request #41651 from BerriAI/litellm_cost_tracking_dead_barrel_exports
...
refactor(ui): drop unused cost-tracking barrel re-exports and response types
2026-09-18 08:47:16 -07:00
Mateo Wang
1f0554c80d
Merge pull request #41650 from BerriAI/litellm_remove_dead_create_credential_from_model
...
refactor(ui): remove unused createCredentialFromModel helper and CredentialValues interface
2026-09-18 08:47:08 -07:00
Mateo Wang
1f50923211
Merge pull request #41649 from BerriAI/litellm_remove_dead_compareui_modelselector
...
chore(ui): remove dead compareUI ModelSelector and its test
2026-09-18 08:46:57 -07:00
Mateo Wang
aa9a08959a
Merge pull request #41647 from BerriAI/litellm_remove_unused_newbadge
...
chore(ui): remove unused NewBadge component and its test
2026-09-18 08:46:45 -07:00
ryan
b6410d563b
fix(scim): accept entitlements and roles entries without a value on SCIM user PUT
...
SCIMMultiValuedAttribute required value, so a PUT /scim/v2/Users/{id} that
carried an IdP-specific entitlements entry such as {"groups": [...]} failed
body validation with 422 and the suspend (active: false) never reached
update_user. value is now optional and unknown members are kept, so the
suspend is applied, keys are blocked, and the entries are stored as sent
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 15:46:33 +00:00
Mateo Wang
8183199992
Merge pull request #41646 from BerriAI/litellm_remove_dead_guardrail_config
...
chore(ui): remove never-rendered GuardrailConfig mock component and its test
2026-09-18 08:46:25 -07:00
Mateo Wang
cbfabbd8ab
Merge pull request #41645 from BerriAI/litellm_remove_orphaned_role_styles
...
chore(ui): remove orphaned ROLE_STYLES and RoleStyle from pretty messages view
2026-09-18 08:46:16 -07:00
Mateo Wang
57a59889ac
Merge pull request #41644 from BerriAI/litellm_remove_dead_helplink_helpicon
...
refactor(ui): remove unused HelpLink and HelpIcon components
2026-09-18 08:46:08 -07:00
ryan
0beb2ffb81
Merge remote-tracking branch 'origin/main' into litellm_ui_per_second_video_pricing
2026-09-18 15:45:18 +00:00
ryan-crabbe-berri
4f70b88a1f
Merge pull request #41707 from BerriAI/litellm_jwt_mapping_cache_evict_on_bulk_key_delete
...
fix(proxy): evict jwt key mapping cache on user, team, org, and bulk key deletion
2026-09-18 08:41:31 -07:00
kerry
5f3a86aee5
test(e2e): use TypeAlias over 3.12 type statements in e2e models
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 13:27:14 +00:00
Devin AI
ca405879a2
fix(cohere): set embed v3 context length to 512 tokens
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 13:22:57 +00:00
Devin AI
4fa7b5b50d
Merge remote-tracking branch 'origin/main' into litellm_qwen3_8_omni_flash
2026-09-18 13:22:19 +00:00
kerry
dda7776346
test(e2e): make cost-calculation cases MECE by rate-key ownership with realistic fixtures
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 13:15:29 +00:00
yucheng
8fc74a78bc
fix(proxy): reject blank trusted_proxy_ranges entries before they are dropped
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 11:50:30 +00:00
yucheng
cacd12b87d
fix(proxy): treat a malformed trusted_proxy_ranges entry as an undeclared topology
...
A list with an entry that is not an address or CIDR range no longer switches
the per-source Admin UI sign-in limit on against the direct peer address, so a
typo cannot make a shared ingress address the bucket for every user behind it
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 11:28:35 +00:00
Yuneng Jiang
da3bd9e31c
test(ui): model E2E cleanup failures as values
2026-09-18 04:08:34 -07:00
yucheng
cfdf4fa5dc
fix(proxy): break ties between equivalent login limit overrides deterministically
...
Two spellings of one network share a prefix length, so the exemption wins the tie, then the higher limit, regardless of mapping order
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 10:20:39 +00:00
Yuneng Jiang
c508df64fe
test(e2e): accept common cat descriptions
2026-09-18 03:13:28 -07:00
yucheng
65765d6550
test(proxy): import LoginThrottle under TYPE_CHECKING for the throttle helper annotation
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:57:35 +00:00
yucheng
0da2f5b96c
feat(proxy): round the per-username sign-in allowance down and exempt an address with an override of 0
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:54:54 +00:00
Yuneng Jiang
0d9c5159df
test(e2e): assert config ownership instead of absence from the stored row
...
/config/field/info used to answer from the LiteLLM_Config row, so "the field
400s" proved the row did not carry it. It now answers from the resolved
settings, and the CI stack config declares general_settings.max_parallel_requests,
so the endpoint returns that value and the old assertion could never hold.
The check that /add/allowed_ip writes only what the caller changed moves to
/config/list, which still reports stored_in_db off the row, and the field/info
call now asserts the ownership the endpoint reports: the config file owns the
key, so it reads back as source=config and editable=false.
Verified against a live proxy on an isolated Postgres rather than in CI, where
this check has never run: it waits on protected-environment approval.
2026-09-18 02:53:37 -07:00
Yuneng Jiang
3af44daf6d
test(e2e): cover chat and responses registry gaps
2026-09-18 02:43:22 -07:00
yucheng
b6bb212248
refactor(proxy): raise the sign-in block explicitly and type the empty settings mapping
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:40:05 +00:00
Yuneng Jiang
066cc1883a
test(router): cover legacy lowest TPM selection
2026-09-18 02:39:58 -07:00
ryan
b50265d75f
refactor(keys): freeze the service account route tuple and stamp metadata without seeding mutable literals
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:34:44 +00:00
yassin
f631301cfa
Merge branch 'litellm_usage_key_free_aggregate_split' into litellm_daily_global_spend_table
2026-09-18 09:29:47 +00:00
yassin
efd2b8a3cd
refactor(vault): type the KV read body walk as Mapping[str, object]
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:28:20 +00:00
ryan
e68ea077f1
style(keys): keep rebind-ok reason within the line limit
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:26:29 +00:00
yucheng
fade26b969
feat(proxy): derive the per-username sign-in allowance from the address limit
...
The per-address-and-username allowance is now half the effective address allowance, rounded up, instead of a separate max_failed_login_attempts_per_user setting. A per-address override therefore raises or effectively removes both limits for that address, and no second override table is needed
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:25:34 +00:00
Yuneng Jiang
2f3e4fa724
test(proxy): pass the new pass-through argument to the side-effect dispatcher
...
_apply_general_settings_side_effects grew a fourth argument when the reload
started comparing the resolved pass-through list, and this dispatch test calls
it positionally, so it failed with a TypeError.
2026-09-18 02:17:52 -07:00
ryan
b78793b153
fix(auth): limit team service account route carve-out to /key/generate and /key/update
...
The key_management_routes group also contains /spend/logs, /team/daily/activity
and other routes whose handlers scope non-admin callers by user_id. A userless
service account key would have reached them unscoped, so the route check now
uses a dedicated two-route allowlist
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:16:57 +00:00
shivam
2542b9cfe8
style(keys): fix ruff format and drop comment that restates the call
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:05:10 +00:00
shivam
062e17a7ac
refactor(keys): keep validate_key_team_change permission check on the key's assigned member
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:05:10 +00:00
shivam
a052da6974
feat(keys): let team service account keys use key management endpoints for their own team
...
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-18 09:05:10 +00:00
Yuneng Jiang
460f336d8a
fix(proxy): rebuild pass-through routes whenever the resolved list changes
...
The reload only re-registered pass-through endpoints when the stored row
still carried the key, so deleting the row left the deleted routes serving
traffic until the process restarted.
It now compares the resolved list before and after the row is applied and
rebuilds on any difference, including a deletion that resolves back to the
config file's list or to nothing.
This matches what _apply_retention_settings already does with the retention
values, so the two reload effects no longer disagree about what counts as a
change.
The tests assert the proxy's registry of live pass-through routes, which is
what decides whether a request is routed upstream or falls through to the
auth error, rather than that the registration helper was called.
2026-09-18 02:05:09 -07:00