Commit graph

33141 commits

Author SHA1 Message Date
Krish Dholakia
14a35a12cb
Revert "End users - Allow giving end users access to specific mcp servers (#…" (#21461)
This reverts commit 1f521be0f2.
2026-02-17 22:49:57 -08:00
Sameer Kankute
03f5717456 Fixes based on greptile reviews 2026-02-18 12:19:11 +05:30
Krish Dholakia
1f521be0f2
End users - Allow giving end users access to specific mcp servers (#21411)
* feat(schema.prisma): add object permissions for end users

allows controlling if end user can call specific mcp servers

* feat: cleanup for customer_endpoints support of object permission id

* fix: cleanup str

* feat(customers/): enforce end user can only call allowed mcps - if configured

* docs: document customer/end user object permission usage

* feat: address greptile comments
2026-02-17 22:45:49 -08:00
Tomu Hirata
fe7e764846 Add native Responses API support for Databricks GPT models
Databricks supports the Responses API natively for GPT models, but litellm
was falling back to the completion transformation handler which converts
responses requests to chat completion calls, losing response schema enforcement.

This adds DatabricksResponsesAPIConfig that passes responses API requests
directly to Databricks' /responses endpoint for GPT models, while non-GPT
models (Claude, Llama, etc.) continue using the completion transformation path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 15:34:18 +09:00
Sameer Kankute
9f5580fddd Fixes based on greptile reviews 2026-02-18 11:55:06 +05:30
Sameer Kankute
8f80b1085e Add File deletion criteria with batch references 2026-02-18 11:39:32 +05:30
Ishaan Jaff
371cabfebd
Add MCP Security guardrail to block unregistered MCP servers (#21429)
* Add MCP_SECURITY enum to SupportedGuardrailIntegrations

* Add MCP security guardrail initializer

* Add MCPSecurityGuardrail implementation

* Add MCP Security policy template

* Add Type filter to policy templates UI

* Add unit tests for MCP security guardrail

* fix(lint): remove unused Dict import from mcp_security_guardrail

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add French language support for EU AI Act Article 5 guardrail (#21427)

* Add French language support for EU AI Act Article 5 template

- Create eu_ai_act_article5_fr.yaml with comprehensive French keywords
- Includes identifier words: concevoir, créer, développer, noter, classer, etc.
- Includes block words: crédit social, comportement social, émotion des employés, etc.
- Includes always-block keywords for explicit prohibited practices
- Includes exceptions for research, compliance, and legitimate use cases
- Catches circumvention attempts with phrase variations

* Add comprehensive tests for French EU AI Act guardrail

- Test 3 critical scenarios: blocked query, circumvention attempt, safe query
- Test edge cases: case-insensitive, mixed language, research exceptions
- All 7 tests passing
- Validates both blocking and allowing behavior

* Fix content filter to support conditional matching without inherit_from

- Enable conditional matching when identifier_words + additional_block_words are present
- Previously required inherit_from, but EU AI Act templates are self-contained
- Fixes Greptile feedback: conditional matching now works as documented

* Add pure conditional matching test for French guardrail

- Test identifier + block word combinations not in always_block_keywords
- Verifies conditional matching works independently
- Addresses Greptile feedback about test coverage gap

* Fix exception word bypass risk in French template

- Replace short words (film, jeu, juste) with context-specific phrases
- Prevents substring matching bypasses (e.g., enjeu matching jeu)
- Add tests for bypass prevention and legitimate game context
- Addresses Greptile security feedback

* Make conditional match assertion more robust

- Use getattr to safely access exception detail field
- Check if detail is dict before calling .get()
- Addresses Greptile feedback about brittle string assertion

* Add French EU AI Act Article 5 policy template to registry

- Add eu-ai-act-article5-fr template for French language support
- Includes French description and guardrail info
- Matches structure of English template

* Address greptile review feedback (greploop iteration 1)

- Use status_code=400 instead of 403 to match guardrail logging convention
- Use prefix stripping instead of split('/')[-1] for robust server name extraction

* remove French EU AI Act template from policy_templates.json

---------

Co-authored-by: Julio Quinteros Pro <jquinter@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 21:19:13 -08:00
Ishaan Jaff
5b5306a540
feat: split EU AI Act Article 5 into 5 dedicated sub-guardrails per language (#21453)
Break the monolithic EU AI Act Article 5 policy template into 5 focused
sub-guardrails, each covering a specific prohibited practice:

- Art. 5.1(a) — Subliminal Manipulation & Deceptive Techniques
- Art. 5.1(b) — Exploitation of Vulnerabilities (children, elderly, disabled)
- Art. 5.1(c) — Social Scoring Systems
- Art. 5.1(f) — Emotion Recognition in Workplace & Education
- Art. 5.1(d)(g)(h) — Biometric Categorization & Predictive Profiling

Each sub-guardrail has expanded keyword coverage specific to its domain.
Includes both English and French versions (10 total sub-guardrails).
Original monolithic YAML files preserved for backward compatibility.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 20:43:25 -08:00
Ishaan Jaff
bc7fef6fda
Add prompt injection detection policy template + guardrails (#21452)
* add SQL injection detection guardrail category

* add malicious code injection detection guardrail category

* add system prompt extraction detection guardrail category

* add jailbreak attempt detection guardrail category

* add data exfiltration detection guardrail category

* add prompt injection detection policy template
2026-02-17 20:31:39 -08:00
Harshit Jain
954e8d25c6
Add relevant test case 2026-02-18 09:31:44 +05:30
Harshit Jain
8d7f9a5e78
feat(datadog): add 'team' tag to logs, metrics, and cost management 2026-02-18 09:24:08 +05:30
Sameer Kankute
e0b28a1a2f Add other provider feats 2026-02-18 09:09:08 +05:30
Sameer Kankute
892b9aca30 Add other provider feats 2026-02-18 09:07:44 +05:30
Sameer Kankute
bdba316a0e Add inference_geo: us costing 2026-02-18 08:57:28 +05:30
Sameer Kankute
0cb56c97a5 Add mapping for thinking and response format 2026-02-18 08:48:29 +05:30
Sameer Kankute
2bbae68685 Add sonnet-4.6 for tool use 2026-02-18 08:43:20 +05:30
Sameer Kankute
8003aa2057
Merge pull request #21358 from ryanh-ai/fix/nova-2-reasoning
fix(bedrock): broaden Nova 2 model detection to support all nova-2-* variants
2026-02-18 08:04:13 +05:30
Ishaan Jaff
5946a933a0
Add compliance checker endpoints + UI panel (#21432)
* eu_ai_act_article5_prohibited_practices_fr

* add backend for checkers

* test checker

* checkEuAiActCompliance

* register compliance router in proxy_server.py

* add compliance check functions to networking.tsx

* fix useEffect dependency array in CompliancePanel

* ui fixes
2026-02-17 18:22:26 -08:00
Sameer Kankute
2517c069ca
Merge pull request #21387 from BerriAI/litellm_vllm_e2e_testing
move e2e to llm translation
2026-02-18 07:44:53 +05:30
Ishaan Jaffer
e4752f4f9d ui fix 2026-02-17 18:02:33 -08:00
Ishaan Jaffer
a6f467e896 fixes - showing content filter on failure 2026-02-17 17:57:52 -08:00
Julio Quinteros Pro
81827be215 fix: prevent sys.modules["langfuse"] import failures in langfuse unit tests
Three test failures caused by the real langfuse SDK import being triggered
at test time:

1. test_langfuse_prompt_management.py: Both tests create LangfusePromptManagement()
   which calls `import langfuse`. Since earlier TestLangfuseUsageDetails tests
   remove sys.modules["langfuse"] via patch.dict teardown, the real langfuse
   import runs and fails on Python 3.14 (pydantic v1 incompatibility).
   Fix: add setup_method/teardown_method to mock sys.modules["langfuse"].

2. test_langfuse.py::test_max_langfuse_clients_limit: Same root cause — creates
   LangFuseLogger() without mocking sys.modules["langfuse"].
   Fix: wrap test body with patch.dict("sys.modules", {"langfuse": mock}).

3. test_langfuse_otel.py::test_extract_langfuse_metadata_with_header_enrichment:
   Replaces sys.modules["litellm.integrations.langfuse.langfuse"] with a stub
   without restoring it, causing patch() in later tests to target the stub
   instead of the real module.
   Fix: use monkeypatch.setitem() which auto-restores after the test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 22:33:06 -03:00
Ishaan Jaff
5a3a0210cb
feat(ui): add guardrail jump link in log detail view (#21437)
* feat(ui): add guardrail jump link at top of log detail

* fix(ui): align guardrail jump link to the left

* fix(ui): move guardrail jump link to trace sidebar

* fix(ui): move guardrail pill above event rows in sidebar
2026-02-17 17:33:06 -08:00
jquinter
93bbc27c53
Merge pull request #21434 from BerriAI/fix/langfuse-otel-sys-modules-leak
fix: restore sys.modules after stub injection in langfuse otel test
2026-02-17 22:32:12 -03:00
Julio Quinteros Pro
58f23cbb80 fix(ci): add prisma generate step to matrix CI workflow
tests/proxy_unit_tests/test_key_generate_prisma.py imports PrismaClient
at module level, which triggers a Prisma binary check. Without running
prisma generate first, all tests in that file ERROR at collection time
with "Unable to find Prisma binaries. Please run 'prisma generate' first."

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 22:24:20 -03:00
Ishaan Jaff
24fcc9da7c
fix: session grouping broken for dict rows from query_raw (#21435)
* fix: session grouping for dict rows from query_raw

* test: add unit test for session count enrichment with dict rows
2026-02-17 17:21:17 -08:00
Julio Quinteros Pro
32922449a3 fix: restore sys.modules after stub injection in langfuse otel test
test_extract_langfuse_metadata_with_header_enrichment replaced
sys.modules["litellm.integrations.langfuse.langfuse"] with a stub
module but never restored it. This caused subsequent tests using
patch("litellm.integrations.langfuse.langfuse._add_prompt_to_generation_params")
to patch the stub instead of the real module, while _log_langfuse_v2
executed from the real module's globals (unpatched), triggering
ModuleNotFoundError and assertion failures.

Fix: use monkeypatch.setitem() so pytest automatically restores the
original module after the test completes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 22:01:21 -03:00
Ishaan Jaffer
f329294005 fix(ui): show category count badge in guardrail selection modal
Category-based guardrails (like EU AI Act) now display an orange
tag showing how many categories they contain, matching the existing
pattern count tag for pattern-based guardrails.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 16:57:31 -08:00
Ishaan Jaffer
ae24bfe8cb fix description 2026-02-17 16:57:14 -08:00
jquinter
a1ba4e31f3
Merge pull request #21277 from BerriAI/improve/ci-test-stability
improve(ci): enhance test stability with better isolation and distribution
2026-02-17 21:53:53 -03:00
Julio Quinteros Pro
44feb55840 improve(ci): enhance test stability with better isolation and distribution
Implements three key improvements to reduce test flakiness from parallel execution:

1. **Split Vertex AI tests into separate group** (workers: 1)
   - Vertex AI tests often have environment variable pollution issues
   - Running serially prevents cross-test interference with GOOGLE_APPLICATION_CREDENTIALS
   - Isolates authentication-related test failures

2. **Reduce workers for other LLM tests** (4 -> 2)
   - Decreases chance of race conditions and state conflicts
   - Still parallel but with less contention

3. **Add --dist=loadscope to pytest-xdist**
   - Keeps tests from the same file together on one worker
   - Reduces interference between unrelated test modules
   - Data shows 70% pass rate WITH loadscope vs 40% WITHOUT
   - Better test isolation while maintaining parallelism

Note: loadscope exposes one tokenizer cache issue in core-utils which will be
fixed in a separate PR. The tradeoff is worth it (7/10 pass vs 4/10 without).

These changes address the root causes of intermittent test failures in:
PRs #21268, #21271, #21272, #21273, #21275, #21276:
- Environment variable pollution (GOOGLE_APPLICATION_CREDENTIALS, VERTEXAI_PROJECT)
- Global state conflicts (litellm.known_tokenizer_config)
- Async mock timing issues with parallel execution

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-17 21:49:20 -03:00
jquinter
cca4a8699a
Merge pull request #20595 from jquinter/fix/test-parallelization-isolation
fix: improve test isolation for parallel execution
2026-02-17 21:46:31 -03:00
Ishaan Jaffer
ecda49e05c fix remplate 2026-02-17 16:45:48 -08:00
Julio Quinteros Pro
c3346962a9 fix: replace silent if-hasattr guards with unconditional assertions in MCP streaming tests
The `if hasattr(...)` guards in test_acompletion_with_mcp_adds_metadata_to_streaming
and test_acompletion_with_mcp_streaming_metadata_in_correct_chunks could silently skip
the provider_specific_fields assertions if chunks lacked choices/delta. Replace with
unconditional `assert hasattr(...)` so failures surface immediately.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 21:42:31 -03:00
jquinter
c38c29d7f0
Merge pull request #21285 from BerriAI/fix/jwt-enterprise-license-test
fix(test): mock enterprise license check in JWT test
2026-02-17 21:29:39 -03:00
Julio Quinteros Pro
e6abb865d3 fix: properly reload litellm in setup_and_teardown fixture
Use importlib.import_module + reload uniformly in both code paths
to ensure fresh module state regardless of whether litellm was
previously in sys.modules. This fixes the inconsistency where the
"not in sys.modules" branch didn't reload the module.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 21:29:13 -03:00
Julio Quinteros Pro
77f315eb11 fix: address Greptile review feedback for test isolation
- test_pillar_guardrails.py: Fix fixture to properly update module-level
  litellm reference using global keyword and assignment from reload
- test_anthropic_experimental_pass_through_messages_handler.py: Add missing
  assert keywords to kwargs comparison statements (lines 36, 60-62)
- test_proxy_server.py: Replace silent pytest.skip with explicit assertion
  to catch router initialization regressions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 21:28:23 -03:00
Julio Quinteros Pro
ab6d2eefb9 fix: improve test isolation for parallel execution
Fixes test failures that occur during parallel test execution (pytest -n 4)
due to module reloading issues with conftest.py reloading litellm.

Changes:
- Add module reload fixtures to ensure fresh references after conftest reloads
- Use patch.object and string-based patches instead of direct attribute assignment
- Use class name comparison instead of isinstance for reloaded modules
- Handle case where litellm is missing from sys.modules during parallel runs
- Move stream consumption inside patch contexts to avoid real API calls
- Mock litellm.acompletion instead of low-level HTTP handlers
- Add skipif decorator for enterprise-only test classes

Affected test files:
- test_container_integration.py
- test_responses_background_cost.py
- test_huggingface_embedding_handler.py
- test_vertex_ai_rerank_integration.py
- test_volcengine_responses_transformation.py
- test_pillar_guardrails.py
- test_litellm_pre_call_utils.py
- test_proxy_server.py
- test_converse_transformation.py
- test_chat_completions_handler.py
- test_aresponses_api_with_mcp.py
- test_anthropic_experimental_pass_through_messages_handler.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-17 21:28:23 -03:00
Ishaan Jaffer
764b9ba9f8 eu_ai_act_article5_prohibited_practices_fr 2026-02-17 16:27:59 -08:00
jquinter
bf9d52e7aa Update tests/proxy_unit_tests/test_user_api_key_auth.py
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-02-17 21:25:00 -03:00
Julio Quinteros Pro
eff082993a Fix mock target for enterprise license check
Changed from non-existent JWTAuthManager._is_jwt_auth_available to
the correct proxy_server.premium_user, which is the established
pattern used elsewhere in the test suite.

This fixes the AttributeError that would occur at runtime.

Addresses Greptile feedback (score 1/5 -> should be 5/5 now).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-17 21:25:00 -03:00
Julio Quinteros Pro
3c61c7fbb1 fix(test): mock enterprise license check in JWT test
The test test_jwt_non_admin_team_route_access was failing with:
```
AssertionError: assert 'Only proxy admin can be used to generate' in
'Authentication Error, JWT Auth is an enterprise only feature...'
```

Root cause: The test was hitting the enterprise license validation before
reaching the proxy admin authorization check. In parallel execution with
--dist=loadscope, environment variables like LITELLM_LICENSE can vary
between workers or be unset, causing inconsistent test behavior.

Solution: Mock the JWTAuthManager._is_jwt_auth_available method to
return True, bypassing the license check. This allows the test to
reach the actual authorization logic being tested (proxy admin check).

This approach is more reliable than setting environment variables which
can cause pollution between parallel tests.

Fixes test failure exposed by PR #21277.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-17 21:25:00 -03:00
jquinter
62c7ebfd2c
Merge pull request #21431 from BerriAI/fix/isolate-litellm-transport-state
fix(tests): restore disable_aiohttp_transport and force_ipv4 in isolate_litellm_state
2026-02-17 21:22:41 -03:00
jquinter
faa16ef29f
Merge pull request #21428 from BerriAI/fix/vertex-gpt-oss-test-isolation
fix(tests): use class-level AsyncHTTPHandler mock in vertex GPT-OSS tests
2026-02-17 21:22:27 -03:00
jquinter
59171bd76d
Merge pull request #21423 from BerriAI/fix/token-counter-test-isolation
fix(token-counter): fix test isolation and encode() return type normalization
2026-02-17 21:22:05 -03:00
Julio Quinteros Pro
d7b0a8c559 fix(tests): restore disable_aiohttp_transport and force_ipv4 in isolate_litellm_state
Many tests across the llms group (sap, compactifai, vercel_ai_gateway, mistral,
zai, heroku) set litellm.disable_aiohttp_transport = True without restoring it.
When these tests run before test_ssl_context_transport or test_session_reuse_chain
in the same xdist worker, _create_async_transport() returns None (because aiohttp
is disabled AND force_ipv4 is False), causing both tests to fail with
'assert None is not None'.

Fix: extend isolate_litellm_state in conftest.py to also save and restore
disable_aiohttp_transport and force_ipv4, following the same pattern already
used for callbacks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 21:18:49 -03:00
Ishaan Jaff
3cc032bc0c
Add French language support for EU AI Act Article 5 guardrail (#21427)
* Add French language support for EU AI Act Article 5 template

- Create eu_ai_act_article5_fr.yaml with comprehensive French keywords
- Includes identifier words: concevoir, créer, développer, noter, classer, etc.
- Includes block words: crédit social, comportement social, émotion des employés, etc.
- Includes always-block keywords for explicit prohibited practices
- Includes exceptions for research, compliance, and legitimate use cases
- Catches circumvention attempts with phrase variations

* Add comprehensive tests for French EU AI Act guardrail

- Test 3 critical scenarios: blocked query, circumvention attempt, safe query
- Test edge cases: case-insensitive, mixed language, research exceptions
- All 7 tests passing
- Validates both blocking and allowing behavior

* Fix content filter to support conditional matching without inherit_from

- Enable conditional matching when identifier_words + additional_block_words are present
- Previously required inherit_from, but EU AI Act templates are self-contained
- Fixes Greptile feedback: conditional matching now works as documented

* Add pure conditional matching test for French guardrail

- Test identifier + block word combinations not in always_block_keywords
- Verifies conditional matching works independently
- Addresses Greptile feedback about test coverage gap

* Fix exception word bypass risk in French template

- Replace short words (film, jeu, juste) with context-specific phrases
- Prevents substring matching bypasses (e.g., enjeu matching jeu)
- Add tests for bypass prevention and legitimate game context
- Addresses Greptile security feedback

* Make conditional match assertion more robust

- Use getattr to safely access exception detail field
- Check if detail is dict before calling .get()
- Addresses Greptile feedback about brittle string assertion
2026-02-17 16:07:54 -08:00
Julio Quinteros Pro
ea0cfac995 fix(tests): add cache flush fixture for reliable HTTP client isolation
Add _reset_litellm_http_client_cache autouse fixture (matching
test_vertex_gemma_transformation.py) to flush in_memory_llm_clients_cache
before each test. Without this, a cached real AsyncHTTPHandler from an
earlier test could bypass the class-level mock and cause real HTTP calls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 21:02:56 -03:00
Julio Quinteros Pro
f0fc44c244 fix(tests): use class-level AsyncHTTPHandler mock in vertex GPT-OSS tests
Replace instance-level patch.object(client, "post", side_effect=...) with
class-level patch of AsyncHTTPHandler and AsyncMock to reliably intercept
HTTP calls in CI where real Google credentials are available.

The old approach patched a specific instance's post method and passed
client=client to acompletion(). In CI, the mock wasn't intercepting actual
HTTP calls, causing 401 ACCESS_TOKEN_TYPE_UNSUPPORTED errors. The new
approach patches AsyncHTTPHandler at the class level so any instance
created internally by get_async_httpx_client() is also mocked.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 20:52:25 -03:00
jquinter
b221b4595c
Merge pull request #21425 from BerriAI/fix/test-module-reload-class-staleness
fix: remove importlib.reload calls causing cross-test class-reference staleness
2026-02-17 20:35:47 -03:00