Chesars
303dd6b8f6
chore: remove orphaned pyproject include for model_prices JSON
...
The include directive for litellm/model_prices_and_context_window.json
was added in c91b44adeb as a follow-up to 62df632 (which had moved the
JSON to .gitignore). Since 62df632 is now reverted, the JSON is tracked
again and uv_build packages it normally — the include is dead code.
It was also using Poetry-style syntax under [project] (a PEP 621
section), so uv_build silently ignored it anyway, as flagged by review.
2026-04-25 17:59:02 -03:00
Cesar Garcia
ed1c4e7295
Merge pull request #26521 from BerriAI/litellm_docs_tweaks
...
Merge readme logo update into litellm_staging_03_21_2026
2026-04-25 17:50:29 -03:00
michelligabriele
db8ef44323
fix(key_management): enforce upperbound_key_generate_params on /key/regenerate ( #26340 )
2026-04-25 13:49:00 -07:00
Chesars
6d6c78e77b
fix(lint): drop unused import, suppress PLR0915 on batch_embeddings
...
- F401: _is_multimodal_input was orphaned by an earlier helper extraction
(b038c0714c ) — remove the dead import.
- PLR0915: batch_embeddings is 51 statements (limit 50), one over the
threshold. Suppress with # noqa, matching the existing convention used
in utils.py, cost_calculator.py, and get_llm_provider_logic.py.
2026-04-25 17:44:26 -03:00
Chesars
f74d06d8e5
chore: align _experimental/out UI build with internal_staging
...
The revert of 62df632 restored an older Next.js build state. Many of
those build artifacts were not in internal_staging, so they survived
the merge as pure additions, polluting the PR diff with ~140 generated
files. Realigning to internal_staging's build keeps the PR focused on
real code changes.
2026-04-25 17:44:13 -03:00
yuneng-jiang
7705cb39f2
Merge pull request #26512 from BerriAI/litellm_rag_credential_precedence
...
[Fix] bind RAG ingestion config to stored credential values
2026-04-25 13:43:13 -07:00
Ryan Crabbe
9d71ad4796
[Feat] Add "My User" tab to team info page
...
Adds a new "My User" tab on the team detail page (between Overview and
Virtual Keys) so non-admin team members can see their own spend, budget,
budget reset date, rate limits, model scope, and team role.
Backend
- New `GET /team/{team_id}/members/me` endpoint that resolves the caller
from the API key and returns only their own LiteLLM_TeamMembership row
plus minimal team context (alias, role, email). Returns 404 if the
caller is not a member of the team. Avoids exposing other members'
data, which would happen if we filtered `/team/info` client-side.
- New `TeamMemberInfoResponse` Pydantic model.
Frontend
- New `MyUserTab` component (antd) — read-only summary cards.
- New `teamMemberMeCall` helper in networking.tsx.
- Tab is visible to all team members (including non-admins).
2026-04-25 13:42:51 -07:00
Chesars
91a4d34990
style: black-format batch_embed_content_transformation.py
...
CI flagged this file as needing reformat after the merge resolution.
2026-04-25 17:31:56 -03:00
Cesar Garcia
2255f7651f
Merge pull request #26519 from BerriAI/litellm_internal_staging
...
Sync litellm_staging_03_21_2026 with litellm_internal_staging
2026-04-25 17:29:44 -03:00
Chesars
232464e151
test: drop incorrect openrouter native-prefix test
...
The removed test asserted that get_llm_provider(model="openrouter/auto")
should return model="openrouter/auto" with the prefix preserved. That
contract is wrong: the LiteLLM convention strips one "openrouter/" prefix,
so a native OpenRouter model is reached via "openrouter/openrouter/auto"
(double-prefix) which the wire send as "openrouter/auto" — the ID the
OpenRouter API expects for natives. E2E checks against api.openrouter.ai
confirm this is the correct routing convention for all native models
(auto, bodybuilder, free, pareto-code).
2026-04-25 17:25:49 -03:00
ryan-crabbe-berri
9f60b751e1
Merge pull request #26338 from BerriAI/litellm_feat-mcp-server-alias-permissions
...
feat(mcp): resolve team/key MCP permissions by name or alias
2026-04-25 13:22:04 -07:00
Chesars
91e78eca3d
Merge remote-tracking branch 'upstream/litellm_internal_staging' into upstream-litellm_staging_03_21_2026
...
# Conflicts:
# .circleci/config.yml
# .circleci/requirements.txt
# .github/workflows/_test-unit-base.yml
# .github/workflows/_test-unit-services-base.yml
# .github/workflows/auto_update_price_and_context_window.yml
# .github/workflows/create-release.yml
# .github/workflows/llm-translation-testing.yml
# .github/workflows/publish_to_pypi.yml
# .github/workflows/scan_duplicate_issues.yml
# .github/workflows/test-linting.yml
# .github/workflows/test-litellm-matrix.yml
# .github/workflows/test-litellm.yml
# .github/workflows/test-mcp.yml
# .github/workflows/test-model-map.yaml
# .github/workflows/test-proxy-e2e-azure-batches.yml
# .github/workflows/test-unit-core-utils.yml
# .github/workflows/test-unit-documentation.yml
# .github/workflows/test-unit-enterprise-routing.yml
# .github/workflows/test-unit-integrations.yml
# .github/workflows/test-unit-llm-providers.yml
# .github/workflows/test-unit-misc.yml
# .github/workflows/test-unit-proxy-auth.yml
# .github/workflows/test-unit-proxy-db.yml
# .github/workflows/test-unit-proxy-endpoints.yml
# .github/workflows/test-unit-proxy-infra.yml
# .github/workflows/test-unit-proxy-legacy.yml
# .github/workflows/test-unit-responses-caching-types.yml
# .github/workflows/test-unit-security.yml
# .github/workflows/test_server_root_path.yml
# docs/my-website/docs/embedding/supported_embedding.md
# litellm/litellm_core_utils/get_llm_provider_logic.py
# litellm/llms/vertex_ai/gemini_embeddings/batch_embed_content_transformation.py
# litellm/proxy/_experimental/out/404/index.html
# litellm/proxy/_experimental/out/__next.__PAGE__.txt
# litellm/proxy/_experimental/out/__next._full.txt
# litellm/proxy/_experimental/out/__next._head.txt
# litellm/proxy/_experimental/out/__next._index.txt
# litellm/proxy/_experimental/out/__next._tree.txt
# litellm/proxy/_experimental/out/_next/static/3qyC5Vtvhd5fSC6sPp1iW/_buildManifest.js
# litellm/proxy/_experimental/out/_next/static/3qyC5Vtvhd5fSC6sPp1iW/_clientMiddlewareManifest.json
# litellm/proxy/_experimental/out/_next/static/3qyC5Vtvhd5fSC6sPp1iW/_ssgManifest.js
# litellm/proxy/_experimental/out/_next/static/aKKihXXKRJWLQThZgi8Rq/_buildManifest.js
# litellm/proxy/_experimental/out/_next/static/aKKihXXKRJWLQThZgi8Rq/_clientMiddlewareManifest.json
# litellm/proxy/_experimental/out/_next/static/aKKihXXKRJWLQThZgi8Rq/_ssgManifest.js
# litellm/proxy/_experimental/out/_next/static/bmMTxs1O5fQKYcsMNTRMT/_buildManifest.js
# litellm/proxy/_experimental/out/_next/static/bmMTxs1O5fQKYcsMNTRMT/_clientMiddlewareManifest.json
# litellm/proxy/_experimental/out/_next/static/bmMTxs1O5fQKYcsMNTRMT/_ssgManifest.js
# litellm/proxy/_experimental/out/_next/static/chunks/11362340846735c3.js
# litellm/proxy/_experimental/out/_next/static/chunks/1a04d31843c96649.js
# litellm/proxy/_experimental/out/_next/static/chunks/342c7d7210247a5e.js
# litellm/proxy/_experimental/out/_next/static/chunks/39768ec0eebd2554.js
# litellm/proxy/_experimental/out/_next/static/chunks/3b3c0b070b14da06.js
# litellm/proxy/_experimental/out/_next/static/chunks/3bddc72a3ecc2253.js
# litellm/proxy/_experimental/out/_next/static/chunks/4472ece1be7379b3.js
# litellm/proxy/_experimental/out/_next/static/chunks/54e29148cb2f2582.js
# litellm/proxy/_experimental/out/_next/static/chunks/67ddb5107368a659.js
# litellm/proxy/_experimental/out/_next/static/chunks/6a167cef4b09b496.js
# litellm/proxy/_experimental/out/_next/static/chunks/7174130ddef406dd.js
# litellm/proxy/_experimental/out/_next/static/chunks/7c36bfe1ba5e3ba8.js
# litellm/proxy/_experimental/out/_next/static/chunks/7e5fe5584502da06.js
# litellm/proxy/_experimental/out/_next/static/chunks/8dda507c226082ca.js
# litellm/proxy/_experimental/out/_next/static/chunks/8dfde809dc4ad794.js
# litellm/proxy/_experimental/out/_next/static/chunks/99109c78121231a0.js
# litellm/proxy/_experimental/out/_next/static/chunks/9dd55e1f36a7225c.js
# litellm/proxy/_experimental/out/_next/static/chunks/a230559fcabaea23.js
# litellm/proxy/_experimental/out/_next/static/chunks/a6c7f80b3968f639.js
# litellm/proxy/_experimental/out/_next/static/chunks/ac9e96d21c200b48.js
# litellm/proxy/_experimental/out/_next/static/chunks/ae9cf43b8c0c76aa.js
# litellm/proxy/_experimental/out/_next/static/chunks/cf06797ce4e438f9.js
# litellm/proxy/_experimental/out/_next/static/chunks/d069df5baead6d90.js
# litellm/proxy/_experimental/out/_next/static/chunks/d2e3b7dd6499c245.js
# litellm/proxy/_experimental/out/_next/static/chunks/d44e73d8ebac5747.js
# litellm/proxy/_experimental/out/_next/static/chunks/dc8a270fee94ced6.js
# litellm/proxy/_experimental/out/_next/static/chunks/df6546cd8a44d3b3.js
# litellm/proxy/_experimental/out/_next/static/chunks/ea0f22bd4b3393bd.js
# litellm/proxy/_experimental/out/_next/static/chunks/eaa9f9b9bb3e054b.js
# litellm/proxy/_experimental/out/_next/static/chunks/turbopack-901b35f89c1f6751.js
# litellm/proxy/_experimental/out/_next/static/chunks/turbopack-d1b22f5e0bd58c57.js
# litellm/proxy/_experimental/out/_next/static/chunks/turbopack-ddedb29a5eb0118f.js
# litellm/proxy/_experimental/out/_not-found.txt
# litellm/proxy/_experimental/out/_not-found/__next._full.txt
# litellm/proxy/_experimental/out/_not-found/__next._head.txt
# litellm/proxy/_experimental/out/_not-found/__next._index.txt
# litellm/proxy/_experimental/out/_not-found/__next._not-found.__PAGE__.txt
# litellm/proxy/_experimental/out/_not-found/__next._not-found.txt
# litellm/proxy/_experimental/out/_not-found/__next._tree.txt
# litellm/proxy/_experimental/out/_not-found/index.html
# litellm/proxy/_experimental/out/api-reference.html
# litellm/proxy/_experimental/out/api-reference.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.__PAGE__.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.api-reference.txt
# litellm/proxy/_experimental/out/api-reference/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/api-reference/__next._full.txt
# litellm/proxy/_experimental/out/api-reference/__next._head.txt
# litellm/proxy/_experimental/out/api-reference/__next._index.txt
# litellm/proxy/_experimental/out/api-reference/__next._tree.txt
# litellm/proxy/_experimental/out/chat.html
# litellm/proxy/_experimental/out/chat.txt
# litellm/proxy/_experimental/out/chat/__next._full.txt
# litellm/proxy/_experimental/out/chat/__next._head.txt
# litellm/proxy/_experimental/out/chat/__next._index.txt
# litellm/proxy/_experimental/out/chat/__next._tree.txt
# litellm/proxy/_experimental/out/chat/__next.chat.__PAGE__.txt
# litellm/proxy/_experimental/out/chat/__next.chat.txt
# litellm/proxy/_experimental/out/experimental/api-playground.html
# litellm/proxy/_experimental/out/experimental/api-playground.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.api-playground.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.api-playground.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._full.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._head.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._index.txt
# litellm/proxy/_experimental/out/experimental/api-playground/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/budgets.html
# litellm/proxy/_experimental/out/experimental/budgets.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.budgets.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.budgets.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._full.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._head.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._index.txt
# litellm/proxy/_experimental/out/experimental/budgets/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/caching.html
# litellm/proxy/_experimental/out/experimental/caching.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.caching.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.caching.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/caching/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._full.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._head.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._index.txt
# litellm/proxy/_experimental/out/experimental/caching/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins.html
# litellm/proxy/_experimental/out/experimental/claude-code-plugins.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.claude-code-plugins.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.claude-code-plugins.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._full.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._head.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._index.txt
# litellm/proxy/_experimental/out/experimental/claude-code-plugins/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/old-usage.html
# litellm/proxy/_experimental/out/experimental/old-usage.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.old-usage.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.old-usage.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._full.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._head.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._index.txt
# litellm/proxy/_experimental/out/experimental/old-usage/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/prompts.html
# litellm/proxy/_experimental/out/experimental/prompts.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.prompts.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.prompts.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._full.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._head.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._index.txt
# litellm/proxy/_experimental/out/experimental/prompts/__next._tree.txt
# litellm/proxy/_experimental/out/experimental/tag-management.html
# litellm/proxy/_experimental/out/experimental/tag-management.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.tag-management.__PAGE__.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.tag-management.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.experimental.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._full.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._head.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._index.txt
# litellm/proxy/_experimental/out/experimental/tag-management/__next._tree.txt
# litellm/proxy/_experimental/out/guardrails.html
# litellm/proxy/_experimental/out/guardrails.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.guardrails.txt
# litellm/proxy/_experimental/out/guardrails/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/guardrails/__next._full.txt
# litellm/proxy/_experimental/out/guardrails/__next._head.txt
# litellm/proxy/_experimental/out/guardrails/__next._index.txt
# litellm/proxy/_experimental/out/guardrails/__next._tree.txt
# litellm/proxy/_experimental/out/index.html
# litellm/proxy/_experimental/out/index.txt
# litellm/proxy/_experimental/out/login.html
# litellm/proxy/_experimental/out/login.txt
# litellm/proxy/_experimental/out/login/__next._full.txt
# litellm/proxy/_experimental/out/login/__next._head.txt
# litellm/proxy/_experimental/out/login/__next._index.txt
# litellm/proxy/_experimental/out/login/__next._tree.txt
# litellm/proxy/_experimental/out/login/__next.login.__PAGE__.txt
# litellm/proxy/_experimental/out/login/__next.login.txt
# litellm/proxy/_experimental/out/logs.html
# litellm/proxy/_experimental/out/logs.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.logs.txt
# litellm/proxy/_experimental/out/logs/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/logs/__next._full.txt
# litellm/proxy/_experimental/out/logs/__next._head.txt
# litellm/proxy/_experimental/out/logs/__next._index.txt
# litellm/proxy/_experimental/out/logs/__next._tree.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._full.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._head.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._index.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next._tree.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.__PAGE__.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.callback.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.oauth.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/__next.mcp.txt
# litellm/proxy/_experimental/out/mcp/oauth/callback/index.html
# litellm/proxy/_experimental/out/model-hub.html
# litellm/proxy/_experimental/out/model-hub.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.model-hub.__PAGE__.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.model-hub.txt
# litellm/proxy/_experimental/out/model-hub/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/model-hub/__next._full.txt
# litellm/proxy/_experimental/out/model-hub/__next._head.txt
# litellm/proxy/_experimental/out/model-hub/__next._index.txt
# litellm/proxy/_experimental/out/model-hub/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub.html
# litellm/proxy/_experimental/out/model_hub.txt
# litellm/proxy/_experimental/out/model_hub/__next._full.txt
# litellm/proxy/_experimental/out/model_hub/__next._head.txt
# litellm/proxy/_experimental/out/model_hub/__next._index.txt
# litellm/proxy/_experimental/out/model_hub/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub/__next.model_hub.__PAGE__.txt
# litellm/proxy/_experimental/out/model_hub/__next.model_hub.txt
# litellm/proxy/_experimental/out/model_hub_table.html
# litellm/proxy/_experimental/out/model_hub_table.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._full.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._head.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._index.txt
# litellm/proxy/_experimental/out/model_hub_table/__next._tree.txt
# litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.__PAGE__.txt
# litellm/proxy/_experimental/out/model_hub_table/__next.model_hub_table.txt
# litellm/proxy/_experimental/out/models-and-endpoints.html
# litellm/proxy/_experimental/out/models-and-endpoints.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.__PAGE__.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.models-and-endpoints.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._full.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._head.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._index.txt
# litellm/proxy/_experimental/out/models-and-endpoints/__next._tree.txt
# litellm/proxy/_experimental/out/onboarding.html
# litellm/proxy/_experimental/out/onboarding.txt
# litellm/proxy/_experimental/out/onboarding/__next._full.txt
# litellm/proxy/_experimental/out/onboarding/__next._head.txt
# litellm/proxy/_experimental/out/onboarding/__next._index.txt
# litellm/proxy/_experimental/out/onboarding/__next._tree.txt
# litellm/proxy/_experimental/out/onboarding/__next.onboarding.__PAGE__.txt
# litellm/proxy/_experimental/out/onboarding/__next.onboarding.txt
# litellm/proxy/_experimental/out/organizations.html
# litellm/proxy/_experimental/out/organizations.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.__PAGE__.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.organizations.txt
# litellm/proxy/_experimental/out/organizations/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/organizations/__next._full.txt
# litellm/proxy/_experimental/out/organizations/__next._head.txt
# litellm/proxy/_experimental/out/organizations/__next._index.txt
# litellm/proxy/_experimental/out/organizations/__next._tree.txt
# litellm/proxy/_experimental/out/playground.html
# litellm/proxy/_experimental/out/playground.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.__PAGE__.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.playground.txt
# litellm/proxy/_experimental/out/playground/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/playground/__next._full.txt
# litellm/proxy/_experimental/out/playground/__next._head.txt
# litellm/proxy/_experimental/out/playground/__next._index.txt
# litellm/proxy/_experimental/out/playground/__next._tree.txt
# litellm/proxy/_experimental/out/policies.html
# litellm/proxy/_experimental/out/policies.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.__PAGE__.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.policies.txt
# litellm/proxy/_experimental/out/policies/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/policies/__next._full.txt
# litellm/proxy/_experimental/out/policies/__next._head.txt
# litellm/proxy/_experimental/out/policies/__next._index.txt
# litellm/proxy/_experimental/out/policies/__next._tree.txt
# litellm/proxy/_experimental/out/settings/admin-settings.html
# litellm/proxy/_experimental/out/settings/admin-settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.admin-settings.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.admin-settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._full.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._head.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._index.txt
# litellm/proxy/_experimental/out/settings/admin-settings/__next._tree.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts.html
# litellm/proxy/_experimental/out/settings/logging-and-alerts.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.logging-and-alerts.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.logging-and-alerts.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._full.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._head.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._index.txt
# litellm/proxy/_experimental/out/settings/logging-and-alerts/__next._tree.txt
# litellm/proxy/_experimental/out/settings/router-settings.html
# litellm/proxy/_experimental/out/settings/router-settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.router-settings.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.router-settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._full.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._head.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._index.txt
# litellm/proxy/_experimental/out/settings/router-settings/__next._tree.txt
# litellm/proxy/_experimental/out/settings/ui-theme.html
# litellm/proxy/_experimental/out/settings/ui-theme.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.ui-theme.__PAGE__.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.settings.ui-theme.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._full.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._head.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._index.txt
# litellm/proxy/_experimental/out/settings/ui-theme/__next._tree.txt
# litellm/proxy/_experimental/out/teams.html
# litellm/proxy/_experimental/out/teams.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.teams.txt
# litellm/proxy/_experimental/out/teams/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/teams/__next._full.txt
# litellm/proxy/_experimental/out/teams/__next._head.txt
# litellm/proxy/_experimental/out/teams/__next._index.txt
# litellm/proxy/_experimental/out/teams/__next._tree.txt
# litellm/proxy/_experimental/out/test-key.html
# litellm/proxy/_experimental/out/test-key.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.test-key.__PAGE__.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.test-key.txt
# litellm/proxy/_experimental/out/test-key/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/test-key/__next._full.txt
# litellm/proxy/_experimental/out/test-key/__next._head.txt
# litellm/proxy/_experimental/out/test-key/__next._index.txt
# litellm/proxy/_experimental/out/test-key/__next._tree.txt
# litellm/proxy/_experimental/out/tools/mcp-servers.html
# litellm/proxy/_experimental/out/tools/mcp-servers.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.mcp-servers.__PAGE__.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.mcp-servers.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.tools.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._full.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._head.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._index.txt
# litellm/proxy/_experimental/out/tools/mcp-servers/__next._tree.txt
# litellm/proxy/_experimental/out/tools/vector-stores.html
# litellm/proxy/_experimental/out/tools/vector-stores.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.vector-stores.__PAGE__.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.tools.vector-stores.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._full.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._head.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._index.txt
# litellm/proxy/_experimental/out/tools/vector-stores/__next._tree.txt
# litellm/proxy/_experimental/out/usage.html
# litellm/proxy/_experimental/out/usage.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt
# litellm/proxy/_experimental/out/usage/__next.!KGRhc2hib2FyZCk.usage.txt
# litellm/proxy/_experimental/out/usage/__next._full.txt
# litellm/proxy/_experimental/out/usage/__next._head.txt
# litellm/proxy/_experimental/out/usage/__next._index.txt
# litellm/proxy/_experimental/out/usage/__next._tree.txt
# litellm/proxy/_experimental/out/users.html
# litellm/proxy/_experimental/out/users.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt
# litellm/proxy/_experimental/out/users/__next.!KGRhc2hib2FyZCk.users.txt
# litellm/proxy/_experimental/out/users/__next._full.txt
# litellm/proxy/_experimental/out/users/__next._head.txt
# litellm/proxy/_experimental/out/users/__next._index.txt
# litellm/proxy/_experimental/out/users/__next._tree.txt
# litellm/proxy/_experimental/out/virtual-keys.html
# litellm/proxy/_experimental/out/virtual-keys.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.virtual-keys.__PAGE__.txt
# litellm/proxy/_experimental/out/virtual-keys/__next.!KGRhc2hib2FyZCk.virtual-keys.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._full.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._head.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._index.txt
# litellm/proxy/_experimental/out/virtual-keys/__next._tree.txt
# scripts/install.sh
# tests/local_testing/test_get_llm_provider.py
2026-04-25 17:15:24 -03:00
Chesars
a2a506c4dc
Revert "Merge pull request #16590 from Chesars/refactor/remove-backup-file-dry-principle"
...
This reverts commit 62df6325b1 , reversing
changes made to a6462143be .
2026-04-25 17:10:41 -03:00
yuneng-jiang
8f4f2a1b30
Merge pull request #26516 from BerriAI/litellm_mcp_oauth_caller_access_check
...
[Fix] Align MCP OAuth proxy endpoints with per-server access policy
2026-04-25 13:05:26 -07:00
Yuneng Jiang
0b9a7044b7
fix: leave vector_store_config untouched when credential lookup misses
...
When litellm_credential_name resolves to no values (name not registered
in litellm.credential_list), bail out before touching the resolved
config. Prevents stripping a caller-supplied api_base in the no-match
case.
2026-04-25 13:02:09 -07:00
Yuneng Jiang
7503f14f3f
fix: harden /model/info redaction to cover plural credential field names
...
Mirrors the existing vertex_credentials handling for the newer
vertex_ai_credentials field, and extends the dynamic masker's sensitive
pattern set to recognize the plural form so other plural-named credential
fields are also covered.
2026-04-25 12:59:12 -07:00
shin-berri
0a166157af
Merge pull request #26511 from BerriAI/cursor/guard-fork-dependencies-eec1
...
ci: add supply-chain guard to block fork PRs that modify dependencies
2026-04-25 12:54:16 -07:00
yuneng-jiang
449146e815
Merge pull request #24428 from BerriAI/litellm_staging_03_23_2026
...
Litellm staging 03 23 2026
2026-04-25 12:43:44 -07:00
Yuneng Jiang
7a6ab3870f
[Fix] bind RAG ingestion config to stored credential values
...
When a vector_store config references a stored credential by name,
overwrite caller-supplied values on the same keys with the credential
values, and drop api_base from the resolved config when the credential
does not define one. Keeps the api_key / api_base pair consistent with
the credential definition.
2026-04-25 12:41:36 -07:00
Yuneng Jiang
91f6661b37
[Fix] Align MCP OAuth proxy endpoints with per-server access policy
...
Bring `/server/oauth/{server_id}/authorize`, `/token`, and `/register`
in line with `fetch_mcp_server`: the helper that resolves the server now
also applies the per-caller access policy. Admin-view callers are
unrestricted; non-admins must have the server in their allowed-servers
set; servers resolved from the admin-only `/server/oauth/session`
temporary cache reject non-admins.
2026-04-25 12:39:44 -07:00
Yufeng He
f63a6f1b26
fix(proxy): set verbose_logger level when LITELLM_LOG=INFO ( #26401 )
...
Fixes #26396 .
The `LITELLM_LOG=INFO` branch in proxy_server only set
`verbose_router_logger` and `verbose_proxy_logger`. The third logger
`verbose_logger` (used by e.g. `token_based_routing.py`) inherited the
Python root default (WARNING) and its INFO-level messages were
silently filtered — inconsistent with the neighbouring DEBUG branch
which configures all three and with the `debug=True` / `detailed_debug`
paths above.
Include `verbose_logger` in the INFO branch as well so all three
loggers behave the same.
Co-authored-by: yuneng-jiang <yuneng@berri.ai>
Co-authored-by: Yufeng He <40085740+universeplayer@users.noreply.github.com>
2026-04-25 12:13:13 -07:00
Chesars
40eeffe089
test(vertex): use valid dimension (128) for multimodalembedding live test
...
dimensions=1 was silently dropped before #24415 wired the param through
to Vertex. Now that it's forwarded, Vertex rejects it (valid values:
128, 256, 512, 1408). Switch the test to a valid dimension.
2026-04-25 16:10:25 -03:00
Cursor Agent
0bd9213d8d
ci: add supply-chain guard to block fork PRs that modify dependencies
...
Add a new CI workflow that rejects pull requests from forks when they:
- Modify uv.lock (any change at all)
- Add new dependencies to any pyproject.toml file (root, litellm-proxy-extras, enterprise)
Security properties:
- Uses pull_request (not pull_request_target) so no secrets are exposed
- All action refs pinned to full SHA hashes
- persist-credentials: false on all checkouts
- permissions: {} (no GitHub token permissions)
- No user-controlled input in run: blocks (no script injection)
- Proper TOML parsing via stdlib tomllib (not regex on raw text)
- Only triggers when dependency files are actually changed (paths filter)
Internal PRs (from branches in the canonical repo) skip the job entirely.
Co-authored-by: Krrish Dholakia <krrish-berri-2@users.noreply.github.com>
2026-04-25 18:46:50 +00:00
Cesar Garcia
c8ceafe941
Merge pull request #26510 from BerriAI/litellm_internal_staging
...
Sync litellm_staging_03_23_2026 with litellm_internal_staging
2026-04-25 15:22:29 -03:00
Chesars
ebe16072f2
Merge remote-tracking branch 'upstream/litellm_internal_staging' into litellm_staging_03_23_2026
...
# Conflicts:
# model_prices_and_context_window.json
# tests/test_litellm/llms/vertex_ai/multimodal_embeddings/test_vertex_ai_multimodal_embedding_transformation.py
2026-04-25 15:16:13 -03:00
Chesars
f118ecc1b6
ci: align CI/workflows with litellm_internal_staging
...
Sync CI configs with upstream/litellm_internal_staging:
- Migrate from Poetry to uv (PR #25007 )
- Pull in zizmor security fixes for workflows
- Add isolated unit test workflows + reusable bases
- Drop redundant matrix workflow and azure-batches workflow
- Drop .circleci/requirements.txt (replaced by uv lockfile)
2026-04-25 15:09:00 -03:00
Chesars
384cfdad47
Revert "Merge pull request #24164 from dongyu-turo/feat/update-bedrock-claude-price-above-200k"
...
This reverts commit b8189ea1de , reversing
changes made to 19c8f3d565 .
2026-04-25 15:04:05 -03:00
Chesars
a4a8d86c2b
Revert "Merge pull request #24417 from Chesars/refactor/shared-format-mapping"
...
This reverts commit 3f3d275e67 , reversing
changes made to 498c113933 .
2026-04-25 15:03:24 -03:00
yuneng-jiang
bb61f747c3
Merge pull request #26496 from BerriAI/litellm_yj_apr23
...
[Infra] Merge dev branch
2026-04-25 11:01:16 -07:00
Chesars
3c8677209b
Revert "Merge pull request #24420 from Chesars/docs/complete-integrations-landing"
...
This reverts commit e5f5ffbe15 , reversing
changes made to 4399b7614d .
2026-04-25 14:58:25 -03:00
Blossom
334aedf2d4
fix(ui): add missing 'zai' (Z.AI / Zhipu AI) provider to Add-Model dropdown ( #25482 ) ( #26419 )
...
The Z.AI (Zhipu AI) provider was missing from the Add-Model dropdown in
the admin UI, even though the rest of the stack already supports it:
- /public/providers returns 'zai' in the provider list
- provider_endpoints_support.json includes a full 'zai' entry with
endpoints and a docs URL (https://docs.litellm.ai/docs/providers/zai )
- Backend routing works for zai/* models (e.g. zai/glm-4.5, zai/glm-5)
- There are many zai/* entries in model_prices_and_context_window.json
The dropdown is driven by the hard-coded Providers enum and provider_map
in provider_info_helpers.tsx, which did not include 'zai', so users
could not select Z.AI when adding a model through the UI.
This PR:
- Adds Providers.ZAI ('Z.AI (Zhipu AI)') to the enum.
- Maps it to 'zai' in provider_map so the UI round-trips the existing
backend provider key.
- Wires a reasonable placeholder 'zai/glm-4.5' in getPlaceholder, since
glm-4.5 is an established zai/* model in the pricing catalog.
- Adds two regression tests in provider_info_helpers.test.tsx:
1. getProviderLogoAndName('zai') resolves to Providers.ZAI.
2. getPlaceholder(Providers.ZAI) returns 'zai/glm-4.5'.
No logo asset is added in this PR; getProviderLogoAndName already
gracefully returns an empty logo string for providers missing from
providerLogoMap, matching the existing pattern for several other
providers. A follow-up can add a dedicated logo.
Fixes #25482
Co-authored-by: yuneng-jiang <yuneng@berri.ai>
2026-04-25 10:52:17 -07:00
RoomWithOutRoof
e2d0fd9eac
fix: remove duplicate MAX_SIZE + add Cloudflare response_text support ( #26385 )
...
- Remove duplicate MAX_SIZE_PER_ITEM_IN_MEMORY_CACHE_IN_KB definition
(kept the one with default 1024, removed the one with default 512)
- Add fallback from 'response' to 'response_text' key in Cloudflare
Workers AI transformation for newer Nemotron models
Co-authored-by: yuneng-jiang <yuneng@berri.ai>
Co-authored-by: Jah-yee <110645028+Jah-yee@users.noreply.github.com>
2026-04-25 10:45:01 -07:00
Yuneng Jiang
410b163f95
fix: annotate centralized common_checks gather results for mypy
...
After ``return_exceptions=True``, gather results are typed
``Any | BaseException``. Mypy could not narrow through
``None if isinstance(x, HTTPException) else x`` ternaries, leaving
BaseException in the type passed to ``common_checks``.
Switch the narrowing checks to ``BaseException`` (HTTPException is the
only one still possible after authz failures were re-raised) and add
explicit ``Optional[...]`` annotations so the typed objects flow into
``common_checks``. No behavior change.
2026-04-25 10:40:15 -07:00
Yuneng Jiang
151d7ab1bc
fix: isolate per-fetch HTTPException in centralized common_checks gate
...
The asyncio.gather in `_run_centralized_common_checks` ran with
`return_exceptions=False` and a single bare `except HTTPException`
arm, so an HTTPException from any one fetch (the realistic case is a
404 from `get_team_object` when a token references a deleted team)
zeroed out the user, end-user, project, and global-spend contexts in
addition to falling back the team object. That silently skipped the
user budget, end-user budget, and project enforcement passes inside
`common_checks` for the unrelated contexts that had actually fetched
fine.
Switch to `return_exceptions=True` and apply per-fetch fallback
(matches the pre-refactor per-fetch try/except pattern in the builder):
- ProxyException / BudgetExceededError still propagate as authz failures.
- HTTPException on the team fetch reconstructs from the token; on the
other fetches it nulls only that one context.
- Successful fetches always reach `common_checks` intact.
Adds two unit tests covering the team-404 and user-404 cases to lock
the per-fetch isolation in. Drops the inaccurate `PROXY_ADMIN tokens
short-circuit` claim from the docstring — admin tokens still flow
through `common_checks`; admin status is only honored where the
underlying check exempts it.
2026-04-25 09:58:23 -07:00
Yuneng Jiang
4884b0b611
Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_yj_apr23
...
# Conflicts:
# litellm/proxy/management_endpoints/key_management_endpoints.py
2026-04-25 09:47:47 -07:00
yuneng-jiang
c05de83f1c
Merge pull request #26490 from BerriAI/litellm_restrict_global_spend_routes
...
[Fix] Restrict /global/spend/* routes to admin roles
2026-04-25 09:30:36 -07:00
yuneng-jiang
5fae8051c5
Merge pull request #26488 from BerriAI/litellm_sortable_spend_logs_columns
...
[Feature] UI - Spend Logs: sortable Model and TTFT columns
2026-04-25 09:29:43 -07:00
ryan-crabbe-berri
9839ab7f96
Merge pull request #26004 from BerriAI/litellm_fix-preserve-reserved-metadata
...
fix: preserve service_account_id in metadata on /key/update
2026-04-25 09:28:47 -07:00
Ryan Crabbe
7eab549190
test: tighten prepare_key_update_data mock and apply black
...
- test_prepare_key_update_data: replace bare MagicMock with
MagicMock(spec=LiteLLM_VerificationToken) and explicitly set
existing_key_row.metadata = {}, so reserved-field reads return real
values instead of MagicMock-returning-MagicMock. Fixes a regression
surfaced by the new reserved-metadata preservation logic.
- test_key_management_endpoints.py: black-format-only changes from
recent edits.
2026-04-25 09:08:55 -07:00
ryan-crabbe-berri
25513b9e43
Merge pull request #26001 from BerriAI/litellm_fix-ui-unconditional-cost-write
...
fix(ui): stop injecting $0 cost on model edit
2026-04-25 08:50:46 -07:00
ryan-crabbe-berri
419a34a900
Merge pull request #26442 from BerriAI/litellm_feat-restrict-org-admin-permissions
...
feat: UI setting to disable /key/generate for org admins
2026-04-25 08:50:26 -07:00
Ryan Crabbe
ea5c762b00
Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_fix-preserve-reserved-metadata
2026-04-25 08:46:17 -07:00
yuneng-jiang
9426aff475
Merge pull request #26493 from BerriAI/litellm_key_route_caller_checks_addendum
...
[Fix] Extend caller-permission checks to service-account + tighten raw-body acceptance
2026-04-24 23:40:58 -07:00
Yuneng Jiang
f7f77d0cf4
docs: clarify intent of empty-dict handle_key_type call in regenerate
2026-04-24 23:18:18 -07:00
Yuneng Jiang
5190bd07eb
fix: extend caller-permission checks to service-account + harden raw-body acceptance
2026-04-24 23:18:18 -07:00
yuneng-jiang
ffdcc689f4
Merge pull request #26492 from BerriAI/litellm_key_route_caller_checks
...
[Fix] Tighten caller-permission checks on key route fields
2026-04-24 23:05:43 -07:00
Yuneng Jiang
2220f3076a
fix: tighten caller-permission checks on key route fields
2026-04-24 22:55:21 -07:00
Yuneng Jiang
2047446546
Scope NULLS LAST to ttft_ms only
...
The previous version appended NULLS LAST to every ORDER BY, which would
silently change DESC semantics for any nullable sort column added to the
whitelist later. Today the existing sort columns (spend, total_tokens,
startTime, endTime, request_duration_ms, model) are all non-null in the
result set, so the clause is a no-op for them — but the broader form is
misleading.
Apply NULLS LAST only when sorting by ttft_ms (the only column whose
computed expression actually produces NULLs). Update the model test to
assert the clause is absent for non-nullable columns.
2026-04-24 22:52:04 -07:00
Yuneng Jiang
01eee0944c
[Fix] Restrict /global/spend/* routes to admin roles
...
The routes in `global_spend_tracking_routes` (e.g. /global/spend/report,
/global/spend/teams, /global/spend/keys) return spend aggregated across
every team, customer, and api_key in the proxy. They were included in
`internal_user_routes` and `internal_user_view_only_routes`, so non-admin
roles could read proxy-wide spend.
Drop them from both non-admin route lists. PROXY_ADMIN and
PROXY_ADMIN_VIEW_ONLY access is preserved through their existing branches
in route_checks.py, and the `get_spend_routes` permission opt-in
continues to grant access for keys that need it.
Updates two pre-existing test parametrizations whose expected results
flip from True to False, and adds parametrized coverage over every
route in `global_spend_tracking_routes` for: PROXY_ADMIN_VIEW_ONLY
allowed, INTERNAL_USER blocked, INTERNAL_USER_VIEW_ONLY blocked,
INTERNAL_USER + get_spend_routes permission allowed.
2026-04-24 22:46:07 -07:00
Yuneng Jiang
5c0349a635
[Feature] UI - Spend Logs: sortable Model and TTFT columns
...
Extend the /spend/logs/ui sort_by whitelist to accept "model" and
"ttft_ms", and wrap the Model and TTFT (s) column headers with the
existing SortableHeader component so users can sort by either.
TTFT has no stored column, so it is computed inline as
(completionStartTime - startTime) milliseconds. Non-streaming rows
(completionStartTime null or equal to endTime) yield NULL and the
ORDER BY uses NULLS LAST so they always sort to the bottom regardless
of direction, matching the existing "-" display in the UI.
Adds parametrized backend tests for sort_by=model and a dedicated test
covering streaming + non-streaming TTFT ordering in both directions.
2026-04-24 22:29:15 -07:00