Commit Graph
2673 Commits
Author SHA1 Message Date
Peter Dave HelloandGitHub dbd4bb5cf4 Add Claude Opus 4.6 (#20508)
Add Claude Opus 4.6 entries for Anthropic, Bedrock Converse, and Vertex AI.

Align pricing and capability metadata with Anthropic docs, including
long-context rates, above-200k prompt-caching rates, prefill removal,
and tool-use system prompt token counts.

Register the Bedrock Converse model ID in constants and add targeted
tests to validate model map values and converse registration.
2026-02-05 11:33:44 -08:00
Ishaan JaffandGitHub d2bd029fa4 [Fix] 404 Not Found on /api/event_logging/batch endpoint (#20504)
* fix typing

* add event_logging_batch

* TestEventLoggingBatchEndpoint
2026-02-05 10:58:08 -08:00
Sameer KankuteandGitHub a21b625a59 Merge pull request #20105 from qiniu/fix/vertex-gemini-streaming-content-filter
Fix Vertex AI Gemini streaming content_filter handling
2026-02-05 16:48:48 +05:30
Sameer KankuteandGitHub 453d1bd5e1 Merge branch 'main' into litellm_oss_staging_02_04_2026 2026-02-05 12:19:03 +05:30
Sameer Kankute 5422a5962e Fix test_route_a2a_model_bypasses_router 2026-02-05 09:47:05 +05:30
2a3843aa57 [Fix] inconsistent response format in anthropic.messages.acreate() when using non anthropic providers (#20442)
* _translate_openai_content_to_anthropic

* test_response_format_consistency

* test fixes unit tests

* test fix

* fix: use dict access for anthropic content blocks in tests (#20447)

The translate_openai_response_to_anthropic method returns dicts, not objects.
Changed .type/.text/.thinking attribute access to dict ['key'] access.

---------

Co-authored-by: shin-bot-litellm <shin-bot-litellm@berri.ai>
2026-02-04 16:37:40 -08:00
Ishaan JaffandGitHub 6a73e5bd37 Revert "fix(a2a): use text/event-stream SSE format for message/stream endpoin…" (#20446)
This reverts commit 0209b214ac.
2026-02-04 16:08:22 -08:00
shin-bot-litellmGitHubshin-bot-litellmIshaan JaffCopilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
0209b214ac fix(a2a): use text/event-stream SSE format for message/stream endpoint (#20365)
* fix(a2a): use text/event-stream SSE format for message/stream endpoint

The A2A gateway's streaming response was using application/x-ndjson
Content-Type and raw NDJSON body format. The A2A protocol spec requires
text/event-stream with SSE framing (data: ...\n\n).

The official a2a-sdk client validates the Content-Type header and raises
SSEError when it doesn't contain text/event-stream.

Changes:
- Changed media_type from application/x-ndjson to text/event-stream
- Updated response body to use SSE framing (data: prefix + \n\n suffix)
- Added tests validating Content-Type and SSE body format

Fixes #20278

* Potential fix for code scanning alert no. 4045: Information exposure through an exception

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* test(a2a): add manual SSE format validation script

Adds a manual test script that:
1. Starts a real A2A agent on port 10001
2. Starts LiteLLM proxy with the agent registered
3. Makes a streaming request to the proxy's A2A gateway
4. Validates Content-Type header is text/event-stream
5. Validates body uses SSE framing (data: ...\n\n)

Run: python tests/a2a_manual/test_a2a_sse_manual.py

---------

Co-authored-by: shin-bot-litellm <shin-bot-litellm@users.noreply.github.com>
Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-02-04 16:07:17 -08:00
yuneng-jiangandGitHub a16faa9e0a Merge pull request #20394 from BerriAI/litellm_spend_fix_2
[Fix] Unique Constraint on Daily Tables + Logging When Updates Fail
2026-02-04 09:42:46 -08:00
Kris Xia bfabb39fc6 fix: Fix Vertex AI Gemini streaming content_filter handling
- Add promptFeedback.blockReason check in chunk_parser
- Return content_filter finish_reason when blocked
- Extract content filter logic into _check_prompt_level_content_filter() method
- Update unit tests to reflect simplified implementation

Signed-off-by: Kris Xia <xiajiayi0506@gmail.com>
2026-02-04 21:11:47 +08:00
Sameer KankuteandGitHub a86e501632 Merge pull request #20407 from BerriAI/litellm_key_mcp_permissions
Add Key info endpoint object permission data
2026-02-04 17:56:05 +05:30
Sameer KankuteandGitHub b2feedc469 Merge pull request #20318 from BerriAI/litellm_oss_staging_02_03_2026
feat(guardrails): implement team-based isolation guardrails mgmnt (#1…
2026-02-04 17:49:30 +05:30
Sameer Kankute 54b5c7d2cd Fix: litellm/tests/test_litellm/proxy/guardrails/guardrail_hooks/test_grayswan.py 2026-02-04 17:35:26 +05:30
Sameer KankuteandGitHub 6b25e37309 Revert "fix: proxy failure cases, now log ip and user agent, key hash, name (…"
This reverts commit ec279eb426.
2026-02-04 17:16:51 +05:30
Sameer Kankute fc873d8867 Fix mypy issues 2026-02-04 14:40:08 +05:30
Sameer Kankute 42561729ee Add Key info endpoint object permission data 2026-02-04 14:21:19 +05:30
774a015aad fix: Preserve streaming content on guardrail-sampled chunks (#20027)
The unified guardrail's streaming iterator hook processes every Nth
chunk (sampling_rate, default 5). On each sampled chunk it calls
process_output_streaming_response, which combines all accumulated text
into the first chunk and clears all subsequent chunks to "".

The hook then yielded `processed_items[-1]` — the last item, whose
content had been cleared to "". This permanently lost every Nth
chunk's content, causing random missing words/tokens in the client
output (observed in Roo Code, Open WebUI, etc.).

Fix: deep-copy the current chunk before guardrail processing runs,
then yield the original (unmodified) chunk. The guardrail validation
still executes and can block if it detects a problem, but the stream
content is preserved.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 22:44:30 -08:00
13130ea3e1 Litellm fix langfuse otel trace (#20382)
* fix: support multi-project keys and fix trace leakage

* fix: Langfuse otel handle

* fix lint errors mypy

* passing all test case

---------

Co-authored-by: Krish Dholakia <krrishdholakia@gmail.com>
2026-02-03 22:40:19 -08:00
Krish DholakiaandGitHub ca34b4ee13 Revert "feat(guardrails): implement team-based isolation guardrails mgmnt (#1…" (#20393)
This reverts commit 76a399ba69.
2026-02-03 20:55:46 -08:00
yuneng-jiang 9ce55057ab Adding logging for when batching fails 2026-02-03 20:54:40 -08:00
yuneng-jiang 30027d2928 save empty endpoint as string 2026-02-03 20:26:57 -08:00
yuneng-jiangandGitHub dc07a6922f Merge pull request #20371 from BerriAI/litellm_config_search_tools
[Feature] Include Config Defined Search Tools in /search_tools/list
2026-02-03 20:00:21 -08:00
Ishaan JaffandGitHub da4cf4942f [Feat] Add xAI /realtime API Support - works with LiveKitSDK (#20381)
* init: _realtime_health_check + routing

* refactor: OpenAIRealtime

* refactor: XAI_API_BASE

* feat: XAIRealtime

* init feat: XAIRealtime

* OpenAIRealtime

* TestXAIRealtime

* test fixes

* test OAI

* TEST xAI, OAI

* clean realtime jobs

* refactor

* test XAI

* docs xAI

* fix xAI

* fix lint errors

* test_async_realtime_url_contains_model

* test fix

* document test changes

* _realtime_health_check

* docs xai realtime

* fix handlers

* add additional_headers

* fix
2026-02-03 19:58:28 -08:00
Sameer KankuteandGitHub 25fa1ad4e7 Merge pull request #20386 from naaa760/fix/extra-head-chat-comp-brid
fix(proxy): forward extra headers in chat
2026-02-04 09:11:43 +05:30
naaa760 0cb6b58768 fix(proxy): forward extra_headers in chat 2026-02-04 08:56:50 +05:30
Sameer KankuteandGitHub f11c16a0e7 Merge pull request #20334 from BerriAI/litellm_fireworks_ai_field_remoal
Fix: Extra inputs are not permitted, field: 'messages[2].provider_specific_fields
2026-02-04 08:50:04 +05:30
Sameer KankuteandGitHub bd87c446f2 Merge pull request #20329 from BerriAI/litellm_delete_files_bug
Add support for delete and GET via file_id for gemini
2026-02-04 08:49:24 +05:30
66eadfabe4 [Bug] Ensure MCP permissions are enforced when using JWT Auth (#20383)
* fix: enforce team MCP permissions when using JWT authentication

Root cause: When JWT auth was used with teams in groups (via team_ids_jwt_field),
the team's MCP permissions were not being enforced because:

1. The default team_allowed_routes did not include mcp_routes
2. allowed_routes_check() failed for MCP endpoints like /mcp/tools/list
3. find_team_with_model_access() skipped the team due to failed route check
4. team_id was None in UserAPIKeyAuth
5. MCPRequestHandler._get_allowed_mcp_servers_for_team() returned empty list

Fix: Add 'mcp_routes' to the default team_allowed_routes in LiteLLM_JWTAuth.

This ensures that teams can access MCP endpoints by default, allowing the
team's MCP server permissions to be properly enforced.

Added tests:
- test_reproduce_jwt_mcp_enforcement_issue: Reproduces the exact bug scenario
- test_verify_mcp_routes_in_default_team_allowed_routes: Verifies fix
- test_mcp_route_check_passes_for_team: Verifies route check works

Co-authored-by: ishaan <ishaan@berri.ai>

* test: add comprehensive E2E tests for JWT + team MCP permission enforcement

Added tests:
- test_e2e_jwt_team_mcp_permissions_enforced: Full E2E test verifying JWT auth
  with teams in groups properly sets team_id and MCPRequestHandler returns
  the team's MCP servers
- test_e2e_jwt_without_team_no_mcp_servers: Verifies no MCP servers returned
  when JWT has no teams
- test_e2e_jwt_team_mcp_key_intersection: Verifies intersection logic when
  both key and team have MCP permissions (result = intersection)

These tests verify the complete flow:
1. JWT token with team in groups field
2. JWT auth properly sets team_id on UserAPIKeyAuth
3. MCPRequestHandler.get_allowed_mcp_servers() returns team's MCP servers
4. Key/team permission intersection works correctly

Co-authored-by: ishaan <ishaan@berri.ai>

* test: add simple tests for JWT + MCP permission enforcement

Simple, focused tests that validate:
1. test_simple_jwt_mcp_permissions_enforced: JWT user with team gets team's MCP servers
2. test_simple_jwt_no_team_no_mcp_servers: JWT user without team gets no MCP servers
3. test_simple_jwt_team_id_required_for_mcp_permissions: Verifies team_id is required
4. test_jwt_auth_sets_team_id_for_mcp_route: JWT auth sets team_id for MCP routes

These tests directly verify the core MCP permission enforcement logic works
when using JWT authentication with teams.

Co-authored-by: ishaan <ishaan@berri.ai>

* Add test: MCP route without model still returns team_id

Co-authored-by: ishaan <ishaan@berri.ai>

* Add 2 debug logs for JWT+MCP troubleshooting

- handle_jwt.py: Log team route check result (team_id, route, is_allowed)
- user_api_key_auth_mcp.py: Log team_id when looking up MCP permissions

Co-authored-by: ishaan <ishaan@berri.ai>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: ishaan <ishaan@berri.ai>
2026-02-03 19:13:13 -08:00
yuneng-jiangandGitHub f9669cc132 Merge pull request #20375 from BerriAI/litellm_user_update_fix
[Fix] /user/update Allow for max_budget Resets
2026-02-03 17:02:16 -08:00
yuneng-jiang cf256c742f allow max_budget reset 2026-02-03 16:32:21 -08:00
michelligabrieleandGitHub a50896f91e fix: revert httpx client caching that caused closed client errors (#20025)
AsyncHTTPHandler.__del__ was closing httpx clients still in use by
AsyncOpenAI/AsyncAzureOpenAI due to independent cache lifecycles.
Restores standalone httpx client creation for OpenAI/Azure providers.
2026-02-03 16:15:04 -08:00
yuneng-jiang 3e3b21e6c3 masking sensitive values 2026-02-03 16:09:37 -08:00
yuneng-jiang 23d9a89793 search tools list includes config defined search tools 2026-02-03 15:57:13 -08:00
Ishaan JaffandGitHub d267c69086 [Feat] Use A2A registered agents with /chat/completions (#20362)
* test_a2a_registry_integration

* fix: render agents on model dropdown on UI

* init append_agents_to_model_group

* route_a2a_agent_request

* is_a2a_agent_model

* route_a2a_agent_request

* fix: error handling

* docs A2A usage

* docs fix

* feat: working A2a streaming

* fix transform
2026-02-03 15:25:38 -08:00
Xiaohan FuandGitHub 2b25d03046 Fix fail-open for grayswan and pass metadata to cygnal api endpoint (#19837)
* fix fail-open for grayswan; pass metadata to cygnal api endpoint; update docs

* pass litellm_metadata to cygnal in payload

* switch error msg to const, and clean exception handling.

* update pyproject.toml as requested

* Revert "update pyproject.toml as requested"

This reverts commit 4eece154d056ba33689a5584c86c8fc352bb7cdd.
2026-02-03 14:41:31 -08:00
cc76f95555 fix: check for model_response_choices before guardrail input (#19784)
* fix: check for model_response_choices before guardrail input

* test: add tests for responses api translation

* fix: protect other guardrail translations

* refactor: remove type ignores

* anthropic request body got mutated fix

* add warning when extra_body is provided but user is non premium

* fix: resolve mypy union-attr errors in anthropic guardrail handler

Cast choices[0] to Choices type before accessing .message attribute
to satisfy mypy's union type checking for Choices | StreamingChoices.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* add logger when model response has no choices for streaming /response and /messages

* update pyproject.toml as requested

* Revert "update pyproject.toml as requested"

This reverts commit 541a2b075a91b1b2d9efaf0407572f35bf5d4324.

* update pyproject.toml as requested

* Revert "update pyproject.toml as requested"

This reverts commit 716ea0caa1fee5e5f028d3f86479fedea2fac68b.

---------

Co-authored-by: Xiaohan Fu <xiaohan@grayswan.ai>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:41:13 -08:00
Sameer Kankute ff568de2cb Add get files API support and tests 2026-02-03 18:57:39 +05:30
Sameer KankuteandGitHub b7f0d05dfd Merge pull request #20337 from BerriAI/main
update 02 staging PR
2026-02-03 17:08:01 +05:30
Sameer Kankute 3765d88809 Fix: Extra inputs are not permitted, field: 'messages[2].provider_specific_fields' 2026-02-03 16:23:18 +05:30
Sameer Kankute 9a6bafe89e Fix litellm/tests/test_litellm/proxy/_experimental/mcp_server/test_semantic_tool_filter.py tests 2026-02-03 15:01:10 +05:30
Sameer Kankute eb8f4d3e05 Revert "fix: models loadbalancing billing issue by filter (#18891) (#19220)"
This reverts commit 72e5193451.
2026-02-03 15:00:57 +05:30
Ishaan JaffandGitHub 5cfcf67d7c [Feat] /chat/completions - allow using OpenAI style tools for web_search with VertexAI/gemini models (#20280)
* test_gemini_openai_web_search_tool_to_google_search

* feat: Handle OpenAI style web search tools
2026-02-02 19:36:36 -08:00
Harshit JainandGitHub ec279eb426 fix: proxy failure cases, now log ip and user agent, key hash, name (#20145) 2026-02-02 19:26:50 -08:00
Harshit JainandGitHub 76a399ba69 feat(guardrails): implement team-based isolation guardrails mgmnt (#19889)
* feat(guardrails): implement team-based isolation guardrails mgmnt

* fix lint errors

* add allow_team_guardrail_config for admin permissions
2026-02-02 19:14:55 -08:00
Ishaan JaffGitHubgreptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
079f49ff6a [Feat] - MCP Semantic Filtering Support (#20296)
* init: SemanticMCPToolFilter

* init: SemanticToolFilterHook

* test_e2e_semantic_filter

* mock tests: test_semantic_filter_basic_filtering

* Update litellm/proxy/_experimental/mcp_server/semantic_tool_filter.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* refactor folder/file organization

* docs fix

* fix filter

* fix: filter_tools

* fix linting tool filrer

* initialize_from_config

* fix: _expand_mcp_tools

* _initialize_semantic_tool_filter

* working: async_post_call_response_headers_hook

* clean up semantic tool filter

* add _initialize_semantic_tool_filter

* build_router_from_mcp_registry

* _get_tools_by_names

* fiix config

* async_post_call_response_headers_hook

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-02-02 18:28:53 -08:00
yuneng-jiang edfe2394b9 reset_spend endpoint 2026-02-02 15:52:30 -08:00
shin-bot-litellmandGitHub 31241416d4 feat: add base /scim/v2 endpoint for SCIM resource discovery (#20301)
Add the following SCIM v2 discovery endpoints per RFC 7643/7644:

- GET /scim/v2 - Base resource discovery (ListResponse of ResourceTypes)
- GET /scim/v2/ResourceTypes - List all supported resource types
- GET /scim/v2/ResourceTypes/{id} - Get a specific resource type (User/Group)
- GET /scim/v2/Schemas - List all supported schemas
- GET /scim/v2/Schemas/{uri} - Get a specific schema by URI

These endpoints are required by identity providers (Okta, Azure AD, etc.)
for SCIM resource discovery. Previously, GET /scim/v2 returned 404.

Also adds SCIMResourceType, SCIMSchema, and SCIMSchemaAttribute Pydantic
models to the SCIM types module.

Fixes #20295
2026-02-02 14:27:00 -08:00
yuneng-jiangandGitHub f1227ce5a8 Merge pull request #20111 from BerriAI/litellm_sso_map_teams
[Feature] SSO Config Team Mappings
2026-02-02 14:18:25 -08:00
shin-bot-litellmandGitHub 923b1cfd92 fix: MCP "Session not found" error on VSCode reconnect (#20298)
* fix: strip stale mcp-session-id header to prevent 'Session not found' error loop

When VSCode reconnects to LiteLLM's MCP endpoint after a reload, it sends
a stale mcp-session-id header. The session was already cleaned up, causing
a 404 'Session not found' error. VSCode retries with the same stale ID,
creating an infinite error loop.

Before forwarding requests to the StreamableHTTP session manager, check if
the mcp-session-id header references a valid session. If the session doesn't
exist, strip the header so a new session is created automatically.

Fixes #20292

* refactor: extract stale session handling into _strip_stale_mcp_session_header helper
2026-02-02 14:15:31 -08:00
yuneng-jiang 1f51f067eb Merge remote-tracking branch 'origin' into litellm_sso_map_teams 2026-02-02 12:40:12 -08:00