From c51696ddda3c5126f2d923bdea7f76ab22286b02 Mon Sep 17 00:00:00 2001 From: An Tang Date: Thu, 19 Feb 2026 17:38:31 -0800 Subject: [PATCH 01/86] auth_with_role_name add region_name arg for cross-account sts --- litellm/llms/bedrock/base_aws_llm.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index dfaddb3c2b1..aa35c30a0b2 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -234,6 +234,7 @@ class BaseAWSLLM: aws_session_token=aws_session_token, aws_role_name=aws_role_name, aws_session_name=aws_session_name, + aws_region_name=aws_region_name, aws_external_id=aws_external_id, ssl_verify=ssl_verify, ) @@ -867,6 +868,7 @@ class BaseAWSLLM: aws_session_token: Optional[str], aws_role_name: str, aws_session_name: str, + aws_region_name: Optional[str] = None, aws_external_id: Optional[str] = None, ssl_verify: Optional[Union[bool, str]] = None, ) -> Tuple[Credentials, Optional[int]]: @@ -943,12 +945,15 @@ class BaseAWSLLM: if aws_access_key_id is None and aws_secret_access_key is None: with tracer.trace("boto3.client(sts)"): sts_client = boto3.client( - "sts", verify=self._get_ssl_verify(ssl_verify) + "sts", + region_name=aws_region_name, + verify=self._get_ssl_verify(ssl_verify) ) else: with tracer.trace("boto3.client(sts)"): sts_client = boto3.client( "sts", + region_name=aws_region_name, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, aws_session_token=aws_session_token, From 5584f2d612da2ef5444b26aaa6214a2fde78443c Mon Sep 17 00:00:00 2001 From: An Tang Date: Thu, 19 Feb 2026 18:06:35 -0800 Subject: [PATCH 02/86] update tests to include case with aws_region_name for _auth_with_aws_role --- .../llms/bedrock/test_base_aws_llm.py | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py index cf9fee6bacf..335f057edbb 100644 --- a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py +++ b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py @@ -548,9 +548,6 @@ def test_eks_irsa_ambient_credentials_used(): """ base_aws_llm = BaseAWSLLM() - # Mock the boto3 STS client - mock_sts_client = MagicMock() - # Mock the STS response with proper expiration handling mock_expiry = MagicMock() mock_expiry.tzinfo = timezone.utc @@ -568,6 +565,9 @@ def test_eks_irsa_ambient_credentials_used(): "Expiration": mock_expiry, } } + + # Case 1: only aws_role_name and aws_session_name (no aws_region_name) + mock_sts_client = MagicMock() mock_sts_client.assume_role.return_value = mock_sts_response with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: @@ -588,13 +588,31 @@ def test_eks_irsa_ambient_credentials_used(): # Should call assume_role mock_sts_client.assume_role.assert_called_once_with( RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - RoleSessionName="test-session" + RoleSessionName="test-session", ) # Verify credentials are returned correctly assert credentials.access_key == "assumed-access-key" - assert credentials.secret_key == "assumed-secret-key" - assert credentials.token == "assumed-session-token" + assert ttl is not None + + # Case 2: aws_role_name, aws_session_name, and aws_region_name (regional STS) + mock_sts_client2 = MagicMock() + mock_sts_client2.assume_role.return_value = mock_sts_response + with patch("boto3.client", return_value=mock_sts_client2) as mock_boto3_client: + credentials, ttl = base_aws_llm._auth_with_aws_role( + aws_access_key_id=None, + aws_secret_access_key=None, + aws_session_token=None, + aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + aws_session_name="test-session", + aws_region_name="us-east-1", + ) + mock_boto3_client.assert_called_once_with("sts", region_name="us-east-1", verify=True) + mock_sts_client2.assume_role.assert_called_once_with( + RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + RoleSessionName="test-session", + ) + assert credentials.access_key == "assumed-access-key" assert ttl is not None From c0eb566f009cb67dfffb1dadc0bdcb3d0a76c138 Mon Sep 17 00:00:00 2001 From: An Tang Date: Thu, 19 Feb 2026 18:22:57 -0800 Subject: [PATCH 03/86] Only pass region_name to STS client when aws_region_name is set --- litellm/llms/bedrock/base_aws_llm.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index aa35c30a0b2..11b3c1422b6 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -942,22 +942,20 @@ class BaseAWSLLM: # In EKS/IRSA environments, use ambient credentials (no explicit keys needed) # This allows the web identity token to work automatically + sts_client_kwargs: dict = {"verify": self._get_ssl_verify(ssl_verify)} + if aws_region_name is not None: + sts_client_kwargs["region_name"] = aws_region_name if aws_access_key_id is None and aws_secret_access_key is None: with tracer.trace("boto3.client(sts)"): - sts_client = boto3.client( - "sts", - region_name=aws_region_name, - verify=self._get_ssl_verify(ssl_verify) - ) + sts_client = boto3.client("sts", **sts_client_kwargs) else: with tracer.trace("boto3.client(sts)"): sts_client = boto3.client( "sts", - region_name=aws_region_name, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, aws_session_token=aws_session_token, - verify=self._get_ssl_verify(ssl_verify), + **sts_client_kwargs, ) assume_role_params = { From 6df8dad7f2f43b94f78ca41ca9a6dea41496bda9 Mon Sep 17 00:00:00 2001 From: An Tang Date: Thu, 19 Feb 2026 18:43:10 -0800 Subject: [PATCH 04/86] Add optional aws_sts_endpoint to _auth_with_aws_role --- litellm/llms/bedrock/base_aws_llm.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index 11b3c1422b6..3b13c44e1a7 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -235,6 +235,7 @@ class BaseAWSLLM: aws_role_name=aws_role_name, aws_session_name=aws_session_name, aws_region_name=aws_region_name, + aws_sts_endpoint=aws_sts_endpoint, aws_external_id=aws_external_id, ssl_verify=ssl_verify, ) @@ -869,6 +870,7 @@ class BaseAWSLLM: aws_role_name: str, aws_session_name: str, aws_region_name: Optional[str] = None, + aws_sts_endpoint: Optional[str] = None, aws_external_id: Optional[str] = None, ssl_verify: Optional[Union[bool, str]] = None, ) -> Tuple[Credentials, Optional[int]]: @@ -945,6 +947,8 @@ class BaseAWSLLM: sts_client_kwargs: dict = {"verify": self._get_ssl_verify(ssl_verify)} if aws_region_name is not None: sts_client_kwargs["region_name"] = aws_region_name + if aws_sts_endpoint is not None: + sts_client_kwargs["endpoint_url"] = aws_sts_endpoint if aws_access_key_id is None and aws_secret_access_key is None: with tracer.trace("boto3.client(sts)"): sts_client = boto3.client("sts", **sts_client_kwargs) From 782df9283f1d84adbd5031dfae097403fe2b6de8 Mon Sep 17 00:00:00 2001 From: An Tang Date: Thu, 19 Feb 2026 18:43:28 -0800 Subject: [PATCH 05/86] Parametrize ambient-credentials test for no opts, region_name, and aws_sts_endpoint --- .../llms/bedrock/test_base_aws_llm.py | 61 ++++++------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py index 335f057edbb..2446f506627 100644 --- a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py +++ b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py @@ -541,22 +541,29 @@ def test_different_roles_without_session_names_should_not_share_cache(): assert cache_key1 != cache_key2 -def test_eks_irsa_ambient_credentials_used(): +@pytest.mark.parametrize( + "role_kwargs,expected_client_kwargs", + [ + ({}, {"verify": True}), + ({"aws_region_name": "us-east-1"}, {"region_name": "us-east-1", "verify": True}), + ( + {"aws_sts_endpoint": "https://sts.eu-west-1.amazonaws.com"}, + {"endpoint_url": "https://sts.eu-west-1.amazonaws.com", "verify": True}, + ), + ], + ids=["no_region_or_endpoint", "regional_sts", "explicit_sts_endpoint"], +) +def test_eks_irsa_ambient_credentials_used(role_kwargs, expected_client_kwargs): """ - Test that in EKS/IRSA environments, ambient credentials are used when no explicit keys provided. - This allows web identity tokens to work automatically. + When only aws_role_name and aws_session_name are passed (no explicit creds), + boto3.client("sts", **expected) is called with no credential kwargs. """ base_aws_llm = BaseAWSLLM() - - # Mock the STS response with proper expiration handling mock_expiry = MagicMock() mock_expiry.tzinfo = timezone.utc - current_time = datetime.now(timezone.utc) - # Create a timedelta object that returns 3600 when total_seconds() is called time_diff = MagicMock() time_diff.total_seconds.return_value = 3600 mock_expiry.__sub__ = MagicMock(return_value=time_diff) - mock_sts_response = { "Credentials": { "AccessKeyId": "assumed-access-key", @@ -565,50 +572,20 @@ def test_eks_irsa_ambient_credentials_used(): "Expiration": mock_expiry, } } - - # Case 1: only aws_role_name and aws_session_name (no aws_region_name) mock_sts_client = MagicMock() mock_sts_client.assume_role.return_value = mock_sts_response - - with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: - - # Call with no explicit credentials (EKS/IRSA scenario) - credentials, ttl = base_aws_llm._auth_with_aws_role( - aws_access_key_id=None, - aws_secret_access_key=None, - aws_session_token=None, - aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - aws_session_name="test-session" - ) - - # Should create STS client without explicit credentials (using ambient credentials) - # Note: verify parameter is passed for SSL verification - mock_boto3_client.assert_called_once_with("sts", verify=True) - - # Should call assume_role - mock_sts_client.assume_role.assert_called_once_with( - RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - RoleSessionName="test-session", - ) - - # Verify credentials are returned correctly - assert credentials.access_key == "assumed-access-key" - assert ttl is not None - # Case 2: aws_role_name, aws_session_name, and aws_region_name (regional STS) - mock_sts_client2 = MagicMock() - mock_sts_client2.assume_role.return_value = mock_sts_response - with patch("boto3.client", return_value=mock_sts_client2) as mock_boto3_client: + with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: credentials, ttl = base_aws_llm._auth_with_aws_role( aws_access_key_id=None, aws_secret_access_key=None, aws_session_token=None, aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", aws_session_name="test-session", - aws_region_name="us-east-1", + **role_kwargs, ) - mock_boto3_client.assert_called_once_with("sts", region_name="us-east-1", verify=True) - mock_sts_client2.assume_role.assert_called_once_with( + mock_boto3_client.assert_called_once_with("sts", **expected_client_kwargs) + mock_sts_client.assume_role.assert_called_once_with( RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", RoleSessionName="test-session", ) From be885ad2367431d3cde19f2e47257ba307721841 Mon Sep 17 00:00:00 2001 From: An Tang Date: Fri, 20 Feb 2026 10:42:14 -0800 Subject: [PATCH 06/86] consistently passing region and endpoint args into explicit credentials irsa --- litellm/llms/bedrock/base_aws_llm.py | 37 +++++----- .../llms/bedrock/test_base_aws_llm.py | 67 ++++++++++++------- 2 files changed, 63 insertions(+), 41 deletions(-) diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index 3b13c44e1a7..5da118a8f53 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -735,6 +735,7 @@ class BaseAWSLLM: region: str, web_identity_token_file: str, aws_external_id: Optional[str] = None, + aws_sts_endpoint: Optional[str] = None, ssl_verify: Optional[Union[bool, str]] = None, ) -> dict: """Handle cross-account role assumption for IRSA.""" @@ -746,11 +747,13 @@ class BaseAWSLLM: with open(web_identity_token_file, "r") as f: web_identity_token = f.read().strip() + irsa_sts_kwargs: dict = {"region_name": region, "verify": self._get_ssl_verify(ssl_verify)} + if aws_sts_endpoint is not None: + irsa_sts_kwargs["endpoint_url"] = aws_sts_endpoint + # Create an STS client without credentials with tracer.trace("boto3.client(sts) for manual IRSA"): - sts_client = boto3.client( - "sts", region_name=region, verify=self._get_ssl_verify(ssl_verify) - ) + sts_client = boto3.client("sts", **irsa_sts_kwargs) # Manually assume the IRSA role with the session name verbose_logger.debug( @@ -769,11 +772,10 @@ class BaseAWSLLM: with tracer.trace("boto3.client(sts) with manual IRSA credentials"): sts_client_with_creds = boto3.client( "sts", - region_name=region, aws_access_key_id=irsa_creds["AccessKeyId"], aws_secret_access_key=irsa_creds["SecretAccessKey"], aws_session_token=irsa_creds["SessionToken"], - verify=self._get_ssl_verify(ssl_verify), + **irsa_sts_kwargs, ) # Get current caller identity for debugging @@ -806,16 +808,19 @@ class BaseAWSLLM: aws_session_name: str, region: str, aws_external_id: Optional[str] = None, + aws_sts_endpoint: Optional[str] = None, ssl_verify: Optional[Union[bool, str]] = None, ) -> dict: """Handle same-account role assumption for IRSA.""" import boto3 + irsa_sts_kwargs: dict = {"region_name": region, "verify": self._get_ssl_verify(ssl_verify)} + if aws_sts_endpoint is not None: + irsa_sts_kwargs["endpoint_url"] = aws_sts_endpoint + verbose_logger.debug("Same account role assumption, using automatic IRSA") with tracer.trace("boto3.client(sts) with automatic IRSA"): - sts_client = boto3.client( - "sts", region_name=region, verify=self._get_ssl_verify(ssl_verify) - ) + sts_client = boto3.client("sts", **irsa_sts_kwargs) # Get current caller identity for debugging try: @@ -884,6 +889,8 @@ class BaseAWSLLM: web_identity_token_file = os.getenv("AWS_WEB_IDENTITY_TOKEN_FILE") irsa_role_arn = os.getenv("AWS_ROLE_ARN") + region = aws_region_name or os.getenv("AWS_REGION") or os.getenv("AWS_DEFAULT_REGION") + # If we have IRSA environment variables and no explicit credentials, # we need to use the web identity token flow if ( @@ -899,12 +906,8 @@ class BaseAWSLLM: ) try: - # Get region from environment - region = ( - os.getenv("AWS_REGION") - or os.getenv("AWS_DEFAULT_REGION") - or "us-east-1" - ) + # Use passed-in region when set, else env, else default (align with AssumeRole path) + region = region or "us-east-1" # Check if we need to do cross-account role assumption if aws_role_name != irsa_role_arn: @@ -915,6 +918,7 @@ class BaseAWSLLM: region, web_identity_token_file, aws_external_id, + aws_sts_endpoint=aws_sts_endpoint, ssl_verify=ssl_verify, ) else: @@ -923,6 +927,7 @@ class BaseAWSLLM: aws_session_name, region, aws_external_id, + aws_sts_endpoint=aws_sts_endpoint, ssl_verify=ssl_verify, ) @@ -945,8 +950,8 @@ class BaseAWSLLM: # In EKS/IRSA environments, use ambient credentials (no explicit keys needed) # This allows the web identity token to work automatically sts_client_kwargs: dict = {"verify": self._get_ssl_verify(ssl_verify)} - if aws_region_name is not None: - sts_client_kwargs["region_name"] = aws_region_name + if region is not None: + sts_client_kwargs["region_name"] = region if aws_sts_endpoint is not None: sts_client_kwargs["endpoint_url"] = aws_sts_endpoint if aws_access_key_id is None and aws_secret_access_key is None: diff --git a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py index 2446f506627..a38e0c0b0ac 100644 --- a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py +++ b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py @@ -593,24 +593,54 @@ def test_eks_irsa_ambient_credentials_used(role_kwargs, expected_client_kwargs): assert ttl is not None -def test_explicit_credentials_used_when_provided(): +@pytest.mark.parametrize( + "role_kwargs,expected_client_kwargs", + [ + ( + {}, + { + "aws_access_key_id": "explicit-access-key", + "aws_secret_access_key": "explicit-secret-key", + "aws_session_token": "assumed-session-token", + "verify": True, + }, + ), + ( + {"aws_region_name": "us-east-1"}, + { + "region_name": "us-east-1", + "aws_access_key_id": "explicit-access-key", + "aws_secret_access_key": "explicit-secret-key", + "aws_session_token": "assumed-session-token", + "verify": True, + }, + ), + ( + {"aws_sts_endpoint": "https://sts.eu-west-1.amazonaws.com"}, + { + "endpoint_url": "https://sts.eu-west-1.amazonaws.com", + "aws_access_key_id": "explicit-access-key", + "aws_secret_access_key": "explicit-secret-key", + "aws_session_token": "assumed-session-token", + "verify": True, + }, + ), + ], + ids=["no_region_or_endpoint", "regional_sts", "explicit_sts_endpoint"], +) +def test_explicit_credentials_used_when_provided(role_kwargs, expected_client_kwargs): """ Test that explicit credentials are used when provided (non-EKS/IRSA scenario). """ base_aws_llm = BaseAWSLLM() - - # Mock the boto3 STS client - mock_sts_client = MagicMock() - + # Mock the STS response with proper expiration handling mock_expiry = MagicMock() mock_expiry.tzinfo = timezone.utc - current_time = datetime.now(timezone.utc) # Create a timedelta object that returns 3600 when total_seconds() is called time_diff = MagicMock() time_diff.total_seconds.return_value = 3600 mock_expiry.__sub__ = MagicMock(return_value=time_diff) - mock_sts_response = { "Credentials": { "AccessKeyId": "assumed-access-key", @@ -619,36 +649,23 @@ def test_explicit_credentials_used_when_provided(): "Expiration": mock_expiry, } } + mock_sts_client = MagicMock() mock_sts_client.assume_role.return_value = mock_sts_response - + with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: - - # Call with explicit credentials credentials, ttl = base_aws_llm._auth_with_aws_role( aws_access_key_id="explicit-access-key", aws_secret_access_key="explicit-secret-key", aws_session_token="assumed-session-token", aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - aws_session_name="test-session" + aws_session_name="test-session", + **role_kwargs ) - - # Should create STS client with explicit credentials - # Note: verify parameter is passed for SSL verification - mock_boto3_client.assert_called_once_with( - "sts", - aws_access_key_id="explicit-access-key", - aws_secret_access_key="explicit-secret-key", - aws_session_token="assumed-session-token", - verify=True, - ) - - # Should call assume_role + mock_boto3_client.assert_called_once_with("sts", **expected_client_kwargs) mock_sts_client.assume_role.assert_called_once_with( RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", RoleSessionName="test-session" ) - - # Verify credentials are returned correctly assert credentials.access_key == "assumed-access-key" assert credentials.secret_key == "assumed-secret-key" assert credentials.token == "assumed-session-token" From 08a561f78aff62d652bb935a049d014e6e9a6681 Mon Sep 17 00:00:00 2001 From: An Tang Date: Fri, 20 Feb 2026 11:10:07 -0800 Subject: [PATCH 07/86] fix env var leakage --- .../llms/bedrock/test_base_aws_llm.py | 92 +++++++++++-------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py index a38e0c0b0ac..18fc7c6173e 100644 --- a/tests/test_litellm/llms/bedrock/test_base_aws_llm.py +++ b/tests/test_litellm/llms/bedrock/test_base_aws_llm.py @@ -555,9 +555,15 @@ def test_different_roles_without_session_names_should_not_share_cache(): ) def test_eks_irsa_ambient_credentials_used(role_kwargs, expected_client_kwargs): """ - When only aws_role_name and aws_session_name are passed (no explicit creds), - boto3.client("sts", **expected) is called with no credential kwargs. + Test that in EKS/IRSA environments, ambient credentials are used when no explicit keys provided. + This allows web identity tokens to work automatically. """ + # Isolate from ambient AWS_REGION/AWS_DEFAULT_REGION so no_region_or_endpoint is deterministic + env_without_aws_region = { + k: v + for k, v in os.environ.items() + if k not in ("AWS_REGION", "AWS_DEFAULT_REGION") + } base_aws_llm = BaseAWSLLM() mock_expiry = MagicMock() mock_expiry.tzinfo = timezone.utc @@ -575,22 +581,25 @@ def test_eks_irsa_ambient_credentials_used(role_kwargs, expected_client_kwargs): mock_sts_client = MagicMock() mock_sts_client.assume_role.return_value = mock_sts_response - with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: - credentials, ttl = base_aws_llm._auth_with_aws_role( - aws_access_key_id=None, - aws_secret_access_key=None, - aws_session_token=None, - aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - aws_session_name="test-session", - **role_kwargs, - ) - mock_boto3_client.assert_called_once_with("sts", **expected_client_kwargs) - mock_sts_client.assume_role.assert_called_once_with( - RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - RoleSessionName="test-session", - ) - assert credentials.access_key == "assumed-access-key" - assert ttl is not None + with patch.dict(os.environ, env_without_aws_region, clear=True): + with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: + credentials, ttl = base_aws_llm._auth_with_aws_role( + aws_access_key_id=None, + aws_secret_access_key=None, + aws_session_token=None, + aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + aws_session_name="test-session", + **role_kwargs, + ) + mock_boto3_client.assert_called_once_with( + "sts", **expected_client_kwargs + ) + mock_sts_client.assume_role.assert_called_once_with( + RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + RoleSessionName="test-session", + ) + assert credentials.access_key == "assumed-access-key" + assert ttl is not None @pytest.mark.parametrize( @@ -632,9 +641,13 @@ def test_explicit_credentials_used_when_provided(role_kwargs, expected_client_kw """ Test that explicit credentials are used when provided (non-EKS/IRSA scenario). """ + # Isolate from ambient AWS_REGION/AWS_DEFAULT_REGION so no_region_or_endpoint is deterministic + env_without_aws_region = { + k: v + for k, v in os.environ.items() + if k not in ("AWS_REGION", "AWS_DEFAULT_REGION") + } base_aws_llm = BaseAWSLLM() - - # Mock the STS response with proper expiration handling mock_expiry = MagicMock() mock_expiry.tzinfo = timezone.utc # Create a timedelta object that returns 3600 when total_seconds() is called @@ -652,24 +665,27 @@ def test_explicit_credentials_used_when_provided(role_kwargs, expected_client_kw mock_sts_client = MagicMock() mock_sts_client.assume_role.return_value = mock_sts_response - with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: - credentials, ttl = base_aws_llm._auth_with_aws_role( - aws_access_key_id="explicit-access-key", - aws_secret_access_key="explicit-secret-key", - aws_session_token="assumed-session-token", - aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - aws_session_name="test-session", - **role_kwargs - ) - mock_boto3_client.assert_called_once_with("sts", **expected_client_kwargs) - mock_sts_client.assume_role.assert_called_once_with( - RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", - RoleSessionName="test-session" - ) - assert credentials.access_key == "assumed-access-key" - assert credentials.secret_key == "assumed-secret-key" - assert credentials.token == "assumed-session-token" - assert ttl is not None + with patch.dict(os.environ, env_without_aws_region, clear=True): + with patch("boto3.client", return_value=mock_sts_client) as mock_boto3_client: + credentials, ttl = base_aws_llm._auth_with_aws_role( + aws_access_key_id="explicit-access-key", + aws_secret_access_key="explicit-secret-key", + aws_session_token="assumed-session-token", + aws_role_name="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + aws_session_name="test-session", + **role_kwargs, + ) + mock_boto3_client.assert_called_once_with( + "sts", **expected_client_kwargs + ) + mock_sts_client.assume_role.assert_called_once_with( + RoleArn="arn:aws:iam::2222222222222:role/LitellmEvalBedrockRole", + RoleSessionName="test-session", + ) + assert credentials.access_key == "assumed-access-key" + assert credentials.secret_key == "assumed-secret-key" + assert credentials.token == "assumed-session-token" + assert ttl is not None def test_partial_credentials_still_use_ambient(): From 4885b3658066aa66326f69c741473162cbb4b2a0 Mon Sep 17 00:00:00 2001 From: An Tang Date: Fri, 20 Feb 2026 13:07:10 -0800 Subject: [PATCH 08/86] fix: bedrock openai-compatible imported-model should also have model arn encoded --- .../invoke_transformations/amazon_openai_transformation.py | 4 ++++ tests/llm_translation/test_bedrock_completion.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/litellm/llms/bedrock/chat/invoke_transformations/amazon_openai_transformation.py b/litellm/llms/bedrock/chat/invoke_transformations/amazon_openai_transformation.py index ee07b71ef15..a438be17458 100644 --- a/litellm/llms/bedrock/chat/invoke_transformations/amazon_openai_transformation.py +++ b/litellm/llms/bedrock/chat/invoke_transformations/amazon_openai_transformation.py @@ -14,6 +14,7 @@ import httpx from litellm.llms.bedrock.base_aws_llm import BaseAWSLLM from litellm.llms.bedrock.common_utils import BedrockError from litellm.llms.openai.chat.gpt_transformation import OpenAIGPTConfig +from litellm.passthrough.utils import CommonUtils from litellm.types.llms.openai import AllMessageValues if TYPE_CHECKING: @@ -94,6 +95,9 @@ class AmazonBedrockOpenAIConfig(OpenAIGPTConfig, BaseAWSLLM): aws_bedrock_runtime_endpoint=aws_bedrock_runtime_endpoint, aws_region_name=aws_region_name, ) + + # Encode model ID for ARNs (e.g., :imported-model/ -> :imported-model%2F) + model_id = CommonUtils.encode_bedrock_runtime_modelid_arn(model_id) # Build the invoke URL if stream: diff --git a/tests/llm_translation/test_bedrock_completion.py b/tests/llm_translation/test_bedrock_completion.py index d23033c1e46..40ef2c32831 100644 --- a/tests/llm_translation/test_bedrock_completion.py +++ b/tests/llm_translation/test_bedrock_completion.py @@ -3517,7 +3517,7 @@ def test_bedrock_openai_imported_model(): print(f"URL: {url}") assert "bedrock-runtime.us-east-1.amazonaws.com" in url assert ( - "arn:aws:bedrock:us-east-1:117159858402:imported-model/m4gc1mrfuddy" in url + "arn:aws:bedrock:us-east-1:117159858402:imported-model%2Fm4gc1mrfuddy" in url ) assert "/invoke" in url From 107f9dc46c44f57ae57a90574691fea59ee947ab Mon Sep 17 00:00:00 2001 From: janfrederickk <75388864+janfrederickk@users.noreply.github.com> Date: Sat, 21 Feb 2026 07:26:14 +0100 Subject: [PATCH 09/86] feat: show proxy url in ModelHub (#21660) --- ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx index 71b84e281df..537aa001b70 100644 --- a/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx +++ b/ui/litellm-dashboard/src/components/AIHub/ModelHubTable.tsx @@ -659,7 +659,7 @@ const ModelHubTable: React.FC = ({ accessToken, publicPage, client = openai.OpenAI( api_key="your_api_key", - base_url="http://0.0.0.0:4000" # Your LiteLLM Proxy URL + base_url="${getProxyBaseUrl()}" # Your LiteLLM Proxy URL ) response = client.chat.completions.create( @@ -997,7 +997,7 @@ import asyncio config = { "mcpServers": { "${selectedMcpServer.server_name}": { - "url": "http://localhost:4000/${selectedMcpServer.server_name}/mcp", + "url": "${getProxyBaseUrl()}/${selectedMcpServer.server_name}/mcp", "headers": { "x-litellm-api-key": "Bearer sk-1234" } @@ -1016,7 +1016,7 @@ async def main(): # Call a tool response = await client.call_tool( - name="tool_name", + name="tool_name", arguments={"arg": "value"} ) print(f"Response: {response}") From 4cc58fe058248f8f734eb65c2be3c3d0542bdc12 Mon Sep 17 00:00:00 2001 From: Zhenting Huang <3061613175@qq.com> Date: Sat, 21 Feb 2026 14:27:22 +0800 Subject: [PATCH 10/86] fix(bedrock): correct modelInput format for Converse API batch models (#21656) --- litellm/llms/bedrock/files/transformation.py | 76 ++++-- .../expected_bedrock_batch_completions.jsonl | 4 +- .../test_bedrock_files_transformation.py | 220 ++++++++++++++++++ 3 files changed, 276 insertions(+), 24 deletions(-) diff --git a/litellm/llms/bedrock/files/transformation.py b/litellm/llms/bedrock/files/transformation.py index fdcbe1a8242..20ec233808d 100644 --- a/litellm/llms/bedrock/files/transformation.py +++ b/litellm/llms/bedrock/files/transformation.py @@ -202,52 +202,84 @@ class BedrockFilesConfig(BaseAWSLLM, BaseFilesConfig): return optional_params + # Providers whose InvokeModel body uses the Converse API format + # (messages + inferenceConfig + image blocks). Nova is the primary + # example; add others here as they adopt the same schema. + CONVERSE_INVOKE_PROVIDERS = ("nova",) + def _map_openai_to_bedrock_params( self, openai_request_body: Dict[str, Any], provider: Optional[str] = None, ) -> Dict[str, Any]: """ - Transform OpenAI request body to Bedrock-compatible modelInput parameters using existing transformation logic + Transform OpenAI request body to Bedrock-compatible modelInput + parameters using existing transformation logic. + + Routes to the correct per-provider transformation so that the + resulting dict matches the InvokeModel body that Bedrock expects + for batch inference. """ from litellm.types.utils import LlmProviders + _model = openai_request_body.get("model", "") messages = openai_request_body.get("messages", []) - - # Use existing Anthropic transformation logic for Anthropic models + optional_params = { + k: v + for k, v in openai_request_body.items() + if k not in ["model", "messages"] + } + + # --- Anthropic: use existing AmazonAnthropicClaudeConfig --- if provider == LlmProviders.ANTHROPIC: from litellm.llms.bedrock.chat.invoke_transformations.anthropic_claude3_transformation import ( AmazonAnthropicClaudeConfig, ) - - anthropic_config = AmazonAnthropicClaudeConfig() - - # Extract optional params (everything except model and messages) - optional_params = {k: v for k, v in openai_request_body.items() if k not in ["model", "messages"]} - mapped_params = anthropic_config.map_openai_params( + + config = AmazonAnthropicClaudeConfig() + mapped_params = config.map_openai_params( non_default_params={}, optional_params=optional_params, model=_model, - drop_params=False + drop_params=False, ) - - # Transform using existing Anthropic logic - bedrock_params = anthropic_config.transform_request( + return config.transform_request( model=_model, messages=messages, optional_params=mapped_params, litellm_params={}, - headers={} + headers={}, ) - return bedrock_params - else: - # For other providers, use basic mapping - bedrock_params = { - "messages": messages, - **{k: v for k, v in openai_request_body.items() if k not in ["model", "messages"]} - } - return bedrock_params + # --- Converse API providers (e.g. Nova): use AmazonConverseConfig + # to correctly convert image_url blocks to Bedrock image format + # and wrap inference params inside inferenceConfig. --- + if provider in self.CONVERSE_INVOKE_PROVIDERS: + from litellm.llms.bedrock.chat.converse_transformation import ( + AmazonConverseConfig, + ) + + config = AmazonConverseConfig() + mapped_params = config.map_openai_params( + non_default_params=optional_params, + optional_params={}, + model=_model, + drop_params=False, + ) + return config.transform_request( + model=_model, + messages=messages, + optional_params=mapped_params, + litellm_params={}, + headers={}, + ) + + # --- All other providers: passthrough (OpenAI-compatible models + # like openai.gpt-oss-*, qwen, deepseek, etc.) --- + return { + "messages": messages, + **optional_params, + } def _transform_openai_jsonl_content_to_bedrock_jsonl_content( self, openai_jsonl_content: List[Dict[str, Any]] diff --git a/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl b/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl index c58963bb1de..8bb35ba95d7 100644 --- a/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl +++ b/tests/test_litellm/llms/bedrock/files/expected_bedrock_batch_completions.jsonl @@ -1,2 +1,2 @@ -{"recordId": "request-1", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are a helpful assistant."}], "anthropic_version": "bedrock-2023-05-31"}} -{"recordId": "request-2", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are an unhelpful assistant."}], "anthropic_version": "bedrock-2023-05-31"}} +{"recordId": "request-1", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are a helpful assistant."}], "anthropic_version": "bedrock-2023-05-31", "anthropic_beta": []}} +{"recordId": "request-2", "modelInput": {"messages": [{"role": "user", "content": [{"type": "text", "text": "Hello world!"}]}], "max_tokens": 10, "system": [{"type": "text", "text": "You are an unhelpful assistant."}], "anthropic_version": "bedrock-2023-05-31", "anthropic_beta": []}} diff --git a/tests/test_litellm/llms/bedrock/files/test_bedrock_files_transformation.py b/tests/test_litellm/llms/bedrock/files/test_bedrock_files_transformation.py index 06e72539088..88cac84e438 100644 --- a/tests/test_litellm/llms/bedrock/files/test_bedrock_files_transformation.py +++ b/tests/test_litellm/llms/bedrock/files/test_bedrock_files_transformation.py @@ -88,3 +88,223 @@ class TestBedrockFilesTransformation: print(f"\n=== Expected output written to: {expected_output_path} ===") + def test_nova_text_only_uses_converse_format(self): + """ + Test that Nova models produce Converse API format in batch modelInput. + + Verifies that: + - max_tokens is wrapped inside inferenceConfig.maxTokens + - messages use Converse content block format + - No raw OpenAI keys (max_tokens, temperature) at the top level + """ + from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + config = BedrockFilesConfig() + + openai_jsonl_content = [ + { + "custom_id": "nova-text-1", + "method": "POST", + "url": "/v1/chat/completions", + "body": { + "model": "us.amazon.nova-pro-v1:0", + "messages": [ + {"role": "user", "content": "What is the capital of France?"} + ], + "max_tokens": 50, + "temperature": 0.7, + }, + } + ] + + result = config._transform_openai_jsonl_content_to_bedrock_jsonl_content( + openai_jsonl_content + ) + + assert len(result) == 1 + record = result[0] + assert record["recordId"] == "nova-text-1" + + model_input = record["modelInput"] + + # Must have inferenceConfig with maxTokens, NOT top-level max_tokens + assert "inferenceConfig" in model_input, ( + "Nova modelInput must contain inferenceConfig" + ) + assert model_input["inferenceConfig"]["maxTokens"] == 50 + assert model_input["inferenceConfig"]["temperature"] == 0.7 + assert "max_tokens" not in model_input, ( + "max_tokens must NOT be at the top level for Nova" + ) + assert "temperature" not in model_input, ( + "temperature must NOT be at the top level for Nova" + ) + + # Must have messages + assert "messages" in model_input + + def test_nova_image_content_uses_converse_image_blocks(self): + """ + Test that image_url content blocks are converted to Bedrock Converse + image format for Nova models in batch. + + Verifies that: + - image_url blocks are converted to {"image": {"format": ..., "source": {"bytes": ...}}} + - text blocks are converted to {"text": "..."} + - No raw OpenAI image_url type remains + """ + from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + config = BedrockFilesConfig() + + # 1x1 transparent PNG + img_b64 = ( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR4" + "2mP8z8BQDwADhQGAWjR9awAAAABJRU5ErkJggg==" + ) + + openai_jsonl_content = [ + { + "custom_id": "nova-img-1", + "method": "POST", + "url": "/v1/chat/completions", + "body": { + "model": "us.amazon.nova-pro-v1:0", + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": "Describe this image."}, + { + "type": "image_url", + "image_url": { + "url": "data:image/png;base64," + img_b64 + }, + }, + ], + } + ], + "max_tokens": 100, + }, + } + ] + + result = config._transform_openai_jsonl_content_to_bedrock_jsonl_content( + openai_jsonl_content + ) + + assert len(result) == 1 + model_input = result[0]["modelInput"] + + # Check inferenceConfig + assert "inferenceConfig" in model_input + assert model_input["inferenceConfig"]["maxTokens"] == 100 + assert "max_tokens" not in model_input + + # Check messages structure + messages = model_input["messages"] + assert len(messages) == 1 + content_blocks = messages[0]["content"] + + # Should have text block and image block in Converse format + has_text = False + has_image = False + for block in content_blocks: + if "text" in block: + has_text = True + if "image" in block: + has_image = True + # Verify Converse image format + assert "format" in block["image"], ( + "Image block must have format field" + ) + assert "source" in block["image"], ( + "Image block must have source field" + ) + assert "bytes" in block["image"]["source"], ( + "Image source must have bytes field" + ) + # Must NOT have OpenAI-style image_url + assert "image_url" not in block, ( + "image_url must not appear in Converse format" + ) + assert block.get("type") != "image_url", ( + "type=image_url must not appear in Converse format" + ) + + assert has_text, "Should have a text content block" + assert has_image, "Should have an image content block" + + def test_anthropic_still_works_after_nova_fix(self): + """ + Regression test: ensure Anthropic models are still correctly + transformed after the Converse API provider changes. + """ + from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + config = BedrockFilesConfig() + + openai_jsonl_content = [ + { + "custom_id": "claude-1", + "method": "POST", + "url": "/v1/chat/completions", + "body": { + "model": "us.anthropic.claude-3-5-sonnet-20240620-v1:0", + "messages": [ + {"role": "system", "content": "You are helpful."}, + {"role": "user", "content": "Hello!"}, + ], + "max_tokens": 10, + }, + } + ] + + result = config._transform_openai_jsonl_content_to_bedrock_jsonl_content( + openai_jsonl_content + ) + + assert len(result) == 1 + model_input = result[0]["modelInput"] + + # Anthropic should have anthropic_version + assert "anthropic_version" in model_input + assert "messages" in model_input + assert "max_tokens" in model_input + + def test_openai_passthrough_still_works(self): + """ + Regression test: ensure OpenAI-compatible models (e.g. gpt-oss) + still use passthrough format. + """ + from litellm.llms.bedrock.files.transformation import BedrockFilesConfig + + config = BedrockFilesConfig() + + openai_jsonl_content = [ + { + "custom_id": "openai-1", + "method": "POST", + "url": "/v1/chat/completions", + "body": { + "model": "openai.gpt-oss-120b-1:0", + "messages": [ + {"role": "user", "content": "Hello!"}, + ], + "max_tokens": 10, + }, + } + ] + + result = config._transform_openai_jsonl_content_to_bedrock_jsonl_content( + openai_jsonl_content + ) + + assert len(result) == 1 + model_input = result[0]["modelInput"] + + # OpenAI-compatible should use passthrough: max_tokens at top level + assert "messages" in model_input + assert "max_tokens" in model_input + assert model_input["max_tokens"] == 10 + From c845c334b442ca799a35c684af689d1cc2f953de Mon Sep 17 00:00:00 2001 From: Zhenting Huang <3061613175@qq.com> Date: Sat, 21 Feb 2026 16:39:57 +0800 Subject: [PATCH 11/86] fix(proxy): add model_ids param to access group endpoints for precise deployment tagging (#21655) POST /access_group/new and PUT /access_group/{name}/update now accept an optional model_ids list that targets specific deployments by their unique model_id, instead of tagging every deployment that shares a model_name. When model_ids is provided it takes priority over model_names, giving API callers the same single-deployment precision that the UI already has via PATCH /model/{model_id}/update. Backward compatible: model_names continues to work as before. Closes #21544 --- ...model_access_group_management_endpoints.py | 153 +++++++++---- .../model_management_endpoints.py | 9 +- .../test_access_group_management.py | 210 ++++++++++++++++++ 3 files changed, 329 insertions(+), 43 deletions(-) diff --git a/litellm/proxy/management_endpoints/model_access_group_management_endpoints.py b/litellm/proxy/management_endpoints/model_access_group_management_endpoints.py index 0c820f6b789..dc80d6eb6ee 100644 --- a/litellm/proxy/management_endpoints/model_access_group_management_endpoints.py +++ b/litellm/proxy/management_endpoints/model_access_group_management_endpoints.py @@ -6,7 +6,7 @@ Endpoints here: """ import json -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, List, Optional, Tuple from fastapi import APIRouter, Depends, HTTPException @@ -141,6 +141,50 @@ async def update_deployments_with_access_group( return models_updated +async def update_specific_deployments_with_access_group( + model_ids: List[str], + access_group: str, + prisma_client: PrismaClient, +) -> int: + """ + Update specific deployments (by model_id) to include the access group. + + Unlike update_deployments_with_access_group which tags ALL deployments sharing + a model_name, this function only tags the specific deployments identified by + their unique model_id. + """ + models_updated = 0 + for model_id in model_ids: + verbose_proxy_logger.debug( + f"Updating specific deployment model_id: {model_id}" + ) + deployment = await prisma_client.db.litellm_proxymodeltable.find_unique( + where={"model_id": model_id} + ) + if deployment is None: + raise HTTPException( + status_code=400, + detail={ + "error": f"Deployment with model_id '{model_id}' not found in Database." + }, + ) + model_info = deployment.model_info or {} + updated_model_info, was_modified = add_access_group_to_deployment( + model_info=model_info, + access_group=access_group, + ) + if was_modified: + await prisma_client.db.litellm_proxymodeltable.update( + where={"model_id": model_id}, + data={"model_info": json.dumps(updated_model_info)}, + ) + models_updated += 1 + verbose_proxy_logger.debug( + f"Updated deployment {model_id} with access group: {access_group}" + ) + return models_updated + + def remove_access_group_from_deployment( model_info: Dict[str, Any], access_group: str ) -> Tuple[Dict[str, Any], bool]: @@ -263,24 +307,31 @@ async def create_model_group( detail={"error": "access_group is required and cannot be empty"}, ) - # Validation: Check if model_names list is provided and not empty - if not data.model_names or len(data.model_names) == 0: + # Validation: Check that at least one of model_names or model_ids is provided + has_model_names = data.model_names and len(data.model_names) > 0 + has_model_ids = data.model_ids and len(data.model_ids) > 0 + + if not has_model_names and not has_model_ids: raise HTTPException( status_code=400, - detail={"error": "model_names list is required and cannot be empty"}, + detail={"error": "Either model_names or model_ids must be provided and non-empty"}, ) - - # Validation: Check if all models exist in the router - all_valid, missing_models = validate_models_exist( - model_names=data.model_names, - llm_router=llm_router, - ) - - if not all_valid: - raise HTTPException( - status_code=400, - detail={"error": f"Model(s) not found: {', '.join(missing_models)}"}, + + # If model_ids is provided, use it (more precise targeting) + use_model_ids = has_model_ids + + # Validate model_names exist in router (only if using model_names path) + if not use_model_ids and has_model_names: + all_valid, missing_models = validate_models_exist( + model_names=data.model_names, + llm_router=llm_router, ) + + if not all_valid: + raise HTTPException( + status_code=400, + detail={"error": f"Model(s) not found: {', '.join(missing_models)}"}, + ) # Check if database is connected if prisma_client is None: @@ -301,12 +352,19 @@ async def create_model_group( detail={"error": f"Access group '{data.access_group}' already exists. Use PUT /access_group/{data.access_group}/update to modify it."}, ) - # Update deployments using helper function - models_updated = await update_deployments_with_access_group( - model_names=data.model_names, - access_group=data.access_group, - prisma_client=prisma_client, - ) + # Update deployments using the appropriate method + if use_model_ids: + models_updated = await update_specific_deployments_with_access_group( + model_ids=data.model_ids, + access_group=data.access_group, + prisma_client=prisma_client, + ) + else: + models_updated = await update_deployments_with_access_group( + model_names=data.model_names, + access_group=data.access_group, + prisma_client=prisma_client, + ) await clear_cache() @@ -317,6 +375,7 @@ async def create_model_group( return NewModelGroupResponse( access_group=data.access_group, model_names=data.model_names, + model_ids=data.model_ids, models_updated=models_updated, ) @@ -496,12 +555,17 @@ async def update_access_group( f"Updating access group: {access_group} with models: {data.model_names}" ) - # Validation: Check if model_names list is provided and not empty - if not data.model_names or len(data.model_names) == 0: + # Validation: Check that at least one of model_names or model_ids is provided + has_model_names = data.model_names and len(data.model_names) > 0 + has_model_ids = data.model_ids and len(data.model_ids) > 0 + + if not has_model_names and not has_model_ids: raise HTTPException( status_code=400, - detail={"error": "model_names list is required and cannot be empty"}, + detail={"error": "Either model_names or model_ids must be provided and non-empty"}, ) + + use_model_ids = has_model_ids # Validation: Check if access group exists try: @@ -521,17 +585,18 @@ async def update_access_group( detail={"error": f"Failed to check access group existence: {str(e)}"}, ) - # Validation: Check if all new models exist - all_valid, missing_models = validate_models_exist( - model_names=data.model_names, - llm_router=llm_router, - ) - - if not all_valid: - raise HTTPException( - status_code=400, - detail={"error": f"Model(s) not found: {', '.join(missing_models)}"}, + # Validation: Check if all new models exist (only if using model_names path) + if not use_model_ids and has_model_names: + all_valid, missing_models = validate_models_exist( + model_names=data.model_names, + llm_router=llm_router, ) + + if not all_valid: + raise HTTPException( + status_code=400, + detail={"error": f"Model(s) not found: {', '.join(missing_models)}"}, + ) try: # Step 1: Remove access group from ALL DB deployments (skip config models) @@ -552,12 +617,19 @@ async def update_access_group( data={"model_info": json.dumps(updated_model_info)}, ) - # Step 2: Add access group to new model_names - models_updated = await update_deployments_with_access_group( - model_names=data.model_names, - access_group=access_group, - prisma_client=prisma_client, - ) + # Step 2: Add access group using the appropriate method + if use_model_ids: + models_updated = await update_specific_deployments_with_access_group( + model_ids=data.model_ids, + access_group=access_group, + prisma_client=prisma_client, + ) + else: + models_updated = await update_deployments_with_access_group( + model_names=data.model_names, + access_group=access_group, + prisma_client=prisma_client, + ) # Clear cache and reload models to pick up the access group changes await clear_cache() @@ -569,6 +641,7 @@ async def update_access_group( return NewModelGroupResponse( access_group=access_group, model_names=data.model_names, + model_ids=data.model_ids, models_updated=models_updated, ) diff --git a/litellm/types/proxy/management_endpoints/model_management_endpoints.py b/litellm/types/proxy/management_endpoints/model_management_endpoints.py index c488c46ecc2..6f07e5c6de0 100644 --- a/litellm/types/proxy/management_endpoints/model_management_endpoints.py +++ b/litellm/types/proxy/management_endpoints/model_management_endpoints.py @@ -21,17 +21,20 @@ class UpdateUsefulLinksRequest(BaseModel): class NewModelGroupRequest(BaseModel): access_group: str # The access group name (e.g., "production-models") - model_names: List[str] # Existing model groups to include (e.g., ["gpt-4", "claude-3"]) + model_names: Optional[List[str]] = None # Existing model groups to include - tags ALL deployments for each name + model_ids: Optional[List[str]] = None # Specific deployment IDs to tag (more precise than model_names) class NewModelGroupResponse(BaseModel): access_group: str - model_names: List[str] + model_names: Optional[List[str]] = None + model_ids: Optional[List[str]] = None models_updated: int # Number of models updated class UpdateModelGroupRequest(BaseModel): - model_names: List[str] # Updated list of model groups to include + model_names: Optional[List[str]] = None # Updated list of model groups to include - tags ALL deployments for each name + model_ids: Optional[List[str]] = None # Specific deployment IDs to tag (more precise than model_names) class DeleteModelGroupResponse(BaseModel): diff --git a/tests/test_litellm/proxy/management_endpoints/test_access_group_management.py b/tests/test_litellm/proxy/management_endpoints/test_access_group_management.py index 1846ffaeb66..18dcb2b0b2d 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_access_group_management.py +++ b/tests/test_litellm/proxy/management_endpoints/test_access_group_management.py @@ -78,3 +78,213 @@ async def test_create_duplicate_access_group_fails(): assert exc_info.value.status_code == 409 assert "already exists" in str(exc_info.value.detail) +@pytest.mark.asyncio +async def test_create_access_group_with_model_ids_tags_only_specific_deployments(): + """ + Test that using model_ids only tags the specific deployments, not all + deployments sharing the same model_name. + + Fixes: https://github.com/BerriAI/litellm/issues/21544 + """ + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.management_endpoints.model_access_group_management_endpoints import ( + create_model_group, + ) + from litellm.types.proxy.management_endpoints.model_management_endpoints import ( + NewModelGroupRequest, + ) + + deploy_a = MagicMock(model_id="deploy-A", model_name="gpt-4o", model_info={}) + + mock_prisma = MagicMock() + mock_prisma.db.litellm_proxymodeltable.find_many = AsyncMock(return_value=[]) + mock_prisma.db.litellm_proxymodeltable.find_unique = AsyncMock(return_value=deploy_a) + mock_prisma.db.litellm_proxymodeltable.update = AsyncMock() + + mock_user = UserAPIKeyAuth( + user_id="test_admin", + user_role=LitellmUserRoles.PROXY_ADMIN, + ) + + request_data = NewModelGroupRequest( + access_group="production-models", + model_ids=["deploy-A"], + ) + + with patch("litellm.proxy.proxy_server.llm_router", MagicMock()), \ + patch("litellm.proxy.proxy_server.prisma_client", mock_prisma), \ + patch( + "litellm.proxy.management_endpoints.model_access_group_management_endpoints.clear_cache", + new_callable=AsyncMock, + ): + response = await create_model_group(data=request_data, user_api_key_dict=mock_user) + + assert response.models_updated == 1 + assert response.model_ids == ["deploy-A"] + mock_prisma.db.litellm_proxymodeltable.find_unique.assert_called_once_with( + where={"model_id": "deploy-A"} + ) + assert mock_prisma.db.litellm_proxymodeltable.update.call_count == 1 + update_call = mock_prisma.db.litellm_proxymodeltable.update.call_args + assert update_call.kwargs["where"] == {"model_id": "deploy-A"} + + +@pytest.mark.asyncio +async def test_create_access_group_with_model_names_tags_all_deployments(): + """ + Test backward compat: model_names still tags ALL deployments sharing that model_name. + """ + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.management_endpoints.model_access_group_management_endpoints import ( + create_model_group, + ) + from litellm.types.proxy.management_endpoints.model_management_endpoints import ( + NewModelGroupRequest, + ) + + deploy_a = MagicMock(model_id="deploy-A", model_name="gpt-4o", model_info={}) + deploy_b = MagicMock(model_id="deploy-B", model_name="gpt-4o", model_info={}) + deploy_c = MagicMock(model_id="deploy-C", model_name="gpt-4o", model_info={}) + + mock_router = Router( + model_list=[{"model_name": "gpt-4o", "litellm_params": {"model": "gpt-4o", "api_key": "fake-key"}}] + ) + + mock_prisma = MagicMock() + mock_prisma.db.litellm_proxymodeltable.find_many = AsyncMock( + side_effect=[[], [deploy_a, deploy_b, deploy_c]] + ) + mock_prisma.db.litellm_proxymodeltable.update = AsyncMock() + + mock_user = UserAPIKeyAuth( + user_id="test_admin", + user_role=LitellmUserRoles.PROXY_ADMIN, + ) + + request_data = NewModelGroupRequest(access_group="production-models", model_names=["gpt-4o"]) + + with patch("litellm.proxy.proxy_server.llm_router", mock_router), \ + patch("litellm.proxy.proxy_server.prisma_client", mock_prisma), \ + patch( + "litellm.proxy.management_endpoints.model_access_group_management_endpoints.clear_cache", + new_callable=AsyncMock, + ): + response = await create_model_group(data=request_data, user_api_key_dict=mock_user) + + assert response.models_updated == 3 + assert response.model_names == ["gpt-4o"] + assert mock_prisma.db.litellm_proxymodeltable.update.call_count == 3 + + +@pytest.mark.asyncio +async def test_create_access_group_model_ids_takes_priority_over_model_names(): + """ + Test that when both model_ids and model_names are provided, model_ids is used. + """ + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.management_endpoints.model_access_group_management_endpoints import ( + create_model_group, + ) + from litellm.types.proxy.management_endpoints.model_management_endpoints import ( + NewModelGroupRequest, + ) + + deploy_a = MagicMock(model_id="deploy-A", model_name="gpt-4o", model_info={}) + + mock_prisma = MagicMock() + mock_prisma.db.litellm_proxymodeltable.find_many = AsyncMock(return_value=[]) + mock_prisma.db.litellm_proxymodeltable.find_unique = AsyncMock(return_value=deploy_a) + mock_prisma.db.litellm_proxymodeltable.update = AsyncMock() + + mock_user = UserAPIKeyAuth( + user_id="test_admin", + user_role=LitellmUserRoles.PROXY_ADMIN, + ) + + request_data = NewModelGroupRequest( + access_group="production-models", + model_names=["gpt-4o"], + model_ids=["deploy-A"], + ) + + with patch("litellm.proxy.proxy_server.llm_router", MagicMock()), \ + patch("litellm.proxy.proxy_server.prisma_client", mock_prisma), \ + patch( + "litellm.proxy.management_endpoints.model_access_group_management_endpoints.clear_cache", + new_callable=AsyncMock, + ): + response = await create_model_group(data=request_data, user_api_key_dict=mock_user) + + assert response.models_updated == 1 + mock_prisma.db.litellm_proxymodeltable.find_unique.assert_called_once_with( + where={"model_id": "deploy-A"} + ) + + +@pytest.mark.asyncio +async def test_create_access_group_requires_model_names_or_model_ids(): + """ + Test that creating an access group without model_names or model_ids fails. + """ + from fastapi import HTTPException + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.management_endpoints.model_access_group_management_endpoints import ( + create_model_group, + ) + from litellm.types.proxy.management_endpoints.model_management_endpoints import ( + NewModelGroupRequest, + ) + + mock_user = UserAPIKeyAuth( + user_id="test_admin", + user_role=LitellmUserRoles.PROXY_ADMIN, + ) + + request_data = NewModelGroupRequest(access_group="production-models") + + with patch("litellm.proxy.proxy_server.llm_router", MagicMock()), \ + patch("litellm.proxy.proxy_server.prisma_client", MagicMock()): + with pytest.raises(HTTPException) as exc_info: + await create_model_group(data=request_data, user_api_key_dict=mock_user) + assert exc_info.value.status_code == 400 + assert "model_names or model_ids" in str(exc_info.value.detail) + + +@pytest.mark.asyncio +async def test_create_access_group_invalid_model_id_returns_400(): + """ + Test that passing a non-existent model_id returns 400 error. + """ + from fastapi import HTTPException + from litellm.proxy._types import LitellmUserRoles, UserAPIKeyAuth + from litellm.proxy.management_endpoints.model_access_group_management_endpoints import ( + create_model_group, + ) + from litellm.types.proxy.management_endpoints.model_management_endpoints import ( + NewModelGroupRequest, + ) + + mock_prisma = MagicMock() + mock_prisma.db.litellm_proxymodeltable.find_many = AsyncMock(return_value=[]) + mock_prisma.db.litellm_proxymodeltable.find_unique = AsyncMock(return_value=None) + + mock_user = UserAPIKeyAuth( + user_id="test_admin", + user_role=LitellmUserRoles.PROXY_ADMIN, + ) + + request_data = NewModelGroupRequest( + access_group="production-models", + model_ids=["non-existent-id"], + ) + + with patch("litellm.proxy.proxy_server.llm_router", MagicMock()), \ + patch("litellm.proxy.proxy_server.prisma_client", mock_prisma), \ + patch( + "litellm.proxy.management_endpoints.model_access_group_management_endpoints.clear_cache", + new_callable=AsyncMock, + ): + with pytest.raises(HTTPException) as exc_info: + await create_model_group(data=request_data, user_api_key_dict=mock_user) + assert exc_info.value.status_code == 400 + assert "non-existent-id" in str(exc_info.value.detail) From 647ea3bfcbea9b10b96a56ec66674b8851bb0ad8 Mon Sep 17 00:00:00 2001 From: Zhenting Huang <3061613175@qq.com> Date: Sat, 21 Feb 2026 16:46:51 +0800 Subject: [PATCH 12/86] feat(proxy): add custom favicon support\n\nAdd ability to configure a custom favicon for the litellm proxy UI.\n\n- Add favicon_url field to UIThemeConfig model\n- Add LITELLM_FAVICON_URL env var support\n- Add /get_favicon endpoint to serve custom favicons\n- Update ThemeContext to dynamically set favicon\n- Add favicon URL input to UI theme settings page\n- Add comprehensive tests\n\nCloses #8323 (#21653) --- litellm/proxy/proxy_server.py | 75 +++++++++++ .../proxy_setting_endpoints.py | 29 ++++- tests/proxy_unit_tests/test_get_favicon.py | 75 +++++++++++ .../test_proxy_setting_endpoints.py | 113 ++++++++++++++++ .../src/components/ui_theme_settings.tsx | 122 +++++------------- .../src/contexts/ThemeContext.tsx | 41 ++++-- 6 files changed, 357 insertions(+), 98 deletions(-) create mode 100644 tests/proxy_unit_tests/test_get_favicon.py diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 1fa0107469b..1a09ed2e0a6 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -10742,6 +10742,81 @@ async def get_image(): return FileResponse(logo_path, media_type="image/jpeg") +@app.get("/get_favicon", include_in_schema=False) +async def get_favicon(): + """Get custom favicon for the admin UI.""" + from fastapi.responses import Response + + current_dir = os.path.dirname(os.path.abspath(__file__)) + default_favicon = os.path.join( + current_dir, "_experimental", "out", "favicon.ico" + ) + + favicon_url = os.getenv("LITELLM_FAVICON_URL", "") + + if not favicon_url: + if os.path.exists(default_favicon): + return FileResponse(default_favicon, media_type="image/x-icon") + raise HTTPException( + status_code=404, detail="Default favicon not found" + ) + + if favicon_url.startswith(("http://", "https://")): + try: + from litellm.llms.custom_httpx.http_handler import ( + get_async_httpx_client, + ) + from litellm.types.llms.custom_http import httpxSpecialProvider + + async_client = get_async_httpx_client( + llm_provider=httpxSpecialProvider.UI, + params={"timeout": 5.0}, + ) + response = await async_client.get(favicon_url) + if response.status_code == 200: + content_type = response.headers.get( + "content-type", "image/x-icon" + ) + return Response( + content=response.content, + media_type=content_type, + ) + else: + verbose_proxy_logger.warning( + "Failed to fetch favicon from %s: status %s", + favicon_url, + response.status_code, + ) + if os.path.exists(default_favicon): + return FileResponse( + default_favicon, media_type="image/x-icon" + ) + raise HTTPException( + status_code=404, detail="Favicon not found" + ) + except HTTPException: + raise + except Exception as e: + verbose_proxy_logger.debug( + "Error downloading favicon from %s: %s", favicon_url, e + ) + if os.path.exists(default_favicon): + return FileResponse( + default_favicon, media_type="image/x-icon" + ) + raise HTTPException( + status_code=404, detail="Favicon not found" + ) + else: + if os.path.exists(favicon_url): + return FileResponse(favicon_url, media_type="image/x-icon") + if os.path.exists(default_favicon): + return FileResponse(default_favicon, media_type="image/x-icon") + raise HTTPException( + status_code=404, detail="Favicon not found" + ) + + #### INVITATION MANAGEMENT #### diff --git a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py index 6d32310940b..9c85f4f148b 100644 --- a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py +++ b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py @@ -30,6 +30,12 @@ class UIThemeConfig(BaseModel): description="URL or path to custom logo image. Can be a local file path or HTTP/HTTPS URL", ) + # Favicon configuration + favicon_url: Optional[str] = Field( + default=None, + description="URL to custom favicon image. Must be an HTTP/HTTPS URL to a .ico, .png, or .svg file", + ) + class SettingsResponse(BaseModel): """Base response model for settings with values and schema information""" @@ -788,6 +794,27 @@ async def update_ui_theme_settings(theme_config: UIThemeConfig): del os.environ["UI_LOGO_PATH"] verbose_proxy_logger.debug("Removed UI_LOGO_PATH from environment") + # Update LITELLM_FAVICON_URL environment variable if favicon_url is provided + favicon_url = theme_data.get("favicon_url") + verbose_proxy_logger.debug(f"Updating favicon_url: {favicon_url}") + + if ( + favicon_url and isinstance(favicon_url, str) and favicon_url.strip() + ): # Check if favicon_url exists and is not empty/whitespace + config["environment_variables"]["LITELLM_FAVICON_URL"] = favicon_url + os.environ["LITELLM_FAVICON_URL"] = favicon_url + verbose_proxy_logger.debug(f"Set LITELLM_FAVICON_URL to: {favicon_url}") + else: + # Remove the environment variable to restore default favicon + if "LITELLM_FAVICON_URL" in config.get("environment_variables", {}): + del config["environment_variables"]["LITELLM_FAVICON_URL"] + verbose_proxy_logger.debug("Removed LITELLM_FAVICON_URL from config") + if "LITELLM_FAVICON_URL" in os.environ: + del os.environ["LITELLM_FAVICON_URL"] + verbose_proxy_logger.debug( + "Removed LITELLM_FAVICON_URL from environment" + ) + # Handle environment variable encryption if needed stored_config = config.copy() if ( @@ -803,7 +830,7 @@ async def update_ui_theme_settings(theme_config: UIThemeConfig): await proxy_config.save_config(new_config=stored_config) return { - "message": "Logo settings updated successfully.", + "message": "UI theme settings updated successfully.", "status": "success", "theme_config": theme_data, } diff --git a/tests/proxy_unit_tests/test_get_favicon.py b/tests/proxy_unit_tests/test_get_favicon.py new file mode 100644 index 00000000000..f17787e740d --- /dev/null +++ b/tests/proxy_unit_tests/test_get_favicon.py @@ -0,0 +1,75 @@ +import os +import sys +from unittest import mock + +sys.path.insert(0, os.path.abspath("../..")) + +import httpx +import pytest + +from litellm.proxy.proxy_server import app + + +@pytest.mark.asyncio +async def test_get_favicon_default(): + """Test that get_favicon returns the default favicon when no URL set.""" + os.environ.pop("LITELLM_FAVICON_URL", None) + + async with httpx.AsyncClient( + transport=httpx.ASGITransport(app=app), base_url="http://testserver" + ) as ac: + response = await ac.get("/get_favicon") + + assert response.status_code in [200, 404] + if response.status_code == 200: + assert response.headers["content-type"] == "image/x-icon" + + +@pytest.mark.asyncio +async def test_get_favicon_with_custom_url(): + """Test that get_favicon fetches from a custom URL.""" + os.environ["LITELLM_FAVICON_URL"] = "https://example.com/favicon.ico" + + mock_response = mock.Mock() + mock_response.status_code = 200 + mock_response.content = b"\x00\x00\x01\x00" + mock_response.headers = {"content-type": "image/x-icon"} + + try: + with mock.patch( + "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.get" + ) as mock_get: + mock_get.return_value = mock_response + + async with httpx.AsyncClient( + transport=httpx.ASGITransport(app=app), + base_url="http://testserver", + ) as ac: + response = await ac.get("/get_favicon") + + assert response.status_code == 200 + assert response.headers["content-type"] == "image/x-icon" + finally: + os.environ.pop("LITELLM_FAVICON_URL", None) + + +@pytest.mark.asyncio +async def test_get_favicon_url_error_fallback(): + """Test that get_favicon falls back to default on error.""" + os.environ["LITELLM_FAVICON_URL"] = "https://invalid.com/favicon.ico" + + try: + with mock.patch( + "litellm.llms.custom_httpx.http_handler.AsyncHTTPHandler.get" + ) as mock_get: + mock_get.side_effect = httpx.ConnectError("unreachable") + + async with httpx.AsyncClient( + transport=httpx.ASGITransport(app=app), + base_url="http://testserver", + ) as ac: + response = await ac.get("/get_favicon") + + assert response.status_code in [200, 404] + finally: + os.environ.pop("LITELLM_FAVICON_URL", None) diff --git a/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py b/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py index 60bdb7d12cb..c36270751d8 100644 --- a/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py +++ b/tests/test_litellm/proxy/ui_crud_endpoints/test_proxy_setting_endpoints.py @@ -666,6 +666,119 @@ class TestProxySettingEndpoints: assert "UI_LOGO_PATH" in updated_config["environment_variables"] assert mock_proxy_config["save_call_count"]() == 1 + def test_update_ui_theme_settings_with_favicon( + self, mock_proxy_config, mock_auth, monkeypatch + ): + """Test updating UI theme settings with favicon_url""" + monkeypatch.setenv("LITELLM_SALT_KEY", "test_salt_key") + monkeypatch.setattr( + "litellm.proxy.proxy_server.store_model_in_db", True + ) + + new_theme = { + "logo_url": "https://example.com/new-logo.png", + "favicon_url": "https://example.com/custom-favicon.ico", + } + + response = client.patch( + "/update/ui_theme_settings", json=new_theme + ) + + assert response.status_code == 200 + data = response.json() + + assert data["status"] == "success" + assert ( + data["theme_config"]["logo_url"] + == "https://example.com/new-logo.png" + ) + assert ( + data["theme_config"]["favicon_url"] + == "https://example.com/custom-favicon.ico" + ) + + updated_config = mock_proxy_config["config"] + assert "UI_LOGO_PATH" in updated_config["environment_variables"] + assert ( + "LITELLM_FAVICON_URL" + in updated_config["environment_variables"] + ) + assert ( + updated_config["environment_variables"][ + "LITELLM_FAVICON_URL" + ] + == "https://example.com/custom-favicon.ico" + ) + + def test_update_ui_theme_settings_clear_favicon( + self, mock_proxy_config, mock_auth, monkeypatch + ): + """Test clearing favicon_url from UI theme settings""" + monkeypatch.setenv("LITELLM_SALT_KEY", "test_salt_key") + monkeypatch.setattr( + "litellm.proxy.proxy_server.store_model_in_db", True + ) + + new_theme = { + "favicon_url": "https://example.com/custom-favicon.ico", + } + response = client.patch( + "/update/ui_theme_settings", json=new_theme + ) + assert response.status_code == 200 + + clear_theme = {"favicon_url": None} + response = client.patch( + "/update/ui_theme_settings", json=clear_theme + ) + assert response.status_code == 200 + data = response.json() + assert data["status"] == "success" + assert "LITELLM_FAVICON_URL" not in os.environ + + def test_get_ui_theme_settings_includes_favicon_schema( + self, mock_proxy_config + ): + """Test UI theme settings includes favicon_url in schema""" + response = client.get("/get/ui_theme_settings") + + assert response.status_code == 200 + data = response.json() + + assert "values" in data + assert "field_schema" in data + assert "properties" in data["field_schema"] + assert "favicon_url" in data["field_schema"]["properties"] + assert ( + "description" + in data["field_schema"]["properties"]["favicon_url"] + ) + + def test_get_ui_theme_settings_with_favicon_configured( + self, mock_proxy_config + ): + """Test getting UI theme settings when favicon is configured""" + mock_proxy_config["config"]["litellm_settings"][ + "ui_theme_config" + ] = { + "logo_url": "https://example.com/logo.png", + "favicon_url": "https://example.com/favicon.ico", + } + + response = client.get("/get/ui_theme_settings") + + assert response.status_code == 200 + data = response.json() + + assert ( + data["values"]["logo_url"] + == "https://example.com/logo.png" + ) + assert ( + data["values"]["favicon_url"] + == "https://example.com/favicon.ico" + ) + def test_get_ui_settings(self, mock_auth, monkeypatch): """Test retrieving UI settings with allowlist sanitization""" from unittest.mock import AsyncMock, MagicMock diff --git a/ui/litellm-dashboard/src/components/ui_theme_settings.tsx b/ui/litellm-dashboard/src/components/ui_theme_settings.tsx index 636163d1d70..94bc0c9ebe6 100644 --- a/ui/litellm-dashboard/src/components/ui_theme_settings.tsx +++ b/ui/litellm-dashboard/src/components/ui_theme_settings.tsx @@ -11,18 +11,16 @@ interface UIThemeSettingsProps { } const UIThemeSettings: React.FC = ({ userID, userRole, accessToken }) => { - const { logoUrl, setLogoUrl } = useTheme(); + const { logoUrl, setLogoUrl, faviconUrl, setFaviconUrl } = useTheme(); const [logoUrlInput, setLogoUrlInput] = useState(""); + const [faviconUrlInput, setFaviconUrlInput] = useState(""); const [loading, setLoading] = useState(false); - // Load current settings when component mounts useEffect(() => { - if (accessToken) { - fetchLogoSettings(); - } + if (accessToken) { fetchThemeSettings(); } }, [accessToken]); - const fetchLogoSettings = async () => { + const fetchThemeSettings = async () => { try { const proxyBaseUrl = getProxyBaseUrl(); const url = proxyBaseUrl ? `${proxyBaseUrl}/get/ui_theme_settings` : "/get/ui_theme_settings"; @@ -33,12 +31,12 @@ const UIThemeSettings: React.FC = ({ userID, userRole, acc "Content-Type": "application/json", }, }); - if (response.ok) { const data = await response.json(); - const logoUrl = data.values?.logo_url || ""; - setLogoUrlInput(logoUrl); - setLogoUrl(logoUrl || null); + setLogoUrlInput(data.values?.logo_url || ""); + setFaviconUrlInput(data.values?.favicon_url || ""); + setLogoUrl(data.values?.logo_url || null); + setFaviconUrl(data.values?.favicon_url || null); } } catch (error) { console.error("Error fetching theme settings:", error); @@ -58,28 +56,23 @@ const UIThemeSettings: React.FC = ({ userID, userRole, acc }, body: JSON.stringify({ logo_url: logoUrlInput || null, + favicon_url: faviconUrlInput || null, }), }); - if (response.ok) { - NotificationsManager.success("Logo settings updated successfully!"); + NotificationsManager.success("Theme settings updated successfully!"); setLogoUrl(logoUrlInput || null); - } else { - throw new Error("Failed to update settings"); - } + setFaviconUrl(faviconUrlInput || null); + } else { throw new Error("Failed to update settings"); } } catch (error) { - console.error("Error updating logo settings:", error); - NotificationsManager.fromBackend("Failed to update logo settings"); - } finally { - setLoading(false); - } + console.error("Error updating theme settings:", error); + NotificationsManager.fromBackend("Failed to update theme settings"); + } finally { setLoading(false); } }; const handleReset = async () => { - setLogoUrlInput(""); - setLogoUrl(null); - - // Save null to backend to clear the logo + setLogoUrlInput(""); setFaviconUrlInput(""); + setLogoUrl(null); setFaviconUrl(null); setLoading(true); try { const proxyBaseUrl = getProxyBaseUrl(); @@ -90,86 +83,41 @@ const UIThemeSettings: React.FC = ({ userID, userRole, acc [getGlobalLitellmHeaderName()]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, - body: JSON.stringify({ - logo_url: null, - }), + body: JSON.stringify({ logo_url: null, favicon_url: null }), }); - - if (response.ok) { - NotificationsManager.success("Logo reset to default!"); - } else { - throw new Error("Failed to reset logo"); - } + if (response.ok) { NotificationsManager.success("Theme settings reset to default!"); } + else { throw new Error("Failed to reset"); } } catch (error) { - console.error("Error resetting logo:", error); - NotificationsManager.fromBackend("Failed to reset logo"); - } finally { - setLoading(false); - } + console.error("Error resetting theme settings:", error); + NotificationsManager.fromBackend("Failed to reset theme settings"); + } finally { setLoading(false); } }; - if (!accessToken) { - return null; - } + if (!accessToken) { return null; } return (
- Logo Customization - Customize your LiteLLM admin dashboard with a custom logo. + UI Theme Customization + Customize your LiteLLM admin dashboard with a custom logo and favicon.
-
Custom Logo URL - { - setLogoUrlInput(value); - // Update logo in real-time for preview - setLogoUrl(value || null); - }} - className="w-full" - /> - - Enter a URL for your custom logo or leave empty to use the default LiteLLM logo - + { setLogoUrlInput(v); setLogoUrl(v || null); }} className="w-full" /> + Enter a URL for your custom logo or leave empty for default
- - {/* Logo Preview */}
- Current Logo -
- {logoUrlInput ? ( - Custom logo { - const target = e.target as HTMLImageElement; - target.style.display = "none"; - const fallbackText = document.createElement("div"); - fallbackText.className = "text-gray-500 text-sm"; - fallbackText.textContent = "Failed to load image"; - target.parentElement?.appendChild(fallbackText); - }} - /> - ) : ( - Default LiteLLM logo will be used - )} -
+ Custom Favicon URL + { setFaviconUrlInput(v); setFaviconUrl(v || null); }} className="w-full" /> + Enter a URL for your custom favicon (.ico, .png, or .svg) or leave empty for default
- - {/* Action Buttons */}
- - + +
diff --git a/ui/litellm-dashboard/src/contexts/ThemeContext.tsx b/ui/litellm-dashboard/src/contexts/ThemeContext.tsx index 1204b7b0deb..8f34269ad4d 100644 --- a/ui/litellm-dashboard/src/contexts/ThemeContext.tsx +++ b/ui/litellm-dashboard/src/contexts/ThemeContext.tsx @@ -4,6 +4,8 @@ import { getProxyBaseUrl } from "@/components/networking"; interface ThemeContextType { logoUrl: string | null; setLogoUrl: (url: string | null) => void; + faviconUrl: string | null; + setFaviconUrl: (url: string | null) => void; } const ThemeContext = createContext(undefined); @@ -23,20 +25,16 @@ interface ThemeProviderProps { export const ThemeProvider: React.FC = ({ children, accessToken }) => { const [logoUrl, setLogoUrl] = useState(null); + const [faviconUrl, setFaviconUrl] = useState(null); - // Load logo URL from backend on mount - // Note: /get/ui_theme_settings is now a public endpoint (no auth required) - // so all users can see custom branding set by admins useEffect(() => { - const loadLogoSettings = async () => { + const loadThemeSettings = async () => { try { const proxyBaseUrl = getProxyBaseUrl(); const url = proxyBaseUrl ? `${proxyBaseUrl}/get/ui_theme_settings` : "/get/ui_theme_settings"; const response = await fetch(url, { method: "GET", - headers: { - "Content-Type": "application/json", - }, + headers: { "Content-Type": "application/json" }, }); if (response.ok) { @@ -44,14 +42,37 @@ export const ThemeProvider: React.FC = ({ children, accessTo if (data.values?.logo_url) { setLogoUrl(data.values.logo_url); } + if (data.values?.favicon_url) { + setFaviconUrl(data.values.favicon_url); + } } } catch (error) { - console.warn("Failed to load logo settings from backend:", error); + console.warn("Failed to load theme settings from backend:", error); } }; - loadLogoSettings(); + loadThemeSettings(); }, []); - return {children}; + useEffect(() => { + if (faviconUrl) { + const existingLinks = document.querySelectorAll("link[rel*='icon']"); + if (existingLinks.length > 0) { + existingLinks.forEach((link) => { + (link as HTMLLinkElement).href = faviconUrl; + }); + } else { + const link = document.createElement("link"); + link.rel = "icon"; + link.href = faviconUrl; + document.head.appendChild(link); + } + } + }, [faviconUrl]); + + return ( + + {children} + + ); }; From d53ea88598c087a218b0b09e20ba8196d14886af Mon Sep 17 00:00:00 2001 From: Zhenting Huang <3061613175@qq.com> Date: Sat, 21 Feb 2026 16:50:40 +0800 Subject: [PATCH 13/86] fix(bedrock): prevent double UUID in create_file S3 key (#21650) In create_file for Bedrock, get_complete_file_url is called twice: once in the sync handler (generating UUID-1 for api_base) and once inside transform_create_file_request (generating UUID-2 for the actual S3 upload). The Bedrock provider correctly writes UUID-2 into litellm_params["upload_url"], but the sync handler unconditionally overwrites it with api_base (UUID-1). This causes the returned file_id to point to a non-existent S3 key. Fix: only set upload_url to api_base when transform_create_file_request has not already set it, preserving the Bedrock provider's value. Closes #21546 --- litellm/llms/custom_httpx/llm_http_handler.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/litellm/llms/custom_httpx/llm_http_handler.py b/litellm/llms/custom_httpx/llm_http_handler.py index 0a5364bfcfe..5087f2e0078 100644 --- a/litellm/llms/custom_httpx/llm_http_handler.py +++ b/litellm/llms/custom_httpx/llm_http_handler.py @@ -3014,8 +3014,11 @@ class BaseLLMHTTPHandler: raise ValueError(f"Unsupported transformed_request type: {type(transformed_request)}") # Store the upload URL in litellm_params for the transformation method + # Honour the URL already set by transform_create_file_request (e.g. Bedrock pre-signed S3 uploads), + # fall back to api_base for providers that do not set it. litellm_params_with_url = dict(litellm_params) - litellm_params_with_url["upload_url"] = api_base + if "upload_url" not in litellm_params: + litellm_params_with_url["upload_url"] = api_base return provider_config.transform_create_file_response( model=None, From e0aaedc9d11f373cc537a8af157054cb41ded0a5 Mon Sep 17 00:00:00 2001 From: Zhenting Huang <3061613175@qq.com> Date: Sat, 21 Feb 2026 16:51:15 +0800 Subject: [PATCH 14/86] feat(semantic-cache): support configurable vector dimensions for Qdrant (#21649) Add vector_size parameter to QdrantSemanticCache and expose it through the Cache facade as qdrant_semantic_cache_vector_size. This allows users to use embedding models with dimensions other than the default 1536, enabling cheaper/stronger models like Stella (1024d), bge-en-icl (4096d), voyage, cohere, etc. The parameter defaults to QDRANT_VECTOR_SIZE (env var or 1536) for backward compatibility. When creating new collections, the configured vector_size is used instead of the hardcoded constant. Closes #9377 --- docs/my-website/docs/caching/all_caches.md | 2 + docs/my-website/docs/proxy/caching.md | 1 + docs/my-website/docs/proxy/config_settings.md | 1 + litellm/caching/caching.py | 2 + litellm/caching/qdrant_semantic_cache.py | 4 +- .../caching/test_qdrant_semantic_cache.py | 129 +++++++++++++++++- 6 files changed, 137 insertions(+), 2 deletions(-) diff --git a/docs/my-website/docs/caching/all_caches.md b/docs/my-website/docs/caching/all_caches.md index 37fb8bc360a..6f81da9105a 100644 --- a/docs/my-website/docs/caching/all_caches.md +++ b/docs/my-website/docs/caching/all_caches.md @@ -297,6 +297,7 @@ litellm.cache = Cache( similarity_threshold=0.7, # similarity threshold for cache hits, 0 == no similarity, 1 = exact matches, 0.5 == 50% similarity qdrant_quantization_config ="binary", # can be one of 'binary', 'product' or 'scalar' quantizations that is supported by qdrant qdrant_semantic_cache_embedding_model="text-embedding-ada-002", # this model is passed to litellm.embedding(), any litellm.embedding() model is supported here + qdrant_semantic_cache_vector_size=1536, # vector size for the embedding model, must match the dimensionality of the embedding model used ) response1 = completion( @@ -635,6 +636,7 @@ def __init__( qdrant_quantization_config: Optional[str] = None, qdrant_semantic_cache_embedding_model="text-embedding-ada-002", + qdrant_semantic_cache_vector_size: Optional[int] = None, **kwargs ): ``` diff --git a/docs/my-website/docs/proxy/caching.md b/docs/my-website/docs/proxy/caching.md index 3cb9e9f3fe4..3357dcb28b2 100644 --- a/docs/my-website/docs/proxy/caching.md +++ b/docs/my-website/docs/proxy/caching.md @@ -340,6 +340,7 @@ litellm_settings: qdrant_semantic_cache_embedding_model: openai-embedding # the model should be defined on the model_list qdrant_collection_name: test_collection qdrant_quantization_config: binary + qdrant_semantic_cache_vector_size: 1536 # vector size must match embedding model dimensionality similarity_threshold: 0.8 # similarity threshold for semantic cache ``` diff --git a/docs/my-website/docs/proxy/config_settings.md b/docs/my-website/docs/proxy/config_settings.md index 9e3b5e90978..121d1624139 100644 --- a/docs/my-website/docs/proxy/config_settings.md +++ b/docs/my-website/docs/proxy/config_settings.md @@ -73,6 +73,7 @@ litellm_settings: qdrant_semantic_cache_embedding_model: openai-embedding # the model should be defined on the model_list qdrant_collection_name: test_collection qdrant_quantization_config: binary + qdrant_semantic_cache_vector_size: 1536 # vector size must match embedding model dimensionality similarity_threshold: 0.8 # similarity threshold for semantic cache # Optional - S3 Cache Settings diff --git a/litellm/caching/caching.py b/litellm/caching/caching.py index a03bff60686..ad02d2ea891 100644 --- a/litellm/caching/caching.py +++ b/litellm/caching/caching.py @@ -108,6 +108,7 @@ class Cache: qdrant_collection_name: Optional[str] = None, qdrant_quantization_config: Optional[str] = None, qdrant_semantic_cache_embedding_model: str = "text-embedding-ada-002", + qdrant_semantic_cache_vector_size: Optional[int] = None, # GCP IAM authentication parameters gcp_service_account: Optional[str] = None, gcp_ssl_ca_certs: Optional[str] = None, @@ -207,6 +208,7 @@ class Cache: similarity_threshold=similarity_threshold, quantization_config=qdrant_quantization_config, embedding_model=qdrant_semantic_cache_embedding_model, + vector_size=qdrant_semantic_cache_vector_size, ) elif type == LiteLLMCacheType.LOCAL: self.cache = InMemoryCache() diff --git a/litellm/caching/qdrant_semantic_cache.py b/litellm/caching/qdrant_semantic_cache.py index 0e77b5a6c21..181effa01d4 100644 --- a/litellm/caching/qdrant_semantic_cache.py +++ b/litellm/caching/qdrant_semantic_cache.py @@ -31,6 +31,7 @@ class QdrantSemanticCache(BaseCache): quantization_config=None, embedding_model="text-embedding-ada-002", host_type=None, + vector_size=None, ): import os @@ -53,6 +54,7 @@ class QdrantSemanticCache(BaseCache): raise Exception("similarity_threshold must be provided, passed None") self.similarity_threshold = similarity_threshold self.embedding_model = embedding_model + self.vector_size = vector_size if vector_size is not None else QDRANT_VECTOR_SIZE headers = {} # check if defined as os.environ/ variable @@ -138,7 +140,7 @@ class QdrantSemanticCache(BaseCache): new_collection_status = self.sync_client.put( url=f"{self.qdrant_api_base}/collections/{self.collection_name}", json={ - "vectors": {"size": QDRANT_VECTOR_SIZE, "distance": "Cosine"}, + "vectors": {"size": self.vector_size, "distance": "Cosine"}, "quantization_config": quantization_params, }, headers=self.headers, diff --git a/tests/test_litellm/caching/test_qdrant_semantic_cache.py b/tests/test_litellm/caching/test_qdrant_semantic_cache.py index e7d934bf0e6..fe6830693d6 100644 --- a/tests/test_litellm/caching/test_qdrant_semantic_cache.py +++ b/tests/test_litellm/caching/test_qdrant_semantic_cache.py @@ -408,4 +408,131 @@ async def test_qdrant_semantic_cache_async_set_cache(): ) # Verify async upsert was called - qdrant_cache.async_client.put.assert_called() \ No newline at end of file + qdrant_cache.async_client.put.assert_called() + +def test_qdrant_semantic_cache_custom_vector_size(): + """ + Test that QdrantSemanticCache uses a custom vector_size when creating a new collection. + Verifies that the vector size passed to the constructor is used in the Qdrant collection + creation payload instead of the default 1536. + """ + with patch("litellm.llms.custom_httpx.http_handler._get_httpx_client") as mock_sync_client, \ + patch("litellm.llms.custom_httpx.http_handler.get_async_httpx_client") as mock_async_client: + + # Mock the collection does NOT exist (so it will be created) + mock_exists_response = MagicMock() + mock_exists_response.status_code = 200 + mock_exists_response.json.return_value = {"result": {"exists": False}} + + # Mock the collection creation response + mock_create_response = MagicMock() + mock_create_response.status_code = 200 + mock_create_response.json.return_value = {"result": True} + + # Mock the collection details response after creation + mock_details_response = MagicMock() + mock_details_response.status_code = 200 + mock_details_response.json.return_value = {"result": {"status": "ok"}} + + mock_sync_client_instance = MagicMock() + mock_sync_client_instance.get.side_effect = [mock_exists_response, mock_details_response] + mock_sync_client_instance.put.return_value = mock_create_response + mock_sync_client.return_value = mock_sync_client_instance + + from litellm.caching.qdrant_semantic_cache import QdrantSemanticCache + + # Initialize with custom vector_size of 768 + qdrant_cache = QdrantSemanticCache( + collection_name="test_collection_768", + qdrant_api_base="http://test.qdrant.local", + qdrant_api_key="test_key", + similarity_threshold=0.8, + vector_size=768, + ) + + # Verify the vector_size attribute is set correctly + assert qdrant_cache.vector_size == 768 + + # Verify the PUT call to create the collection used vector_size=768 + put_call = mock_sync_client_instance.put.call_args + assert put_call is not None + create_payload = put_call.kwargs.get("json") or put_call[1].get("json") + assert create_payload["vectors"]["size"] == 768 + assert create_payload["vectors"]["distance"] == "Cosine" + + +def test_qdrant_semantic_cache_default_vector_size(): + """ + Test that QdrantSemanticCache defaults to QDRANT_VECTOR_SIZE (1536) when vector_size + is not provided, and stores it as self.vector_size. + """ + with patch("litellm.llms.custom_httpx.http_handler._get_httpx_client") as mock_sync_client, \ + patch("litellm.llms.custom_httpx.http_handler.get_async_httpx_client") as mock_async_client: + + # Mock the collection exists check + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = {"result": {"exists": True}} + + mock_sync_client_instance = MagicMock() + mock_sync_client_instance.get.return_value = mock_response + mock_sync_client.return_value = mock_sync_client_instance + + from litellm.caching.qdrant_semantic_cache import QdrantSemanticCache + from litellm.constants import QDRANT_VECTOR_SIZE + + # Initialize without vector_size + qdrant_cache = QdrantSemanticCache( + collection_name="test_collection", + qdrant_api_base="http://test.qdrant.local", + qdrant_api_key="test_key", + similarity_threshold=0.8, + ) + + # Verify it falls back to the default QDRANT_VECTOR_SIZE constant + assert qdrant_cache.vector_size == QDRANT_VECTOR_SIZE + + +def test_qdrant_semantic_cache_large_vector_size(): + """ + Test that QdrantSemanticCache supports large embedding dimensions (e.g. 4096, 8192) + for models like Stella, bge-en-icl, etc. + """ + with patch("litellm.llms.custom_httpx.http_handler._get_httpx_client") as mock_sync_client, \ + patch("litellm.llms.custom_httpx.http_handler.get_async_httpx_client") as mock_async_client: + + # Mock the collection does NOT exist (so it will be created) + mock_exists_response = MagicMock() + mock_exists_response.status_code = 200 + mock_exists_response.json.return_value = {"result": {"exists": False}} + + mock_create_response = MagicMock() + mock_create_response.status_code = 200 + mock_create_response.json.return_value = {"result": True} + + mock_details_response = MagicMock() + mock_details_response.status_code = 200 + mock_details_response.json.return_value = {"result": {"status": "ok"}} + + mock_sync_client_instance = MagicMock() + mock_sync_client_instance.get.side_effect = [mock_exists_response, mock_details_response] + mock_sync_client_instance.put.return_value = mock_create_response + mock_sync_client.return_value = mock_sync_client_instance + + from litellm.caching.qdrant_semantic_cache import QdrantSemanticCache + + # Initialize with a large vector_size of 4096 + qdrant_cache = QdrantSemanticCache( + collection_name="test_collection_4096", + qdrant_api_base="http://test.qdrant.local", + qdrant_api_key="test_key", + similarity_threshold=0.8, + vector_size=4096, + ) + + assert qdrant_cache.vector_size == 4096 + + # Verify the collection was created with 4096 + put_call = mock_sync_client_instance.put.call_args + create_payload = put_call.kwargs.get("json") or put_call[1].get("json") + assert create_payload["vectors"]["size"] == 4096 From cc6ef0e3f766270ec6517aae1890a978eafe2338 Mon Sep 17 00:00:00 2001 From: Cesar Garcia <128240629+Chesars@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:14:39 -0300 Subject: [PATCH 15/86] fix(utils): normalize camelCase thinking param keys to snake_case (#21762) Clients like OpenCode's @ai-sdk/openai-compatible send budgetTokens (camelCase) instead of budget_tokens in the thinking parameter, causing validation errors. Add early normalization in completion(). --- litellm/main.py | 3 +++ litellm/utils.py | 17 ++++++++++++++ tests/test_litellm/test_utils.py | 40 ++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/litellm/main.py b/litellm/main.py index 356ca7ecf13..e64099baabd 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -147,6 +147,7 @@ from litellm.utils import ( token_counter, validate_and_fix_openai_messages, validate_and_fix_openai_tools, + validate_and_fix_thinking_param, validate_chat_completion_tool_choice, validate_openai_optional_params, ) @@ -1102,6 +1103,8 @@ def completion( # type: ignore # noqa: PLR0915 tool_choice = validate_chat_completion_tool_choice(tool_choice=tool_choice) # validate optional params stop = validate_openai_optional_params(stop=stop) + # normalize camelCase thinking keys (e.g. budgetTokens -> budget_tokens) + thinking = validate_and_fix_thinking_param(thinking=thinking) ######### unpacking kwargs ##################### args = locals() diff --git a/litellm/utils.py b/litellm/utils.py index 241b9d217b7..3c02a17d15e 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -7666,6 +7666,23 @@ def validate_and_fix_openai_tools(tools: Optional[List]) -> Optional[List[dict]] return new_tools +def validate_and_fix_thinking_param( + thinking: Optional["AnthropicThinkingParam"], +) -> Optional["AnthropicThinkingParam"]: + """ + Normalizes camelCase keys in the thinking param to snake_case. + Handles clients that send budgetTokens instead of budget_tokens. + """ + if thinking is None or not isinstance(thinking, dict): + return thinking + normalized = dict(thinking) + if "budgetTokens" in normalized and "budget_tokens" not in normalized: + normalized["budget_tokens"] = normalized.pop("budgetTokens") + elif "budgetTokens" in normalized and "budget_tokens" in normalized: + normalized.pop("budgetTokens") + return cast("AnthropicThinkingParam", normalized) + + def cleanup_none_field_in_message(message: AllMessageValues): """ Cleans up the message by removing the none field. diff --git a/tests/test_litellm/test_utils.py b/tests/test_litellm/test_utils.py index 5bfb3bd8795..30fbaa6995d 100644 --- a/tests/test_litellm/test_utils.py +++ b/tests/test_litellm/test_utils.py @@ -3478,3 +3478,43 @@ class TestMetadataNoneHandling: litellm_params = {"metadata": None} metadata = litellm_params.get("metadata") or {} assert metadata == {} + + +class TestValidateAndFixThinkingParam: + """Tests for validate_and_fix_thinking_param.""" + + def test_none_returns_none(self): + from litellm.utils import validate_and_fix_thinking_param + + assert validate_and_fix_thinking_param(thinking=None) is None + + def test_already_snake_case(self): + from litellm.utils import validate_and_fix_thinking_param + + thinking = {"type": "enabled", "budget_tokens": 32000} + result = validate_and_fix_thinking_param(thinking=thinking) + assert result == {"type": "enabled", "budget_tokens": 32000} + + def test_camel_case_normalized(self): + from litellm.utils import validate_and_fix_thinking_param + + thinking = {"type": "enabled", "budgetTokens": 32000} + result = validate_and_fix_thinking_param(thinking=thinking) + assert result == {"type": "enabled", "budget_tokens": 32000} + assert "budgetTokens" not in result + + def test_both_keys_snake_case_wins(self): + from litellm.utils import validate_and_fix_thinking_param + + thinking = {"type": "enabled", "budget_tokens": 10000, "budgetTokens": 50000} + result = validate_and_fix_thinking_param(thinking=thinking) + assert result == {"type": "enabled", "budget_tokens": 10000} + assert "budgetTokens" not in result + + def test_original_dict_not_mutated(self): + from litellm.utils import validate_and_fix_thinking_param + + thinking = {"type": "enabled", "budgetTokens": 32000} + validate_and_fix_thinking_param(thinking=thinking) + assert "budgetTokens" in thinking + assert "budget_tokens" not in thinking From ca5c109a92bf0deed3289792be239ce6c1b05c16 Mon Sep 17 00:00:00 2001 From: Darien Kindlund Date: Sat, 21 Feb 2026 18:19:17 -0500 Subject: [PATCH 16/86] feat: add optional digest mode for Slack alert types (#21683) Adds per-alert-type digest mode that aggregates duplicate alerts within a configurable time window and emits a single summary message with count, start/end timestamps. Configuration via general_settings.alert_type_config: alert_type_config: llm_requests_hanging: digest: true digest_interval: 86400 Digest key: (alert_type, request_model, api_base) Default interval: 24 hours Window type: fixed interval Co-authored-by: Claude Opus 4.6 (1M context) --- docs/my-website/docs/proxy/alerting.md | 53 ++++ .../SlackAlerting/hanging_request_check.py | 2 + .../SlackAlerting/slack_alerting.py | 121 +++++++++ litellm/proxy/proxy_server.py | 1 + litellm/proxy/utils.py | 4 + litellm/types/integrations/slack_alerting.py | 31 ++- .../test_slack_alerting_digest.py | 235 ++++++++++++++++++ 7 files changed, 446 insertions(+), 1 deletion(-) create mode 100644 tests/test_litellm/integrations/SlackAlerting/test_slack_alerting_digest.py diff --git a/docs/my-website/docs/proxy/alerting.md b/docs/my-website/docs/proxy/alerting.md index 38d6d47be44..e9afe2d9939 100644 --- a/docs/my-website/docs/proxy/alerting.md +++ b/docs/my-website/docs/proxy/alerting.md @@ -438,6 +438,59 @@ curl -X GET --location 'http://0.0.0.0:4000/health/services?service=webhook' \ - `event_message` *str*: A human-readable description of the event. +### Digest Mode (Reducing Alert Noise) + +By default, LiteLLM sends a separate Slack message for **every** alert event. For high-frequency alert types like `llm_requests_hanging` or `llm_too_slow`, this can produce hundreds of duplicate messages per day. + +**Digest mode** aggregates duplicate alerts within a configurable time window and emits a single summary message with the total count and time range. + +#### Configuration + +Use `alert_type_config` in `general_settings` to enable digest mode per alert type: + +```yaml +general_settings: + alerting: ["slack"] + alert_type_config: + llm_requests_hanging: + digest: true + digest_interval: 86400 # 24 hours (default) + llm_too_slow: + digest: true + digest_interval: 3600 # 1 hour + llm_exceptions: + digest: true + # uses default interval (86400 seconds / 24 hours) +``` + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `digest` | bool | `false` | Enable digest mode for this alert type | +| `digest_interval` | int | `86400` (24h) | Time window in seconds. Alerts are aggregated within this interval. | + +#### How It Works + +1. When an alert fires for a digest-enabled type, it is **grouped** by `(alert_type, request_model, api_base)` instead of being sent immediately +2. A counter tracks how many times the alert fires within the interval +3. When the interval expires, a **single summary message** is sent: + +``` +Alert type: `llm_requests_hanging` (Digest) +Level: `Medium` +Start: `2026-02-19 03:27:39` +End: `2026-02-20 03:27:39` +Count: `847` + +Message: `Requests are hanging - 600s+ request time` +Request Model: `gemini-2.5-flash` +API Base: `None` +``` + +#### Limitations + +- **Per-instance**: Digest state is held in memory per proxy instance. If you run multiple instances (e.g., Cloud Run with autoscaling), each instance maintains its own digest and emits its own summary. +- **Not durable**: If an instance is terminated before the digest interval expires, the aggregated alerts for that instance are lost. + ## Region-outage alerting (✨ Enterprise feature) :::info diff --git a/litellm/integrations/SlackAlerting/hanging_request_check.py b/litellm/integrations/SlackAlerting/hanging_request_check.py index 713e790ba90..d2f70c9caf1 100644 --- a/litellm/integrations/SlackAlerting/hanging_request_check.py +++ b/litellm/integrations/SlackAlerting/hanging_request_check.py @@ -172,4 +172,6 @@ Team Alias: `{hanging_request_data.team_alias}`""" level="Medium", alert_type=AlertType.llm_requests_hanging, alerting_metadata=hanging_request_data.alerting_metadata or {}, + request_model=hanging_request_data.model, + api_base=hanging_request_data.api_base, ) diff --git a/litellm/integrations/SlackAlerting/slack_alerting.py b/litellm/integrations/SlackAlerting/slack_alerting.py index a525856db82..561d759cf28 100644 --- a/litellm/integrations/SlackAlerting/slack_alerting.py +++ b/litellm/integrations/SlackAlerting/slack_alerting.py @@ -70,6 +70,7 @@ class SlackAlerting(CustomBatchLogger): ] = None, # if user wants to separate alerts to diff channels alerting_args={}, default_webhook_url: Optional[str] = None, + alert_type_config: Optional[Dict[str, dict]] = None, **kwargs, ): if alerting_threshold is None: @@ -92,6 +93,12 @@ class SlackAlerting(CustomBatchLogger): self.hanging_request_check = AlertingHangingRequestCheck( slack_alerting_object=self, ) + self.alert_type_config: Dict[str, AlertTypeConfig] = {} + if alert_type_config: + for key, val in alert_type_config.items(): + self.alert_type_config[key] = AlertTypeConfig(**val) if isinstance(val, dict) else val + self.digest_buckets: Dict[str, DigestEntry] = {} + self.digest_lock = asyncio.Lock() super().__init__(**kwargs, flush_lock=self.flush_lock) def update_values( @@ -102,6 +109,7 @@ class SlackAlerting(CustomBatchLogger): alert_to_webhook_url: Optional[Dict[AlertType, Union[List[str], str]]] = None, alerting_args: Optional[Dict] = None, llm_router: Optional[Router] = None, + alert_type_config: Optional[Dict[str, dict]] = None, ): if alerting is not None: self.alerting = alerting @@ -116,6 +124,9 @@ class SlackAlerting(CustomBatchLogger): if not self.periodic_started: asyncio.create_task(self.periodic_flush()) self.periodic_started = True + if alert_type_config is not None: + for key, val in alert_type_config.items(): + self.alert_type_config[key] = AlertTypeConfig(**val) if isinstance(val, dict) else val if alert_to_webhook_url is not None: # update the dict @@ -284,6 +295,8 @@ class SlackAlerting(CustomBatchLogger): level="Low", alert_type=AlertType.llm_too_slow, alerting_metadata=alerting_metadata, + request_model=model, + api_base=api_base, ) async def async_update_daily_reports( @@ -1361,6 +1374,8 @@ Model Info: alert_type: AlertType, alerting_metadata: dict, user_info: Optional[WebhookEvent] = None, + request_model: Optional[str] = None, + api_base: Optional[str] = None, **kwargs, ): """ @@ -1376,6 +1391,8 @@ Model Info: Parameters: level: str - Low|Medium|High - if calls might fail (Medium) or are failing (High); Currently, no alerts would be 'Low'. message: str - what is the alert about + request_model: Optional[str] - model name for digest grouping + api_base: Optional[str] - api base for digest grouping """ if self.alerting is None: return @@ -1413,6 +1430,44 @@ Model Info: from datetime import datetime + # Check if digest mode is enabled for this alert type + alert_type_name_str = getattr(alert_type, "value", str(alert_type)) + _atc = self.alert_type_config.get(alert_type_name_str) + if _atc is not None and _atc.digest: + # Resolve webhook URL for this alert type (needed for digest entry) + if ( + self.alert_to_webhook_url is not None + and alert_type in self.alert_to_webhook_url + ): + _digest_webhook: Optional[Union[str, List[str]]] = self.alert_to_webhook_url[alert_type] + elif self.default_webhook_url is not None: + _digest_webhook = self.default_webhook_url + else: + _digest_webhook = os.getenv("SLACK_WEBHOOK_URL", None) + if _digest_webhook is None: + raise ValueError("Missing SLACK_WEBHOOK_URL from environment") + + digest_key = f"{alert_type_name_str}:{request_model or ''}:{api_base or ''}" + + async with self.digest_lock: + now = datetime.now() + if digest_key in self.digest_buckets: + self.digest_buckets[digest_key]["count"] += 1 + self.digest_buckets[digest_key]["last_time"] = now + else: + self.digest_buckets[digest_key] = DigestEntry( + alert_type=alert_type_name_str, + request_model=request_model or "", + api_base=api_base or "", + first_message=message, + level=level, + count=1, + start_time=now, + last_time=now, + webhook_url=_digest_webhook, + ) + return # Suppress immediate alert; will be emitted by _flush_digest_buckets + # Get the current timestamp current_time = datetime.now().strftime("%H:%M:%S") _proxy_base_url = os.getenv("PROXY_BASE_URL", None) @@ -1488,6 +1543,72 @@ Model Info: await asyncio.gather(*tasks) self.log_queue.clear() + async def _flush_digest_buckets(self): + """Flush any digest buckets whose interval has expired. + + For each expired bucket, formats a digest summary message and + appends it to the log_queue for delivery via the normal batching path. + """ + from datetime import datetime + + now = datetime.now() + flushed_keys: List[str] = [] + + async with self.digest_lock: + for key, entry in self.digest_buckets.items(): + alert_type_name = entry["alert_type"] + _atc = self.alert_type_config.get(alert_type_name) + if _atc is None: + continue + elapsed = (now - entry["start_time"]).total_seconds() + if elapsed < _atc.digest_interval: + continue + + # Build digest summary message + start_ts = entry["start_time"].strftime("%H:%M:%S") + end_ts = entry["last_time"].strftime("%H:%M:%S") + start_date = entry["start_time"].strftime("%Y-%m-%d") + end_date = entry["last_time"].strftime("%Y-%m-%d") + formatted_message = ( + f"Alert type: `{alert_type_name}` (Digest)\n" + f"Level: `{entry['level']}`\n" + f"Start: `{start_date} {start_ts}`\n" + f"End: `{end_date} {end_ts}`\n" + f"Count: `{entry['count']}`\n\n" + f"Message: {entry['first_message']}" + ) + _proxy_base_url = os.getenv("PROXY_BASE_URL", None) + if _proxy_base_url is not None: + formatted_message += f"\n\nProxy URL: `{_proxy_base_url}`" + + payload = {"text": formatted_message} + headers = {"Content-type": "application/json"} + webhook_url = entry["webhook_url"] + + if isinstance(webhook_url, list): + for url in webhook_url: + self.log_queue.append( + {"url": url, "headers": headers, "payload": payload, "alert_type": alert_type_name} + ) + else: + self.log_queue.append( + {"url": webhook_url, "headers": headers, "payload": payload, "alert_type": alert_type_name} + ) + flushed_keys.append(key) + + for key in flushed_keys: + del self.digest_buckets[key] + + async def periodic_flush(self): + """Override base periodic_flush to also flush digest buckets.""" + while True: + await asyncio.sleep(self.flush_interval) + try: + await self._flush_digest_buckets() + except Exception as e: + verbose_proxy_logger.debug(f"Error flushing digest buckets: {str(e)}") + await self.flush_queue() + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): """Log deployment latency""" try: diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 1a09ed2e0a6..2ee89892e23 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -3151,6 +3151,7 @@ class ProxyConfig: alert_types=general_settings.get("alert_types", None), alert_to_webhook_url=general_settings.get("alert_to_webhook_url", None), alerting_args=general_settings.get("alerting_args", None), + alert_type_config=general_settings.get("alert_type_config", None), redis_cache=redis_usage_cache, ) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 1a1764324a3..cac3e2e688c 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -384,6 +384,7 @@ class ProxyLogging: alert_types: Optional[List[AlertType]] = None, alerting_args: Optional[dict] = None, alert_to_webhook_url: Optional[dict] = None, + alert_type_config: Optional[dict] = None, ): updated_slack_alerting: bool = False if alerting is not None: @@ -398,6 +399,8 @@ class ProxyLogging: if alert_to_webhook_url is not None: self.alert_to_webhook_url = alert_to_webhook_url updated_slack_alerting = True + if alert_type_config is not None: + updated_slack_alerting = True if updated_slack_alerting is True: self.slack_alerting_instance.update_values( @@ -406,6 +409,7 @@ class ProxyLogging: alert_types=self.alert_types, alerting_args=alerting_args, alert_to_webhook_url=self.alert_to_webhook_url, + alert_type_config=alert_type_config, ) if self.alerting is not None and "slack" in self.alerting: diff --git a/litellm/types/integrations/slack_alerting.py b/litellm/types/integrations/slack_alerting.py index 856640638c2..078e7953ad8 100644 --- a/litellm/types/integrations/slack_alerting.py +++ b/litellm/types/integrations/slack_alerting.py @@ -1,13 +1,15 @@ import os from datetime import datetime as dt from enum import Enum -from typing import Any, Dict, List, Literal, Optional, Set +from typing import Any, Dict, List, Literal, Optional, Set, Union from pydantic import BaseModel, Field from typing_extensions import TypedDict from litellm.types.utils import LiteLLMPydanticObjectBase +DEFAULT_DIGEST_INTERVAL = 86400 # 24 hours in seconds + SLACK_ALERTING_THRESHOLD_5_PERCENT = 0.05 SLACK_ALERTING_THRESHOLD_15_PERCENT = 0.15 MAX_OLDEST_HANGING_REQUESTS_TO_CHECK = 20 @@ -199,3 +201,30 @@ class HangingRequestData(BaseModel): key_alias: Optional[str] = None team_alias: Optional[str] = None alerting_metadata: Optional[dict] = None + + +class AlertTypeConfig(LiteLLMPydanticObjectBase): + """Per-alert-type configuration, including digest mode settings.""" + + digest: bool = Field( + default=False, + description="Enable digest mode for this alert type. When enabled, duplicate alerts are aggregated into a single summary message.", + ) + digest_interval: int = Field( + default=DEFAULT_DIGEST_INTERVAL, + description="Digest window in seconds. Alerts are aggregated within this interval. Default 24 hours.", + ) + + +class DigestEntry(TypedDict): + """Tracks an in-flight digest bucket for a unique (alert_type, model, api_base) combination.""" + + alert_type: str + request_model: str + api_base: str + first_message: str + level: str + count: int + start_time: dt + last_time: dt + webhook_url: Union[str, List[str]] diff --git a/tests/test_litellm/integrations/SlackAlerting/test_slack_alerting_digest.py b/tests/test_litellm/integrations/SlackAlerting/test_slack_alerting_digest.py new file mode 100644 index 00000000000..eeb3640dd87 --- /dev/null +++ b/tests/test_litellm/integrations/SlackAlerting/test_slack_alerting_digest.py @@ -0,0 +1,235 @@ +""" +Tests for Slack Alert Digest Mode + +Verifies that: +- Digest mode suppresses duplicate alerts within the interval +- Digest summary is emitted after the interval expires +- Non-digest alert types are unaffected +- Different (model, api_base) combos get separate digest entries +- The digest message format includes Start/End timestamps and Count +""" + +import os +import sys +import unittest +from datetime import datetime, timedelta + +sys.path.insert(0, os.path.abspath("../../..")) + +from litellm.integrations.SlackAlerting.slack_alerting import SlackAlerting +from litellm.proxy._types import AlertType +from litellm.types.integrations.slack_alerting import AlertTypeConfig + + +class TestDigestMode(unittest.IsolatedAsyncioTestCase): + """Test digest mode in SlackAlerting.send_alert().""" + + def setUp(self): + os.environ["SLACK_WEBHOOK_URL"] = "https://hooks.slack.com/test" + self.slack_alerting = SlackAlerting( + alerting=["slack"], + alert_type_config={ + "llm_requests_hanging": {"digest": True, "digest_interval": 60}, + }, + ) + # Prevent periodic flush from starting + self.slack_alerting.periodic_started = True + + def tearDown(self): + os.environ.pop("SLACK_WEBHOOK_URL", None) + + async def test_digest_suppresses_duplicate_alerts(self): + """Sending the same alert type + model + api_base multiple times should NOT add to log_queue.""" + message = "`Requests are hanging`\nRequest Model: `gemini-2.5-flash`\nAPI Base: `None`" + + for _ in range(5): + await self.slack_alerting.send_alert( + message=message, + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gemini-2.5-flash", + api_base="None", + ) + + # No messages should be in the log queue - they're all in digest_buckets + self.assertEqual(len(self.slack_alerting.log_queue), 0) + # Should have exactly 1 digest bucket entry + self.assertEqual(len(self.slack_alerting.digest_buckets), 1) + # Count should be 5 + bucket = list(self.slack_alerting.digest_buckets.values())[0] + self.assertEqual(bucket["count"], 5) + + async def test_different_models_get_separate_digests(self): + """Different models should produce separate digest entries.""" + await self.slack_alerting.send_alert( + message="`Requests are hanging`", + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gemini-2.5-flash", + api_base="None", + ) + await self.slack_alerting.send_alert( + message="`Requests are hanging`", + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gpt-4", + api_base="https://api.openai.com", + ) + + self.assertEqual(len(self.slack_alerting.digest_buckets), 2) + + async def test_non_digest_alert_goes_to_queue(self): + """Alert types without digest enabled should go straight to the log queue.""" + message = "Budget exceeded" + + await self.slack_alerting.send_alert( + message=message, + level="High", + alert_type=AlertType.budget_alerts, + alerting_metadata={}, + ) + + # Should be in log_queue, not digest_buckets + self.assertGreater(len(self.slack_alerting.log_queue), 0) + self.assertEqual(len(self.slack_alerting.digest_buckets), 0) + + async def test_flush_digest_buckets_emits_after_interval(self): + """After the digest interval expires, _flush_digest_buckets should emit a summary.""" + message = "`Requests are hanging`\nRequest Model: `gemini-2.5-flash`\nAPI Base: `None`" + + # Send 3 alerts + for _ in range(3): + await self.slack_alerting.send_alert( + message=message, + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gemini-2.5-flash", + api_base="None", + ) + + self.assertEqual(len(self.slack_alerting.log_queue), 0) + self.assertEqual(len(self.slack_alerting.digest_buckets), 1) + + # Manually backdate the start_time to simulate interval expiration + key = list(self.slack_alerting.digest_buckets.keys())[0] + self.slack_alerting.digest_buckets[key]["start_time"] = datetime.now() - timedelta(seconds=120) + + # Flush digest buckets + await self.slack_alerting._flush_digest_buckets() + + # Digest bucket should be cleared + self.assertEqual(len(self.slack_alerting.digest_buckets), 0) + # And a summary message should be in the log queue + self.assertEqual(len(self.slack_alerting.log_queue), 1) + payload_text = self.slack_alerting.log_queue[0]["payload"]["text"] + self.assertIn("(Digest)", payload_text) + self.assertIn("Count: `3`", payload_text) + self.assertIn("Start:", payload_text) + self.assertIn("End:", payload_text) + + async def test_flush_does_not_emit_before_interval(self): + """Digest buckets should NOT be flushed before the interval expires.""" + message = "`Requests are hanging`" + + await self.slack_alerting.send_alert( + message=message, + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gemini-2.5-flash", + ) + + # Flush immediately (interval hasn't expired) + await self.slack_alerting._flush_digest_buckets() + + # Bucket should still be there + self.assertEqual(len(self.slack_alerting.digest_buckets), 1) + self.assertEqual(len(self.slack_alerting.log_queue), 0) + + async def test_digest_message_format(self): + """Verify the digest summary message format.""" + message = "`Requests are hanging - 600s+ request time`\nRequest Model: `gemini-2.5-flash`\nAPI Base: `None`" + + await self.slack_alerting.send_alert( + message=message, + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + request_model="gemini-2.5-flash", + api_base="None", + ) + + # Backdate and flush + key = list(self.slack_alerting.digest_buckets.keys())[0] + self.slack_alerting.digest_buckets[key]["start_time"] = datetime.now() - timedelta(seconds=120) + + await self.slack_alerting._flush_digest_buckets() + + payload_text = self.slack_alerting.log_queue[0]["payload"]["text"] + self.assertIn("Alert type: `llm_requests_hanging` (Digest)", payload_text) + self.assertIn("Level: `Medium`", payload_text) + self.assertIn("Count: `1`", payload_text) + self.assertIn("`Requests are hanging - 600s+ request time`", payload_text) + + async def test_digest_without_model_groups_by_alert_type_only(self): + """When request_model is not provided, alerts group by alert type alone.""" + for _ in range(3): + await self.slack_alerting.send_alert( + message="Some hanging request", + level="Medium", + alert_type=AlertType.llm_requests_hanging, + alerting_metadata={}, + ) + + # All 3 should be in the same bucket (empty model and api_base) + self.assertEqual(len(self.slack_alerting.digest_buckets), 1) + bucket = list(self.slack_alerting.digest_buckets.values())[0] + self.assertEqual(bucket["count"], 3) + self.assertEqual(bucket["request_model"], "") + self.assertEqual(bucket["api_base"], "") + + +class TestAlertTypeConfig(unittest.TestCase): + """Test AlertTypeConfig model and initialization.""" + + def test_default_values(self): + config = AlertTypeConfig() + self.assertFalse(config.digest) + self.assertEqual(config.digest_interval, 86400) + + def test_custom_values(self): + config = AlertTypeConfig(digest=True, digest_interval=3600) + self.assertTrue(config.digest) + self.assertEqual(config.digest_interval, 3600) + + def test_slack_alerting_init_with_config(self): + sa = SlackAlerting( + alerting=["slack"], + alert_type_config={ + "llm_requests_hanging": {"digest": True, "digest_interval": 7200}, + "llm_too_slow": {"digest": True}, + }, + ) + self.assertIn("llm_requests_hanging", sa.alert_type_config) + self.assertIn("llm_too_slow", sa.alert_type_config) + self.assertTrue(sa.alert_type_config["llm_requests_hanging"].digest) + self.assertEqual(sa.alert_type_config["llm_requests_hanging"].digest_interval, 7200) + self.assertEqual(sa.alert_type_config["llm_too_slow"].digest_interval, 86400) + + def test_update_values_with_config(self): + sa = SlackAlerting(alerting=["slack"]) + self.assertEqual(len(sa.alert_type_config), 0) + + sa.update_values( + alert_type_config={"llm_exceptions": {"digest": True, "digest_interval": 1800}}, + ) + self.assertIn("llm_exceptions", sa.alert_type_config) + self.assertTrue(sa.alert_type_config["llm_exceptions"].digest) + + +if __name__ == "__main__": + unittest.main() From e37d54e95be32e6b2432898c9ab7449dd805d55c Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:41:21 -0800 Subject: [PATCH 17/86] feat: add blog_posts.json and local backup --- blog_posts.json | 16 ++++++++++++++++ litellm/blog_posts_backup.json | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 blog_posts.json create mode 100644 litellm/blog_posts_backup.json diff --git a/blog_posts.json b/blog_posts.json new file mode 100644 index 00000000000..8e29e3c4e19 --- /dev/null +++ b/blog_posts.json @@ -0,0 +1,16 @@ +{ + "posts": [ + { + "title": "LiteLLM: Unified Interface for 100+ LLMs", + "description": "Learn how LiteLLM provides a single interface to call any LLM with OpenAI-compatible syntax.", + "date": "2026-02-01", + "url": "https://www.litellm.ai/blog/litellm" + }, + { + "title": "Using the LiteLLM Proxy for Load Balancing", + "description": "Set up the LiteLLM proxy server to load balance across multiple LLM providers and deployments.", + "date": "2026-01-15", + "url": "https://www.litellm.ai/blog/proxy-load-balancing" + } + ] +} diff --git a/litellm/blog_posts_backup.json b/litellm/blog_posts_backup.json new file mode 100644 index 00000000000..8e29e3c4e19 --- /dev/null +++ b/litellm/blog_posts_backup.json @@ -0,0 +1,16 @@ +{ + "posts": [ + { + "title": "LiteLLM: Unified Interface for 100+ LLMs", + "description": "Learn how LiteLLM provides a single interface to call any LLM with OpenAI-compatible syntax.", + "date": "2026-02-01", + "url": "https://www.litellm.ai/blog/litellm" + }, + { + "title": "Using the LiteLLM Proxy for Load Balancing", + "description": "Set up the LiteLLM proxy server to load balance across multiple LLM providers and deployments.", + "date": "2026-01-15", + "url": "https://www.litellm.ai/blog/proxy-load-balancing" + } + ] +} From be1a543b55e05f01c1f554922dfe0452c7ef1283 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:44:33 -0800 Subject: [PATCH 18/86] feat: add GetBlogPosts utility with GitHub fetch and local fallback Adds GetBlogPosts class that fetches blog posts from GitHub with a 1-hour in-process TTL cache, validates the response, and falls back to the bundled blog_posts_backup.json on any network or validation failure. --- litellm/litellm_core_utils/get_blog_posts.py | 134 ++++++++++++++++ tests/test_litellm/test_get_blog_posts.py | 157 +++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 litellm/litellm_core_utils/get_blog_posts.py create mode 100644 tests/test_litellm/test_get_blog_posts.py diff --git a/litellm/litellm_core_utils/get_blog_posts.py b/litellm/litellm_core_utils/get_blog_posts.py new file mode 100644 index 00000000000..70fbe7129b5 --- /dev/null +++ b/litellm/litellm_core_utils/get_blog_posts.py @@ -0,0 +1,134 @@ +""" +Pulls the latest LiteLLM blog posts from GitHub. + +Falls back to the bundled local backup on any failure. +GitHub JSON can be overridden via LITELLM_BLOG_POSTS_URL env var. + +Disable remote fetching entirely: + export LITELLM_LOCAL_BLOG_POSTS=True +""" + +import json +import os +import time +from importlib.resources import files +from typing import Any, Dict, List, Optional + +import httpx +from pydantic import BaseModel + +from litellm import verbose_logger + +BLOG_POSTS_GITHUB_URL: str = os.getenv( + "LITELLM_BLOG_POSTS_URL", + "https://raw.githubusercontent.com/BerriAI/litellm/main/blog_posts.json", +) + +BLOG_POSTS_TTL_SECONDS: int = 3600 # 1 hour + + +class BlogPost(BaseModel): + title: str + description: str + date: str + url: str + + +class BlogPostsResponse(BaseModel): + posts: List[BlogPost] + + +class GetBlogPosts: + """ + Fetches, validates, and caches LiteLLM blog posts. + + Mirrors the structure of GetModelCostMap: + - Fetches from GitHub with a 5-second timeout + - Validates the response has a non-empty ``posts`` list + - Caches the result in-process for BLOG_POSTS_TTL_SECONDS (1 hour) + - Falls back to the bundled local backup on any failure + """ + + _cached_posts: Optional[List[Dict[str, str]]] = None + _last_fetch_time: float = 0.0 + + @staticmethod + def load_local_blog_posts() -> List[Dict[str, str]]: + """Load the bundled local backup blog posts.""" + content = json.loads( + files("litellm") + .joinpath("blog_posts_backup.json") + .read_text(encoding="utf-8") + ) + return content.get("posts", []) + + @staticmethod + def fetch_remote_blog_posts(url: str, timeout: int = 5) -> Any: + """ + Fetch blog posts JSON from a remote URL. + + Returns the parsed response. Raises on network/parse errors. + """ + response = httpx.get(url, timeout=timeout) + response.raise_for_status() + return response.json() + + @staticmethod + def validate_blog_posts(data: Any) -> bool: + """Return True if data is a dict with a non-empty ``posts`` list.""" + if not isinstance(data, dict): + verbose_logger.warning( + "LiteLLM: Blog posts response is not a dict (type=%s). " + "Falling back to local backup.", + type(data).__name__, + ) + return False + posts = data.get("posts") + if not isinstance(posts, list) or len(posts) == 0: + verbose_logger.warning( + "LiteLLM: Blog posts response has no valid 'posts' list. " + "Falling back to local backup.", + ) + return False + return True + + @classmethod + def get_blog_posts(cls, url: str = BLOG_POSTS_GITHUB_URL) -> List[Dict[str, str]]: + """ + Return the blog posts list. + + Uses the in-process cache if within BLOG_POSTS_TTL_SECONDS. + Fetches from ``url`` otherwise, falling back to local backup on failure. + """ + if os.getenv("LITELLM_LOCAL_BLOG_POSTS", "").lower() == "true": + return cls.load_local_blog_posts() + + now = time.time() + if ( + cls._cached_posts is not None + and (now - cls._last_fetch_time) < BLOG_POSTS_TTL_SECONDS + ): + return cls._cached_posts + + try: + data = cls.fetch_remote_blog_posts(url) + except Exception as e: + verbose_logger.warning( + "LiteLLM: Failed to fetch blog posts from %s: %s. " + "Falling back to local backup.", + url, + str(e), + ) + return cls.load_local_blog_posts() + + if not cls.validate_blog_posts(data): + return cls.load_local_blog_posts() + + cls._cached_posts = data["posts"] + cls._last_fetch_time = now + return cls._cached_posts + + +def get_blog_posts(url: str = BLOG_POSTS_GITHUB_URL) -> List[Dict[str, str]]: + """Public entry point — returns the blog posts list.""" + return GetBlogPosts.get_blog_posts(url=url) diff --git a/tests/test_litellm/test_get_blog_posts.py b/tests/test_litellm/test_get_blog_posts.py new file mode 100644 index 00000000000..29cecfaf5d5 --- /dev/null +++ b/tests/test_litellm/test_get_blog_posts.py @@ -0,0 +1,157 @@ +"""Tests for GetBlogPosts utility class.""" +import json +import time +from unittest.mock import MagicMock, patch + +import pytest + +from litellm.litellm_core_utils.get_blog_posts import ( + BLOG_POSTS_GITHUB_URL, + BlogPost, + BlogPostsResponse, + GetBlogPosts, + get_blog_posts, +) + +SAMPLE_RESPONSE = { + "posts": [ + { + "title": "Test Post", + "description": "A test post.", + "date": "2026-01-01", + "url": "https://www.litellm.ai/blog/test", + } + ] +} + + +def test_load_local_blog_posts_returns_list(): + posts = GetBlogPosts.load_local_blog_posts() + assert isinstance(posts, list) + assert len(posts) > 0 + first = posts[0] + assert "title" in first + assert "description" in first + assert "date" in first + assert "url" in first + + +def test_validate_blog_posts_valid(): + assert GetBlogPosts.validate_blog_posts(SAMPLE_RESPONSE) is True + + +def test_validate_blog_posts_missing_posts_key(): + assert GetBlogPosts.validate_blog_posts({"other": []}) is False + + +def test_validate_blog_posts_empty_list(): + assert GetBlogPosts.validate_blog_posts({"posts": []}) is False + + +def test_validate_blog_posts_not_dict(): + assert GetBlogPosts.validate_blog_posts("not a dict") is False + + +def test_get_blog_posts_success(monkeypatch): + """Fetches from remote on first call.""" + # Reset class cache state + GetBlogPosts._cached_posts = None + GetBlogPosts._last_fetch_time = 0.0 + + mock_response = MagicMock() + mock_response.json.return_value = SAMPLE_RESPONSE + mock_response.raise_for_status = MagicMock() + + with patch("litellm.litellm_core_utils.get_blog_posts.httpx.get", return_value=mock_response): + posts = get_blog_posts() + + assert len(posts) == 1 + assert posts[0]["title"] == "Test Post" + + +def test_get_blog_posts_network_error_falls_back_to_local(monkeypatch): + """Falls back to local backup on network error.""" + GetBlogPosts._cached_posts = None + GetBlogPosts._last_fetch_time = 0.0 + + with patch( + "litellm.litellm_core_utils.get_blog_posts.httpx.get", + side_effect=Exception("Network error"), + ): + posts = get_blog_posts() + + assert isinstance(posts, list) + assert len(posts) > 0 + + +def test_get_blog_posts_invalid_json_falls_back_to_local(monkeypatch): + """Falls back when remote returns non-dict.""" + GetBlogPosts._cached_posts = None + GetBlogPosts._last_fetch_time = 0.0 + + mock_response = MagicMock() + mock_response.json.return_value = "not a dict" + mock_response.raise_for_status = MagicMock() + + with patch("litellm.litellm_core_utils.get_blog_posts.httpx.get", return_value=mock_response): + posts = get_blog_posts() + + assert isinstance(posts, list) + assert len(posts) > 0 + + +def test_get_blog_posts_ttl_cache_not_refetched(monkeypatch): + """Within TTL window, does not re-fetch.""" + GetBlogPosts._cached_posts = SAMPLE_RESPONSE["posts"] + GetBlogPosts._last_fetch_time = time.time() # just now + + call_count = 0 + + def mock_get(*args, **kwargs): + nonlocal call_count + call_count += 1 + m = MagicMock() + m.json.return_value = SAMPLE_RESPONSE + m.raise_for_status = MagicMock() + return m + + with patch("litellm.litellm_core_utils.get_blog_posts.httpx.get", side_effect=mock_get): + posts = get_blog_posts() + + assert call_count == 0 # cache hit, no fetch + assert len(posts) == 1 + + +def test_get_blog_posts_ttl_expired_refetches(monkeypatch): + """After TTL window, re-fetches from remote.""" + GetBlogPosts._cached_posts = SAMPLE_RESPONSE["posts"] + GetBlogPosts._last_fetch_time = time.time() - 7200 # 2 hours ago + + mock_response = MagicMock() + mock_response.json.return_value = SAMPLE_RESPONSE + mock_response.raise_for_status = MagicMock() + + with patch( + "litellm.litellm_core_utils.get_blog_posts.httpx.get", return_value=mock_response + ) as mock_get: + posts = get_blog_posts() + + mock_get.assert_called_once() + assert len(posts) == 1 + + +def test_blog_post_pydantic_model(): + post = BlogPost( + title="T", + description="D", + date="2026-01-01", + url="https://example.com", + ) + assert post.title == "T" + + +def test_blog_posts_response_pydantic_model(): + resp = BlogPostsResponse( + posts=[BlogPost(title="T", description="D", date="2026-01-01", url="https://x.com")] + ) + assert len(resp.posts) == 1 From 7e5c63c13487162151bfbf9f0e9911341b305a4b Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:48:54 -0800 Subject: [PATCH 19/86] test: add cache reset fixture and LITELLM_LOCAL_BLOG_POSTS test Co-Authored-By: Claude Sonnet 4.6 --- litellm/litellm_core_utils/get_blog_posts.py | 2 +- tests/test_litellm/test_get_blog_posts.py | 38 ++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/litellm/litellm_core_utils/get_blog_posts.py b/litellm/litellm_core_utils/get_blog_posts.py index 70fbe7129b5..137e32b0c9e 100644 --- a/litellm/litellm_core_utils/get_blog_posts.py +++ b/litellm/litellm_core_utils/get_blog_posts.py @@ -63,7 +63,7 @@ class GetBlogPosts: return content.get("posts", []) @staticmethod - def fetch_remote_blog_posts(url: str, timeout: int = 5) -> Any: + def fetch_remote_blog_posts(url: str, timeout: int = 5) -> dict: """ Fetch blog posts JSON from a remote URL. diff --git a/tests/test_litellm/test_get_blog_posts.py b/tests/test_litellm/test_get_blog_posts.py index 29cecfaf5d5..3f36a5b5fa5 100644 --- a/tests/test_litellm/test_get_blog_posts.py +++ b/tests/test_litellm/test_get_blog_posts.py @@ -25,6 +25,15 @@ SAMPLE_RESPONSE = { } +@pytest.fixture(autouse=True) +def reset_blog_posts_cache(): + GetBlogPosts._cached_posts = None + GetBlogPosts._last_fetch_time = 0.0 + yield + GetBlogPosts._cached_posts = None + GetBlogPosts._last_fetch_time = 0.0 + + def test_load_local_blog_posts_returns_list(): posts = GetBlogPosts.load_local_blog_posts() assert isinstance(posts, list) @@ -52,12 +61,8 @@ def test_validate_blog_posts_not_dict(): assert GetBlogPosts.validate_blog_posts("not a dict") is False -def test_get_blog_posts_success(monkeypatch): +def test_get_blog_posts_success(): """Fetches from remote on first call.""" - # Reset class cache state - GetBlogPosts._cached_posts = None - GetBlogPosts._last_fetch_time = 0.0 - mock_response = MagicMock() mock_response.json.return_value = SAMPLE_RESPONSE mock_response.raise_for_status = MagicMock() @@ -69,11 +74,8 @@ def test_get_blog_posts_success(monkeypatch): assert posts[0]["title"] == "Test Post" -def test_get_blog_posts_network_error_falls_back_to_local(monkeypatch): +def test_get_blog_posts_network_error_falls_back_to_local(): """Falls back to local backup on network error.""" - GetBlogPosts._cached_posts = None - GetBlogPosts._last_fetch_time = 0.0 - with patch( "litellm.litellm_core_utils.get_blog_posts.httpx.get", side_effect=Exception("Network error"), @@ -84,11 +86,8 @@ def test_get_blog_posts_network_error_falls_back_to_local(monkeypatch): assert len(posts) > 0 -def test_get_blog_posts_invalid_json_falls_back_to_local(monkeypatch): +def test_get_blog_posts_invalid_json_falls_back_to_local(): """Falls back when remote returns non-dict.""" - GetBlogPosts._cached_posts = None - GetBlogPosts._last_fetch_time = 0.0 - mock_response = MagicMock() mock_response.json.return_value = "not a dict" mock_response.raise_for_status = MagicMock() @@ -100,7 +99,7 @@ def test_get_blog_posts_invalid_json_falls_back_to_local(monkeypatch): assert len(posts) > 0 -def test_get_blog_posts_ttl_cache_not_refetched(monkeypatch): +def test_get_blog_posts_ttl_cache_not_refetched(): """Within TTL window, does not re-fetch.""" GetBlogPosts._cached_posts = SAMPLE_RESPONSE["posts"] GetBlogPosts._last_fetch_time = time.time() # just now @@ -122,7 +121,7 @@ def test_get_blog_posts_ttl_cache_not_refetched(monkeypatch): assert len(posts) == 1 -def test_get_blog_posts_ttl_expired_refetches(monkeypatch): +def test_get_blog_posts_ttl_expired_refetches(): """After TTL window, re-fetches from remote.""" GetBlogPosts._cached_posts = SAMPLE_RESPONSE["posts"] GetBlogPosts._last_fetch_time = time.time() - 7200 # 2 hours ago @@ -140,6 +139,15 @@ def test_get_blog_posts_ttl_expired_refetches(monkeypatch): assert len(posts) == 1 +def test_get_blog_posts_local_env_var_skips_remote(monkeypatch): + monkeypatch.setenv("LITELLM_LOCAL_BLOG_POSTS", "true") + with patch("litellm.litellm_core_utils.get_blog_posts.httpx.get") as mock_get: + posts = get_blog_posts() + mock_get.assert_not_called() + assert isinstance(posts, list) + assert len(posts) > 0 + + def test_blog_post_pydantic_model(): post = BlogPost( title="T", From 021a9097c4f1f5ae22de4b40dd69d7cdf453678a Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:51:55 -0800 Subject: [PATCH 20/86] feat: add GET /public/litellm_blog_posts endpoint Co-Authored-By: Claude Sonnet 4.6 --- .../public_endpoints/public_endpoints.py | 27 +++++++ .../test_blog_posts_endpoint.py | 79 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 tests/proxy_unit_tests/test_blog_posts_endpoint.py diff --git a/litellm/proxy/public_endpoints/public_endpoints.py b/litellm/proxy/public_endpoints/public_endpoints.py index 6d60a218fd1..f5bca531839 100644 --- a/litellm/proxy/public_endpoints/public_endpoints.py +++ b/litellm/proxy/public_endpoints/public_endpoints.py @@ -4,6 +4,12 @@ from typing import List from fastapi import APIRouter, Depends, HTTPException +from litellm.litellm_core_utils.get_blog_posts import ( + BlogPost, + BlogPostsResponse, + GetBlogPosts, + get_blog_posts, +) from litellm.proxy._types import CommonProxyErrors from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.types.agents import AgentCard @@ -193,6 +199,27 @@ async def get_litellm_model_cost_map(): ) +@router.get( + "/public/litellm_blog_posts", + tags=["public"], + response_model=BlogPostsResponse, +) +async def get_litellm_blog_posts(): + """ + Public endpoint to get the latest LiteLLM blog posts. + + Fetches from GitHub with a 1-hour in-process cache. + Falls back to the bundled local backup on any failure. + """ + try: + posts_data = get_blog_posts() + except Exception: + posts_data = GetBlogPosts.load_local_blog_posts() + + posts = [BlogPost(**p) for p in posts_data[:5]] + return BlogPostsResponse(posts=posts) + + @router.get( "/public/agents/fields", tags=["public", "[beta] Agents"], diff --git a/tests/proxy_unit_tests/test_blog_posts_endpoint.py b/tests/proxy_unit_tests/test_blog_posts_endpoint.py new file mode 100644 index 00000000000..1c5db4d2cfe --- /dev/null +++ b/tests/proxy_unit_tests/test_blog_posts_endpoint.py @@ -0,0 +1,79 @@ +"""Tests for the /public/litellm_blog_posts endpoint.""" +from unittest.mock import patch + +import pytest +from fastapi.testclient import TestClient + +SAMPLE_POSTS = [ + { + "title": "Test Post", + "description": "A test post.", + "date": "2026-01-01", + "url": "https://www.litellm.ai/blog/test", + } +] + + +@pytest.fixture +def client(): + """Create a TestClient with just the public_endpoints router.""" + from fastapi import FastAPI + + from litellm.proxy.public_endpoints.public_endpoints import router + + app = FastAPI() + app.include_router(router) + return TestClient(app) + + +def test_get_blog_posts_returns_response_shape(client): + with patch( + "litellm.proxy.public_endpoints.public_endpoints.get_blog_posts", + return_value=SAMPLE_POSTS, + ): + response = client.get("/public/litellm_blog_posts") + + assert response.status_code == 200 + data = response.json() + assert "posts" in data + assert len(data["posts"]) == 1 + post = data["posts"][0] + assert post["title"] == "Test Post" + assert post["description"] == "A test post." + assert post["date"] == "2026-01-01" + assert post["url"] == "https://www.litellm.ai/blog/test" + + +def test_get_blog_posts_limits_to_five(client): + """Endpoint returns at most 5 posts.""" + many_posts = [ + { + "title": f"Post {i}", + "description": "desc", + "date": "2026-01-01", + "url": f"https://www.litellm.ai/blog/{i}", + } + for i in range(10) + ] + + with patch( + "litellm.proxy.public_endpoints.public_endpoints.get_blog_posts", + return_value=many_posts, + ): + response = client.get("/public/litellm_blog_posts") + + assert response.status_code == 200 + assert len(response.json()["posts"]) == 5 + + +def test_get_blog_posts_returns_local_backup_on_failure(client): + """Endpoint returns local backup (non-empty list) when fetcher fails.""" + with patch( + "litellm.proxy.public_endpoints.public_endpoints.get_blog_posts", + side_effect=Exception("fetch failed"), + ): + response = client.get("/public/litellm_blog_posts") + + # Should not 500 — returns local backup + assert response.status_code == 200 + assert "posts" in response.json() From 4b1ce1ff54acf9e483d3390644f316c2faa10d80 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:54:48 -0800 Subject: [PATCH 21/86] fix: log fallback warning in blog posts endpoint and tighten test --- litellm/proxy/public_endpoints/public_endpoints.py | 6 +++++- tests/proxy_unit_tests/test_blog_posts_endpoint.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/public_endpoints/public_endpoints.py b/litellm/proxy/public_endpoints/public_endpoints.py index f5bca531839..b2fb3dd0f8a 100644 --- a/litellm/proxy/public_endpoints/public_endpoints.py +++ b/litellm/proxy/public_endpoints/public_endpoints.py @@ -4,6 +4,7 @@ from typing import List from fastapi import APIRouter, Depends, HTTPException +from litellm._logging import verbose_logger from litellm.litellm_core_utils.get_blog_posts import ( BlogPost, BlogPostsResponse, @@ -213,7 +214,10 @@ async def get_litellm_blog_posts(): """ try: posts_data = get_blog_posts() - except Exception: + except Exception as e: + verbose_logger.warning( + "LiteLLM: get_litellm_blog_posts endpoint fallback triggered: %s", str(e) + ) posts_data = GetBlogPosts.load_local_blog_posts() posts = [BlogPost(**p) for p in posts_data[:5]] diff --git a/tests/proxy_unit_tests/test_blog_posts_endpoint.py b/tests/proxy_unit_tests/test_blog_posts_endpoint.py index 1c5db4d2cfe..0f93f6f80cf 100644 --- a/tests/proxy_unit_tests/test_blog_posts_endpoint.py +++ b/tests/proxy_unit_tests/test_blog_posts_endpoint.py @@ -77,3 +77,4 @@ def test_get_blog_posts_returns_local_backup_on_failure(client): # Should not 500 — returns local backup assert response.status_code == 200 assert "posts" in response.json() + assert len(response.json()["posts"]) > 0 From ca9111ea318c696d79a62663efa1c5fbca0fb47d Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:56:30 -0800 Subject: [PATCH 22/86] feat: add disable_show_blog to UISettings Co-Authored-By: Claude Sonnet 4.6 --- .../ui_crud_endpoints/proxy_setting_endpoints.py | 6 ++++++ .../test_proxy_setting_endpoints.py | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 tests/proxy_unit_tests/test_proxy_setting_endpoints.py diff --git a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py index b465d13bc70..f6795f12bbc 100644 --- a/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py +++ b/litellm/proxy/ui_crud_endpoints/proxy_setting_endpoints.py @@ -93,6 +93,11 @@ class UISettings(BaseModel): description="If enabled, forwards client headers (e.g. Authorization) to the LLM API. Required for Claude Code with Max subscription.", ) + disable_show_blog: bool = Field( + default=False, + description="If true, hides the Blog dropdown from the UI navbar.", + ) + class UISettingsResponse(SettingsResponse): """Response model for UI settings""" @@ -107,6 +112,7 @@ ALLOWED_UI_SETTINGS_FIELDS = { "enabled_ui_pages_internal_users", "require_auth_for_public_ai_hub", "forward_client_headers_to_llm_api", + "disable_show_blog", } diff --git a/tests/proxy_unit_tests/test_proxy_setting_endpoints.py b/tests/proxy_unit_tests/test_proxy_setting_endpoints.py new file mode 100644 index 00000000000..1bc50919689 --- /dev/null +++ b/tests/proxy_unit_tests/test_proxy_setting_endpoints.py @@ -0,0 +1,13 @@ +def test_ui_settings_has_disable_show_blog_field(): + """UISettings model must include disable_show_blog.""" + from litellm.proxy.ui_crud_endpoints.proxy_setting_endpoints import UISettings + + settings = UISettings() + assert hasattr(settings, "disable_show_blog") + assert settings.disable_show_blog is False # default + + +def test_allowed_ui_settings_fields_contains_disable_show_blog(): + from litellm.proxy.ui_crud_endpoints.proxy_setting_endpoints import ALLOWED_UI_SETTINGS_FIELDS + + assert "disable_show_blog" in ALLOWED_UI_SETTINGS_FIELDS From 70f8e979a02d9dce8c1ee16cc4faf150e200d0d9 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 16:59:34 -0800 Subject: [PATCH 23/86] feat: add useUISettings and useDisableShowBlog hooks --- .../(dashboard)/hooks/useDisableShowBlog.ts | 6 +++++ .../app/(dashboard)/hooks/useUISettings.ts | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts create mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts new file mode 100644 index 00000000000..18532cd4c26 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts @@ -0,0 +1,6 @@ +import { useUISettings } from "./useUISettings"; + +export function useDisableShowBlog(): boolean { + const { data } = useUISettings(); + return data?.disable_show_blog ?? false; +} diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts new file mode 100644 index 00000000000..f99491d5964 --- /dev/null +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts @@ -0,0 +1,27 @@ +import { getUiSettings } from "@/components/networking"; +import { useQuery } from "@tanstack/react-query"; + +export interface UISettingsData { + disable_model_add_for_internal_users: boolean; + disable_team_admin_delete_team_user: boolean; + enabled_ui_pages_internal_users: string[] | null; + require_auth_for_public_ai_hub: boolean; + forward_client_headers_to_llm_api: boolean; + disable_show_blog: boolean; +} + +async function fetchUISettings(): Promise { + // getUiSettings returns the raw response: { values: {...}, field_schema: {...} } + const data = await getUiSettings(); + return data.values as UISettingsData; +} + +export function useUISettings() { + return useQuery({ + queryKey: ["uiSettings"], + queryFn: fetchUISettings, + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, + retry: 1, + }); +} From a82c8c18b2ba5bd0168576b2844e490df2de5a2c Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 17:01:05 -0800 Subject: [PATCH 24/86] fix: rename useUISettings to useUISettingsFlags to avoid naming collision --- .../src/app/(dashboard)/hooks/useDisableShowBlog.ts | 4 ++-- .../hooks/{useUISettings.ts => useUISettingsFlags.ts} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename ui/litellm-dashboard/src/app/(dashboard)/hooks/{useUISettings.ts => useUISettingsFlags.ts} (91%) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts index 18532cd4c26..a31040542b8 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts @@ -1,6 +1,6 @@ -import { useUISettings } from "./useUISettings"; +import { useUISettingsFlags } from "./useUISettingsFlags"; export function useDisableShowBlog(): boolean { - const { data } = useUISettings(); + const { data } = useUISettingsFlags(); return data?.disable_show_blog ?? false; } diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts similarity index 91% rename from ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts rename to ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts index f99491d5964..98b3e2cc128 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettings.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts @@ -16,9 +16,9 @@ async function fetchUISettings(): Promise { return data.values as UISettingsData; } -export function useUISettings() { +export function useUISettingsFlags() { return useQuery({ - queryKey: ["uiSettings"], + queryKey: ["uiSettingsFlags"], queryFn: fetchUISettings, staleTime: 5 * 60 * 1000, // 5 minutes gcTime: 10 * 60 * 1000, From 98da524a9f255141eee05347484aac37311e4eda Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 17:04:05 -0800 Subject: [PATCH 25/86] fix: use existing useUISettings hook in useDisableShowBlog to avoid cache duplication Co-Authored-By: Claude Sonnet 4.6 --- .../(dashboard)/hooks/useDisableShowBlog.ts | 6 ++--- .../(dashboard)/hooks/useUISettingsFlags.ts | 27 ------------------- 2 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts index a31040542b8..cbe1bdc1250 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useDisableShowBlog.ts @@ -1,6 +1,6 @@ -import { useUISettingsFlags } from "./useUISettingsFlags"; +import { useUISettings } from "./uiSettings/useUISettings"; export function useDisableShowBlog(): boolean { - const { data } = useUISettingsFlags(); - return data?.disable_show_blog ?? false; + const { data } = useUISettings(); + return (data?.values?.disable_show_blog as boolean) ?? false; } diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts deleted file mode 100644 index 98b3e2cc128..00000000000 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useUISettingsFlags.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { getUiSettings } from "@/components/networking"; -import { useQuery } from "@tanstack/react-query"; - -export interface UISettingsData { - disable_model_add_for_internal_users: boolean; - disable_team_admin_delete_team_user: boolean; - enabled_ui_pages_internal_users: string[] | null; - require_auth_for_public_ai_hub: boolean; - forward_client_headers_to_llm_api: boolean; - disable_show_blog: boolean; -} - -async function fetchUISettings(): Promise { - // getUiSettings returns the raw response: { values: {...}, field_schema: {...} } - const data = await getUiSettings(); - return data.values as UISettingsData; -} - -export function useUISettingsFlags() { - return useQuery({ - queryKey: ["uiSettingsFlags"], - queryFn: fetchUISettings, - staleTime: 5 * 60 * 1000, // 5 minutes - gcTime: 10 * 60 * 1000, - retry: 1, - }); -} From e241e6fd45cf83f24c77aa34f7e757347b8b75ac Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 17:10:25 -0800 Subject: [PATCH 26/86] feat: add BlogDropdown component with react-query and error/retry state Co-Authored-By: Claude Sonnet 4.6 --- .../Navbar/BlogDropdown/BlogDropdown.tsx | 145 ++++++++++++++++++ .../__tests__/BlogDropdown.test.tsx | 113 ++++++++++++++ 2 files changed, 258 insertions(+) create mode 100644 ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx create mode 100644 ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx diff --git a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx new file mode 100644 index 00000000000..6f8b29f8805 --- /dev/null +++ b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx @@ -0,0 +1,145 @@ +import { useDisableShowBlog } from "@/app/(dashboard)/hooks/useDisableShowBlog"; +import { getProxyBaseUrl } from "@/components/networking"; +import { + DownOutlined, + LoadingOutlined, + ReadOutlined, +} from "@ant-design/icons"; +import { useQuery } from "@tanstack/react-query"; +import { Button, Dropdown, Space, Typography } from "antd"; +import React from "react"; + +const { Text } = Typography; + +interface BlogPost { + title: string; + description: string; + date: string; + url: string; +} + +interface BlogPostsResponse { + posts: BlogPost[]; +} + +async function fetchBlogPosts(): Promise { + const baseUrl = getProxyBaseUrl(); + const response = await fetch(`${baseUrl}/public/litellm_blog_posts`); + if (!response.ok) { + throw new Error(`Failed to fetch blog posts: ${response.statusText}`); + } + return response.json(); +} + +function formatDate(dateStr: string): string { + const date = new Date(dateStr + "T00:00:00"); + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }); +} + +export const BlogDropdown: React.FC = () => { + const disableShowBlog = useDisableShowBlog(); + + const { data, isLoading, isError, refetch } = useQuery({ + queryKey: ["blogPosts"], + queryFn: fetchBlogPosts, + staleTime: 60 * 60 * 1000, // 1 hour — matches server-side TTL + }); + + if (disableShowBlog) { + return null; + } + + const dropdownContent = () => { + if (isError) { + return ( +
+ + Failed to load blog posts + + +
+ ); + } + + if (!data || data.posts.length === 0) { + return ( +
+ No posts available +
+ ); + } + + return ( + + ); + }; + + return ( + + + + ); +}; + +export default BlogDropdown; diff --git a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx new file mode 100644 index 00000000000..f5a79648c77 --- /dev/null +++ b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx @@ -0,0 +1,113 @@ +import React from "react"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { BlogDropdown } from "../BlogDropdown"; +import { useDisableShowBlog } from "@/app/(dashboard)/hooks/useDisableShowBlog"; + +// Mock hooks +vi.mock("@/app/(dashboard)/hooks/useDisableShowBlog", () => ({ + useDisableShowBlog: vi.fn(() => false), +})); + +vi.mock("@/components/networking", () => ({ + getProxyBaseUrl: () => "http://localhost:4000", +})); + +const SAMPLE_POSTS = { + posts: [ + { + title: "Test Post 1", + description: "First test post description.", + date: "2026-02-01", + url: "https://www.litellm.ai/blog/test-1", + }, + { + title: "Test Post 2", + description: "Second test post description.", + date: "2026-01-15", + url: "https://www.litellm.ai/blog/test-2", + }, + ], +}; + +function createWrapper() { + const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: false } }, + }); + return ({ children }: { children: React.ReactNode }) => ( + {children} + ); +} + +describe("BlogDropdown", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("renders the Blog button", async () => { + global.fetch = vi.fn().mockResolvedValueOnce({ + ok: true, + json: async () => SAMPLE_POSTS, + }); + + render(, { wrapper: createWrapper() }); + expect(screen.getByText("Blog")).toBeInTheDocument(); + }); + + it("shows posts on success", async () => { + global.fetch = vi.fn().mockResolvedValueOnce({ + ok: true, + json: async () => SAMPLE_POSTS, + }); + + render(, { wrapper: createWrapper() }); + + // Open the dropdown + fireEvent.click(screen.getByText("Blog")); + + await waitFor(() => { + expect(screen.getByText("Test Post 1")).toBeInTheDocument(); + expect(screen.getByText("Test Post 2")).toBeInTheDocument(); + }); + }); + + it("shows error message and Retry button on fetch failure", async () => { + global.fetch = vi.fn().mockRejectedValueOnce(new Error("Network error")); + + render(, { wrapper: createWrapper() }); + fireEvent.click(screen.getByText("Blog")); + + await waitFor(() => { + expect(screen.getByText(/Failed to load blog posts/i)).toBeInTheDocument(); + expect(screen.getByRole("button", { name: /retry/i })).toBeInTheDocument(); + }); + }); + + it("calls refetch when Retry is clicked", async () => { + global.fetch = vi + .fn() + .mockRejectedValueOnce(new Error("Network error")) + .mockResolvedValueOnce({ ok: true, json: async () => SAMPLE_POSTS }); + + render(, { wrapper: createWrapper() }); + fireEvent.click(screen.getByText("Blog")); + + await waitFor(() => { + expect(screen.getByRole("button", { name: /retry/i })).toBeInTheDocument(); + }); + + fireEvent.click(screen.getByRole("button", { name: /retry/i })); + + await waitFor(() => { + expect(screen.getByText("Test Post 1")).toBeInTheDocument(); + }); + }); + + it("returns null when useDisableShowBlog is true", () => { + vi.mocked(useDisableShowBlog).mockReturnValue(true); + + const { container } = render(, { wrapper: createWrapper() }); + expect(container.firstChild).toBeNull(); + }); +}); From 1c0cfd7e3b72b8a1cf82d7dadef244b762adc3d5 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 17:11:53 -0800 Subject: [PATCH 27/86] fix: enforce 5-post limit in BlogDropdown and add cap test --- .../Navbar/BlogDropdown/BlogDropdown.tsx | 2 +- .../__tests__/BlogDropdown.test.tsx | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx index 6f8b29f8805..022ebb1e68c 100644 --- a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx +++ b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx @@ -77,7 +77,7 @@ export const BlogDropdown: React.FC = () => { return (
- {data.posts.map((post, index) => ( + {data.posts.slice(0, 5).map((post, index) => ( { }); }); + it("shows at most 5 posts", async () => { + const manyPosts = Array.from({ length: 8 }, (_, i) => ({ + title: `Post ${i + 1}`, + description: `Description ${i + 1}`, + date: "2026-02-01", + url: `https://www.litellm.ai/blog/post-${i + 1}`, + })); + + global.fetch = vi.fn().mockResolvedValueOnce({ + ok: true, + json: async () => ({ posts: manyPosts }), + }); + + render(, { wrapper: createWrapper() }); + fireEvent.click(screen.getByText("Blog")); + + await waitFor(() => { + expect(screen.getByText("Post 1")).toBeInTheDocument(); + expect(screen.getByText("Post 5")).toBeInTheDocument(); + expect(screen.queryByText("Post 6")).not.toBeInTheDocument(); + }); + }); + it("shows error message and Retry button on fetch failure", async () => { global.fetch = vi.fn().mockRejectedValueOnce(new Error("Network error")); From 929d592ef48e09240c200cecac8307f782b9f94a Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Feb 2026 17:15:14 -0800 Subject: [PATCH 28/86] fix: add retry, stable post key, enabled guard in BlogDropdown Co-Authored-By: Claude Sonnet 4.6 --- .../BlogDropdown/{__tests__ => }/BlogDropdown.test.tsx | 10 +++++++--- .../components/Navbar/BlogDropdown/BlogDropdown.tsx | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) rename ui/litellm-dashboard/src/components/Navbar/BlogDropdown/{__tests__ => }/BlogDropdown.test.tsx (92%) diff --git a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.test.tsx similarity index 92% rename from ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx rename to ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.test.tsx index 6f448e5b60b..fa1baa311d4 100644 --- a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/__tests__/BlogDropdown.test.tsx +++ b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { describe, it, expect, vi, beforeEach } from "vitest"; -import { BlogDropdown } from "../BlogDropdown"; +import { BlogDropdown } from "./BlogDropdown"; import { useDisableShowBlog } from "@/app/(dashboard)/hooks/useDisableShowBlog"; // Mock hooks @@ -33,7 +33,7 @@ const SAMPLE_POSTS = { function createWrapper() { const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false } }, + defaultOptions: { queries: { retry: false, retryDelay: 0 } }, }); return ({ children }: { children: React.ReactNode }) => ( {children} @@ -96,7 +96,10 @@ describe("BlogDropdown", () => { }); it("shows error message and Retry button on fetch failure", async () => { - global.fetch = vi.fn().mockRejectedValueOnce(new Error("Network error")); + global.fetch = vi + .fn() + .mockRejectedValueOnce(new Error("Network error")) + .mockRejectedValueOnce(new Error("Network error")); render(, { wrapper: createWrapper() }); fireEvent.click(screen.getByText("Blog")); @@ -111,6 +114,7 @@ describe("BlogDropdown", () => { global.fetch = vi .fn() .mockRejectedValueOnce(new Error("Network error")) + .mockRejectedValueOnce(new Error("Network error")) .mockResolvedValueOnce({ ok: true, json: async () => SAMPLE_POSTS }); render(, { wrapper: createWrapper() }); diff --git a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx index 022ebb1e68c..20cfe99ae44 100644 --- a/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx +++ b/ui/litellm-dashboard/src/components/Navbar/BlogDropdown/BlogDropdown.tsx @@ -47,6 +47,9 @@ export const BlogDropdown: React.FC = () => { queryKey: ["blogPosts"], queryFn: fetchBlogPosts, staleTime: 60 * 60 * 1000, // 1 hour — matches server-side TTL + retry: 1, + retryDelay: 0, + enabled: !disableShowBlog, }); if (disableShowBlog) { @@ -77,9 +80,9 @@ export const BlogDropdown: React.FC = () => { return (
- {data.posts.slice(0, 5).map((post, index) => ( + {data.posts.slice(0, 5).map((post) => ( Date: Sat, 21 Feb 2026 17:16:16 -0800 Subject: [PATCH 29/86] feat: add BlogDropdown to navbar after Docs link --- ui/litellm-dashboard/src/components/navbar.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/litellm-dashboard/src/components/navbar.tsx b/ui/litellm-dashboard/src/components/navbar.tsx index 2ffa0632f27..fe6fbb4c3a7 100644 --- a/ui/litellm-dashboard/src/components/navbar.tsx +++ b/ui/litellm-dashboard/src/components/navbar.tsx @@ -12,6 +12,7 @@ import { import { Switch, Tag } from "antd"; import Link from "next/link"; import React, { useEffect, useState } from "react"; +import { BlogDropdown } from "./Navbar/BlogDropdown/BlogDropdown"; import { CommunityEngagementButtons } from "./Navbar/CommunityEngagementButtons/CommunityEngagementButtons"; import UserDropdown from "./Navbar/UserDropdown/UserDropdown"; @@ -146,6 +147,7 @@ const Navbar: React.FC = ({ > Docs + {!isPublicPage && ( From 94b76ea9ad57ffd7923e59d9b0882e59e51ec519 Mon Sep 17 00:00:00 2001 From: Ryan Crabbe Date: Wed, 18 Feb 2026 12:19:18 -0800 Subject: [PATCH 30/86] feat: add network_mock transport for benchmarking proxy overhead without real API calls Intercepts at httpx transport layer so the full proxy path (auth, routing, OpenAI SDK, response transformation) is exercised with zero-latency responses. Activated via `litellm_settings: { network_mock: true }` in proxy config. --- litellm/__init__.py | 1 + litellm/llms/custom_httpx/mock_transport.py | 163 ++++++++++++++++++ litellm/llms/openai/common_utils.py | 10 ++ scripts/benchmark_mock.py | 142 +++++++++++++++ .../llms/custom_httpx/test_mock_transport.py | 159 +++++++++++++++++ 5 files changed, 475 insertions(+) create mode 100644 litellm/llms/custom_httpx/mock_transport.py create mode 100644 scripts/benchmark_mock.py create mode 100644 tests/test_litellm/llms/custom_httpx/test_mock_transport.py diff --git a/litellm/__init__.py b/litellm/__init__.py index 97f36a9b00f..8537ccfd6e3 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -405,6 +405,7 @@ disable_aiohttp_trust_env: bool = ( force_ipv4: bool = ( False # when True, litellm will force ipv4 for all LLM requests. Some users have seen httpx ConnectionError when using ipv6. ) +network_mock: bool = False # When True, use mock transport — no real network calls ####### STOP SEQUENCE LIMIT ####### disable_stop_sequence_limit: bool = False # when True, stop sequence limit is disabled diff --git a/litellm/llms/custom_httpx/mock_transport.py b/litellm/llms/custom_httpx/mock_transport.py new file mode 100644 index 00000000000..6a8ece73d81 --- /dev/null +++ b/litellm/llms/custom_httpx/mock_transport.py @@ -0,0 +1,163 @@ +""" +Mock httpx transport that returns valid OpenAI ChatCompletion responses. + +Activated via `litellm_settings: { network_mock: true }`. +Intercepts at the httpx transport layer — the lowest point before bytes hit the wire — +so the full proxy -> router -> OpenAI SDK -> httpx path is exercised. +""" + +import json +import time +from typing import Iterator, List + +import httpx + + +# --------------------------------------------------------------------------- +# Pre-built response templates +# --------------------------------------------------------------------------- + +def _chat_completion_json(model: str) -> dict: + """Return a minimal valid ChatCompletion object.""" + return { + "id": "chatcmpl-mock", + "object": "chat.completion", + "created": int(time.time()), + "model": model, + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Mock response", + }, + "finish_reason": "stop", + } + ], + "usage": { + "prompt_tokens": 1, + "completion_tokens": 1, + "total_tokens": 2, + }, + } + + +def _streaming_sse_payloads(model: str) -> List[bytes]: + """Pre-build the SSE byte payloads for a streaming response.""" + chunk = { + "id": "chatcmpl-mock", + "object": "chat.completion.chunk", + "created": int(time.time()), + "model": model, + "choices": [ + { + "index": 0, + "delta": {"role": "assistant", "content": "Mock response"}, + "finish_reason": None, + } + ], + } + done_chunk = { + "id": "chatcmpl-mock", + "object": "chat.completion.chunk", + "created": int(time.time()), + "model": model, + "choices": [ + { + "index": 0, + "delta": {}, + "finish_reason": "stop", + } + ], + } + return [ + b"data: " + json.dumps(chunk).encode() + b"\n\n", + b"data: " + json.dumps(done_chunk).encode() + b"\n\n", + b"data: [DONE]\n\n", + ] + + +# --------------------------------------------------------------------------- +# Byte-stream wrappers +# --------------------------------------------------------------------------- + +class MockSSEAsyncStream(httpx.AsyncByteStream): + """Async byte stream that yields pre-built SSE payloads.""" + + def __init__(self, payloads: List[bytes]) -> None: + self._payloads = payloads + + async def __aiter__(self): # type: ignore[override] + for payload in self._payloads: + yield payload + + +class MockSSESyncStream(httpx.SyncByteStream): + """Sync byte stream that yields pre-built SSE payloads.""" + + def __init__(self, payloads: List[bytes]) -> None: + self._payloads = payloads + + def __iter__(self) -> Iterator[bytes]: + return iter(self._payloads) + + +# --------------------------------------------------------------------------- +# Transport +# --------------------------------------------------------------------------- + +_STREAM_HEADERS = { + "content-type": "text/event-stream", +} + +_JSON_HEADERS = { + "content-type": "application/json", +} + + +class MockOpenAITransport(httpx.AsyncBaseTransport, httpx.BaseTransport): + """ + httpx transport that returns canned OpenAI ChatCompletion responses. + + Supports both async (AsyncOpenAI) and sync (OpenAI) SDK paths. + """ + + @staticmethod + def _parse_request(request: httpx.Request) -> tuple: + """Extract (model, stream) from the request body.""" + body = json.loads(request.content) + model = body.get("model", "mock-model") + stream = body.get("stream", False) + return model, stream + + async def handle_async_request(self, request: httpx.Request) -> httpx.Response: + model, stream = self._parse_request(request) + if stream: + payloads = _streaming_sse_payloads(model) + return httpx.Response( + status_code=200, + headers=_STREAM_HEADERS, + stream=MockSSEAsyncStream(payloads), + ) + body = json.dumps(_chat_completion_json(model)).encode() + return httpx.Response( + status_code=200, + headers=_JSON_HEADERS, + content=body, + ) + + def handle_request(self, request: httpx.Request) -> httpx.Response: + model, stream = self._parse_request(request) + if stream: + payloads = _streaming_sse_payloads(model) + return httpx.Response( + status_code=200, + headers=_STREAM_HEADERS, + stream=MockSSESyncStream(payloads), + ) + body = json.dumps(_chat_completion_json(model)).encode() + return httpx.Response( + status_code=200, + headers=_JSON_HEADERS, + content=body, + ) diff --git a/litellm/llms/openai/common_utils.py b/litellm/llms/openai/common_utils.py index 28de9f1303e..61f150f1c2e 100644 --- a/litellm/llms/openai/common_utils.py +++ b/litellm/llms/openai/common_utils.py @@ -205,6 +205,11 @@ class BaseOpenAILLM: if litellm.aclient_session is not None: return litellm.aclient_session + if getattr(litellm, "network_mock", False): + from litellm.llms.custom_httpx.mock_transport import MockOpenAITransport + + return httpx.AsyncClient(transport=MockOpenAITransport()) + # Get unified SSL configuration ssl_config = get_ssl_configuration() @@ -225,6 +230,11 @@ class BaseOpenAILLM: if litellm.client_session is not None: return litellm.client_session + if getattr(litellm, "network_mock", False): + from litellm.llms.custom_httpx.mock_transport import MockOpenAITransport + + return httpx.Client(transport=MockOpenAITransport()) + # Get unified SSL configuration ssl_config = get_ssl_configuration() diff --git a/scripts/benchmark_mock.py b/scripts/benchmark_mock.py new file mode 100644 index 00000000000..3d681c96607 --- /dev/null +++ b/scripts/benchmark_mock.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +"""Quick benchmark for network_mock proxy overhead measurement.""" + +import argparse +import asyncio +import time +import statistics + +import aiohttp + + +REQUEST_BODY = { + "model": "db-openai-endpoint", + "messages": [{"role": "user", "content": "hi"}], + "max_tokens": 100, + "user": "new_user", +} + + +async def send_request(session, url, semaphore): + async with semaphore: + start = time.perf_counter() + try: + async with session.post(url, json=REQUEST_BODY) as resp: + await resp.read() + elapsed = time.perf_counter() - start + return elapsed if resp.status == 200 else None + except Exception: + return None + + +async def run_benchmark(url, n_requests, max_concurrent): + semaphore = asyncio.Semaphore(max_concurrent) + connector_limit = min(max_concurrent * 2, 200) + connector = aiohttp.TCPConnector( + limit=connector_limit, + limit_per_host=max_concurrent, + force_close=False, + enable_cleanup_closed=True, + ) + async with aiohttp.ClientSession(connector=connector) as session: + # warmup + await asyncio.gather(*[send_request(session, url, semaphore) for _ in range(min(50, n_requests))]) + + # timed run + wall_start = time.perf_counter() + results = await asyncio.gather(*[send_request(session, url, semaphore) for _ in range(n_requests)]) + wall_elapsed = time.perf_counter() - wall_start + + latencies = [r for r in results if r is not None] + failures = sum(1 for r in results if r is None) + + latencies.sort() + n = len(latencies) + mean = statistics.mean(latencies) * 1000 + p50 = latencies[n // 2] * 1000 + p95 = latencies[int(n * 0.95)] * 1000 + p99 = latencies[int(n * 0.99)] * 1000 + throughput = n_requests / wall_elapsed + + return { + "mean": mean, "p50": p50, "p95": p95, "p99": p99, + "throughput": throughput, "failures": failures, + "wall_time": wall_elapsed, "n_requests": n_requests, + "max_concurrent": max_concurrent, "latencies": latencies, + } + + +def print_run_results(run_num, total_runs, result): + label = f" Run {run_num}/{total_runs}" if total_runs > 1 else " Results" + print(f"\n{'='*60}") + print(label) + print(f"{'='*60}") + print(f" Requests: {result['n_requests']} (failures: {result['failures']})") + print(f" Concurrency: {result['max_concurrent']}") + print(f" Wall time: {result['wall_time']:.2f}s") + print(f" Throughput: {result['throughput']:.0f} req/s") + print(f" Mean: {result['mean']:.2f} ms") + print(f" P50: {result['p50']:.2f} ms") + print(f" P95: {result['p95']:.2f} ms") + print(f" P99: {result['p99']:.2f} ms") + + +def print_aggregate(results): + all_latencies = [] + for r in results: + all_latencies.extend(r["latencies"]) + all_latencies.sort() + + total_failures = sum(r["failures"] for r in results) + total_requests = sum(r["n_requests"] for r in results) + n = len(all_latencies) + mean = statistics.mean(all_latencies) * 1000 + p50 = all_latencies[n // 2] * 1000 + p95 = all_latencies[int(n * 0.95)] * 1000 + p99 = all_latencies[int(n * 0.99)] * 1000 + avg_throughput = statistics.mean(r["throughput"] for r in results) + + print(f"\n{'='*60}") + print(f" Aggregate ({len(results)} runs, {total_requests} total requests)") + print(f"{'='*60}") + print(f" Failures: {total_failures}") + print(f" Throughput: {avg_throughput:.0f} req/s (avg across runs)") + print(f" Mean: {mean:.2f} ms") + print(f" P50: {p50:.2f} ms") + print(f" P95: {p95:.2f} ms") + print(f" P99: {p99:.2f} ms") + + # Run-to-run variance + run_means = [r["mean"] for r in results] + run_throughputs = [r["throughput"] for r in results] + if len(run_means) > 1: + cov_latency = statistics.stdev(run_means) / statistics.mean(run_means) * 100 + cov_throughput = statistics.stdev(run_throughputs) / statistics.mean(run_throughputs) * 100 + print(f"\n Run-to-run variance:") + print(f" Latency CoV: {cov_latency:.1f}%") + print(f" Throughput CoV: {cov_throughput:.1f}%") + + +async def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--url", default="http://localhost:4000/chat/completions") + parser.add_argument("--requests", type=int, default=2000) + parser.add_argument("--max-concurrent", type=int, default=200) + parser.add_argument("--runs", type=int, default=1) + args = parser.parse_args() + + print(f"Benchmarking {args.url}") + print(f" {args.requests} requests, {args.max_concurrent} concurrency, {args.runs} run(s)") + + results = [] + for run_num in range(1, args.runs + 1): + result = await run_benchmark(args.url, args.requests, args.max_concurrent) + results.append(result) + print_run_results(run_num, args.runs, result) + + if args.runs > 1: + print_aggregate(results) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/tests/test_litellm/llms/custom_httpx/test_mock_transport.py b/tests/test_litellm/llms/custom_httpx/test_mock_transport.py new file mode 100644 index 00000000000..d18f79ac971 --- /dev/null +++ b/tests/test_litellm/llms/custom_httpx/test_mock_transport.py @@ -0,0 +1,159 @@ +""" +Tests for MockOpenAITransport — verifies that the mock transport produces +responses parseable by the OpenAI SDK for both streaming and non-streaming paths. +""" + +import json + +import httpx +import pytest + +from litellm.llms.custom_httpx.mock_transport import MockOpenAITransport + + +# --------------------------------------------------------------------------- +# Non-streaming +# --------------------------------------------------------------------------- + + +class TestNonStreaming: + def test_sync_returns_valid_chat_completion(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "gpt-4o", "messages": [{"role": "user", "content": "hi"}]}), + ) + response = transport.handle_request(request) + assert response.status_code == 200 + + body = json.loads(response.content) + assert body["object"] == "chat.completion" + assert body["model"] == "gpt-4o" + assert body["choices"][0]["message"]["role"] == "assistant" + assert body["choices"][0]["finish_reason"] == "stop" + assert "usage" in body + + @pytest.mark.asyncio + async def test_async_returns_valid_chat_completion(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "hi"}]}), + ) + response = await transport.handle_async_request(request) + assert response.status_code == 200 + + body = json.loads(response.content) + assert body["object"] == "chat.completion" + assert body["model"] == "gpt-4o-mini" + + def test_model_echoed_from_request(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "my-custom-model", "messages": []}), + ) + response = transport.handle_request(request) + body = json.loads(response.content) + assert body["model"] == "my-custom-model" + + +# --------------------------------------------------------------------------- +# Streaming +# --------------------------------------------------------------------------- + + +class TestStreaming: + def test_sync_streaming_returns_sse_events(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "gpt-4o", "stream": True, "messages": []}), + ) + response = transport.handle_request(request) + assert response.status_code == 200 + assert "text/event-stream" in response.headers["content-type"] + + chunks = list(response.stream) + # Should have: content chunk, finish chunk, [DONE] + assert len(chunks) == 3 + assert chunks[-1] == b"data: [DONE]\n\n" + + # Parse the first chunk + first_line = chunks[0].decode() + assert first_line.startswith("data: ") + data = json.loads(first_line[len("data: "):].strip()) + assert data["object"] == "chat.completion.chunk" + assert data["model"] == "gpt-4o" + assert data["choices"][0]["delta"]["content"] == "Mock response" + + @pytest.mark.asyncio + async def test_async_streaming_returns_sse_events(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "gpt-4o", "stream": True, "messages": []}), + ) + response = await transport.handle_async_request(request) + assert response.status_code == 200 + + chunks = [] + async for chunk in response.stream: + chunks.append(chunk) + + assert len(chunks) == 3 + assert chunks[-1] == b"data: [DONE]\n\n" + + # Parse finish chunk + finish_line = chunks[1].decode() + data = json.loads(finish_line[len("data: "):].strip()) + assert data["choices"][0]["finish_reason"] == "stop" + + def test_streaming_model_echoed(self): + transport = MockOpenAITransport() + request = httpx.Request( + method="POST", + url="https://api.openai.com/v1/chat/completions", + content=json.dumps({"model": "custom-stream", "stream": True, "messages": []}), + ) + response = transport.handle_request(request) + first_chunk = next(iter(response.stream)) + data = json.loads(first_chunk.decode()[len("data: "):].strip()) + assert data["model"] == "custom-stream" + + +# --------------------------------------------------------------------------- +# Integration with httpx client +# --------------------------------------------------------------------------- + + +class TestHttpxClientIntegration: + def test_sync_client_get(self): + """Verify the transport works when wired into an httpx.Client.""" + client = httpx.Client(transport=MockOpenAITransport()) + response = client.post( + "https://api.openai.com/v1/chat/completions", + json={"model": "gpt-4o", "messages": [{"role": "user", "content": "test"}]}, + ) + assert response.status_code == 200 + body = response.json() + assert body["object"] == "chat.completion" + client.close() + + @pytest.mark.asyncio + async def test_async_client_get(self): + """Verify the transport works when wired into an httpx.AsyncClient.""" + client = httpx.AsyncClient(transport=MockOpenAITransport()) + response = await client.post( + "https://api.openai.com/v1/chat/completions", + json={"model": "gpt-4o", "messages": [{"role": "user", "content": "test"}]}, + ) + assert response.status_code == 200 + body = response.json() + assert body["object"] == "chat.completion" + await client.aclose() From 886f1a347274bf8465c7f1c11a65708204442feb Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Sat, 21 Feb 2026 19:14:04 -0800 Subject: [PATCH 31/86] Litellm dev 02 19 2026 p2 (#21871) * feat(ui/): new guardrails monitor 'demo mock representation of what guardrails monitor looks like * fix: ui updates * style(ui/): fix styling * feat: enable running ai monitor on individual guardrails * feat: add backend logic for guardrail monitoring --- .../migration.sql | 2 - .../migration.sql | 60 ++ .../litellm_proxy_extras/schema.prisma | 95 +-- litellm/integrations/custom_guardrail.py | 7 +- .../proxy/guardrails/guardrail_endpoints.py | 72 ++- litellm/proxy/guardrails/usage_endpoints.py | 587 ++++++++++++++++++ litellm/proxy/guardrails/usage_tracking.py | 170 +++++ litellm/proxy/schema.prisma | 49 +- litellm/proxy/utils.py | 183 +++--- schema.prisma | 48 ++ ui/litellm-dashboard/src/app/page.tsx | 3 + .../EvaluationSettingsModal.tsx | 157 +++++ .../GuardrailsMonitor/GuardrailConfig.tsx | 217 +++++++ .../GuardrailsMonitor/GuardrailDetail.tsx | 301 +++++++++ .../GuardrailsMonitorView.test.tsx | 62 ++ .../GuardrailsMonitorView.tsx | 37 ++ .../GuardrailsMonitor/GuardrailsOverview.tsx | 395 ++++++++++++ .../GuardrailsMonitor/LogViewer.tsx | 219 +++++++ .../GuardrailsMonitor/MetricCard.tsx | 30 + .../GuardrailsMonitor/ScoreChart.tsx | 39 ++ .../components/GuardrailsMonitor/mockData.ts | 50 ++ .../src/components/leftnav.tsx | 7 + .../src/components/networking.tsx | 122 ++++ .../src/components/page_metadata.ts | 1 + .../GuardrailViewer/GuardrailViewer.tsx | 6 +- 25 files changed, 2741 insertions(+), 178 deletions(-) delete mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20260214124140_baseline_diff/migration.sql create mode 100644 litellm-proxy-extras/litellm_proxy_extras/migrations/20260219181415_baseline_diff/migration.sql create mode 100644 litellm/proxy/guardrails/usage_endpoints.py create mode 100644 litellm/proxy/guardrails/usage_tracking.py create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/EvaluationSettingsModal.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailConfig.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.test.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/LogViewer.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/MetricCard.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/ScoreChart.tsx create mode 100644 ui/litellm-dashboard/src/components/GuardrailsMonitor/mockData.ts diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260214124140_baseline_diff/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260214124140_baseline_diff/migration.sql deleted file mode 100644 index 2f725d83806..00000000000 --- a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260214124140_baseline_diff/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- This is an empty migration. - diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260219181415_baseline_diff/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260219181415_baseline_diff/migration.sql new file mode 100644 index 00000000000..dd95d9d84a3 --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260219181415_baseline_diff/migration.sql @@ -0,0 +1,60 @@ +-- CreateTable +CREATE TABLE "LiteLLM_DailyGuardrailMetrics" ( + "guardrail_id" TEXT NOT NULL, + "date" TEXT NOT NULL, + "requests_evaluated" BIGINT NOT NULL DEFAULT 0, + "passed_count" BIGINT NOT NULL DEFAULT 0, + "blocked_count" BIGINT NOT NULL DEFAULT 0, + "flagged_count" BIGINT NOT NULL DEFAULT 0, + "avg_score" DOUBLE PRECISION, + "avg_latency_ms" DOUBLE PRECISION, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LiteLLM_DailyGuardrailMetrics_pkey" PRIMARY KEY ("guardrail_id","date") +); + +-- CreateTable +CREATE TABLE "LiteLLM_DailyPolicyMetrics" ( + "policy_id" TEXT NOT NULL, + "date" TEXT NOT NULL, + "requests_evaluated" BIGINT NOT NULL DEFAULT 0, + "passed_count" BIGINT NOT NULL DEFAULT 0, + "blocked_count" BIGINT NOT NULL DEFAULT 0, + "flagged_count" BIGINT NOT NULL DEFAULT 0, + "avg_score" DOUBLE PRECISION, + "avg_latency_ms" DOUBLE PRECISION, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LiteLLM_DailyPolicyMetrics_pkey" PRIMARY KEY ("policy_id","date") +); + +-- CreateTable +CREATE TABLE "LiteLLM_SpendLogGuardrailIndex" ( + "request_id" TEXT NOT NULL, + "guardrail_id" TEXT NOT NULL, + "policy_id" TEXT, + "start_time" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LiteLLM_SpendLogGuardrailIndex_pkey" PRIMARY KEY ("request_id","guardrail_id") +); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyGuardrailMetrics_date_idx" ON "LiteLLM_DailyGuardrailMetrics"("date"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyGuardrailMetrics_guardrail_id_idx" ON "LiteLLM_DailyGuardrailMetrics"("guardrail_id"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyPolicyMetrics_date_idx" ON "LiteLLM_DailyPolicyMetrics"("date"); + +-- CreateIndex +CREATE INDEX "LiteLLM_DailyPolicyMetrics_policy_id_idx" ON "LiteLLM_DailyPolicyMetrics"("policy_id"); + +-- CreateIndex +CREATE INDEX "LiteLLM_SpendLogGuardrailIndex_guardrail_id_start_time_idx" ON "LiteLLM_SpendLogGuardrailIndex"("guardrail_id", "start_time"); + +-- CreateIndex +CREATE INDEX "LiteLLM_SpendLogGuardrailIndex_policy_id_start_time_idx" ON "LiteLLM_SpendLogGuardrailIndex"("policy_id", "start_time"); + diff --git a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma index 777e9c6b971..18a824d9b99 100644 --- a/litellm-proxy-extras/litellm_proxy_extras/schema.prisma +++ b/litellm-proxy-extras/litellm_proxy_extras/schema.prisma @@ -213,53 +213,6 @@ model LiteLLM_DeletedTeamTable { @@index([created_at]) } -// Audit table for deleted teams - preserves spend and team information for historical tracking -model LiteLLM_DeletedTeamTable { - id String @id @default(uuid()) - team_id String // Original team_id - team_alias String? - organization_id String? - object_permission_id String? - admins String[] - members String[] - members_with_roles Json @default("{}") - metadata Json @default("{}") - max_budget Float? - soft_budget Float? - spend Float @default(0.0) - models String[] - max_parallel_requests Int? - tpm_limit BigInt? - rpm_limit BigInt? - budget_duration String? - budget_reset_at DateTime? - blocked Boolean @default(false) - model_spend Json @default("{}") - model_max_budget Json @default("{}") - router_settings Json? @default("{}") - team_member_permissions String[] @default([]) - access_group_ids String[] @default([]) - policies String[] @default([]) - model_id Int? // id for LiteLLM_ModelTable -> stores team-level model aliases - allow_team_guardrail_config Boolean @default(false) - - // Original timestamps from team creation/updates - created_at DateTime? @map("created_at") - updated_at DateTime? @map("updated_at") - - // Deletion metadata - deleted_at DateTime @default(now()) @map("deleted_at") - deleted_by String? @map("deleted_by") // User who deleted the team - deleted_by_api_key String? @map("deleted_by_api_key") // API key hash that performed the deletion - litellm_changed_by String? @map("litellm_changed_by") // From litellm-changed-by header if provided - - @@index([team_id]) - @@index([deleted_at]) - @@index([organization_id]) - @@index([team_alias]) - @@index([created_at]) -} - // Track spend, rate limit, budget Users model LiteLLM_UserTable { user_id String @id @@ -912,6 +865,54 @@ model LiteLLM_GuardrailsTable { updated_at DateTime @updatedAt } +// Daily guardrail metrics for usage dashboard (one row per guardrail per day) +model LiteLLM_DailyGuardrailMetrics { + guardrail_id String // logical id; may not FK if guardrail from config + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([guardrail_id, date]) + @@index([date]) + @@index([guardrail_id]) +} + +// Daily policy metrics for usage dashboard (one row per policy per day) +model LiteLLM_DailyPolicyMetrics { + policy_id String + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([policy_id, date]) + @@index([date]) + @@index([policy_id]) +} + +// Index for fast "last N logs for guardrail/policy" from SpendLogs +model LiteLLM_SpendLogGuardrailIndex { + request_id String + guardrail_id String + policy_id String? // set when run as part of a policy pipeline + start_time DateTime + + @@id([request_id, guardrail_id]) + @@index([guardrail_id, start_time]) + @@index([policy_id, start_time]) +} + // Prompt table for storing prompt configurations model LiteLLM_PromptTable { id String @id @default(uuid()) diff --git a/litellm/integrations/custom_guardrail.py b/litellm/integrations/custom_guardrail.py index 4a1e3e41e96..bf330944ef8 100644 --- a/litellm/integrations/custom_guardrail.py +++ b/litellm/integrations/custom_guardrail.py @@ -587,9 +587,10 @@ class CustomGuardrail(CustomLogger): elif "litellm_metadata" in request_data: _append_guardrail_info(request_data["litellm_metadata"]) else: - verbose_logger.warning( - "unable to log guardrail information. No metadata found in request_data" - ) + # Ensure guardrail info is always logged (e.g. proxy may not have set + # metadata yet). Attach to "metadata" so spend log / standard logging see it. + request_data["metadata"] = {} + _append_guardrail_info(request_data["metadata"]) async def apply_guardrail( self, diff --git a/litellm/proxy/guardrails/guardrail_endpoints.py b/litellm/proxy/guardrails/guardrail_endpoints.py index e14782fa1f8..c083c60cb4c 100644 --- a/litellm/proxy/guardrails/guardrail_endpoints.py +++ b/litellm/proxy/guardrails/guardrail_endpoints.py @@ -14,21 +14,27 @@ from litellm.integrations.custom_guardrail import CustomGuardrail from litellm.proxy._types import UserAPIKeyAuth from litellm.proxy.auth.user_api_key_auth import user_api_key_auth from litellm.proxy.guardrails.guardrail_registry import GuardrailRegistry -from litellm.types.guardrails import (PII_ENTITY_CATEGORIES_MAP, - ApplyGuardrailRequest, - ApplyGuardrailResponse, - BaseLitellmParams, - BedrockGuardrailConfigModel, Guardrail, - GuardrailEventHooks, - GuardrailInfoResponse, - GuardrailUIAddGuardrailSettings, - LakeraV2GuardrailConfigModel, - ListGuardrailsResponse, LitellmParams, - PatchGuardrailRequest, PiiAction, - PiiEntityType, - PresidioPresidioConfigModelUserInterface, - SupportedGuardrailIntegrations, - ToolPermissionGuardrailConfigModel) +from litellm.proxy.guardrails.usage_endpoints import router as guardrails_usage_router +from litellm.types.guardrails import ( + PII_ENTITY_CATEGORIES_MAP, + ApplyGuardrailRequest, + ApplyGuardrailResponse, + BaseLitellmParams, + BedrockGuardrailConfigModel, + Guardrail, + GuardrailEventHooks, + GuardrailInfoResponse, + GuardrailUIAddGuardrailSettings, + LakeraV2GuardrailConfigModel, + ListGuardrailsResponse, + LitellmParams, + PatchGuardrailRequest, + PiiAction, + PiiEntityType, + PresidioPresidioConfigModelUserInterface, + SupportedGuardrailIntegrations, + ToolPermissionGuardrailConfigModel, +) #### GUARDRAILS ENDPOINTS #### @@ -147,8 +153,7 @@ async def list_guardrails_v2(): ``` """ from litellm.litellm_core_utils.litellm_logging import _get_masked_values - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -288,8 +293,7 @@ async def create_guardrail(request: CreateGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -378,8 +382,7 @@ async def update_guardrail(guardrail_id: str, request: UpdateGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -447,8 +450,7 @@ async def delete_guardrail(guardrail_id: str): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -541,8 +543,7 @@ async def patch_guardrail(guardrail_id: str, request: PatchGuardrailRequest): } ``` """ - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client if prisma_client is None: @@ -664,8 +665,7 @@ async def get_guardrail_info(guardrail_id: str): """ from litellm.litellm_core_utils.litellm_logging import _get_masked_values - from litellm.proxy.guardrails.guardrail_registry import \ - IN_MEMORY_GUARDRAIL_HANDLER + from litellm.proxy.guardrails.guardrail_registry import IN_MEMORY_GUARDRAIL_HANDLER from litellm.proxy.proxy_server import prisma_client from litellm.types.guardrails import GUARDRAIL_DEFINITION_LOCATION @@ -740,8 +740,10 @@ async def get_guardrail_ui_settings(): - Content filter settings (patterns and categories) """ from litellm.proxy.guardrails.guardrail_hooks.litellm_content_filter.patterns import ( - PATTERN_CATEGORIES, get_available_content_categories, - get_pattern_metadata) + PATTERN_CATEGORIES, + get_available_content_categories, + get_pattern_metadata, + ) # Convert the PII_ENTITY_CATEGORIES_MAP to the format expected by the UI category_maps = [] @@ -1313,8 +1315,7 @@ async def get_provider_specific_params(): } ### get the config model for the guardrail - go through the registry and get the config model for the guardrail - from litellm.proxy.guardrails.guardrail_registry import \ - guardrail_class_registry + from litellm.proxy.guardrails.guardrail_registry import guardrail_class_registry for guardrail_name, guardrail_class in guardrail_class_registry.items(): guardrail_config_model = guardrail_class.get_config_model() @@ -1442,8 +1443,9 @@ async def test_custom_code_guardrail(request: TestCustomCodeGuardrailRequest): import concurrent.futures import re - from litellm.proxy.guardrails.guardrail_hooks.custom_code.primitives import \ - get_custom_code_primitives + from litellm.proxy.guardrails.guardrail_hooks.custom_code.primitives import ( + get_custom_code_primitives, + ) # Security validation patterns FORBIDDEN_PATTERNS = [ @@ -1633,3 +1635,7 @@ async def apply_guardrail( ) except Exception as e: raise handle_exception_on_proxy(e) + + +# Usage (dashboard) endpoints: overview, detail, logs +router.include_router(guardrails_usage_router) diff --git a/litellm/proxy/guardrails/usage_endpoints.py b/litellm/proxy/guardrails/usage_endpoints.py new file mode 100644 index 00000000000..16a6f1a2cc5 --- /dev/null +++ b/litellm/proxy/guardrails/usage_endpoints.py @@ -0,0 +1,587 @@ +""" +Guardrails and policies usage endpoints for the dashboard. +GET /guardrails/usage/overview, /guardrails/usage/detail/:id, /guardrails/usage/logs +""" + +import json +from datetime import datetime, timedelta, timezone +from typing import Any, Dict, List, Optional + +from fastapi import APIRouter, Depends, Query +from pydantic import BaseModel + +from litellm.proxy._types import UserAPIKeyAuth +from litellm.proxy.auth.user_api_key_auth import user_api_key_auth + +router = APIRouter() + + +# --- Response models --- + + +class UsageOverviewRow(BaseModel): + id: str + name: str + type: str + provider: str + requestsEvaluated: int + failRate: float + avgScore: Optional[float] + avgLatency: Optional[float] + status: str # healthy | warning | critical + trend: str # up | down | stable + + +class UsageOverviewResponse(BaseModel): + rows: List[UsageOverviewRow] + chart: List[Dict[str, Any]] # [{ date, passed, blocked }] + totalRequests: int + totalBlocked: int + passRate: float + + +class UsageDetailResponse(BaseModel): + guardrail_id: str + guardrail_name: str + type: str + provider: str + requestsEvaluated: int + failRate: float + avgScore: Optional[float] + avgLatency: Optional[float] + status: str + trend: str + description: Optional[str] + time_series: List[Dict[str, Any]] + + +class UsageLogEntry(BaseModel): + id: str + timestamp: str + action: str # blocked | passed | flagged + score: Optional[float] + latency_ms: Optional[float] + model: Optional[str] + input_snippet: Optional[str] + output_snippet: Optional[str] + reason: Optional[str] + + +class UsageLogsResponse(BaseModel): + logs: List[UsageLogEntry] + total: int + page: int + page_size: int + + +def _status_from_fail_rate(fail_rate: float) -> str: + if fail_rate > 15: + return "critical" + if fail_rate > 5: + return "warning" + return "healthy" + + +def _trend_from_comparison(current_fail: float, previous_fail: float) -> str: + if previous_fail <= 0: + return "stable" + diff = current_fail - previous_fail + if diff > 0.5: + return "up" + if diff < -0.5: + return "down" + return "stable" + + +def _aggregate_daily_metrics(metrics: Any, id_attr: str) -> Dict[str, Dict[str, Any]]: + agg: Dict[str, Dict[str, Any]] = {} + for m in metrics: + gid = getattr(m, id_attr) + if gid not in agg: + agg[gid] = {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0} + agg[gid]["requests"] += int(m.requests_evaluated or 0) + agg[gid]["passed"] += int(m.passed_count or 0) + agg[gid]["blocked"] += int(m.blocked_count or 0) + agg[gid]["flagged"] += int(m.flagged_count or 0) + return agg + + +def _prev_fail_rates( + metrics_prev: Any, id_attr: str +) -> Dict[str, float]: + prev_agg_raw: Dict[str, Dict[str, int]] = {} + for m in metrics_prev: + gid = getattr(m, id_attr) + r, b = int(m.requests_evaluated or 0), int(m.blocked_count or 0) + if gid not in prev_agg_raw: + prev_agg_raw[gid] = {"req": 0, "blocked": 0} + prev_agg_raw[gid]["req"] += r + prev_agg_raw[gid]["blocked"] += b + return { + gid: (100.0 * v["blocked"] / v["req"]) if v["req"] else 0.0 + for gid, v in prev_agg_raw.items() + } + + +def _chart_from_metrics(metrics: Any) -> List[Dict[str, Any]]: + chart_by_date: Dict[str, Dict[str, int]] = {} + for m in metrics: + d = m.date + if d not in chart_by_date: + chart_by_date[d] = {"passed": 0, "blocked": 0} + chart_by_date[d]["passed"] += int(m.passed_count or 0) + chart_by_date[d]["blocked"] += int(m.blocked_count or 0) + return [ + {"date": d, "passed": v["passed"], "blocked": v["blocked"]} + for d, v in sorted(chart_by_date.items()) + ] + + +def _guardrail_overview_rows( + guardrails: Any, + agg: Dict[str, Dict[str, Any]], + prev_agg: Dict[str, float], +) -> List[UsageOverviewRow]: + rows: List[UsageOverviewRow] = [] + for g in guardrails: + gid = g.guardrail_id + a = agg.get(gid, {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0}) + req, blocked = a["requests"], a["blocked"] + fail_rate = (100.0 * blocked / req) if req else 0.0 + litellm_params = ( + (g.litellm_params or {}) if isinstance(g.litellm_params, dict) else {} + ) + provider = str(litellm_params.get("guardrail", "Unknown")) + guardrail_info = ( + (g.guardrail_info or {}) if isinstance(g.guardrail_info, dict) else {} + ) + gtype = str(guardrail_info.get("type", "Guardrail")) + prev_fail = ( + prev_agg.get(gid, 0.0) + if isinstance(prev_agg.get(gid), (int, float)) + else 0.0 + ) + trend = _trend_from_comparison(fail_rate, prev_fail) + rows.append( + UsageOverviewRow( + id=gid, + name=g.guardrail_name or gid, + type=gtype, + provider=provider, + requestsEvaluated=req, + failRate=round(fail_rate, 1), + avgScore=None, + avgLatency=None, + status=_status_from_fail_rate(fail_rate), + trend=trend, + ) + ) + return rows + + +def _policy_overview_rows( + policies: Any, + agg: Dict[str, Dict[str, Any]], + prev_agg: Dict[str, float], +) -> List[UsageOverviewRow]: + rows: List[UsageOverviewRow] = [] + for p in policies: + pid = p.policy_id + a = agg.get(pid, {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0}) + req, blocked = a["requests"], a["blocked"] + fail_rate = (100.0 * blocked / req) if req else 0.0 + trend = _trend_from_comparison(fail_rate, prev_agg.get(pid, 0.0)) + rows.append( + UsageOverviewRow( + id=pid, + name=p.policy_name or pid, + type="Policy", + provider="LiteLLM", + requestsEvaluated=req, + failRate=round(fail_rate, 1), + avgScore=None, + avgLatency=None, + status=_status_from_fail_rate(fail_rate), + trend=trend, + ) + ) + return rows + + +@router.get( + "/guardrails/usage/overview", + tags=["Guardrails"], + dependencies=[Depends(user_api_key_auth)], + response_model=UsageOverviewResponse, +) +async def guardrails_usage_overview( + start_date: Optional[str] = Query(None, description="YYYY-MM-DD"), + end_date: Optional[str] = Query(None, description="YYYY-MM-DD"), + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """Return guardrail performance overview for the dashboard.""" + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + return UsageOverviewResponse( + rows=[], chart=[], totalRequests=0, totalBlocked=0, passRate=100.0 + ) + + now = datetime.now(timezone.utc) + end = end_date or now.strftime("%Y-%m-%d") + start = start_date or (now - timedelta(days=7)).strftime("%Y-%m-%d") + + try: + # Guardrails from DB + guardrails = await prisma_client.db.litellm_guardrailstable.find_many() + + # Daily metrics in range + metrics = await prisma_client.db.litellm_dailyguardrailmetrics.find_many( + where={"date": {"gte": start, "lte": end}} + ) + + # Previous period for trend + start_prev = ( + datetime.strptime(start, "%Y-%m-%d") - timedelta(days=7) + ).strftime("%Y-%m-%d") + metrics_prev = await prisma_client.db.litellm_dailyguardrailmetrics.find_many( + where={"date": {"gte": start_prev, "lt": start}} + ) + + agg = _aggregate_daily_metrics(metrics, "guardrail_id") + prev_agg = _prev_fail_rates(metrics_prev, "guardrail_id") + chart = _chart_from_metrics(metrics) + total_requests = sum(a["requests"] for a in agg.values()) + total_blocked = sum(a["blocked"] for a in agg.values()) + pass_rate = ( + (100.0 * (total_requests - total_blocked) / total_requests) + if total_requests + else 100.0 + ) + rows = _guardrail_overview_rows(guardrails, agg, prev_agg) + return UsageOverviewResponse( + rows=rows, + chart=chart, + totalRequests=total_requests, + totalBlocked=total_blocked, + passRate=round(pass_rate, 1), + ) + except Exception as e: + from litellm.proxy.utils import handle_exception_on_proxy + + raise handle_exception_on_proxy(e) + + +@router.get( + "/guardrails/usage/detail/{guardrail_id}", + tags=["Guardrails"], + dependencies=[Depends(user_api_key_auth)], + response_model=UsageDetailResponse, +) +async def guardrails_usage_detail( + guardrail_id: str, + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """Return single guardrail usage metrics and time series.""" + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + from fastapi import HTTPException + + raise HTTPException(status_code=500, detail="Prisma client not initialized") + + now = datetime.now(timezone.utc) + end = end_date or now.strftime("%Y-%m-%d") + start = start_date or (now - timedelta(days=7)).strftime("%Y-%m-%d") + + guardrail = await prisma_client.db.litellm_guardrailstable.find_unique( + where={"guardrail_id": guardrail_id} + ) + if not guardrail: + from fastapi import HTTPException + + raise HTTPException(status_code=404, detail="Guardrail not found") + + metrics = await prisma_client.db.litellm_dailyguardrailmetrics.find_many( + where={"guardrail_id": guardrail_id, "date": {"gte": start, "lte": end}} + ) + metrics_prev = await prisma_client.db.litellm_dailyguardrailmetrics.find_many( + where={"guardrail_id": guardrail_id, "date": {"lt": start}} + ) + + requests = sum(int(m.requests_evaluated or 0) for m in metrics) + blocked = sum(int(m.blocked_count or 0) for m in metrics) + fail_rate = (100.0 * blocked / requests) if requests else 0.0 + + prev_blocked = sum(int(m.blocked_count or 0) for m in metrics_prev) + prev_req = sum(int(m.requests_evaluated or 0) for m in metrics_prev) + prev_fail = (100.0 * prev_blocked / prev_req) if prev_req else 0.0 + trend = _trend_from_comparison(fail_rate, prev_fail) + + time_series = [ + { + "date": m.date, + "passed": int(m.passed_count or 0), + "blocked": int(m.blocked_count or 0), + "score": None, + } + for m in sorted(metrics, key=lambda x: x.date) + ] + litellm_params = ( + (guardrail.litellm_params or {}) + if isinstance(guardrail.litellm_params, dict) + else {} + ) + guardrail_info = ( + (guardrail.guardrail_info or {}) + if isinstance(guardrail.guardrail_info, dict) + else {} + ) + + return UsageDetailResponse( + guardrail_id=guardrail_id, + guardrail_name=guardrail.guardrail_name or guardrail_id, + type=str(guardrail_info.get("type", "Guardrail")), + provider=str(litellm_params.get("guardrail", "Unknown")), + requestsEvaluated=requests, + failRate=round(fail_rate, 1), + avgScore=None, + avgLatency=None, + status=_status_from_fail_rate(fail_rate), + trend=trend, + description=guardrail_info.get("description"), + time_series=time_series, + ) + + +def _build_usage_logs_where( + guardrail_id: Optional[str], + policy_id: Optional[str], + start_date: Optional[str], + end_date: Optional[str], +) -> Dict[str, Any]: + where: Dict[str, Any] = {} + if guardrail_id: + where["guardrail_id"] = guardrail_id + if policy_id: + where["policy_id"] = policy_id + if start_date or end_date: + st_filter: Dict[str, Any] = {} + if start_date: + sd = start_date.replace("Z", "+00:00").strip() + if "T" not in sd: + sd += "T00:00:00+00:00" + st_filter["gte"] = datetime.fromisoformat(sd) + if end_date: + ed = end_date.replace("Z", "+00:00").strip() + if "T" not in ed: + ed += "T23:59:59+00:00" + st_filter["lte"] = datetime.fromisoformat(ed) + where["start_time"] = st_filter + return where + + +def _usage_log_entry_from_row( + r: Any, sl: Any, action_filter: Optional[str] +) -> Optional[UsageLogEntry]: + meta = sl.metadata + if isinstance(meta, str): + try: + meta = json.loads(meta) + except Exception: + meta = {} + guardrail_info_list = (meta or {}).get("guardrail_information") or [] + entry_for_guardrail = None + for gi in guardrail_info_list: + if (gi.get("guardrail_id") or gi.get("guardrail_name")) == r.guardrail_id: + entry_for_guardrail = gi + break + action_val = "passed" + score_val = None + latency_val = None + reason_val = None + if entry_for_guardrail: + st = (entry_for_guardrail.get("guardrail_status") or "").lower() + if "intervened" in st or "block" in st: + action_val = "blocked" + elif "fail" in st or "error" in st: + action_val = "flagged" + duration = entry_for_guardrail.get("duration") + if duration is not None: + latency_val = round(float(duration) * 1000, 0) + score_val = entry_for_guardrail.get("confidence_score") or entry_for_guardrail.get( + "risk_score" + ) + if score_val is not None: + score_val = round(float(score_val), 2) + resp = entry_for_guardrail.get("guardrail_response") + if isinstance(resp, str): + reason_val = resp[:500] + elif isinstance(resp, dict): + reason_val = str(resp)[:500] + if action_filter and action_val != action_filter: + return None + ts = ( + sl.startTime.isoformat() + if hasattr(sl.startTime, "isoformat") + else str(sl.startTime) + ) + return UsageLogEntry( + id=r.request_id, + timestamp=ts, + action=action_val, + score=score_val, + latency_ms=latency_val, + model=sl.model, + input_snippet=_snippet(sl.messages), + output_snippet=_snippet(sl.response), + reason=reason_val, + ) + + +def _snippet(text: Any, max_len: int = 200) -> Optional[str]: + if text is None: + return None + if isinstance(text, str): + s = text + elif isinstance(text, list): + parts = [] + for item in text: + if isinstance(item, dict) and "content" in item: + c = item["content"] + parts.append(c if isinstance(c, str) else str(c)) + else: + parts.append(str(item)) + s = " ".join(parts) + else: + s = str(text) + return (s[:max_len] + "...") if len(s) > max_len else s + + +@router.get( + "/guardrails/usage/logs", + tags=["Guardrails"], + dependencies=[Depends(user_api_key_auth)], + response_model=UsageLogsResponse, +) +async def guardrails_usage_logs( + guardrail_id: Optional[str] = Query(None), + policy_id: Optional[str] = Query(None), + page: int = Query(1, ge=1), + page_size: int = Query(50, ge=1, le=100), + action: Optional[str] = Query(None), + start_date: Optional[str] = Query(None), + end_date: Optional[str] = Query(None), + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """Return paginated run logs for a guardrail (or policy) from SpendLogs via index.""" + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + return UsageLogsResponse(logs=[], total=0, page=page, page_size=page_size) + + if not guardrail_id and not policy_id: + return UsageLogsResponse(logs=[], total=0, page=page, page_size=page_size) + + try: + where = _build_usage_logs_where( + guardrail_id, policy_id, start_date, end_date + ) + index_rows = await prisma_client.db.litellm_spendlogguardrailindex.find_many( + where=where, + order={"start_time": "desc"}, + skip=(page - 1) * page_size, + take=page_size + 1, + ) + total = await prisma_client.db.litellm_spendlogguardrailindex.count(where=where) + request_ids = [r.request_id for r in index_rows[:page_size]] + if not request_ids: + return UsageLogsResponse( + logs=[], total=total, page=page, page_size=page_size + ) + spend_logs = await prisma_client.db.litellm_spendlogs.find_many( + where={"request_id": {"in": request_ids}} + ) + log_by_id = {s.request_id: s for s in spend_logs} + logs_out: List[UsageLogEntry] = [] + for r in index_rows[:page_size]: + sl = log_by_id.get(r.request_id) + if not sl: + continue + entry = _usage_log_entry_from_row(r, sl, action) + if entry is not None: + logs_out.append(entry) + return UsageLogsResponse( + logs=logs_out, total=total, page=page, page_size=page_size + ) + except Exception as e: + from litellm.proxy.utils import handle_exception_on_proxy + + raise handle_exception_on_proxy(e) + + +# --- Policy usage (same shape as guardrails; policy metrics populated when policy_run is in metadata) --- + + +@router.get( + "/policies/usage/overview", + tags=["Policies"], + dependencies=[Depends(user_api_key_auth)], + response_model=UsageOverviewResponse, +) +async def policies_usage_overview( + start_date: Optional[str] = Query(None, description="YYYY-MM-DD"), + end_date: Optional[str] = Query(None, description="YYYY-MM-DD"), + user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), +): + """Return policy performance overview for the dashboard.""" + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + return UsageOverviewResponse( + rows=[], chart=[], totalRequests=0, totalBlocked=0, passRate=100.0 + ) + + now = datetime.now(timezone.utc) + end = end_date or now.strftime("%Y-%m-%d") + start = start_date or (now - timedelta(days=7)).strftime("%Y-%m-%d") + + try: + policies = await prisma_client.db.litellm_policytable.find_many() + metrics = await prisma_client.db.litellm_dailypolicymetrics.find_many( + where={"date": {"gte": start, "lte": end}} + ) + metrics_prev = await prisma_client.db.litellm_dailypolicymetrics.find_many( + where={ + "date": { + "gte": ( + datetime.strptime(start, "%Y-%m-%d") - timedelta(days=7) + ).strftime("%Y-%m-%d"), + "lt": start, + } + } + ) + agg = _aggregate_daily_metrics(metrics, "policy_id") + prev_agg = _prev_fail_rates(metrics_prev, "policy_id") + chart = _chart_from_metrics(metrics) + total_requests = sum(a["requests"] for a in agg.values()) + total_blocked = sum(a["blocked"] for a in agg.values()) + pass_rate = ( + (100.0 * (total_requests - total_blocked) / total_requests) + if total_requests + else 100.0 + ) + rows = _policy_overview_rows(policies, agg, prev_agg) + return UsageOverviewResponse( + rows=rows, + chart=chart, + totalRequests=total_requests, + totalBlocked=total_blocked, + passRate=round(pass_rate, 1), + ) + except Exception as e: + from litellm.proxy.utils import handle_exception_on_proxy + + raise handle_exception_on_proxy(e) diff --git a/litellm/proxy/guardrails/usage_tracking.py b/litellm/proxy/guardrails/usage_tracking.py new file mode 100644 index 00000000000..248f3a19875 --- /dev/null +++ b/litellm/proxy/guardrails/usage_tracking.py @@ -0,0 +1,170 @@ +""" +Track guardrail and policy usage for the dashboard: upsert daily metrics and +insert into SpendLogGuardrailIndex when spend logs are written. +""" + +import json +from collections import defaultdict +from datetime import datetime, timezone +from typing import Any, Dict, List, Optional + +from litellm._logging import verbose_proxy_logger +from litellm.proxy.utils import PrismaClient + + +def _guardrail_status_to_action(status: Optional[str]) -> str: + """Map StandardLogging guardrail_status to blocked/passed/flagged.""" + if not status: + return "passed" + s = (status or "").lower() + if "intervened" in s or "block" in s: + return "blocked" + if "fail" in s or "error" in s: + return "flagged" + return "passed" + + +def _parse_guardrail_info_from_payload(payload: Dict[str, Any]) -> List[Dict[str, Any]]: + """Extract guardrail_information from spend log payload metadata.""" + meta = payload.get("metadata") + if not meta: + return [] + if isinstance(meta, str): + try: + meta = json.loads(meta) + except (json.JSONDecodeError, TypeError): + return [] + if not isinstance(meta, dict): + return [] + info = meta.get("guardrail_information") or meta.get( + "standard_logging_guardrail_information" + ) + if not isinstance(info, list): + return [] + return info + + +def _date_str(dt: datetime) -> str: + """YYYY-MM-DD in UTC.""" + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + return dt.astimezone(timezone.utc).strftime("%Y-%m-%d") + + +async def process_spend_logs_guardrail_usage( + prisma_client: PrismaClient, + logs_to_process: List[Dict[str, Any]], +) -> None: + """ + After spend logs are written: update DailyGuardrailMetrics and insert + SpendLogGuardrailIndex rows from guardrail_information in each payload. + """ + if not logs_to_process: + return + # Aggregate daily metrics by (guardrail_id, date). Latency/score metrics dropped. + daily_guardrail: Dict[tuple, Dict[str, Any]] = defaultdict( + lambda: { + "requests_evaluated": 0, + "passed_count": 0, + "blocked_count": 0, + "flagged_count": 0, + } + ) + index_rows: List[Dict[str, Any]] = [] + + for payload in logs_to_process: + request_id = payload.get("request_id") + start_time = payload.get("startTime") + if not request_id or not start_time: + continue + if isinstance(start_time, str): + try: + start_time = datetime.fromisoformat(start_time.replace("Z", "+00:00")) + except (ValueError, TypeError): + continue + date_key = _date_str(start_time) + + for entry in _parse_guardrail_info_from_payload(payload): + guardrail_id = entry.get("guardrail_id") or entry.get("guardrail_name") or "" + if not guardrail_id: + continue + key = (guardrail_id, date_key) + daily_guardrail[key]["requests_evaluated"] += 1 + action = _guardrail_status_to_action(entry.get("guardrail_status")) + if action == "passed": + daily_guardrail[key]["passed_count"] += 1 + elif action == "blocked": + daily_guardrail[key]["blocked_count"] += 1 + else: + daily_guardrail[key]["flagged_count"] += 1 + policy_id = entry.get("policy_id") + index_rows.append({ + "request_id": request_id, + "guardrail_id": guardrail_id, + "policy_id": policy_id, + "start_time": start_time, + }) + + if not daily_guardrail and not index_rows: + return + + try: + # Insert index rows (skip duplicates by request_id + guardrail_id) + if index_rows: + index_data = [] + for r in index_rows: + st = r["start_time"] + if isinstance(st, str): + try: + st = datetime.fromisoformat(st.replace("Z", "+00:00")) + except (ValueError, TypeError): + continue + index_data.append({ + "request_id": r["request_id"], + "guardrail_id": r["guardrail_id"], + "policy_id": r.get("policy_id"), + "start_time": st, + }) + try: + await prisma_client.db.litellm_spendlogguardrailindex.create_many( + data=index_data, + skip_duplicates=True, + ) + except Exception as e: + verbose_proxy_logger.debug( + "Guardrail usage tracking: index create_many skipped: %s", e + ) + + # Upsert daily guardrail metrics (counts only; latency/score dropped) + for (guardrail_id, date_key), agg in daily_guardrail.items(): + n = int(agg["requests_evaluated"]) + if n == 0: + continue + await prisma_client.db.litellm_dailyguardrailmetrics.upsert( + where={ + "guardrail_id_date": { + "guardrail_id": guardrail_id, + "date": date_key, + } + }, + data={ + "create": { + "guardrail_id": guardrail_id, + "date": date_key, + "requests_evaluated": n, + "passed_count": int(agg["passed_count"]), + "blocked_count": int(agg["blocked_count"]), + "flagged_count": int(agg["flagged_count"]), + }, + "update": { + "requests_evaluated": {"increment": n}, + "passed_count": {"increment": int(agg["passed_count"])}, + "blocked_count": {"increment": int(agg["blocked_count"])}, + "flagged_count": {"increment": int(agg["flagged_count"])}, + }, + }, + ) + except Exception as e: + verbose_proxy_logger.warning( + "Guardrail usage tracking failed (non-fatal): %s", e + ) diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 4128ab5f23e..18a824d9b99 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -273,7 +273,6 @@ model LiteLLM_MCPServerTable { alias String? description String? url String? - spec_path String? transport String @default("sse") auth_type String? credentials Json? @default("{}") @@ -866,6 +865,54 @@ model LiteLLM_GuardrailsTable { updated_at DateTime @updatedAt } +// Daily guardrail metrics for usage dashboard (one row per guardrail per day) +model LiteLLM_DailyGuardrailMetrics { + guardrail_id String // logical id; may not FK if guardrail from config + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([guardrail_id, date]) + @@index([date]) + @@index([guardrail_id]) +} + +// Daily policy metrics for usage dashboard (one row per policy per day) +model LiteLLM_DailyPolicyMetrics { + policy_id String + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([policy_id, date]) + @@index([date]) + @@index([policy_id]) +} + +// Index for fast "last N logs for guardrail/policy" from SpendLogs +model LiteLLM_SpendLogGuardrailIndex { + request_id String + guardrail_id String + policy_id String? // set when run as part of a policy pipeline + start_time DateTime + + @@id([request_id, guardrail_id]) + @@index([guardrail_id, start_time]) + @@index([policy_id, start_time]) +} + // Prompt table for storing prompt configurations model LiteLLM_PromptTable { id String @id @default(uuid()) diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index bbc549782d0..1edb7b1b530 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -25,31 +25,23 @@ from typing import ( ) from litellm import _custom_logger_compatible_callbacks_literal -from litellm.constants import DEFAULT_MODEL_CREATED_AT_TIME, MAX_TEAM_LIST_LIMIT -from litellm.proxy._types import ( - DB_CONNECTION_ERROR_TYPES, - CommonProxyErrors, - ProxyErrorTypes, - ProxyException, - SpendLogsMetadata, - SpendLogsPayload, -) +from litellm.constants import (DEFAULT_MODEL_CREATED_AT_TIME, + MAX_TEAM_LIST_LIMIT) +from litellm.proxy._types import (DB_CONNECTION_ERROR_TYPES, CommonProxyErrors, + ProxyErrorTypes, ProxyException, + SpendLogsMetadata, SpendLogsPayload) from litellm.types.guardrails import GuardrailEventHooks from litellm.types.utils import CallTypes, CallTypesLiteral try: - from litellm_enterprise.enterprise_callbacks.send_emails.base_email import ( - BaseEmailLogger, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import ( - ResendEmailLogger, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.sendgrid_email import ( - SendGridEmailLogger, - ) - from litellm_enterprise.enterprise_callbacks.send_emails.smtp_email import ( - SMTPEmailLogger, - ) + from litellm_enterprise.enterprise_callbacks.send_emails.base_email import \ + BaseEmailLogger + from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import \ + ResendEmailLogger + from litellm_enterprise.enterprise_callbacks.send_emails.sendgrid_email import \ + SendGridEmailLogger + from litellm_enterprise.enterprise_callbacks.send_emails.smtp_email import \ + SMTPEmailLogger except ImportError: BaseEmailLogger = None # type: ignore SendGridEmailLogger = None # type: ignore @@ -68,70 +60,56 @@ from fastapi import HTTPException, status import litellm import litellm.litellm_core_utils import litellm.litellm_core_utils.litellm_logging -from litellm import ( - EmbeddingResponse, - ImageResponse, - ModelResponse, - ModelResponseStream, - Router, -) +from litellm import (EmbeddingResponse, ImageResponse, ModelResponse, + ModelResponseStream, Router) from litellm._logging import verbose_proxy_logger from litellm._service_logger import ServiceLogging, ServiceTypes from litellm.caching.caching import DualCache, RedisCache from litellm.caching.dual_cache import LimitedSizeOrderedDict from litellm.exceptions import RejectedRequestError -from litellm.integrations.custom_guardrail import ( - CustomGuardrail, - ModifyResponseException, -) +from litellm.integrations.custom_guardrail import (CustomGuardrail, + ModifyResponseException) from litellm.integrations.custom_logger import CustomLogger from litellm.integrations.SlackAlerting.slack_alerting import SlackAlerting -from litellm.integrations.SlackAlerting.utils import _add_langfuse_trace_id_to_alert +from litellm.integrations.SlackAlerting.utils import \ + _add_langfuse_trace_id_to_alert from litellm.litellm_core_utils.litellm_logging import Logging from litellm.litellm_core_utils.safe_json_dumps import safe_dumps from litellm.litellm_core_utils.safe_json_loads import safe_json_loads from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler -from litellm.proxy._types import ( - AlertType, - CallInfo, - LiteLLM_VerificationTokenView, - Member, - UserAPIKeyAuth, -) +from litellm.proxy._types import (AlertType, CallInfo, + LiteLLM_VerificationTokenView, Member, + UserAPIKeyAuth) from litellm.proxy.auth.route_checks import RouteChecks -from litellm.proxy.db.create_views import ( - create_missing_views, - should_create_missing_views, -) +from litellm.proxy.db.create_views import (create_missing_views, + should_create_missing_views) from litellm.proxy.db.db_spend_update_writer import DBSpendUpdateWriter from litellm.proxy.db.exception_handler import PrismaDBExceptionHandler from litellm.proxy.db.log_db_metrics import log_db_metrics from litellm.proxy.db.prisma_client import PrismaWrapper -from litellm.proxy.guardrails.guardrail_hooks.unified_guardrail.unified_guardrail import ( - UnifiedLLMGuardrails, -) +from litellm.proxy.guardrails.guardrail_hooks.unified_guardrail.unified_guardrail import \ + UnifiedLLMGuardrails from litellm.proxy.hooks import PROXY_HOOKS, get_proxy_hook from litellm.proxy.hooks.cache_control_check import _PROXY_CacheControlCheck from litellm.proxy.hooks.max_budget_limiter import _PROXY_MaxBudgetLimiter -from litellm.proxy.hooks.parallel_request_limiter import ( - _PROXY_MaxParallelRequestsHandler, -) +from litellm.proxy.hooks.parallel_request_limiter import \ + _PROXY_MaxParallelRequestsHandler from litellm.proxy.litellm_pre_call_utils import LiteLLMProxyRequestSetup from litellm.proxy.policy_engine.pipeline_executor import PipelineExecutor from litellm.secret_managers.main import str_to_bool from litellm.types.integrations.slack_alerting import DEFAULT_ALERT_TYPES -from litellm.types.mcp import ( - MCPDuringCallResponseObject, - MCPPreCallRequestObject, - MCPPreCallResponseObject, -) -from litellm.types.proxy.policy_engine.pipeline_types import PipelineExecutionResult +from litellm.types.mcp import (MCPDuringCallResponseObject, + MCPPreCallRequestObject, + MCPPreCallResponseObject) +from litellm.types.proxy.policy_engine.pipeline_types import \ + PipelineExecutionResult from litellm.types.utils import LLMResponseTypes, LoggedLiteLLMParams if TYPE_CHECKING: from opentelemetry.trace import Span as _Span - from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj + from litellm.litellm_core_utils.litellm_logging import \ + Logging as LiteLLMLoggingObj Span = Union[_Span, Any] else: @@ -1070,10 +1048,9 @@ class ProxyLogging: """Process prompt template if applicable.""" from litellm.proxy.prompts.prompt_endpoints import ( - construct_versioned_prompt_id, - get_latest_version_prompt_id, - ) - from litellm.proxy.prompts.prompt_registry import IN_MEMORY_PROMPT_REGISTRY + construct_versioned_prompt_id, get_latest_version_prompt_id) + from litellm.proxy.prompts.prompt_registry import \ + IN_MEMORY_PROMPT_REGISTRY from litellm.utils import get_non_default_completion_params if prompt_version is None: @@ -1123,9 +1100,8 @@ class ProxyLogging: def _process_guardrail_metadata(self, data: dict) -> None: """Process guardrails from metadata and add to applied_guardrails.""" - from litellm.proxy.common_utils.callback_utils import ( - add_guardrail_to_applied_guardrails_header, - ) + from litellm.proxy.common_utils.callback_utils import \ + add_guardrail_to_applied_guardrails_header metadata_standard = data.get("metadata") or {} metadata_litellm = data.get("litellm_metadata") or {} @@ -2022,7 +1998,8 @@ class ProxyLogging: if isinstance(response, (ModelResponse, ModelResponseStream)): response_str = litellm.get_response_string(response_obj=response) elif isinstance(response, dict) and self.is_a2a_streaming_response(response): - from litellm.llms.a2a.common_utils import extract_text_from_a2a_response + from litellm.llms.a2a.common_utils import \ + extract_text_from_a2a_response response_str = extract_text_from_a2a_response(response) if response_str is not None: @@ -2031,7 +2008,8 @@ class ProxyLogging: _callback: Optional[CustomLogger] = None if isinstance(callback, CustomGuardrail): # Main - V2 Guardrails implementation - from litellm.types.guardrails import GuardrailEventHooks + from litellm.types.guardrails import \ + GuardrailEventHooks ## CHECK FOR MODEL-LEVEL GUARDRAILS modified_data = _check_and_merge_model_level_guardrails( @@ -4166,20 +4144,24 @@ class ProxyUpdateSpend: prisma_client: PrismaClient, db_writer_client: Optional[AsyncHTTPHandler], proxy_logging_obj: ProxyLogging, + logs_to_process: Optional[List[Dict[str, Any]]] = None, ): BATCH_SIZE = 1000 # Preferred size of each batch to write to the database MAX_LOGS_PER_INTERVAL = ( 10000 # Maximum number of logs to flush in a single interval ) - # Atomically read and remove logs to process (protected by lock) - async with prisma_client._spend_log_transactions_lock: - logs_to_process = prisma_client.spend_log_transactions[ - :MAX_LOGS_PER_INTERVAL - ] - # Remove the logs we're about to process - prisma_client.spend_log_transactions = prisma_client.spend_log_transactions[ - len(logs_to_process) : - ] + popped_batch = False + if logs_to_process is None: + # Atomically read and remove logs to process (protected by lock) + async with prisma_client._spend_log_transactions_lock: + logs_to_process = prisma_client.spend_log_transactions[ + :MAX_LOGS_PER_INTERVAL + ] + # Remove the logs we're about to process + prisma_client.spend_log_transactions = prisma_client.spend_log_transactions[ + len(logs_to_process) : + ] + popped_batch = True start_time = time.time() try: for i in range(n_retry_times + 1): @@ -4239,8 +4221,9 @@ class ProxyUpdateSpend: e=e, start_time=start_time, proxy_logging_obj=proxy_logging_obj ) finally: - # Clean up logs_to_process after all processing is complete - del logs_to_process + # Clean up logs_to_process only if we popped it (caller-owned otherwise) + if popped_batch: + del logs_to_process @staticmethod def disable_spend_updates() -> bool: @@ -4306,24 +4289,47 @@ async def update_spend_logs_job( Job to process spend_log_transactions queue. This job is triggered based on queue size rather than time. - Processes spend log transactions when the queue reaches a threshold. + Pops the batch once, writes spend logs, then runs guardrail usage tracking. """ n_retry_times = 3 + MAX_LOGS_PER_INTERVAL = 10000 - # Check queue size with lock protection + # Atomically pop batch from queue async with prisma_client._spend_log_transactions_lock: queue_size = len(prisma_client.spend_log_transactions) - if queue_size == 0: return + async with prisma_client._spend_log_transactions_lock: + logs_to_process = prisma_client.spend_log_transactions[ + :MAX_LOGS_PER_INTERVAL + ] + prisma_client.spend_log_transactions = prisma_client.spend_log_transactions[ + len(logs_to_process) : + ] + await ProxyUpdateSpend.update_spend_logs( n_retry_times=n_retry_times, prisma_client=prisma_client, proxy_logging_obj=proxy_logging_obj, db_writer_client=db_writer_client, + logs_to_process=logs_to_process, ) + # Guardrail/policy usage tracking (same batch, outside spend-logs update) + try: + from litellm.proxy.guardrails.usage_tracking import \ + process_spend_logs_guardrail_usage + await process_spend_logs_guardrail_usage( + prisma_client=prisma_client, + logs_to_process=logs_to_process, + ) + except Exception as guardrail_tracking_err: + verbose_proxy_logger.debug( + "Guardrail usage tracking failed (non-fatal): %s", + guardrail_tracking_err, + ) + async def _monitor_spend_logs_queue( prisma_client: PrismaClient, @@ -4339,10 +4345,8 @@ async def _monitor_spend_logs_queue( db_writer_client: Optional HTTP handler for external spend logs endpoint proxy_logging_obj: Proxy logging object """ - from litellm.constants import ( - SPEND_LOG_QUEUE_POLL_INTERVAL, - SPEND_LOG_QUEUE_SIZE_THRESHOLD, - ) + from litellm.constants import (SPEND_LOG_QUEUE_POLL_INTERVAL, + SPEND_LOG_QUEUE_SIZE_THRESHOLD) threshold = SPEND_LOG_QUEUE_SIZE_THRESHOLD base_interval = SPEND_LOG_QUEUE_POLL_INTERVAL @@ -4863,12 +4867,11 @@ async def get_available_models_for_user( List of model names available to the user """ from litellm.proxy.auth.auth_checks import get_team_object - from litellm.proxy.auth.model_checks import ( - get_complete_model_list, - get_key_models, - get_team_models, - ) - from litellm.proxy.management_endpoints.team_endpoints import validate_membership + from litellm.proxy.auth.model_checks import (get_complete_model_list, + get_key_models, + get_team_models) + from litellm.proxy.management_endpoints.team_endpoints import \ + validate_membership # Get proxy model list and access groups if llm_router is None: diff --git a/schema.prisma b/schema.prisma index 4128ab5f23e..3ef88e18b0d 100644 --- a/schema.prisma +++ b/schema.prisma @@ -866,6 +866,54 @@ model LiteLLM_GuardrailsTable { updated_at DateTime @updatedAt } +// Daily guardrail metrics for usage dashboard (one row per guardrail per day) +model LiteLLM_DailyGuardrailMetrics { + guardrail_id String // logical id; may not FK if guardrail from config + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([guardrail_id, date]) + @@index([date]) + @@index([guardrail_id]) +} + +// Daily policy metrics for usage dashboard (one row per policy per day) +model LiteLLM_DailyPolicyMetrics { + policy_id String + date String // YYYY-MM-DD + requests_evaluated BigInt @default(0) + passed_count BigInt @default(0) + blocked_count BigInt @default(0) + flagged_count BigInt @default(0) + avg_score Float? + avg_latency_ms Float? + created_at DateTime @default(now()) + updated_at DateTime @updatedAt + + @@id([policy_id, date]) + @@index([date]) + @@index([policy_id]) +} + +// Index for fast "last N logs for guardrail/policy" from SpendLogs +model LiteLLM_SpendLogGuardrailIndex { + request_id String + guardrail_id String + policy_id String? // set when run as part of a policy pipeline + start_time DateTime + + @@id([request_id, guardrail_id]) + @@index([guardrail_id, start_time]) + @@index([policy_id, start_time]) +} + // Prompt table for storing prompt configurations model LiteLLM_PromptTable { id String @id @default(uuid()) diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index ae3bd76e3cf..fb749d7afb0 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -13,6 +13,7 @@ import { fetchTeams } from "@/components/common_components/fetch_teams"; import LoadingScreen from "@/components/common_components/LoadingScreen"; import { CostTrackingSettings } from "@/components/CostTrackingSettings"; import GeneralSettings from "@/components/general_settings"; +import GuardrailsMonitorView from "@/components/GuardrailsMonitor/GuardrailsMonitorView"; import GuardrailsPanel from "@/components/guardrails"; import PoliciesPanel from "@/components/policies"; import { Team } from "@/components/key_team_helpers/key_list"; @@ -547,6 +548,8 @@ function CreateKeyPageContent() { ) : page == "vector-stores" ? ( + ) : page == "guardrails-monitor" ? ( + ) : page == "new_usage" ? ( void; + guardrailName?: string; + accessToken: string | null; + onRunEvaluation?: (settings: { prompt: string; schema: string; model: string }) => void; +} + +export function EvaluationSettingsModal({ + open, + onClose, + guardrailName, + accessToken, + onRunEvaluation, +}: EvaluationSettingsModalProps) { + const [prompt, setPrompt] = useState(DEFAULT_PROMPT); + const [schema, setSchema] = useState(DEFAULT_SCHEMA); + const [model, setModel] = useState(null); + const [modelOptions, setModelOptions] = useState([]); + const [loadingModels, setLoadingModels] = useState(false); + + useEffect(() => { + if (!open || !accessToken) { + setModelOptions([]); + return; + } + let cancelled = false; + setLoadingModels(true); + fetchAvailableModels(accessToken) + .then((list) => { + if (!cancelled) setModelOptions(list); + }) + .catch(() => { + if (!cancelled) setModelOptions([]); + }) + .finally(() => { + if (!cancelled) setLoadingModels(false); + }); + return () => { + cancelled = true; + }; + }, [open, accessToken]); + + const handleResetPrompt = () => setPrompt(DEFAULT_PROMPT); + const handleRun = () => { + if (model) { + onRunEvaluation?.({ prompt, schema, model }); + onClose(); + } + }; + + const modelSelectOptions = modelOptions.map((m) => ({ + value: m.model_group, + label: m.model_group, + })); + + return ( + } + destroyOnClose + > +

+ {guardrailName + ? `Configure AI evaluation for ${guardrailName}` + : "Configure AI evaluation for re-running on logs"} +

+ +
+
+
+ + +
+ setPrompt(e.target.value)} + rows={6} + className="font-mono text-sm" + /> +

+ System prompt sent to the evaluation model. Output is structured via response_format. +

+
+ +
+ +

response_format: json_schema

+ setSchema(e.target.value)} + rows={6} + className="font-mono text-sm" + /> +
+ +
+ + ({ value: v.id, label: v.label }))} + style={{ width: 140 }} + /> + +
+
+ + +
+
+ + {showVersionHistory && ( +
+ {versions.map((v) => ( +
+
+ + {v.id} + + {v.changes} +
+
+ {v.author} + {v.date} +
+
+ ))} +
+ )} +
+ + {/* Parameters */} +
+

Parameters

+

Configure {guardrailName} behavior

+ +
+
+ + +
+ +
+ + +
+ +
+ + Guardrail enabled in production +
+
+
+ + {/* Custom Code Override */} +
+
+
+

+ + Custom Code Override +

+

+ Replace the built-in guardrail with custom evaluation code +

+
+ +
+ + {useCustomCode && ( + setCustomCode(e.target.value)} + placeholder={`async def evaluate(input_text: str, context: dict) -> dict: + # Return {"score": 0.0-1.0, "passed": bool, "reason": str} + # Example: + if "banned_word" in input_text.lower(): + return {"score": 0.1, "passed": False, "reason": "Banned word detected"} + return {"score": 0.9, "passed": True, "reason": "No violations"}`} + rows={10} + className="font-mono text-sm" + /> + )} +
+ + {/* Re-run on Failing Logs */} +
+

Test Configuration

+

+ Re-run this guardrail on recent failing logs to validate your changes +

+ +
+ + + {rerunStatus === "success" && ( + + 7/10 would now pass with new config + + )} + + {rerunStatus === "error" && ( + Error running tests + )} +
+
+
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx new file mode 100644 index 00000000000..9724050276d --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx @@ -0,0 +1,301 @@ +import { + ArrowLeftOutlined, + BellOutlined, + PlayCircleOutlined, + SafetyOutlined, + SettingOutlined, + WarningOutlined, +} from "@ant-design/icons"; +import { useQuery } from "@tanstack/react-query"; +import { Card, Col, Grid, Title } from "@tremor/react"; +import { Button, Spin, Tabs } from "antd"; +import React, { useMemo, useState } from "react"; +import { + formatDate, + getGuardrailsUsageDetail, + getGuardrailsUsageLogs, +} from "@/components/networking"; +import { EvaluationSettingsModal } from "./EvaluationSettingsModal"; +import { LogViewer } from "./LogViewer"; +import { MetricCard } from "./MetricCard"; +import type { LogEntry } from "./mockData"; + +interface GuardrailDetailProps { + guardrailId: string; + onBack: () => void; + accessToken?: string | null; +} + +const statusColors: Record< + string, + { bg: string; text: string; dot: string } +> = { + healthy: { bg: "bg-green-50", text: "text-green-700", dot: "bg-green-500" }, + warning: { bg: "bg-amber-50", text: "text-amber-700", dot: "bg-amber-500" }, + critical: { bg: "bg-red-50", text: "text-red-700", dot: "bg-red-500" }, +}; + +const defaultEnd = new Date(); +const defaultStart = new Date(); +defaultStart.setDate(defaultStart.getDate() - 7); + +export function GuardrailDetail({ + guardrailId, + onBack, + accessToken = null, +}: GuardrailDetailProps) { + const [activeTab, setActiveTab] = useState("overview"); + const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); + const [startDate] = useState(() => formatDate(defaultStart)); + const [endDate] = useState(() => formatDate(defaultEnd)); + const [logsPage, setLogsPage] = useState(1); + const logsPageSize = 50; + + const { data: detailData, isLoading: detailLoading, error: detailError } = useQuery({ + queryKey: ["guardrails-usage-detail", guardrailId, startDate, endDate], + queryFn: () => getGuardrailsUsageDetail(accessToken!, guardrailId, startDate, endDate), + enabled: !!accessToken && !!guardrailId, + }); + const { data: logsData, isLoading: logsLoading } = useQuery({ + queryKey: ["guardrails-usage-logs", guardrailId, logsPage, logsPageSize], + queryFn: () => + getGuardrailsUsageLogs(accessToken!, { + guardrailId, + page: logsPage, + pageSize: logsPageSize, + startDate, + endDate, + }), + enabled: !!accessToken && !!guardrailId, + }); + + const logs: LogEntry[] = useMemo(() => { + const list = logsData?.logs ?? []; + return list.map((l: Record) => ({ + id: l.id as string, + timestamp: l.timestamp as string, + action: l.action as "blocked" | "passed" | "flagged", + score: l.score as number | undefined, + model: l.model as string | undefined, + input_snippet: l.input_snippet as string | undefined, + output_snippet: l.output_snippet as string | undefined, + reason: l.reason as string | undefined, + })); + }, [logsData?.logs]); + + const data = detailData + ? { + name: detailData.guardrail_name, + description: detailData.description ?? "", + status: detailData.status, + provider: detailData.provider, + type: detailData.type, + requestsEvaluated: detailData.requestsEvaluated, + failRate: detailData.failRate, + avgScore: detailData.avgScore, + avgLatency: detailData.avgLatency, + } + : { + name: guardrailId, + description: "", + status: "healthy", + provider: "—", + type: "—", + requestsEvaluated: 0, + failRate: 0, + avgScore: undefined as number | undefined, + avgLatency: undefined as number | undefined, + }; + const statusStyle = statusColors[data.status] ?? statusColors.healthy; + + if (detailLoading && !detailData) { + return ( +
+ +
+ ); + } + if (detailError && !detailData) { + return ( +
+ +

Failed to load guardrail details.

+
+ ); + } + + return ( +
+
+ + +
+
+
+ +

{data.name}

+ + + {data.status.charAt(0).toUpperCase() + data.status.slice(1)} + +
+

{data.description}

+
+
+ + {data.provider} + + + +
+
+
+ + + + {activeTab === "overview" && ( +
+ + + + + + 15 ? "text-red-600" : data.failRate > 5 ? "text-amber-600" : "text-green-600" + } + subtitle={`${Math.round((data.requestsEvaluated * data.failRate) / 100).toLocaleString()} blocked`} + icon={data.failRate > 15 ? : undefined} + /> + + + 150 + ? "text-red-600" + : data.avgLatency > 50 + ? "text-amber-600" + : "text-green-600" + : "text-gray-500" + } + subtitle={data.avgLatency != null ? "Per request (avg)" : "No data"} + /> + + + + + + Root Cause Analysis + +

Common patterns in failing requests

+
+
+ +
+

+ High sensitivity to medical terminology +

+

+ 34% of blocked requests contain common medical terms (e.g., "symptoms", + "treatment", "medication") that are benign in context. + Consider adding an allowlist or relaxing sensitivity for these categories. +

+
+
+
+ +
+

+ False positives on educational content +

+

+ 22% of blocked requests are educational queries about safety topics. The guardrail + is flagging the topic itself rather than harmful intent. +

+
+
+
+ +
+

+ Sensitivity may be too aggressive +

+

+ Many blocked requests may be false positives. Consider relaxing sensitivity or + adding allowlisted patterns to reduce blocks by ~40% while maintaining safety. +

+
+
+
+
+ + +
+ )} + + {activeTab === "logs" && ( +
+ +
+ )} + + setEvaluationModalOpen(false)} + guardrailName={data.name} + accessToken={accessToken} + /> +
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.test.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.test.tsx new file mode 100644 index 00000000000..be2bc7f3e48 --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.test.tsx @@ -0,0 +1,62 @@ +import { render, screen, waitFor } from "@testing-library/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { describe, expect, it, vi } from "vitest"; +import GuardrailsMonitorView from "./GuardrailsMonitorView"; +import * as networking from "@/components/networking"; + +vi.mock("@/components/networking", () => ({ + getGuardrailsUsageOverview: vi.fn(), + getPoliciesUsageOverview: vi.fn(), + formatDate: vi.fn((d: Date) => d.toISOString().slice(0, 10)), +})); + +const mockGetGuardrailsUsageOverview = vi.mocked(networking.getGuardrailsUsageOverview); +const mockGetPoliciesUsageOverview = vi.mocked(networking.getPoliciesUsageOverview); + +function wrapper({ children }: { children: React.ReactNode }) { + const queryClient = new QueryClient({ + defaultOptions: { + queries: { retry: false }, + }, + }); + return ( + + {children} + + ); +} + +describe("GuardrailsMonitorView", () => { + it("should render overview and fetch guardrails and policies usage when accessToken is provided", async () => { + mockGetGuardrailsUsageOverview.mockResolvedValue({ + rows: [], + chart: [], + totalRequests: 0, + totalBlocked: 0, + passRate: 100, + }); + mockGetPoliciesUsageOverview.mockResolvedValue({ + rows: [], + chart: [], + totalRequests: 0, + totalBlocked: 0, + passRate: 100, + }); + + render( + , + { wrapper } + ); + + expect(await screen.findByRole("heading", { name: /Guardrails Monitor/i })).toBeDefined(); + await waitFor(() => { + expect(mockGetGuardrailsUsageOverview).toHaveBeenCalled(); + expect(mockGetPoliciesUsageOverview).toHaveBeenCalled(); + }); + }); + + it("should render without crashing when accessToken is null", async () => { + render(, { wrapper }); + expect(await screen.findByRole("heading", { name: /Guardrails Monitor/i })).toBeDefined(); + }); +}); diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx new file mode 100644 index 00000000000..7cc2074e468 --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx @@ -0,0 +1,37 @@ +import React, { useState } from "react"; +import { GuardrailsOverview } from "./GuardrailsOverview"; +import { GuardrailDetail } from "./GuardrailDetail"; + +type View = + | { type: "overview" } + | { type: "detail"; guardrailId: string }; + +interface GuardrailsMonitorViewProps { + accessToken?: string | null; +} + +export default function GuardrailsMonitorView({ accessToken = null }: GuardrailsMonitorViewProps) { + const [view, setView] = useState({ type: "overview" }); + + const handleSelectGuardrail = (id: string) => { + setView({ type: "detail", guardrailId: id }); + }; + + const handleBack = () => { + setView({ type: "overview" }); + }; + + return ( +
+ {view.type === "overview" ? ( + + ) : ( + + )} +
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx new file mode 100644 index 00000000000..6aef6a9e0ad --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx @@ -0,0 +1,395 @@ +import { + DownloadOutlined, + FileTextOutlined, + PlayCircleOutlined, + RiseOutlined, + SafetyOutlined, + SettingOutlined, + WarningOutlined, +} from "@ant-design/icons"; +import { useQuery } from "@tanstack/react-query"; +import { Card, Col, Grid, Title } from "@tremor/react"; +import { Button, Spin, Table } from "antd"; +import type { ColumnsType } from "antd/es/table"; +import React, { useEffect, useMemo, useState } from "react"; +import { + getGuardrailsUsageOverview, + getPoliciesUsageOverview, +} from "@/components/networking"; +import { formatDate } from "@/components/networking"; +import { type PerformanceRow } from "./mockData"; +import { EvaluationSettingsModal } from "./EvaluationSettingsModal"; +import { MetricCard } from "./MetricCard"; +import { ScoreChart } from "./ScoreChart"; + +interface GuardrailsOverviewProps { + accessToken?: string | null; + onSelectGuardrail: (id: string) => void; +} + +type ViewMode = "guardrails" | "policies"; +type SortKey = + | "failRate" + | "requestsEvaluated" + | "avgLatency" + | "falsePositiveRate" + | "falseNegativeRate"; + +const providerColors: Record = { + Bedrock: "bg-orange-100 text-orange-700 border-orange-200", + "Google Cloud": "bg-sky-100 text-sky-700 border-sky-200", + LiteLLM: "bg-indigo-100 text-indigo-700 border-indigo-200", + Custom: "bg-gray-100 text-gray-600 border-gray-200", +}; + +function computeMetricsFromRows(data: PerformanceRow[]) { + const totalRequests = data.reduce((sum, r) => sum + r.requestsEvaluated, 0); + const totalBlocked = data.reduce( + (sum, r) => sum + Math.round((r.requestsEvaluated * r.failRate) / 100), + 0 + ); + const passRate = + totalRequests > 0 ? ((1 - totalBlocked / totalRequests) * 100).toFixed(1) : "0"; + const withLat = data.filter((r) => r.avgLatency != null); + const avgLatency = + withLat.length > 0 + ? Math.round(withLat.reduce((sum, r) => sum + (r.avgLatency ?? 0), 0) / withLat.length) + : 0; + return { totalRequests, totalBlocked, passRate, avgLatency, count: data.length }; +} + +type RerunState = "idle" | "running" | "done"; + +const defaultEnd = new Date(); +const defaultStart = new Date(); +defaultStart.setDate(defaultStart.getDate() - 7); + +export function GuardrailsOverview({ + accessToken = null, + onSelectGuardrail, +}: GuardrailsOverviewProps) { + const [viewMode, setViewMode] = useState("guardrails"); + const [sortBy, setSortBy] = useState("failRate"); + const [sortDir, setSortDir] = useState<"asc" | "desc">("desc"); + const [rerunState, setRerunState] = useState("idle"); + const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); + const [startDate, setStartDate] = useState(() => formatDate(defaultStart)); + const [endDate, setEndDate] = useState(() => formatDate(defaultEnd)); + + const { data: guardrailsData, isLoading: guardrailsLoading, error: guardrailsError } = useQuery({ + queryKey: ["guardrails-usage-overview", startDate, endDate], + queryFn: () => getGuardrailsUsageOverview(accessToken!, startDate, endDate), + enabled: !!accessToken, + }); + const { data: policiesData, isLoading: policiesLoading, error: policiesError } = useQuery({ + queryKey: ["policies-usage-overview", startDate, endDate], + queryFn: () => getPoliciesUsageOverview(accessToken!, startDate, endDate), + enabled: !!accessToken, + }); + + useEffect(() => { + if (rerunState !== "done") return; + const t = setTimeout(() => setRerunState("idle"), 4000); + return () => clearTimeout(t); + }, [rerunState]); + + const activeData: PerformanceRow[] = viewMode === "guardrails" + ? (guardrailsData?.rows ?? []) + : (policiesData?.rows ?? []); + const metrics = useMemo(() => { + if (viewMode === "guardrails" && guardrailsData) { + return { + totalRequests: guardrailsData.totalRequests ?? 0, + totalBlocked: guardrailsData.totalBlocked ?? 0, + passRate: String(guardrailsData.passRate ?? 0), + avgLatency: activeData.length ? Math.round(activeData.reduce((s, r) => s + (r.avgLatency ?? 0), 0) / activeData.length) : 0, + count: activeData.length, + }; + } + if (viewMode === "policies" && policiesData) { + return { + totalRequests: policiesData.totalRequests ?? 0, + totalBlocked: policiesData.totalBlocked ?? 0, + passRate: String(policiesData.passRate ?? 0), + avgLatency: activeData.length ? Math.round(activeData.reduce((s, r) => s + (r.avgLatency ?? 0), 0) / activeData.length) : 0, + count: activeData.length, + }; + } + return computeMetricsFromRows(activeData); + }, [viewMode, guardrailsData, policiesData, activeData]); + const chartData = viewMode === "guardrails" ? guardrailsData?.chart : policiesData?.chart; + const sorted = useMemo(() => { + return [...activeData].sort((a, b) => { + const mult = sortDir === "desc" ? -1 : 1; + const aVal = a[sortBy] ?? 0; + const bVal = b[sortBy] ?? 0; + return (Number(aVal) - Number(bVal)) * mult; + }); + }, [activeData, sortBy, sortDir]); + const isLoading = viewMode === "guardrails" ? guardrailsLoading : policiesLoading; + const error = viewMode === "guardrails" ? guardrailsError : policiesError; + + const isGuardrails = viewMode === "guardrails"; + + const columns: ColumnsType = [ + { + title: isGuardrails ? "Guardrail" : "Policy", + dataIndex: "name", + key: "name", + render: (name: string, row) => ( + + ), + }, + { + title: "Provider", + dataIndex: "provider", + key: "provider", + render: (provider: string) => ( + + {provider} + + ), + }, + { + title: "Requests", + dataIndex: "requestsEvaluated", + key: "requestsEvaluated", + align: "right", + sorter: true, + sortOrder: sortBy === "requestsEvaluated" ? (sortDir === "desc" ? "descend" : "ascend") : null, + render: (v: number) => v.toLocaleString(), + }, + { + title: "Fail Rate", + dataIndex: "failRate", + key: "failRate", + align: "right", + sorter: true, + sortOrder: sortBy === "failRate" ? (sortDir === "desc" ? "descend" : "ascend") : null, + render: (v: number, row) => ( + 15 ? "text-red-600" : v > 5 ? "text-amber-600" : "text-green-600" + } + > + {v}% + {row.trend === "up" && ↑} + {row.trend === "down" && ↓} + + ), + }, + { + title: "Avg. latency added", + dataIndex: "avgLatency", + key: "avgLatency", + align: "right", + sorter: true, + sortOrder: sortBy === "avgLatency" ? (sortDir === "desc" ? "descend" : "ascend") : null, + render: (v?: number) => ( + 150 ? "text-red-600" : v > 50 ? "text-amber-600" : "text-green-600" + } + > + {v != null ? `${v}ms` : "—"} + + ), + }, + { + title: "Status", + dataIndex: "status", + key: "status", + align: "center", + render: (status: string) => ( + + + {status} + + ), + }, + ]; + + const sortableKeys: SortKey[] = ["failRate", "requestsEvaluated", "avgLatency"]; + const handleTableChange = (_pagination: unknown, _filters: unknown, sorter: unknown) => { + const s = sorter as { field?: keyof PerformanceRow; order?: string }; + if (s?.field && sortableKeys.includes(s.field as SortKey)) { + setSortBy(s.field as SortKey); + setSortDir(s.order === "ascend" ? "asc" : "desc"); + } + }; + + const handleRerun = () => { + if (rerunState !== "idle") return; + setRerunState("running"); + setTimeout(() => setRerunState("done"), 2500); + }; + + return ( +
+
+
+
+ +

Guardrails Monitor

+
+

+ {isGuardrails + ? "Monitor guardrail performance across all requests" + : "Monitor policy enforcement across all requests"} +

+
+
+ + {startDate} – {endDate} + + +
+
+ +
+ + +
+ + + + + + + } + /> + + + } + /> + + + 150 + ? "text-red-600" + : metrics.avgLatency > 50 + ? "text-amber-600" + : "text-green-600" + } + /> + + + + + + +
+ +
+ + + {(isLoading || error) && ( +
+ {isLoading && } + {error && Failed to load data. Try again.} +
+ )} +
+
+ + {isGuardrails ? "Guardrail Performance" : "Policy Performance"} + +

+ {isGuardrails + ? "Click a guardrail to view details, logs, and configuration" + : "Click a policy to view details, logs, and configuration"} +

+
+
+ +
+
+ ({ + onClick: () => onSelectGuardrail(row.id), + style: { cursor: "pointer" }, + })} + /> + + + setEvaluationModalOpen(false)} + accessToken={accessToken} + /> + + ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/LogViewer.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/LogViewer.tsx new file mode 100644 index 00000000000..f4af5f122e1 --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/LogViewer.tsx @@ -0,0 +1,219 @@ +import { + CheckCircleOutlined, + CloseOutlined, + CopyOutlined, + DownOutlined, + WarningOutlined, +} from "@ant-design/icons"; +import { Button, Spin } from "antd"; +import React, { useState } from "react"; +import type { LogEntry } from "./mockData"; + +const actionConfig: Record< + "blocked" | "passed" | "flagged", + { icon: React.ElementType; color: string; bg: string; border: string; label: string } +> = { + blocked: { + icon: CloseOutlined, + color: "text-red-600", + bg: "bg-red-50", + border: "border-red-200", + label: "Blocked", + }, + passed: { + icon: CheckCircleOutlined, + color: "text-green-600", + bg: "bg-green-50", + border: "border-green-200", + label: "Passed", + }, + flagged: { + icon: WarningOutlined, + color: "text-amber-600", + bg: "bg-amber-50", + border: "border-amber-200", + label: "Flagged", + }, +}; + +interface LogViewerProps { + guardrailName?: string; + filterAction?: "all" | "blocked" | "passed" | "flagged"; + logs?: LogEntry[]; + logsLoading?: boolean; + totalLogs?: number; +} + +export function LogViewer({ + guardrailName, + filterAction = "all", + logs = [], + logsLoading = false, + totalLogs, +}: LogViewerProps) { + const [sampleSize, setSampleSize] = useState(10); + const [expandedLog, setExpandedLog] = useState(null); + const [activeFilter, setActiveFilter] = useState(filterAction); + + const filteredLogs = logs.filter( + (log) => activeFilter === "all" || log.action === activeFilter + ); + const displayLogs = filteredLogs.slice(0, sampleSize); + const total = totalLogs ?? logs.length; + const sampleSizes = [10, 50, 100]; + const filters: Array<"all" | "blocked" | "flagged" | "passed"> = [ + "all", + "blocked", + "flagged", + "passed", + ]; + + return ( +
+
+
+
+

+ {guardrailName ? `Logs — ${guardrailName}` : "Request Logs"} +

+

+ {logsLoading + ? "Loading…" + : logs.length > 0 + ? `Showing ${displayLogs.length} of ${total} entries` + : "No logs for this period. Select a guardrail and date range."} +

+
+ {logs.length > 0 && ( +
+
+ {filters.map((f) => ( + + ))} +
+
+
+ Sample: + {sampleSizes.map((size) => ( + + ))} +
+
+ )} +
+
+ + {logsLoading && ( +
+ +
+ )} + {!logsLoading && displayLogs.length === 0 && ( +
+ No logs to display. Adjust filters or date range. +
+ )} + {!logsLoading && displayLogs.length > 0 && ( +
+ {displayLogs.map((log) => { + const config = actionConfig[log.action]; + const ActionIcon = config.icon; + const isExpanded = expandedLog === log.id; + return ( +
+ + + {isExpanded && ( +
+
+
+
+ + Input + +
+

+ {log.input_snippet ?? log.input ?? "—"} +

+
+
+ + Output + +

+ {log.output_snippet ?? log.output ?? "—"} +

+
+ {(log.reason ?? log.score != null) && ( +
+ + Reason + +

+ {log.reason ?? (log.score != null ? `Score: ${log.score}` : "—")} +

+
+ )} +
+
+ )} +
+ ); + })} +
+ )} +
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/MetricCard.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/MetricCard.tsx new file mode 100644 index 00000000000..4a11efe72ab --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/MetricCard.tsx @@ -0,0 +1,30 @@ +import React, { type ReactNode } from "react"; + +interface MetricCardProps { + label: string; + value: string | number; + valueColor?: string; + icon?: ReactNode; + subtitle?: string; +} + +export function MetricCard({ + label, + value, + valueColor = "text-gray-900", + icon, + subtitle, +}: MetricCardProps) { + return ( +
+
+ {label} + {icon && {icon}} +
+
+ {value} +
+ {subtitle &&

{subtitle}

} +
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/ScoreChart.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/ScoreChart.tsx new file mode 100644 index 00000000000..e4803747d4f --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/ScoreChart.tsx @@ -0,0 +1,39 @@ +import { BarChart, Card, Title } from "@tremor/react"; +import React from "react"; + +/** + * Overview chart: Request Outcomes Over Time (passed vs blocked). + * Uses Tremor BarChart with stacked data. Data from usage/overview API (chart array). + */ +interface ScoreChartProps { + data?: Array<{ date: string; passed: number; blocked: number }>; +} + +export function ScoreChart({ data }: ScoreChartProps) { + const chartData = data && data.length > 0 ? data : []; + return ( + + + Request Outcomes Over Time + +
+ {chartData.length > 0 ? ( + v.toLocaleString()} + yAxisWidth={48} + showLegend={true} + stack={true} + /> + ) : ( +
+ No chart data for this period +
+ )} +
+
+ ); +} diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/mockData.ts b/ui/litellm-dashboard/src/components/GuardrailsMonitor/mockData.ts new file mode 100644 index 00000000000..7d99ebe7c44 --- /dev/null +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/mockData.ts @@ -0,0 +1,50 @@ +/** + * Types for Guardrails Monitor dashboard (data from usage API). + */ + +export interface PerformanceRow { + id: string; + name: string; + type: string; + provider: string; + requestsEvaluated: number; + failRate: number; + avgScore?: number; + avgLatency?: number; + p95Latency?: number; + falsePositiveRate?: number; + falseNegativeRate?: number; + status: "healthy" | "warning" | "critical"; + trend: "up" | "down" | "stable"; +} + +export interface GuardrailDetailRecord { + name: string; + type: string; + provider: string; + requestsEvaluated: number; + failRate: number; + avgScore?: number; + avgLatency?: number; + p95Latency?: number; + falsePositiveRate?: number; + falsePositiveCount?: number; + falseNegativeRate?: number; + falseNegativeCount?: number; + status: string; + description: string; +} + +export interface LogEntry { + id: string; + timestamp: string; + input?: string; + output?: string; + input_snippet?: string; + output_snippet?: string; + score?: number; + action: "blocked" | "passed" | "flagged"; + model?: string; + reason?: string; + latency_ms?: number; +} diff --git a/ui/litellm-dashboard/src/components/leftnav.tsx b/ui/litellm-dashboard/src/components/leftnav.tsx index 150be88de21..da3ca2a8bae 100644 --- a/ui/litellm-dashboard/src/components/leftnav.tsx +++ b/ui/litellm-dashboard/src/components/leftnav.tsx @@ -154,6 +154,13 @@ const menuGroups: MenuGroup[] = [ label: "Logs", icon: , }, + { + key: "guardrails-monitor", + page: "guardrails-monitor", + label: "Guardrails Monitor", + icon: , + roles: [...all_admin_roles, ...internalUserRoles], + }, ], }, { diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index a16afe9c8a2..87b9ae98e11 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -5408,6 +5408,128 @@ export const getGuardrailsList = async (accessToken: string) => { } }; +// Guardrails / Policies usage (dashboard) +export const getGuardrailsUsageOverview = async ( + accessToken: string, + startDate?: string, + endDate?: string +) => { + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/usage/overview` : `/guardrails/usage/overview`; + const params = new URLSearchParams(); + if (startDate) params.append("start_date", startDate); + if (endDate) params.append("end_date", endDate); + if (params.toString()) url += `?${params.toString()}`; + const response = await fetch(url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(deriveErrorMessage(errorData)); + } + return response.json(); + } catch (error) { + console.error("Failed to get guardrails usage overview:", error); + throw error; + } +}; + +export const getGuardrailsUsageDetail = async ( + accessToken: string, + guardrailId: string, + startDate?: string, + endDate?: string +) => { + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/usage/detail/${encodeURIComponent(guardrailId)}` : `/guardrails/usage/detail/${encodeURIComponent(guardrailId)}`; + const params = new URLSearchParams(); + if (startDate) params.append("start_date", startDate); + if (endDate) params.append("end_date", endDate); + if (params.toString()) url += `?${params.toString()}`; + const response = await fetch(url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(deriveErrorMessage(errorData)); + } + return response.json(); + } catch (error) { + console.error("Failed to get guardrails usage detail:", error); + throw error; + } +}; + +export const getGuardrailsUsageLogs = async ( + accessToken: string, + options: { guardrailId?: string; policyId?: string; page?: number; pageSize?: number; action?: string; startDate?: string; endDate?: string } +) => { + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/usage/logs` : `/guardrails/usage/logs`; + const params = new URLSearchParams(); + if (options.guardrailId) params.append("guardrail_id", options.guardrailId); + if (options.policyId) params.append("policy_id", options.policyId); + if (options.page != null) params.append("page", String(options.page)); + if (options.pageSize != null) params.append("page_size", String(options.pageSize)); + if (options.action) params.append("action", options.action); + if (options.startDate) params.append("start_date", options.startDate); + if (options.endDate) params.append("end_date", options.endDate); + if (params.toString()) url += `?${params.toString()}`; + const response = await fetch(url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(deriveErrorMessage(errorData)); + } + return response.json(); + } catch (error) { + console.error("Failed to get guardrails usage logs:", error); + throw error; + } +}; + +export const getPoliciesUsageOverview = async ( + accessToken: string, + startDate?: string, + endDate?: string +) => { + try { + let url = proxyBaseUrl ? `${proxyBaseUrl}/policies/usage/overview` : `/policies/usage/overview`; + const params = new URLSearchParams(); + if (startDate) params.append("start_date", startDate); + if (endDate) params.append("end_date", endDate); + if (params.toString()) url += `?${params.toString()}`; + const response = await fetch(url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + if (!response.ok) { + const errorData = await response.json(); + throw new Error(deriveErrorMessage(errorData)); + } + return response.json(); + } catch (error) { + console.error("Failed to get policies usage overview:", error); + throw error; + } +}; + // ───────────────────────────────────────────────────────────────────────────── // Policy CRUD API Calls // ───────────────────────────────────────────────────────────────────────────── diff --git a/ui/litellm-dashboard/src/components/page_metadata.ts b/ui/litellm-dashboard/src/components/page_metadata.ts index 54fbfd791bf..69fcf1bd39a 100644 --- a/ui/litellm-dashboard/src/components/page_metadata.ts +++ b/ui/litellm-dashboard/src/components/page_metadata.ts @@ -16,6 +16,7 @@ export const pageDescriptions: Record = { "vector-stores": "Manage vector databases for embeddings", new_usage: "View usage analytics and metrics", logs: "Access request and response logs", + "guardrails-monitor": "Monitor guardrail and policy performance and view logs", users: "Manage internal user accounts and permissions", teams: "Create and manage teams for access control", organizations: "Manage organizations and their members", diff --git a/ui/litellm-dashboard/src/components/view_logs/GuardrailViewer/GuardrailViewer.tsx b/ui/litellm-dashboard/src/components/view_logs/GuardrailViewer/GuardrailViewer.tsx index 12abf9c3c6d..49ea447720c 100644 --- a/ui/litellm-dashboard/src/components/view_logs/GuardrailViewer/GuardrailViewer.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/GuardrailViewer/GuardrailViewer.tsx @@ -77,8 +77,10 @@ const PROVIDERS_WITH_CUSTOM_RENDERERS = new Set([ "litellm_content_filter", ]); -const formatMode = (mode: string): string => { - return mode.replace(/_/g, "-").toUpperCase(); +const formatMode = (mode: unknown): string => { + if (mode == null) return "—"; + const s = typeof mode === "string" ? mode : String(mode); + return s.replace(/_/g, "-").toUpperCase(); }; const formatDurationMs = (seconds: number): string => { From 9828b9929faac7c4c3c9c77623568ac4da0ce183 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 21 Feb 2026 19:33:50 -0800 Subject: [PATCH 32/86] fix(guardrails/usage_endpoints.py): fix usage dashboard --- .../out/{404.html => 404/index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../{budgets.html => budgets/index.html} | 0 .../{caching.html => caching/index.html} | 0 .../index.html} | 0 .../{old-usage.html => old-usage/index.html} | 0 .../{prompts.html => prompts/index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../out/{login.html => login/index.html} | 0 .../out/{logs.html => logs/index.html} | 0 .../{callback.html => callback/index.html} | 0 .../{model-hub.html => model-hub/index.html} | 0 .../{model_hub.html => model_hub/index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../{policies.html => policies/index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../{ui-theme.html => ui-theme/index.html} | 0 .../out/{teams.html => teams/index.html} | 0 .../{test-key.html => test-key/index.html} | 0 .../index.html} | 0 .../index.html} | 0 .../out/{usage.html => usage/index.html} | 0 .../out/{users.html => users/index.html} | 0 .../index.html} | 0 litellm/proxy/guardrails/usage_endpoints.py | 71 ++++++++--- .../GuardrailsMonitor/GuardrailDetail.tsx | 72 +---------- .../GuardrailsMonitorView.test.tsx | 12 +- .../GuardrailsMonitorView.tsx | 43 ++++++- .../GuardrailsMonitor/GuardrailsOverview.tsx | 116 +++--------------- .../src/components/page_metadata.ts | 2 +- 39 files changed, 118 insertions(+), 198 deletions(-) rename litellm/proxy/_experimental/out/{404.html => 404/index.html} (100%) rename litellm/proxy/_experimental/out/{_not-found.html => _not-found/index.html} (100%) rename litellm/proxy/_experimental/out/{api-reference.html => api-reference/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{api-playground.html => api-playground/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{budgets.html => budgets/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{caching.html => caching/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{claude-code-plugins.html => claude-code-plugins/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{old-usage.html => old-usage/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{prompts.html => prompts/index.html} (100%) rename litellm/proxy/_experimental/out/experimental/{tag-management.html => tag-management/index.html} (100%) rename litellm/proxy/_experimental/out/{guardrails.html => guardrails/index.html} (100%) rename litellm/proxy/_experimental/out/{login.html => login/index.html} (100%) rename litellm/proxy/_experimental/out/{logs.html => logs/index.html} (100%) rename litellm/proxy/_experimental/out/mcp/oauth/{callback.html => callback/index.html} (100%) rename litellm/proxy/_experimental/out/{model-hub.html => model-hub/index.html} (100%) rename litellm/proxy/_experimental/out/{model_hub.html => model_hub/index.html} (100%) rename litellm/proxy/_experimental/out/{model_hub_table.html => model_hub_table/index.html} (100%) rename litellm/proxy/_experimental/out/{models-and-endpoints.html => models-and-endpoints/index.html} (100%) rename litellm/proxy/_experimental/out/{onboarding.html => onboarding/index.html} (100%) rename litellm/proxy/_experimental/out/{organizations.html => organizations/index.html} (100%) rename litellm/proxy/_experimental/out/{playground.html => playground/index.html} (100%) rename litellm/proxy/_experimental/out/{policies.html => policies/index.html} (100%) rename litellm/proxy/_experimental/out/settings/{admin-settings.html => admin-settings/index.html} (100%) rename litellm/proxy/_experimental/out/settings/{logging-and-alerts.html => logging-and-alerts/index.html} (100%) rename litellm/proxy/_experimental/out/settings/{router-settings.html => router-settings/index.html} (100%) rename litellm/proxy/_experimental/out/settings/{ui-theme.html => ui-theme/index.html} (100%) rename litellm/proxy/_experimental/out/{teams.html => teams/index.html} (100%) rename litellm/proxy/_experimental/out/{test-key.html => test-key/index.html} (100%) rename litellm/proxy/_experimental/out/tools/{mcp-servers.html => mcp-servers/index.html} (100%) rename litellm/proxy/_experimental/out/tools/{vector-stores.html => vector-stores/index.html} (100%) rename litellm/proxy/_experimental/out/{usage.html => usage/index.html} (100%) rename litellm/proxy/_experimental/out/{users.html => users/index.html} (100%) rename litellm/proxy/_experimental/out/{virtual-keys.html => virtual-keys/index.html} (100%) diff --git a/litellm/proxy/_experimental/out/404.html b/litellm/proxy/_experimental/out/404/index.html similarity index 100% rename from litellm/proxy/_experimental/out/404.html rename to litellm/proxy/_experimental/out/404/index.html diff --git a/litellm/proxy/_experimental/out/_not-found.html b/litellm/proxy/_experimental/out/_not-found/index.html similarity index 100% rename from litellm/proxy/_experimental/out/_not-found.html rename to litellm/proxy/_experimental/out/_not-found/index.html diff --git a/litellm/proxy/_experimental/out/api-reference.html b/litellm/proxy/_experimental/out/api-reference/index.html similarity index 100% rename from litellm/proxy/_experimental/out/api-reference.html rename to litellm/proxy/_experimental/out/api-reference/index.html diff --git a/litellm/proxy/_experimental/out/experimental/api-playground.html b/litellm/proxy/_experimental/out/experimental/api-playground/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/api-playground.html rename to litellm/proxy/_experimental/out/experimental/api-playground/index.html diff --git a/litellm/proxy/_experimental/out/experimental/budgets.html b/litellm/proxy/_experimental/out/experimental/budgets/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/budgets.html rename to litellm/proxy/_experimental/out/experimental/budgets/index.html diff --git a/litellm/proxy/_experimental/out/experimental/caching.html b/litellm/proxy/_experimental/out/experimental/caching/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/caching.html rename to litellm/proxy/_experimental/out/experimental/caching/index.html diff --git a/litellm/proxy/_experimental/out/experimental/claude-code-plugins.html b/litellm/proxy/_experimental/out/experimental/claude-code-plugins/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/claude-code-plugins.html rename to litellm/proxy/_experimental/out/experimental/claude-code-plugins/index.html diff --git a/litellm/proxy/_experimental/out/experimental/old-usage.html b/litellm/proxy/_experimental/out/experimental/old-usage/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/old-usage.html rename to litellm/proxy/_experimental/out/experimental/old-usage/index.html diff --git a/litellm/proxy/_experimental/out/experimental/prompts.html b/litellm/proxy/_experimental/out/experimental/prompts/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/prompts.html rename to litellm/proxy/_experimental/out/experimental/prompts/index.html diff --git a/litellm/proxy/_experimental/out/experimental/tag-management.html b/litellm/proxy/_experimental/out/experimental/tag-management/index.html similarity index 100% rename from litellm/proxy/_experimental/out/experimental/tag-management.html rename to litellm/proxy/_experimental/out/experimental/tag-management/index.html diff --git a/litellm/proxy/_experimental/out/guardrails.html b/litellm/proxy/_experimental/out/guardrails/index.html similarity index 100% rename from litellm/proxy/_experimental/out/guardrails.html rename to litellm/proxy/_experimental/out/guardrails/index.html diff --git a/litellm/proxy/_experimental/out/login.html b/litellm/proxy/_experimental/out/login/index.html similarity index 100% rename from litellm/proxy/_experimental/out/login.html rename to litellm/proxy/_experimental/out/login/index.html diff --git a/litellm/proxy/_experimental/out/logs.html b/litellm/proxy/_experimental/out/logs/index.html similarity index 100% rename from litellm/proxy/_experimental/out/logs.html rename to litellm/proxy/_experimental/out/logs/index.html diff --git a/litellm/proxy/_experimental/out/mcp/oauth/callback.html b/litellm/proxy/_experimental/out/mcp/oauth/callback/index.html similarity index 100% rename from litellm/proxy/_experimental/out/mcp/oauth/callback.html rename to litellm/proxy/_experimental/out/mcp/oauth/callback/index.html diff --git a/litellm/proxy/_experimental/out/model-hub.html b/litellm/proxy/_experimental/out/model-hub/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model-hub.html rename to litellm/proxy/_experimental/out/model-hub/index.html diff --git a/litellm/proxy/_experimental/out/model_hub.html b/litellm/proxy/_experimental/out/model_hub/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model_hub.html rename to litellm/proxy/_experimental/out/model_hub/index.html diff --git a/litellm/proxy/_experimental/out/model_hub_table.html b/litellm/proxy/_experimental/out/model_hub_table/index.html similarity index 100% rename from litellm/proxy/_experimental/out/model_hub_table.html rename to litellm/proxy/_experimental/out/model_hub_table/index.html diff --git a/litellm/proxy/_experimental/out/models-and-endpoints.html b/litellm/proxy/_experimental/out/models-and-endpoints/index.html similarity index 100% rename from litellm/proxy/_experimental/out/models-and-endpoints.html rename to litellm/proxy/_experimental/out/models-and-endpoints/index.html diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding/index.html similarity index 100% rename from litellm/proxy/_experimental/out/onboarding.html rename to litellm/proxy/_experimental/out/onboarding/index.html diff --git a/litellm/proxy/_experimental/out/organizations.html b/litellm/proxy/_experimental/out/organizations/index.html similarity index 100% rename from litellm/proxy/_experimental/out/organizations.html rename to litellm/proxy/_experimental/out/organizations/index.html diff --git a/litellm/proxy/_experimental/out/playground.html b/litellm/proxy/_experimental/out/playground/index.html similarity index 100% rename from litellm/proxy/_experimental/out/playground.html rename to litellm/proxy/_experimental/out/playground/index.html diff --git a/litellm/proxy/_experimental/out/policies.html b/litellm/proxy/_experimental/out/policies/index.html similarity index 100% rename from litellm/proxy/_experimental/out/policies.html rename to litellm/proxy/_experimental/out/policies/index.html diff --git a/litellm/proxy/_experimental/out/settings/admin-settings.html b/litellm/proxy/_experimental/out/settings/admin-settings/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/admin-settings.html rename to litellm/proxy/_experimental/out/settings/admin-settings/index.html diff --git a/litellm/proxy/_experimental/out/settings/logging-and-alerts.html b/litellm/proxy/_experimental/out/settings/logging-and-alerts/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/logging-and-alerts.html rename to litellm/proxy/_experimental/out/settings/logging-and-alerts/index.html diff --git a/litellm/proxy/_experimental/out/settings/router-settings.html b/litellm/proxy/_experimental/out/settings/router-settings/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/router-settings.html rename to litellm/proxy/_experimental/out/settings/router-settings/index.html diff --git a/litellm/proxy/_experimental/out/settings/ui-theme.html b/litellm/proxy/_experimental/out/settings/ui-theme/index.html similarity index 100% rename from litellm/proxy/_experimental/out/settings/ui-theme.html rename to litellm/proxy/_experimental/out/settings/ui-theme/index.html diff --git a/litellm/proxy/_experimental/out/teams.html b/litellm/proxy/_experimental/out/teams/index.html similarity index 100% rename from litellm/proxy/_experimental/out/teams.html rename to litellm/proxy/_experimental/out/teams/index.html diff --git a/litellm/proxy/_experimental/out/test-key.html b/litellm/proxy/_experimental/out/test-key/index.html similarity index 100% rename from litellm/proxy/_experimental/out/test-key.html rename to litellm/proxy/_experimental/out/test-key/index.html diff --git a/litellm/proxy/_experimental/out/tools/mcp-servers.html b/litellm/proxy/_experimental/out/tools/mcp-servers/index.html similarity index 100% rename from litellm/proxy/_experimental/out/tools/mcp-servers.html rename to litellm/proxy/_experimental/out/tools/mcp-servers/index.html diff --git a/litellm/proxy/_experimental/out/tools/vector-stores.html b/litellm/proxy/_experimental/out/tools/vector-stores/index.html similarity index 100% rename from litellm/proxy/_experimental/out/tools/vector-stores.html rename to litellm/proxy/_experimental/out/tools/vector-stores/index.html diff --git a/litellm/proxy/_experimental/out/usage.html b/litellm/proxy/_experimental/out/usage/index.html similarity index 100% rename from litellm/proxy/_experimental/out/usage.html rename to litellm/proxy/_experimental/out/usage/index.html diff --git a/litellm/proxy/_experimental/out/users.html b/litellm/proxy/_experimental/out/users/index.html similarity index 100% rename from litellm/proxy/_experimental/out/users.html rename to litellm/proxy/_experimental/out/users/index.html diff --git a/litellm/proxy/_experimental/out/virtual-keys.html b/litellm/proxy/_experimental/out/virtual-keys/index.html similarity index 100% rename from litellm/proxy/_experimental/out/virtual-keys.html rename to litellm/proxy/_experimental/out/virtual-keys/index.html diff --git a/litellm/proxy/guardrails/usage_endpoints.py b/litellm/proxy/guardrails/usage_endpoints.py index 16a6f1a2cc5..b5a578815f0 100644 --- a/litellm/proxy/guardrails/usage_endpoints.py +++ b/litellm/proxy/guardrails/usage_endpoints.py @@ -106,9 +106,7 @@ def _aggregate_daily_metrics(metrics: Any, id_attr: str) -> Dict[str, Dict[str, return agg -def _prev_fail_rates( - metrics_prev: Any, id_attr: str -) -> Dict[str, float]: +def _prev_fail_rates(metrics_prev: Any, id_attr: str) -> Dict[str, float]: prev_agg_raw: Dict[str, Dict[str, int]] = {} for m in metrics_prev: gid = getattr(m, id_attr) @@ -137,15 +135,34 @@ def _chart_from_metrics(metrics: Any) -> List[Dict[str, Any]]: ] +def _get_guardrail_attrs(g: Any) -> tuple[Any, str]: + """Get (guardrail_id, display_name) from guardrail - handles Prisma model or dict.""" + gid = getattr(g, "guardrail_id", None) or ( + g.get("guardrail_id") if isinstance(g, dict) else None + ) + name = getattr(g, "guardrail_name", None) or ( + g.get("guardrail_name") if isinstance(g, dict) else None + ) + return gid, (name or gid or "") + + def _guardrail_overview_rows( guardrails: Any, agg: Dict[str, Dict[str, Any]], prev_agg: Dict[str, float], ) -> List[UsageOverviewRow]: rows: List[UsageOverviewRow] = [] + covered_keys: set = set() for g in guardrails: - gid = g.guardrail_id - a = agg.get(gid, {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0}) + gid, display_name = _get_guardrail_attrs(g) + # Metrics are keyed by logical name from spend log metadata; guardrails table uses UUID + lookup_keys = [k for k in (display_name, gid) if k] + covered_keys.update(lookup_keys) + a = {"requests": 0, "passed": 0, "blocked": 0, "flagged": 0} + for k in lookup_keys: + if k in agg: + a = agg[k] + break req, blocked = a["requests"], a["blocked"] fail_rate = (100.0 * blocked / req) if req else 0.0 litellm_params = ( @@ -156,16 +173,16 @@ def _guardrail_overview_rows( (g.guardrail_info or {}) if isinstance(g.guardrail_info, dict) else {} ) gtype = str(guardrail_info.get("type", "Guardrail")) - prev_fail = ( - prev_agg.get(gid, 0.0) - if isinstance(prev_agg.get(gid), (int, float)) - else 0.0 - ) + prev_fail = 0.0 + for k in lookup_keys: + if k in prev_agg: + prev_fail = float(prev_agg.get(k, 0.0) or 0.0) + break trend = _trend_from_comparison(fail_rate, prev_fail) rows.append( UsageOverviewRow( id=gid, - name=g.guardrail_name or gid, + name=display_name or str(gid), type=gtype, provider=provider, requestsEvaluated=req, @@ -176,6 +193,28 @@ def _guardrail_overview_rows( trend=trend, ) ) + # Add rows for guardrails with metrics but not in guardrails table (e.g. MCP, config) + for agg_key, a in agg.items(): + if agg_key in covered_keys or a["requests"] == 0: + continue + req, blocked = a["requests"], a["blocked"] + fail_rate = (100.0 * blocked / req) if req else 0.0 + prev_fail = float(prev_agg.get(agg_key, 0.0) or 0.0) + trend = _trend_from_comparison(fail_rate, prev_fail) + rows.append( + UsageOverviewRow( + id=agg_key, + name=agg_key, + type="Guardrail", + provider="Custom", + requestsEvaluated=req, + failRate=round(fail_rate, 1), + avgScore=None, + avgLatency=None, + status=_status_from_fail_rate(fail_rate), + trend=trend, + ) + ) return rows @@ -411,9 +450,9 @@ def _usage_log_entry_from_row( duration = entry_for_guardrail.get("duration") if duration is not None: latency_val = round(float(duration) * 1000, 0) - score_val = entry_for_guardrail.get("confidence_score") or entry_for_guardrail.get( - "risk_score" - ) + score_val = entry_for_guardrail.get( + "confidence_score" + ) or entry_for_guardrail.get("risk_score") if score_val is not None: score_val = round(float(score_val), 2) resp = entry_for_guardrail.get("guardrail_response") @@ -486,9 +525,7 @@ async def guardrails_usage_logs( return UsageLogsResponse(logs=[], total=0, page=page, page_size=page_size) try: - where = _build_usage_logs_where( - guardrail_id, policy_id, start_date, end_date - ) + where = _build_usage_logs_where(guardrail_id, policy_id, start_date, end_date) index_rows = await prisma_client.db.litellm_spendlogguardrailindex.find_many( where=where, order={"start_time": "desc"}, diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx index 9724050276d..ed9f435f9db 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailDetail.tsx @@ -1,17 +1,14 @@ import { ArrowLeftOutlined, - BellOutlined, - PlayCircleOutlined, SafetyOutlined, SettingOutlined, WarningOutlined, } from "@ant-design/icons"; import { useQuery } from "@tanstack/react-query"; -import { Card, Col, Grid, Title } from "@tremor/react"; +import { Col, Grid } from "@tremor/react"; import { Button, Spin, Tabs } from "antd"; import React, { useMemo, useState } from "react"; import { - formatDate, getGuardrailsUsageDetail, getGuardrailsUsageLogs, } from "@/components/networking"; @@ -24,6 +21,8 @@ interface GuardrailDetailProps { guardrailId: string; onBack: () => void; accessToken?: string | null; + startDate: string; + endDate: string; } const statusColors: Record< @@ -35,19 +34,15 @@ const statusColors: Record< critical: { bg: "bg-red-50", text: "text-red-700", dot: "bg-red-500" }, }; -const defaultEnd = new Date(); -const defaultStart = new Date(); -defaultStart.setDate(defaultStart.getDate() - 7); - export function GuardrailDetail({ guardrailId, onBack, accessToken = null, + startDate, + endDate, }: GuardrailDetailProps) { const [activeTab, setActiveTab] = useState("overview"); const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); - const [startDate] = useState(() => formatDate(defaultStart)); - const [endDate] = useState(() => formatDate(defaultEnd)); const [logsPage, setLogsPage] = useState(1); const logsPageSize = 50; @@ -156,23 +151,12 @@ export function GuardrailDetail({ {data.provider} -
@@ -223,52 +207,6 @@ export function GuardrailDetail({ - - - Root Cause Analysis - -

Common patterns in failing requests

-
-
- -
-

- High sensitivity to medical terminology -

-

- 34% of blocked requests contain common medical terms (e.g., "symptoms", - "treatment", "medication") that are benign in context. - Consider adding an allowlist or relaxing sensitivity for these categories. -

-
-
-
- -
-

- False positives on educational content -

-

- 22% of blocked requests are educational queries about safety topics. The guardrail - is flagging the topic itself rather than harmful intent. -

-
-
-
- -
-

- Sensitivity may be too aggressive -

-

- Many blocked requests may be false positives. Consider relaxing sensitivity or - adding allowlisted patterns to reduce blocks by ~40% while maintaining safety. -

-
-
-
-
- ({ getGuardrailsUsageOverview: vi.fn(), - getPoliciesUsageOverview: vi.fn(), formatDate: vi.fn((d: Date) => d.toISOString().slice(0, 10)), })); const mockGetGuardrailsUsageOverview = vi.mocked(networking.getGuardrailsUsageOverview); -const mockGetPoliciesUsageOverview = vi.mocked(networking.getPoliciesUsageOverview); function wrapper({ children }: { children: React.ReactNode }) { const queryClient = new QueryClient({ @@ -27,7 +25,7 @@ function wrapper({ children }: { children: React.ReactNode }) { } describe("GuardrailsMonitorView", () => { - it("should render overview and fetch guardrails and policies usage when accessToken is provided", async () => { + it("should render overview and fetch guardrails usage when accessToken is provided", async () => { mockGetGuardrailsUsageOverview.mockResolvedValue({ rows: [], chart: [], @@ -35,13 +33,6 @@ describe("GuardrailsMonitorView", () => { totalBlocked: 0, passRate: 100, }); - mockGetPoliciesUsageOverview.mockResolvedValue({ - rows: [], - chart: [], - totalRequests: 0, - totalBlocked: 0, - passRate: 100, - }); render( , @@ -51,7 +42,6 @@ describe("GuardrailsMonitorView", () => { expect(await screen.findByRole("heading", { name: /Guardrails Monitor/i })).toBeDefined(); await waitFor(() => { expect(mockGetGuardrailsUsageOverview).toHaveBeenCalled(); - expect(mockGetPoliciesUsageOverview).toHaveBeenCalled(); }); }); diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx index 7cc2074e468..7214b0642b6 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsMonitorView.tsx @@ -1,6 +1,9 @@ -import React, { useState } from "react"; -import { GuardrailsOverview } from "./GuardrailsOverview"; +import type { DateRangePickerValue } from "@tremor/react"; +import React, { useCallback, useMemo, useState } from "react"; +import { formatDate } from "@/components/networking"; +import AdvancedDatePicker from "@/components/shared/advanced_date_picker"; import { GuardrailDetail } from "./GuardrailDetail"; +import { GuardrailsOverview } from "./GuardrailsOverview"; type View = | { type: "overview" } @@ -10,9 +13,28 @@ interface GuardrailsMonitorViewProps { accessToken?: string | null; } +const defaultEnd = new Date(); +const defaultStart = new Date(); +defaultStart.setDate(defaultStart.getDate() - 7); + export default function GuardrailsMonitorView({ accessToken = null }: GuardrailsMonitorViewProps) { const [view, setView] = useState({ type: "overview" }); + const initialFrom = useMemo(() => new Date(defaultStart), []); + const initialTo = useMemo(() => new Date(defaultEnd), []); + + const [dateValue, setDateValue] = useState({ + from: initialFrom, + to: initialTo, + }); + + const startDate = dateValue.from ? formatDate(dateValue.from) : ""; + const endDate = dateValue.to ? formatDate(dateValue.to) : ""; + + const handleDateChange = useCallback((newValue: DateRangePickerValue) => { + setDateValue(newValue); + }, []); + const handleSelectGuardrail = (id: string) => { setView({ type: "detail", guardrailId: id }); }; @@ -23,13 +45,28 @@ export default function GuardrailsMonitorView({ accessToken = null }: Guardrails return (
+
+ +
{view.type === "overview" ? ( - + ) : ( )}
diff --git a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx index 6aef6a9e0ad..fc3801484e0 100644 --- a/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx +++ b/ui/litellm-dashboard/src/components/GuardrailsMonitor/GuardrailsOverview.tsx @@ -1,7 +1,5 @@ import { DownloadOutlined, - FileTextOutlined, - PlayCircleOutlined, RiseOutlined, SafetyOutlined, SettingOutlined, @@ -11,12 +9,8 @@ import { useQuery } from "@tanstack/react-query"; import { Card, Col, Grid, Title } from "@tremor/react"; import { Button, Spin, Table } from "antd"; import type { ColumnsType } from "antd/es/table"; -import React, { useEffect, useMemo, useState } from "react"; -import { - getGuardrailsUsageOverview, - getPoliciesUsageOverview, -} from "@/components/networking"; -import { formatDate } from "@/components/networking"; +import React, { useMemo, useState } from "react"; +import { getGuardrailsUsageOverview } from "@/components/networking"; import { type PerformanceRow } from "./mockData"; import { EvaluationSettingsModal } from "./EvaluationSettingsModal"; import { MetricCard } from "./MetricCard"; @@ -24,10 +18,11 @@ import { ScoreChart } from "./ScoreChart"; interface GuardrailsOverviewProps { accessToken?: string | null; + startDate: string; + endDate: string; onSelectGuardrail: (id: string) => void; } -type ViewMode = "guardrails" | "policies"; type SortKey = | "failRate" | "requestsEvaluated" @@ -58,46 +53,25 @@ function computeMetricsFromRows(data: PerformanceRow[]) { return { totalRequests, totalBlocked, passRate, avgLatency, count: data.length }; } -type RerunState = "idle" | "running" | "done"; - -const defaultEnd = new Date(); -const defaultStart = new Date(); -defaultStart.setDate(defaultStart.getDate() - 7); - export function GuardrailsOverview({ accessToken = null, + startDate, + endDate, onSelectGuardrail, }: GuardrailsOverviewProps) { - const [viewMode, setViewMode] = useState("guardrails"); const [sortBy, setSortBy] = useState("failRate"); const [sortDir, setSortDir] = useState<"asc" | "desc">("desc"); - const [rerunState, setRerunState] = useState("idle"); const [evaluationModalOpen, setEvaluationModalOpen] = useState(false); - const [startDate, setStartDate] = useState(() => formatDate(defaultStart)); - const [endDate, setEndDate] = useState(() => formatDate(defaultEnd)); const { data: guardrailsData, isLoading: guardrailsLoading, error: guardrailsError } = useQuery({ queryKey: ["guardrails-usage-overview", startDate, endDate], queryFn: () => getGuardrailsUsageOverview(accessToken!, startDate, endDate), enabled: !!accessToken, }); - const { data: policiesData, isLoading: policiesLoading, error: policiesError } = useQuery({ - queryKey: ["policies-usage-overview", startDate, endDate], - queryFn: () => getPoliciesUsageOverview(accessToken!, startDate, endDate), - enabled: !!accessToken, - }); - useEffect(() => { - if (rerunState !== "done") return; - const t = setTimeout(() => setRerunState("idle"), 4000); - return () => clearTimeout(t); - }, [rerunState]); - - const activeData: PerformanceRow[] = viewMode === "guardrails" - ? (guardrailsData?.rows ?? []) - : (policiesData?.rows ?? []); + const activeData: PerformanceRow[] = guardrailsData?.rows ?? []; const metrics = useMemo(() => { - if (viewMode === "guardrails" && guardrailsData) { + if (guardrailsData) { return { totalRequests: guardrailsData.totalRequests ?? 0, totalBlocked: guardrailsData.totalBlocked ?? 0, @@ -106,18 +80,9 @@ export function GuardrailsOverview({ count: activeData.length, }; } - if (viewMode === "policies" && policiesData) { - return { - totalRequests: policiesData.totalRequests ?? 0, - totalBlocked: policiesData.totalBlocked ?? 0, - passRate: String(policiesData.passRate ?? 0), - avgLatency: activeData.length ? Math.round(activeData.reduce((s, r) => s + (r.avgLatency ?? 0), 0) / activeData.length) : 0, - count: activeData.length, - }; - } return computeMetricsFromRows(activeData); - }, [viewMode, guardrailsData, policiesData, activeData]); - const chartData = viewMode === "guardrails" ? guardrailsData?.chart : policiesData?.chart; + }, [guardrailsData, activeData]); + const chartData = guardrailsData?.chart; const sorted = useMemo(() => { return [...activeData].sort((a, b) => { const mult = sortDir === "desc" ? -1 : 1; @@ -126,14 +91,12 @@ export function GuardrailsOverview({ return (Number(aVal) - Number(bVal)) * mult; }); }, [activeData, sortBy, sortDir]); - const isLoading = viewMode === "guardrails" ? guardrailsLoading : policiesLoading; - const error = viewMode === "guardrails" ? guardrailsError : policiesError; - - const isGuardrails = viewMode === "guardrails"; + const isLoading = guardrailsLoading; + const error = guardrailsError; const columns: ColumnsType = [ { - title: isGuardrails ? "Guardrail" : "Policy", + title: "Guardrail", dataIndex: "name", key: "name", render: (name: string, row) => ( @@ -236,12 +199,6 @@ export function GuardrailsOverview({ } }; - const handleRerun = () => { - if (rerunState !== "idle") return; - setRerunState("running"); - setTimeout(() => setRerunState("done"), 2500); - }; - return (
@@ -251,50 +208,16 @@ export function GuardrailsOverview({

Guardrails Monitor

- {isGuardrails - ? "Monitor guardrail performance across all requests" - : "Monitor policy enforcement across all requests"} + Monitor guardrail performance across all requests

- - {startDate} – {endDate} -
-
- - -
-
@@ -330,7 +253,7 @@ export function GuardrailsOverview({ @@ -350,12 +273,10 @@ export function GuardrailsOverview({
- {isGuardrails ? "Guardrail Performance" : "Policy Performance"} + Guardrail Performance

- {isGuardrails - ? "Click a guardrail to view details, logs, and configuration" - : "Click a policy to view details, logs, and configuration"} + Click a guardrail to view details, logs, and configuration

@@ -365,9 +286,6 @@ export function GuardrailsOverview({ onClick={() => setEvaluationModalOpen(true)} title="Evaluation settings" /> -
= { "vector-stores": "Manage vector databases for embeddings", new_usage: "View usage analytics and metrics", logs: "Access request and response logs", - "guardrails-monitor": "Monitor guardrail and policy performance and view logs", + "guardrails-monitor": "Monitor guardrail performance and view logs", users: "Manage internal user accounts and permissions", teams: "Create and manage teams for access control", organizations: "Manage organizations and their members", From 50f36d9ca6a585e196dcd7a4436c009083b0aa63 Mon Sep 17 00:00:00 2001 From: LeeJuOh <56071126+LeeJuOh@users.noreply.github.com> Date: Sun, 22 Feb 2026 12:35:06 +0900 Subject: [PATCH 33/86] fix(budget): fix timezone config lookup and replace hardcoded timezone map with ZoneInfo (#21754) * fix(budget): fix timezone config lookup and replace hardcoded timezone map with ZoneInfo * fix(budget): update stale docstring on get_budget_reset_time --- .../docs/proxy/budget_reset_and_tz.md | 2 + docs/my-website/sidebars.js | 1 + litellm/litellm_core_utils/duration_parser.py | 28 +++---- litellm/proxy/common_utils/timezone_utils.py | 18 ++-- .../test_duration_parser.py | 60 +++++++++++++- .../proxy/common_utils/test_timezone_utils.py | 83 +++++++++++++++++-- 6 files changed, 154 insertions(+), 38 deletions(-) diff --git a/docs/my-website/docs/proxy/budget_reset_and_tz.md b/docs/my-website/docs/proxy/budget_reset_and_tz.md index 340e33afe18..0fedff8be18 100644 --- a/docs/my-website/docs/proxy/budget_reset_and_tz.md +++ b/docs/my-website/docs/proxy/budget_reset_and_tz.md @@ -22,6 +22,8 @@ litellm_settings: This ensures that all budget resets happen at midnight in your specified timezone rather than in UTC. If no timezone is specified, UTC will be used by default. +Any valid [IANA timezone string](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) is supported (powered by Python's `zoneinfo` module). DST transitions are handled automatically. + Common timezone values: - `UTC` - Coordinated Universal Time diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index be5fcd3313f..992ed7c3a3c 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -417,6 +417,7 @@ const sidebars = { "proxy/dynamic_rate_limit", "proxy/rate_limit_tiers", "proxy/temporary_budget_increase", + "proxy/budget_reset_and_tz", ], }, "proxy/caching", diff --git a/litellm/litellm_core_utils/duration_parser.py b/litellm/litellm_core_utils/duration_parser.py index 9a317cfcf0d..70c28c4e067 100644 --- a/litellm/litellm_core_utils/duration_parser.py +++ b/litellm/litellm_core_utils/duration_parser.py @@ -8,8 +8,9 @@ duration_in_seconds is used in diff parts of the code base, example import re import time -from datetime import datetime, timedelta, timezone +from datetime import datetime, timedelta, timezone, tzinfo from typing import Optional, Tuple +from zoneinfo import ZoneInfo def _extract_from_regex(duration: str) -> Tuple[int, str]: @@ -116,7 +117,7 @@ def get_next_standardized_reset_time( - Next reset time at a standardized interval in the specified timezone """ # Set up timezone and normalize current time - current_time, timezone = _setup_timezone(current_time, timezone_str) + current_time, tz = _setup_timezone(current_time, timezone_str) # Parse duration value, unit = _parse_duration(duration) @@ -131,7 +132,7 @@ def get_next_standardized_reset_time( # Handle different time units if unit == "d": - return _handle_day_reset(current_time, base_midnight, value, timezone) + return _handle_day_reset(current_time, base_midnight, value, tz) elif unit == "h": return _handle_hour_reset(current_time, base_midnight, value) elif unit == "m": @@ -147,22 +148,13 @@ def get_next_standardized_reset_time( def _setup_timezone( current_time: datetime, timezone_str: str = "UTC" -) -> Tuple[datetime, timezone]: +) -> Tuple[datetime, tzinfo]: """Set up timezone and normalize current time to that timezone.""" try: if timezone_str is None: - tz = timezone.utc + tz: tzinfo = timezone.utc else: - # Map common timezone strings to their UTC offsets - timezone_map = { - "US/Eastern": timezone(timedelta(hours=-4)), # EDT - "US/Pacific": timezone(timedelta(hours=-7)), # PDT - "Asia/Kolkata": timezone(timedelta(hours=5, minutes=30)), # IST - "Asia/Bangkok": timezone(timedelta(hours=7)), # ICT (Indochina Time) - "Europe/London": timezone(timedelta(hours=1)), # BST - "UTC": timezone.utc, - } - tz = timezone_map.get(timezone_str, timezone.utc) + tz = ZoneInfo(timezone_str) except Exception: # If timezone is invalid, fall back to UTC tz = timezone.utc @@ -190,7 +182,7 @@ def _parse_duration(duration: str) -> Tuple[Optional[int], Optional[str]]: def _handle_day_reset( - current_time: datetime, base_midnight: datetime, value: int, timezone: timezone + current_time: datetime, base_midnight: datetime, value: int, tz: tzinfo ) -> datetime: """Handle day-based reset times.""" # Handle zero value - immediate expiration @@ -215,7 +207,7 @@ def _handle_day_reset( minute=0, second=0, microsecond=0, - tzinfo=timezone, + tzinfo=tz, ) else: next_reset = datetime( @@ -226,7 +218,7 @@ def _handle_day_reset( minute=0, second=0, microsecond=0, - tzinfo=timezone, + tzinfo=tz, ) return next_reset else: # Custom day value - next interval is value days from current diff --git a/litellm/proxy/common_utils/timezone_utils.py b/litellm/proxy/common_utils/timezone_utils.py index a289e5328b2..700a9197f6f 100644 --- a/litellm/proxy/common_utils/timezone_utils.py +++ b/litellm/proxy/common_utils/timezone_utils.py @@ -1,27 +1,23 @@ from datetime import datetime, timezone +import litellm from litellm.litellm_core_utils.duration_parser import get_next_standardized_reset_time def get_budget_reset_timezone(): """ - Get the budget reset timezone from general_settings. + Get the budget reset timezone from litellm_settings. Falls back to UTC if not specified. + + litellm_settings values are set as attributes on the litellm module + by proxy_server.py at startup (via setattr(litellm, key, value)). """ - # Import at function level to avoid circular imports - from litellm.proxy.proxy_server import general_settings - - if general_settings: - litellm_settings = general_settings.get("litellm_settings", {}) - if litellm_settings and "timezone" in litellm_settings: - return litellm_settings["timezone"] - - return "UTC" + return getattr(litellm, "timezone", None) or "UTC" def get_budget_reset_time(budget_duration: str): """ - Get the budget reset time from general_settings. + Get the budget reset time based on the configured timezone. Falls back to UTC if not specified. """ diff --git a/tests/test_litellm/litellm_core_utils/test_duration_parser.py b/tests/test_litellm/litellm_core_utils/test_duration_parser.py index cebad07c07a..52316d4d97d 100644 --- a/tests/test_litellm/litellm_core_utils/test_duration_parser.py +++ b/tests/test_litellm/litellm_core_utils/test_duration_parser.py @@ -91,7 +91,9 @@ class TestStandardizedResetTime(unittest.TestCase): # Test Bangkok timezone (UTC+7): 5:30 AM next day, so next reset is midnight the day after bangkok = ZoneInfo("Asia/Bangkok") bangkok_expected = datetime(2023, 5, 17, 0, 0, 0, tzinfo=bangkok) - bangkok_result = get_next_standardized_reset_time("1d", base_time, "Asia/Bangkok") + bangkok_result = get_next_standardized_reset_time( + "1d", base_time, "Asia/Bangkok" + ) self.assertEqual(bangkok_result, bangkok_expected) def test_edge_cases(self): @@ -125,6 +127,62 @@ class TestStandardizedResetTime(unittest.TestCase): ) self.assertEqual(invalid_tz_result, invalid_tz_expected) + def test_iana_timezones_previously_unsupported(self): + """Test IANA timezones that were previously unsupported by the hardcoded map.""" + # Base time: 2023-05-15 15:00:00 UTC + base_time = datetime(2023, 5, 15, 15, 0, 0, tzinfo=timezone.utc) + + # Asia/Tokyo (UTC+9): 15:00 UTC = 00:00 JST May 16, exactly on midnight boundary → next day + tokyo = ZoneInfo("Asia/Tokyo") + tokyo_expected = datetime(2023, 5, 17, 0, 0, 0, tzinfo=tokyo) + tokyo_result = get_next_standardized_reset_time( + "1d", base_time, "Asia/Tokyo" + ) + self.assertEqual(tokyo_result, tokyo_expected) + + # Australia/Sydney (UTC+10): 2023-05-16 01:00 AEST + sydney = ZoneInfo("Australia/Sydney") + # At 15:00 UTC it's 01:00 AEST May 16 → next midnight is May 17 00:00 AEST + sydney_expected = datetime(2023, 5, 17, 0, 0, 0, tzinfo=sydney) + sydney_result = get_next_standardized_reset_time( + "1d", base_time, "Australia/Sydney" + ) + self.assertEqual(sydney_result, sydney_expected) + + # America/Chicago (UTC-5): at 15:00 UTC it's 10:00 CDT → next midnight is May 16 00:00 CDT + chicago = ZoneInfo("America/Chicago") + chicago_expected = datetime(2023, 5, 16, 0, 0, 0, tzinfo=chicago) + chicago_result = get_next_standardized_reset_time( + "1d", base_time, "America/Chicago" + ) + self.assertEqual(chicago_result, chicago_expected) + + def test_dst_fall_back(self): + """Test DST fall-back transition (clocks go back 1 hour).""" + # US/Eastern DST ends first Sunday of November 2023 (Nov 5) + # At 2023-11-05 05:30 UTC = 01:30 EDT (before fall-back) + # After fall-back at 06:00 UTC = 01:00 EST + pre_fallback = datetime(2023, 11, 5, 5, 30, 0, tzinfo=timezone.utc) + eastern = ZoneInfo("US/Eastern") + + # Daily reset: next midnight should be Nov 6 00:00 EST + expected = datetime(2023, 11, 6, 0, 0, 0, tzinfo=eastern) + result = get_next_standardized_reset_time("1d", pre_fallback, "US/Eastern") + self.assertEqual(result, expected) + + def test_dst_spring_forward(self): + """Test DST spring-forward transition (clocks go forward 1 hour).""" + # US/Eastern DST starts second Sunday of March 2023 (Mar 12) + # At 2023-03-12 06:30 UTC = 01:30 EST (before spring-forward) + # After spring-forward at 07:00 UTC = 03:00 EDT + pre_spring = datetime(2023, 3, 12, 6, 30, 0, tzinfo=timezone.utc) + eastern = ZoneInfo("US/Eastern") + + # Daily reset: next midnight should be Mar 13 00:00 EDT + expected = datetime(2023, 3, 13, 0, 0, 0, tzinfo=eastern) + result = get_next_standardized_reset_time("1d", pre_spring, "US/Eastern") + self.assertEqual(result, expected) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_litellm/proxy/common_utils/test_timezone_utils.py b/tests/test_litellm/proxy/common_utils/test_timezone_utils.py index fed96418f91..80b813226df 100644 --- a/tests/test_litellm/proxy/common_utils/test_timezone_utils.py +++ b/tests/test_litellm/proxy/common_utils/test_timezone_utils.py @@ -1,18 +1,17 @@ -import asyncio -import json import os import sys -import time -from datetime import datetime, timedelta, timezone - -import pytest -from fastapi.testclient import TestClient +from datetime import datetime, timezone +from zoneinfo import ZoneInfo sys.path.insert( 0, os.path.abspath("../../..") ) # Adds the parent directory to the system path -from litellm.proxy.common_utils.timezone_utils import get_budget_reset_time +import litellm +from litellm.proxy.common_utils.timezone_utils import ( + get_budget_reset_time, + get_budget_reset_timezone, +) def test_get_budget_reset_time(): @@ -33,3 +32,71 @@ def test_get_budget_reset_time(): # Verify budget_reset_at is set to first of next month assert get_budget_reset_time(budget_duration="1mo") == expected_reset_at + + +def test_get_budget_reset_timezone_reads_litellm_attr(): + """ + Test that get_budget_reset_timezone reads from litellm.timezone attribute. + """ + original = getattr(litellm, "timezone", None) + try: + litellm.timezone = "Asia/Tokyo" + assert get_budget_reset_timezone() == "Asia/Tokyo" + finally: + if original is None: + if hasattr(litellm, "timezone"): + delattr(litellm, "timezone") + else: + litellm.timezone = original + + +def test_get_budget_reset_timezone_fallback_utc(): + """ + Test that get_budget_reset_timezone falls back to UTC when litellm.timezone is not set. + """ + original = getattr(litellm, "timezone", None) + try: + if hasattr(litellm, "timezone"): + delattr(litellm, "timezone") + assert get_budget_reset_timezone() == "UTC" + finally: + if original is not None: + litellm.timezone = original + + +def test_get_budget_reset_timezone_fallback_on_none(): + """ + Test that get_budget_reset_timezone falls back to UTC when litellm.timezone is None. + """ + original = getattr(litellm, "timezone", None) + try: + litellm.timezone = None + assert get_budget_reset_timezone() == "UTC" + finally: + if original is None: + if hasattr(litellm, "timezone"): + delattr(litellm, "timezone") + else: + litellm.timezone = original + + +def test_get_budget_reset_time_respects_timezone(): + """ + Test that get_budget_reset_time uses the configured timezone for reset calculation. + A daily reset should align to midnight in the configured timezone. + """ + original = getattr(litellm, "timezone", None) + try: + litellm.timezone = "Asia/Tokyo" + reset_at = get_budget_reset_time(budget_duration="1d") + # The reset time should be midnight in Asia/Tokyo + tokyo_reset = reset_at.astimezone(ZoneInfo("Asia/Tokyo")) + assert tokyo_reset.hour == 0 + assert tokyo_reset.minute == 0 + assert tokyo_reset.second == 0 + finally: + if original is None: + if hasattr(litellm, "timezone"): + delattr(litellm, "timezone") + else: + litellm.timezone = original From 083c8998e616042db043fb34583f62d52ea94bf4 Mon Sep 17 00:00:00 2001 From: Monesh Ram <31161039+WhoisMonesh@users.noreply.github.com> Date: Sun, 22 Feb 2026 09:20:38 +0530 Subject: [PATCH 34/86] fix: add missing return type annotations to iterator protocol methods in streaming_handler (#21750) * fix: add return type annotations to iterator protocol methods in streaming_handler Add missing return type annotations to __iter__, __aiter__, __next__, and __anext__ methods in CustomStreamWrapper and related classes. - __iter__(self) -> Iterator["ModelResponseStream"] - __aiter__(self) -> AsyncIterator["ModelResponseStream"] - __next__(self) -> "ModelResponseStream" - __anext__(self) -> "ModelResponseStream" Also adds AsyncIterator and Iterator to typing imports. Fixes issue with PLR0915 noqa comments and ensures proper type checking support. Related to: BerriAI/litellm#8304 * fix: add ruff PLR0915 noqa for files with too many statements --- litellm/litellm_core_utils/streaming_handler.py | 10 +++++----- ruff.toml | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/litellm/litellm_core_utils/streaming_handler.py b/litellm/litellm_core_utils/streaming_handler.py index 1f739a60b40..6b83ded9d25 100644 --- a/litellm/litellm_core_utils/streaming_handler.py +++ b/litellm/litellm_core_utils/streaming_handler.py @@ -6,7 +6,7 @@ import logging import threading import time import traceback -from typing import Any, Callable, Dict, List, Optional, Union, cast +from typing import Any, AsyncIterator, Callable, Dict, Iterator, List, Optional, Union, cast import anyio import httpx @@ -151,10 +151,10 @@ class CustomStreamWrapper: self.is_function_call = self.check_is_function_call(logging_obj=logging_obj) self.created: Optional[int] = None - def __iter__(self): + def __iter__(self) -> Iterator["ModelResponseStream"]: return self - def __aiter__(self): + def __aiter__(self) -> AsyncIterator["ModelResponseStream"]: return self async def aclose(self): @@ -1726,7 +1726,7 @@ class CustomStreamWrapper: model_response.choices[0].finish_reason = "tool_calls" return model_response - def __next__(self): # noqa: PLR0915 + def __next__(self) -> "ModelResponseStream": # noqa: PLR0915 cache_hit = False if ( self.custom_llm_provider is not None @@ -1900,7 +1900,7 @@ class CustomStreamWrapper: return self.completion_stream - async def __anext__(self): # noqa: PLR0915 + async def __anext__(self) -> "ModelResponseStream": # noqa: PLR0915 cache_hit = False if ( self.custom_llm_provider is not None diff --git a/ruff.toml b/ruff.toml index a3104466710..43ff802a684 100644 --- a/ruff.toml +++ b/ruff.toml @@ -12,4 +12,7 @@ exclude = ["litellm/types/*", "litellm/__init__.py", "litellm/proxy/example_conf "litellm/llms/anthropic/chat/__init__.py" = ["F401"] "litellm/llms/azure_ai/embed/__init__.py" = ["F401"] "litellm/llms/azure_ai/rerank/__init__.py" = ["F401"] -"litellm/llms/bedrock/chat/__init__.py" = ["F401"] \ No newline at end of file +"litellm/llms/bedrock/chat/__init__.py" = ["F401"] +"litellm/proxy/utils.py" = ["F401", "PLR0915"] +"litellm/proxy/guardrails/guardrail_hooks/litellm_content_filter/content_filter.py" = ["PLR0915"] +"litellm/proxy/guardrails/guardrail_hooks/guardrail_benchmarks/test_eval.py" = ["PLR0915"] From 66ccbe37cd5c07255f3c498b2f24e701a6a0fed8 Mon Sep 17 00:00:00 2001 From: Trevor Prater Date: Sat, 21 Feb 2026 22:51:28 -0500 Subject: [PATCH 35/86] Add gollem Go agent framework cookbook example (#21747) Show how to use gollem, a production Go agent framework, with LiteLLM proxy for multi-provider LLM access including tool use and streaming. --- cookbook/gollem_go_agent_framework/README.md | 119 ++++++++++++++++++ .../gollem_go_agent_framework/basic/main.go | 41 ++++++ cookbook/gollem_go_agent_framework/go.mod | 5 + cookbook/gollem_go_agent_framework/go.sum | 2 + .../proxy_config.yaml | 16 +++ .../streaming/main.go | 56 +++++++++ .../gollem_go_agent_framework/tools/main.go | 64 ++++++++++ 7 files changed, 303 insertions(+) create mode 100644 cookbook/gollem_go_agent_framework/README.md create mode 100644 cookbook/gollem_go_agent_framework/basic/main.go create mode 100644 cookbook/gollem_go_agent_framework/go.mod create mode 100644 cookbook/gollem_go_agent_framework/go.sum create mode 100644 cookbook/gollem_go_agent_framework/proxy_config.yaml create mode 100644 cookbook/gollem_go_agent_framework/streaming/main.go create mode 100644 cookbook/gollem_go_agent_framework/tools/main.go diff --git a/cookbook/gollem_go_agent_framework/README.md b/cookbook/gollem_go_agent_framework/README.md new file mode 100644 index 00000000000..729f985d086 --- /dev/null +++ b/cookbook/gollem_go_agent_framework/README.md @@ -0,0 +1,119 @@ +# Gollem Go Agent Framework with LiteLLM + +A working example showing how to use [gollem](https://github.com/fugue-labs/gollem), a production-grade Go agent framework, with LiteLLM as a proxy gateway. This lets Go developers access 100+ LLM providers through a single proxy while keeping compile-time type safety for tools and structured output. + +## Quick Start + +### 1. Start LiteLLM Proxy + +```bash +# Simple start with a single model +litellm --model gpt-4o + +# Or with the example config for multi-provider access +litellm --config proxy_config.yaml +``` + +### 2. Run the examples + +```bash +# Install Go dependencies +go mod tidy + +# Basic agent +go run ./basic + +# Agent with type-safe tools +go run ./tools + +# Streaming responses +go run ./streaming +``` + +## Configuration + +The included `proxy_config.yaml` sets up three providers through LiteLLM: + +```yaml +model_list: + - model_name: gpt-4o # OpenAI + - model_name: claude-sonnet # Anthropic + - model_name: gemini-pro # Google Vertex AI +``` + +Switch providers in Go by changing a single string — no code changes needed: + +```go +model := openai.NewLiteLLM("http://localhost:4000", + openai.WithModel("gpt-4o"), // OpenAI + // openai.WithModel("claude-sonnet"), // Anthropic + // openai.WithModel("gemini-pro"), // Google +) +``` + +## Examples + +### `basic/` — Basic Agent + +Connects gollem to LiteLLM and runs a simple prompt. Demonstrates the `NewLiteLLM` constructor and basic agent creation. + +### `tools/` — Type-Safe Tools + +Shows gollem's compile-time type-safe tool framework working through LiteLLM's tool-use passthrough. The tool parameters are Go structs with JSON tags — the schema is generated automatically at compile time. + +### `streaming/` — Streaming Responses + +Real-time token streaming using Go 1.23+ range-over-function iterators, proxied through LiteLLM's SSE passthrough. + +## How It Works + +Gollem's `openai.NewLiteLLM()` constructor creates an OpenAI-compatible provider pointed at your LiteLLM proxy. Since LiteLLM speaks the OpenAI API protocol, everything works out of the box: + +- **Chat completions** — standard request/response +- **Tool use** — LiteLLM passes tool definitions and calls through transparently +- **Streaming** — Server-Sent Events proxied through LiteLLM +- **Structured output** — JSON schema response format works with supporting models + +``` +Go App (gollem) → LiteLLM Proxy → OpenAI / Anthropic / Google / ... +``` + +## Why Use This? + +- **Type-safe Go**: Compile-time type checking for tools, structured output, and agent configuration — no runtime surprises +- **Single proxy, many models**: Switch between OpenAI, Anthropic, Google, and 100+ other providers by changing a model name string +- **Zero-dependency core**: gollem's core has no external dependencies — just stdlib +- **Single binary deployment**: `go build` produces one binary, no pip/venv/Docker needed +- **Cost tracking & rate limiting**: LiteLLM handles cost tracking, rate limits, and fallbacks at the proxy layer + +## Environment Variables + +```bash +# Required for providers you want to use (set in LiteLLM config or env) +export OPENAI_API_KEY="sk-..." +export ANTHROPIC_API_KEY="sk-ant-..." + +# Optional: point to a non-default LiteLLM proxy +export LITELLM_PROXY_URL="http://localhost:4000" +``` + +## Troubleshooting + +**Connection errors?** +- Make sure LiteLLM is running: `litellm --model gpt-4o` +- Check the URL is correct (default: `http://localhost:4000`) + +**Model not found?** +- Verify the model name matches what's configured in LiteLLM +- Run `curl http://localhost:4000/models` to see available models + +**Tool calls not working?** +- Ensure the underlying model supports tool use (GPT-4o, Claude, Gemini) +- Check LiteLLM logs for any provider-specific errors + +## Learn More + +- [gollem GitHub](https://github.com/fugue-labs/gollem) +- [gollem API Reference](https://pkg.go.dev/github.com/fugue-labs/gollem/core) +- [LiteLLM Proxy Docs](https://docs.litellm.ai/docs/simple_proxy) +- [LiteLLM Supported Models](https://docs.litellm.ai/docs/providers) diff --git a/cookbook/gollem_go_agent_framework/basic/main.go b/cookbook/gollem_go_agent_framework/basic/main.go new file mode 100644 index 00000000000..838149a8ff9 --- /dev/null +++ b/cookbook/gollem_go_agent_framework/basic/main.go @@ -0,0 +1,41 @@ +// Basic gollem agent connected to a LiteLLM proxy. +// +// Usage: +// +// litellm --model gpt-4o # start proxy in another terminal +// go run ./basic +package main + +import ( + "context" + "fmt" + "log" + "os" + + "github.com/fugue-labs/gollem/core" + "github.com/fugue-labs/gollem/provider/openai" +) + +func main() { + proxyURL := "http://localhost:4000" + if u := os.Getenv("LITELLM_PROXY_URL"); u != "" { + proxyURL = u + } + + // Connect to LiteLLM proxy. NewLiteLLM creates an OpenAI-compatible + // provider pointed at the given URL. + model := openai.NewLiteLLM(proxyURL, + openai.WithModel("gpt-4o"), // any model name configured in LiteLLM + ) + + // Create and run a simple agent. + agent := core.NewAgent[string](model, + core.WithSystemPrompt[string]("You are a helpful assistant. Be concise."), + ) + + result, err := agent.Run(context.Background(), "Explain quantum computing in two sentences.") + if err != nil { + log.Fatal(err) + } + fmt.Println(result.Output) +} diff --git a/cookbook/gollem_go_agent_framework/go.mod b/cookbook/gollem_go_agent_framework/go.mod new file mode 100644 index 00000000000..89d9033aa22 --- /dev/null +++ b/cookbook/gollem_go_agent_framework/go.mod @@ -0,0 +1,5 @@ +module github.com/BerriAI/litellm/cookbook/gollem_go_agent_framework + +go 1.25.1 + +require github.com/fugue-labs/gollem v0.1.0 diff --git a/cookbook/gollem_go_agent_framework/go.sum b/cookbook/gollem_go_agent_framework/go.sum new file mode 100644 index 00000000000..1eb6c5ac9fc --- /dev/null +++ b/cookbook/gollem_go_agent_framework/go.sum @@ -0,0 +1,2 @@ +github.com/fugue-labs/gollem v0.1.0 h1:QexYnvkb44QZFEljgAePqMIGZjgsbk0Y5GJ2jYYgfa8= +github.com/fugue-labs/gollem v0.1.0/go.mod h1:htW1YO81uysSKVOkYJtxhGCFrzm+36HBFxEWuECoHKQ= diff --git a/cookbook/gollem_go_agent_framework/proxy_config.yaml b/cookbook/gollem_go_agent_framework/proxy_config.yaml new file mode 100644 index 00000000000..18265a002bc --- /dev/null +++ b/cookbook/gollem_go_agent_framework/proxy_config.yaml @@ -0,0 +1,16 @@ +model_list: + - model_name: gpt-4o + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY + + - model_name: claude-sonnet + litellm_params: + model: anthropic/claude-sonnet-4-20250514 + api_key: os.environ/ANTHROPIC_API_KEY + + - model_name: gemini-pro + litellm_params: + model: vertex_ai/gemini-2.0-flash + vertex_project: my-project + vertex_location: us-central1 diff --git a/cookbook/gollem_go_agent_framework/streaming/main.go b/cookbook/gollem_go_agent_framework/streaming/main.go new file mode 100644 index 00000000000..42bc9bbe34a --- /dev/null +++ b/cookbook/gollem_go_agent_framework/streaming/main.go @@ -0,0 +1,56 @@ +// Streaming responses from gollem through LiteLLM. +// +// Uses Go 1.23+ range-over-function iterators for real-time token +// streaming via LiteLLM's SSE passthrough. +// +// Usage: +// +// litellm --model gpt-4o +// go run ./streaming +package main + +import ( + "context" + "fmt" + "log" + "os" + + "github.com/fugue-labs/gollem/core" + "github.com/fugue-labs/gollem/provider/openai" +) + +func main() { + proxyURL := "http://localhost:4000" + if u := os.Getenv("LITELLM_PROXY_URL"); u != "" { + proxyURL = u + } + + model := openai.NewLiteLLM(proxyURL, + openai.WithModel("gpt-4o"), + ) + + agent := core.NewAgent[string](model) + + // RunStream returns a streaming result that yields tokens as they arrive. + stream, err := agent.RunStream(context.Background(), "Write a haiku about distributed systems") + if err != nil { + log.Fatal(err) + } + + // StreamText yields text chunks in real-time. + // The boolean argument controls whether deltas (true) or accumulated + // text (false) is returned. + fmt.Print("Response: ") + for text, err := range stream.StreamText(true) { + if err != nil { + log.Fatal(err) + } + fmt.Print(text) + } + fmt.Println() + + // After streaming completes, the final response is available. + resp := stream.Response() + fmt.Printf("\nTokens used: input=%d, output=%d\n", + resp.Usage.InputTokens, resp.Usage.OutputTokens) +} diff --git a/cookbook/gollem_go_agent_framework/tools/main.go b/cookbook/gollem_go_agent_framework/tools/main.go new file mode 100644 index 00000000000..ed41a95ffef --- /dev/null +++ b/cookbook/gollem_go_agent_framework/tools/main.go @@ -0,0 +1,64 @@ +// Gollem agent with type-safe tools through LiteLLM. +// +// The tool parameters are Go structs — gollem generates the JSON schema +// automatically at compile time. LiteLLM passes tool definitions through +// transparently to the underlying provider. +// +// Usage: +// +// litellm --model gpt-4o +// go run ./tools +package main + +import ( + "context" + "fmt" + "log" + "os" + + "github.com/fugue-labs/gollem/core" + "github.com/fugue-labs/gollem/provider/openai" +) + +// WeatherParams defines the tool's input schema via struct tags. +// The JSON schema is generated at compile time — no runtime reflection needed. +type WeatherParams struct { + City string `json:"city" description:"City name to get weather for"` + Unit string `json:"unit,omitempty" description:"Temperature unit: celsius or fahrenheit"` +} + +func main() { + proxyURL := "http://localhost:4000" + if u := os.Getenv("LITELLM_PROXY_URL"); u != "" { + proxyURL = u + } + + model := openai.NewLiteLLM(proxyURL, + openai.WithModel("gpt-4o"), + ) + + // Define a type-safe tool. The function signature enforces correct types. + weatherTool := core.FuncTool[WeatherParams]( + "get_weather", + "Get current weather for a city", + func(ctx context.Context, p WeatherParams) (string, error) { + unit := p.Unit + if unit == "" { + unit = "fahrenheit" + } + // In production, call a real weather API here. + return fmt.Sprintf("Weather in %s: 72°F (22°C), sunny", p.City), nil + }, + ) + + agent := core.NewAgent[string](model, + core.WithTools[string](weatherTool), + core.WithSystemPrompt[string]("You are a helpful weather assistant. Use the get_weather tool to answer weather questions."), + ) + + result, err := agent.Run(context.Background(), "What's the weather like in San Francisco and Tokyo?") + if err != nil { + log.Fatal(err) + } + fmt.Println(result.Output) +} From 4fc11f6fac7c0244f108bafe6206680e032a6e43 Mon Sep 17 00:00:00 2001 From: The Mavik <179817126+themavik@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:52:30 -0500 Subject: [PATCH 36/86] fix: avoid mutating caller-owned dicts in SpendUpdateQueue aggregation (#21742) From bce078a796174420951a3d973ea17e91b81afbbb Mon Sep 17 00:00:00 2001 From: Edwin Isac <33712823+edwiniac@users.noreply.github.com> Date: Sun, 22 Feb 2026 04:11:13 +0000 Subject: [PATCH 37/86] fix(vertex_ai): enable context-1m-2025-08-07 beta header (#21870) * server root path regression doc * fixing syntax * fix: replace Zapier webhook with Google Form for survey submission (#21621) * Replace Zapier webhook with Google Form for survey submission * Add back error logging for survey submission debugging --------- Co-authored-by: Ishaan Jaff * Revert "Merge pull request #21140 from BerriAI/litellm_perf_user_api_key_auth" This reverts commit 0e1db3f7e4dbfd622825cc2e936f29091232496d, reversing changes made to 7e2d6f2355d64885b590628ab998e868d3a84643. * test_vertex_ai_gemini_2_5_pro_streaming * UI new build * fix rendering * ui new build * docs fix * docs fix * docs fix * docs fix * docs fix * docs fix * docs fix * docs fix * release note docs * docs * adding image * fix(vertex_ai): enable context-1m-2025-08-07 beta header The `context-1m-2025-08-07` Anthropic beta header was set to `null` for vertex_ai, causing it to be filtered out when users set `extra_headers: {anthropic-beta: context-1m-2025-08-07}`. This prevented using Claude's 1M context window feature via Vertex AI, resulting in `prompt is too long: 460500 tokens > 200000 maximum` errors. Fixes #21861 --------- Co-authored-by: yuneng-jiang Co-authored-by: milan-berri Co-authored-by: Ishaan Jaff --- .../my-website/blog/server_root_path/index.md | 154 +++++++ docs/my-website/docs/proxy/config_settings.md | 2 +- .../docs/proxy/ui_store_model_db_setting.md | 92 ++++ .../release_notes/compliance_playground.png | Bin 0 -> 798714 bytes .../img/release_notes/guardrail_garden.png | Bin 0 -> 1272082 bytes docs/my-website/img/ui_store_model_in_db.png | Bin 0 -> 239242 bytes docs/my-website/release_notes/v1.81.14.md | 55 ++- docs/my-website/sidebars.js | 1 + litellm/anthropic_beta_headers_config.json | 2 +- litellm/proxy/_experimental/out/404.html | 2 +- .../_experimental/out/__next.__PAGE__.txt | 36 +- .../proxy/_experimental/out/__next._full.txt | 60 +-- .../proxy/_experimental/out/__next._head.txt | 2 +- .../proxy/_experimental/out/__next._index.txt | 4 +- .../proxy/_experimental/out/__next._tree.txt | 4 +- .../_buildManifest.js | 0 .../_clientMiddlewareManifest.json | 0 .../_ssgManifest.js | 0 .../_next/static/chunks/00bcc8d30dd19793.js | 9 - .../_next/static/chunks/00df334931105be9.js | 1 - .../_next/static/chunks/013791f8eba056fd.js | 8 - .../_next/static/chunks/04b9c7b5c33ea26c.js | 14 - .../_next/static/chunks/063c4474b4beb936.js | 8 - .../_next/static/chunks/06aaedbe7d27898c.js | 1 - .../_next/static/chunks/07e257472238fd0e.js | 1 - .../_next/static/chunks/0873952ac15e4eda.js | 1 - .../_next/static/chunks/0877ad95251adcc7.js | 8 + .../_next/static/chunks/0ae850c6a86fef44.js | 1 - .../_next/static/chunks/0e2a627a54136dda.js | 50 --- .../_next/static/chunks/0eb4f11affd32b85.js | 1 + .../_next/static/chunks/0f65c6f511745d11.js | 420 ++++++++++++++++++ .../_next/static/chunks/10a902acb31b2e0d.js | 1 + .../_next/static/chunks/131c959876d0fbc6.js | 420 ------------------ .../_next/static/chunks/148ed2f1e722cc27.js | 1 - .../_next/static/chunks/179f4b987bc9083f.js | 9 - .../_next/static/chunks/1ab49d0a71eaa7f0.js | 1 + .../_next/static/chunks/1b40e5377564c6e9.js | 8 + .../_next/static/chunks/1bda0a8545f524a8.js | 10 - .../_next/static/chunks/1c3ccfb809d00076.js | 1 + .../_next/static/chunks/1df04fce056b1606.js | 13 - .../_next/static/chunks/1e3e256f7c177b58.js | 1 + ...ff5d03760926304.js => 1e3e6ea855e21aa3.js} | 2 +- .../_next/static/chunks/1ff47604985886e0.css | 1 + .../_next/static/chunks/22e715061d511345.js | 8 - .../_next/static/chunks/24b1d0970a71eaa1.js | 1 + ...a0f96889fbb9021.js => 278a1de8e6555996.js} | 6 +- .../_next/static/chunks/2a96aa35a3c0aa80.js | 8 - .../_next/static/chunks/2b91e23827b21f65.js | 20 + .../_next/static/chunks/2b9358c932fd9753.js | 1 - .../_next/static/chunks/2ccb447933a8122b.js | 8 - .../_next/static/chunks/2ce4aba43ddc02ec.js | 1 + .../_next/static/chunks/31d797c1b30c0a76.js | 1 - .../_next/static/chunks/3232b8a775f194ea.js | 8 + .../_next/static/chunks/338d41628ba80ec8.js | 8 + .../_next/static/chunks/36f6bacb770de079.js | 1 + .../_next/static/chunks/38efda5fb5457a02.js | 139 ------ .../_next/static/chunks/3dad14bcec641ba8.js | 1 - .../_next/static/chunks/403c4d96324c23a6.js | 3 - .../_next/static/chunks/40cea13171651d2e.js | 1 - .../_next/static/chunks/4281af5566e202f8.js | 1 - .../_next/static/chunks/4295f0690f1c5527.js | 1 - ...9c5ec09d0df41c1.js => 457923c551f21385.js} | 2 +- .../_next/static/chunks/476e3c64fbdd0295.js | 1 + .../_next/static/chunks/47812e8f19218c74.js | 50 +++ .../_next/static/chunks/4a0199c823d1ff8f.js | 68 +++ .../_next/static/chunks/4ab1b6582817a6eb.js | 20 + .../_next/static/chunks/4bacf5b9194c12f5.js | 8 - .../_next/static/chunks/4cc34359818f7847.js | 8 + .../_next/static/chunks/4da7cf3c63e7b9db.js | 68 --- .../_next/static/chunks/52f256b7c39350f9.js | 1 + .../_next/static/chunks/540b445b4cb775e3.js | 8 + .../_next/static/chunks/55e0c41de154ca8e.js | 8 - ...e3d841f0d8baf2e.js => 56cd14cefec1b147.js} | 2 +- ...56949df41a6c0d3.js => 57d30d98b42689ea.js} | 2 +- .../_next/static/chunks/58a1502950d2f12a.js | 3 - .../_next/static/chunks/58b9eb1766fba8e0.js | 7 - .../_next/static/chunks/58daa1d381447b72.js | 1 - .../_next/static/chunks/592a03684f0c75fd.js | 8 + .../_next/static/chunks/5a9194d7fc126b21.js | 1 + .../_next/static/chunks/5b42dfb88ddfa23d.js | 420 ++++++++++++++++++ .../_next/static/chunks/5c46c54ae5ab3d73.js | 1 - .../_next/static/chunks/5d6c9ec8732873a6.js | 8 - .../_next/static/chunks/6008d176e68995d6.js | 1 - .../_next/static/chunks/6497ed335970f492.js | 1 + .../_next/static/chunks/64b1f13d4ef36bcd.js | 1 + .../_next/static/chunks/6b76fc805db3ea11.js | 1 - .../_next/static/chunks/6c2eab534e6a69a5.js | 1 - .../_next/static/chunks/6d587e6e43260fc9.js | 19 - .../_next/static/chunks/6dfb975743c55a98.js | 1 - .../_next/static/chunks/6f705707ca004fa6.js | 1 + .../_next/static/chunks/717233091bfa29a6.js | 10 + .../_next/static/chunks/720b47e35ef3d83a.js | 8 + ...1fe71b9ff3d3857.js => 73697e4eb83777c8.js} | 4 +- .../_next/static/chunks/7417b5cecc8f4ba2.js | 1 - .../_next/static/chunks/772d9e0b7b90b1e1.js | 1 - .../_next/static/chunks/7e2badb3d178f837.js | 13 - .../_next/static/chunks/7e66968a1ed1e0c9.js | 1 - .../_next/static/chunks/7f5b214481b0bc95.js | 1 - .../_next/static/chunks/80cc92b61f21698a.js | 1 + .../_next/static/chunks/811d7b3b40758701.js | 420 ++++++++++++++++++ .../_next/static/chunks/814136f5b55e06b6.js | 7 - .../_next/static/chunks/81466417d229213f.js | 1 - .../_next/static/chunks/82a75ea89bd8d55d.js | 1 - .../_next/static/chunks/83a5841d85931760.js | 1 + .../_next/static/chunks/83d2edfc9086942f.js | 1 + .../_next/static/chunks/88d4acdde699779d.js | 1 + .../_next/static/chunks/89cba401d0979021.js | 1 + .../_next/static/chunks/8bf5d2710ad7f6b1.js | 1 + .../_next/static/chunks/8d3de418d4b67739.js | 1 - .../_next/static/chunks/8e31c5afcd2ccfcd.js | 18 + .../_next/static/chunks/8f205045de362d9f.js | 1 - .../_next/static/chunks/8ffa484671f88254.js | 1 - .../_next/static/chunks/90218b86957c5a75.js | 1 + .../_next/static/chunks/90ee99692db4fdaa.js | 1 + .../_next/static/chunks/91b2e5616fe775a8.js | 1 + .../_next/static/chunks/92b07d01bfbc78ea.js | 7 - .../_next/static/chunks/937c3b6cb00f6b79.js | 13 - ...5519b15ee9dfcd1.js => 93a33e3820a464ce.js} | 2 +- .../_next/static/chunks/956e975295cc6331.js | 1 - .../_next/static/chunks/958b335e6da31445.js | 8 + .../_next/static/chunks/975de62a103e2bc2.js | 139 ++++++ .../_next/static/chunks/99d01a5f7d6db768.js | 1 - .../_next/static/chunks/9f5ccd929375c1d6.js | 1 - .../_next/static/chunks/9f8be55209f8aff2.js | 1 - .../_next/static/chunks/9ffb8ddd0c9a7c31.js | 3 + .../_next/static/chunks/a1ef280b7ad5ae6a.js | 3 - .../_next/static/chunks/a6cfcea694d68d1b.js | 8 + .../_next/static/chunks/a8281e1f02ce4cee.css | 1 - .../_next/static/chunks/a8ac8f0cd71dd2e6.js | 1 - .../_next/static/chunks/a90c60a34861f1ec.js | 8 + ...c18e240e0fdc6c4.js => a9600c08caec613f.js} | 2 +- .../_next/static/chunks/a98be772010c6af7.js | 1 + ...dab95b327d13b84.js => a9b0f0942dfdb3ee.js} | 2 +- .../_next/static/chunks/ab1b35ff5f0af938.js | 1 - .../_next/static/chunks/ac256ae3becff0a7.js | 1 + .../_next/static/chunks/ac66c498c502cf01.js | 14 + .../_next/static/chunks/ad68dd123ab47eda.js | 1 + .../_next/static/chunks/af8b8c7227c41b49.js | 8 - ...7189ca9cface593.js => b023cd29f09b6fc7.js} | 4 +- .../_next/static/chunks/b14f6d39cd6f12fc.js | 1 + ...ff6350cd6eb02b4.js => b172d3661e65f54b.js} | 2 +- .../_next/static/chunks/b318061c3c041888.js | 1 - .../_next/static/chunks/b3caf393f01d0f98.js | 1 + .../_next/static/chunks/b5ab158fc8ad0c88.js | 1 - .../_next/static/chunks/b5bcd87b218a6bcd.js | 14 - .../_next/static/chunks/b65782e2ef5a469d.js | 8 - .../_next/static/chunks/b7a98e208dfbbcc9.js | 8 + .../_next/static/chunks/b7b291b407b8400f.js | 1 + .../_next/static/chunks/ba1d40c8aeedbfd5.js | 7 + .../_next/static/chunks/bbb93bd1b7edfa3f.js | 420 ------------------ .../_next/static/chunks/bbfde407e540e659.js | 1 + .../_next/static/chunks/be706efe6db7c06c.js | 1 - .../_next/static/chunks/c19eccfe4b4f6856.js | 1 - .../_next/static/chunks/c2a897bcd410d954.js | 8 - .../_next/static/chunks/c46a2d7a0a0cab48.js | 1 + .../_next/static/chunks/c5f6f339440a93cb.js | 1 - .../_next/static/chunks/c6cd168c5215f7e7.js | 7 - .../_next/static/chunks/c95c1ec38f9d4c79.js | 1 + .../_next/static/chunks/c9af2deb434988d6.js | 8 - .../_next/static/chunks/cd958f5b81d510b6.js | 7 + .../_next/static/chunks/cda0969cf986d041.js | 1 + .../_next/static/chunks/cda9c71f326222ec.js | 1 + .../_next/static/chunks/d0143a75ff364adb.js | 9 + .../_next/static/chunks/d296e3f8663b2fcc.js | 8 + .../_next/static/chunks/d4010df7b41ffdaa.js | 17 + .../_next/static/chunks/d41ad237324aaa9a.js | 1 - .../_next/static/chunks/d979defcb5b51fb7.js | 1 - .../_next/static/chunks/db289f8142125d7b.js | 8 + .../_next/static/chunks/dd3c6f03e70836b7.js | 1 + .../_next/static/chunks/de549aab31d7e497.js | 8 + .../_next/static/chunks/dea8a22e13558d5a.js | 7 + .../_next/static/chunks/e6df12b11e20fa72.js | 9 + .../_next/static/chunks/e8e8ef5d40e83b74.js | 8 - .../_next/static/chunks/eb216e95be4f4952.js | 8 + .../_next/static/chunks/ecfa5dc44961a613.js | 8 - .../_next/static/chunks/ee9da31e3fc0f75c.js | 17 + .../_next/static/chunks/f3f9faa52461e16e.js | 1 + .../_next/static/chunks/f788f211d4f3bff2.js | 1 + .../_next/static/chunks/f94c765da6666d2c.js | 1 + ...d085736c47d6c25.js => f9641e47d9945775.js} | 2 +- .../_next/static/chunks/fac62984f95a8469.js | 7 + .../_next/static/chunks/fb981bf7548d9de3.js | 2 - .../_next/static/chunks/fd04bd81ed67693a.js | 17 + .../_next/static/chunks/fe1ed23b45deb0ac.js | 17 - .../_next/static/chunks/fea7bf620826260d.js | 1 + .../_next/static/chunks/fef260cdb9ba302d.js | 1 - .../_next/static/chunks/ff105fb4146c7cee.js | 420 ------------------ .../_next/static/chunks/ff281977829cf637.js | 1 + .../_next/static/chunks/ffd416b6dab7092c.js | 12 - .../proxy/_experimental/out/_not-found.html | 2 +- .../proxy/_experimental/out/_not-found.txt | 4 +- .../out/_not-found/__next._full.txt | 4 +- .../out/_not-found/__next._head.txt | 2 +- .../out/_not-found/__next._index.txt | 4 +- .../_not-found/__next._not-found.__PAGE__.txt | 2 +- .../out/_not-found/__next._not-found.txt | 2 +- .../out/_not-found/__next._tree.txt | 4 +- .../_experimental/out/api-reference.html | 2 +- .../proxy/_experimental/out/api-reference.txt | 10 +- ...KGRhc2hib2FyZCk.api-reference.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.api-reference.txt | 2 +- .../api-reference/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/api-reference/__next._full.txt | 10 +- .../out/api-reference/__next._head.txt | 2 +- .../out/api-reference/__next._index.txt | 4 +- .../out/api-reference/__next._tree.txt | 4 +- .../out/experimental/api-playground.html | 2 +- .../out/experimental/api-playground.txt | 8 +- ...k.experimental.api-playground.__PAGE__.txt | 4 +- ...2hib2FyZCk.experimental.api-playground.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../api-playground/__next._full.txt | 8 +- .../api-playground/__next._head.txt | 2 +- .../api-playground/__next._index.txt | 4 +- .../api-playground/__next._tree.txt | 4 +- .../out/experimental/budgets.html | 2 +- .../out/experimental/budgets.txt | 10 +- ...ib2FyZCk.experimental.budgets.__PAGE__.txt | 4 +- ....!KGRhc2hib2FyZCk.experimental.budgets.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../budgets/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/experimental/budgets/__next._full.txt | 10 +- .../out/experimental/budgets/__next._head.txt | 2 +- .../experimental/budgets/__next._index.txt | 4 +- .../out/experimental/budgets/__next._tree.txt | 4 +- .../out/experimental/caching.html | 2 +- .../out/experimental/caching.txt | 8 +- ...ib2FyZCk.experimental.caching.__PAGE__.txt | 4 +- ....!KGRhc2hib2FyZCk.experimental.caching.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../caching/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/experimental/caching/__next._full.txt | 8 +- .../out/experimental/caching/__next._head.txt | 2 +- .../experimental/caching/__next._index.txt | 4 +- .../out/experimental/caching/__next._tree.txt | 4 +- .../out/experimental/claude-code-plugins.html | 2 +- .../out/experimental/claude-code-plugins.txt | 8 +- ...erimental.claude-code-plugins.__PAGE__.txt | 4 +- ...FyZCk.experimental.claude-code-plugins.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../claude-code-plugins/__next._full.txt | 8 +- .../claude-code-plugins/__next._head.txt | 2 +- .../claude-code-plugins/__next._index.txt | 4 +- .../claude-code-plugins/__next._tree.txt | 4 +- .../out/experimental/old-usage.html | 2 +- .../out/experimental/old-usage.txt | 10 +- ...2FyZCk.experimental.old-usage.__PAGE__.txt | 4 +- ...KGRhc2hib2FyZCk.experimental.old-usage.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../old-usage/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../experimental/old-usage/__next._full.txt | 10 +- .../experimental/old-usage/__next._head.txt | 2 +- .../experimental/old-usage/__next._index.txt | 4 +- .../experimental/old-usage/__next._tree.txt | 4 +- .../out/experimental/prompts.html | 2 +- .../out/experimental/prompts.txt | 10 +- ...ib2FyZCk.experimental.prompts.__PAGE__.txt | 4 +- ....!KGRhc2hib2FyZCk.experimental.prompts.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../prompts/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/experimental/prompts/__next._full.txt | 10 +- .../out/experimental/prompts/__next._head.txt | 2 +- .../experimental/prompts/__next._index.txt | 4 +- .../out/experimental/prompts/__next._tree.txt | 4 +- .../out/experimental/tag-management.html | 2 +- .../out/experimental/tag-management.txt | 10 +- ...k.experimental.tag-management.__PAGE__.txt | 4 +- ...2hib2FyZCk.experimental.tag-management.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.experimental.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../tag-management/__next._full.txt | 10 +- .../tag-management/__next._head.txt | 2 +- .../tag-management/__next._index.txt | 4 +- .../tag-management/__next._tree.txt | 4 +- .../proxy/_experimental/out/guardrails.html | 2 +- .../proxy/_experimental/out/guardrails.txt | 10 +- ...t.!KGRhc2hib2FyZCk.guardrails.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.guardrails.txt | 2 +- .../guardrails/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/guardrails/__next._full.txt | 10 +- .../out/guardrails/__next._head.txt | 2 +- .../out/guardrails/__next._index.txt | 4 +- .../out/guardrails/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 60 +-- litellm/proxy/_experimental/out/login.html | 2 +- litellm/proxy/_experimental/out/login.txt | 6 +- .../_experimental/out/login/__next._full.txt | 6 +- .../_experimental/out/login/__next._head.txt | 2 +- .../_experimental/out/login/__next._index.txt | 4 +- .../_experimental/out/login/__next._tree.txt | 4 +- .../out/login/__next.login.__PAGE__.txt | 4 +- .../_experimental/out/login/__next.login.txt | 2 +- litellm/proxy/_experimental/out/logs.html | 2 +- litellm/proxy/_experimental/out/logs.txt | 10 +- .../__next.!KGRhc2hib2FyZCk.logs.__PAGE__.txt | 4 +- .../out/logs/__next.!KGRhc2hib2FyZCk.logs.txt | 2 +- .../out/logs/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../_experimental/out/logs/__next._full.txt | 10 +- .../_experimental/out/logs/__next._head.txt | 2 +- .../_experimental/out/logs/__next._index.txt | 4 +- .../_experimental/out/logs/__next._tree.txt | 4 +- .../_experimental/out/mcp/oauth/callback.html | 2 +- .../_experimental/out/mcp/oauth/callback.txt | 4 +- .../out/mcp/oauth/callback/__next._full.txt | 4 +- .../out/mcp/oauth/callback/__next._head.txt | 2 +- .../out/mcp/oauth/callback/__next._index.txt | 4 +- .../out/mcp/oauth/callback/__next._tree.txt | 4 +- .../__next.mcp.oauth.callback.__PAGE__.txt | 2 +- .../callback/__next.mcp.oauth.callback.txt | 2 +- .../mcp/oauth/callback/__next.mcp.oauth.txt | 2 +- .../out/mcp/oauth/callback/__next.mcp.txt | 2 +- .../proxy/_experimental/out/model-hub.html | 2 +- litellm/proxy/_experimental/out/model-hub.txt | 10 +- ...xt.!KGRhc2hib2FyZCk.model-hub.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.model-hub.txt | 2 +- .../out/model-hub/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/model-hub/__next._full.txt | 10 +- .../out/model-hub/__next._head.txt | 2 +- .../out/model-hub/__next._index.txt | 4 +- .../out/model-hub/__next._tree.txt | 4 +- .../proxy/_experimental/out/model_hub.html | 2 +- litellm/proxy/_experimental/out/model_hub.txt | 6 +- .../out/model_hub/__next._full.txt | 6 +- .../out/model_hub/__next._head.txt | 2 +- .../out/model_hub/__next._index.txt | 4 +- .../out/model_hub/__next._tree.txt | 4 +- .../model_hub/__next.model_hub.__PAGE__.txt | 4 +- .../out/model_hub/__next.model_hub.txt | 2 +- .../_experimental/out/model_hub_table.html | 2 +- .../_experimental/out/model_hub_table.txt | 16 +- .../out/model_hub_table/__next._full.txt | 16 +- .../out/model_hub_table/__next._head.txt | 2 +- .../out/model_hub_table/__next._index.txt | 4 +- .../out/model_hub_table/__next._tree.txt | 4 +- .../__next.model_hub_table.__PAGE__.txt | 4 +- .../__next.model_hub_table.txt | 2 +- .../out/models-and-endpoints.html | 2 +- .../out/models-and-endpoints.txt | 10 +- ...ib2FyZCk.models-and-endpoints.__PAGE__.txt | 4 +- ....!KGRhc2hib2FyZCk.models-and-endpoints.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/models-and-endpoints/__next._full.txt | 10 +- .../out/models-and-endpoints/__next._head.txt | 2 +- .../models-and-endpoints/__next._index.txt | 4 +- .../out/models-and-endpoints/__next._tree.txt | 4 +- .../proxy/_experimental/out/onboarding.html | 2 +- .../proxy/_experimental/out/onboarding.txt | 6 +- .../out/onboarding/__next._full.txt | 6 +- .../out/onboarding/__next._head.txt | 2 +- .../out/onboarding/__next._index.txt | 4 +- .../out/onboarding/__next._tree.txt | 4 +- .../onboarding/__next.onboarding.__PAGE__.txt | 4 +- .../out/onboarding/__next.onboarding.txt | 2 +- .../_experimental/out/organizations.html | 2 +- .../proxy/_experimental/out/organizations.txt | 10 +- ...KGRhc2hib2FyZCk.organizations.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.organizations.txt | 2 +- .../organizations/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/organizations/__next._full.txt | 10 +- .../out/organizations/__next._head.txt | 2 +- .../out/organizations/__next._index.txt | 4 +- .../out/organizations/__next._tree.txt | 4 +- .../proxy/_experimental/out/playground.html | 2 +- .../proxy/_experimental/out/playground.txt | 10 +- ...t.!KGRhc2hib2FyZCk.playground.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.playground.txt | 2 +- .../playground/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/playground/__next._full.txt | 10 +- .../out/playground/__next._head.txt | 2 +- .../out/playground/__next._index.txt | 4 +- .../out/playground/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/policies.html | 2 +- litellm/proxy/_experimental/out/policies.txt | 10 +- ...ext.!KGRhc2hib2FyZCk.policies.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.policies.txt | 2 +- .../out/policies/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/policies/__next._full.txt | 10 +- .../out/policies/__next._head.txt | 2 +- .../out/policies/__next._index.txt | 4 +- .../out/policies/__next._tree.txt | 4 +- .../out/settings/admin-settings.html | 2 +- .../out/settings/admin-settings.txt | 10 +- ...FyZCk.settings.admin-settings.__PAGE__.txt | 4 +- ...GRhc2hib2FyZCk.settings.admin-settings.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.settings.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../settings/admin-settings/__next._full.txt | 10 +- .../settings/admin-settings/__next._head.txt | 2 +- .../settings/admin-settings/__next._index.txt | 4 +- .../settings/admin-settings/__next._tree.txt | 4 +- .../out/settings/logging-and-alerts.html | 2 +- .../out/settings/logging-and-alerts.txt | 10 +- ...k.settings.logging-and-alerts.__PAGE__.txt | 4 +- ...2hib2FyZCk.settings.logging-and-alerts.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.settings.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../logging-and-alerts/__next._full.txt | 10 +- .../logging-and-alerts/__next._head.txt | 2 +- .../logging-and-alerts/__next._index.txt | 4 +- .../logging-and-alerts/__next._tree.txt | 4 +- .../out/settings/router-settings.html | 2 +- .../out/settings/router-settings.txt | 10 +- ...yZCk.settings.router-settings.__PAGE__.txt | 4 +- ...Rhc2hib2FyZCk.settings.router-settings.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.settings.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.txt | 4 +- .../settings/router-settings/__next._full.txt | 10 +- .../settings/router-settings/__next._head.txt | 2 +- .../router-settings/__next._index.txt | 4 +- .../settings/router-settings/__next._tree.txt | 4 +- .../_experimental/out/settings/ui-theme.html | 2 +- .../_experimental/out/settings/ui-theme.txt | 8 +- .../__next.!KGRhc2hib2FyZCk.settings.txt | 2 +- ...c2hib2FyZCk.settings.ui-theme.__PAGE__.txt | 4 +- ...ext.!KGRhc2hib2FyZCk.settings.ui-theme.txt | 2 +- .../ui-theme/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/settings/ui-theme/__next._full.txt | 8 +- .../out/settings/ui-theme/__next._head.txt | 2 +- .../out/settings/ui-theme/__next._index.txt | 4 +- .../out/settings/ui-theme/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/teams.html | 2 +- litellm/proxy/_experimental/out/teams.txt | 10 +- ...__next.!KGRhc2hib2FyZCk.teams.__PAGE__.txt | 4 +- .../teams/__next.!KGRhc2hib2FyZCk.teams.txt | 2 +- .../out/teams/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../_experimental/out/teams/__next._full.txt | 10 +- .../_experimental/out/teams/__next._head.txt | 2 +- .../_experimental/out/teams/__next._index.txt | 4 +- .../_experimental/out/teams/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/test-key.html | 2 +- litellm/proxy/_experimental/out/test-key.txt | 10 +- ...ext.!KGRhc2hib2FyZCk.test-key.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.test-key.txt | 2 +- .../out/test-key/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/test-key/__next._full.txt | 10 +- .../out/test-key/__next._head.txt | 2 +- .../out/test-key/__next._index.txt | 4 +- .../out/test-key/__next._tree.txt | 4 +- .../_experimental/out/tools/mcp-servers.html | 2 +- .../_experimental/out/tools/mcp-servers.txt | 10 +- ...c2hib2FyZCk.tools.mcp-servers.__PAGE__.txt | 4 +- ...ext.!KGRhc2hib2FyZCk.tools.mcp-servers.txt | 2 +- .../__next.!KGRhc2hib2FyZCk.tools.txt | 2 +- .../mcp-servers/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/tools/mcp-servers/__next._full.txt | 10 +- .../out/tools/mcp-servers/__next._head.txt | 2 +- .../out/tools/mcp-servers/__next._index.txt | 4 +- .../out/tools/mcp-servers/__next._tree.txt | 4 +- .../out/tools/vector-stores.html | 2 +- .../_experimental/out/tools/vector-stores.txt | 10 +- .../__next.!KGRhc2hib2FyZCk.tools.txt | 2 +- ...hib2FyZCk.tools.vector-stores.__PAGE__.txt | 4 +- ...t.!KGRhc2hib2FyZCk.tools.vector-stores.txt | 2 +- .../vector-stores/__next.!KGRhc2hib2FyZCk.txt | 4 +- .../out/tools/vector-stores/__next._full.txt | 10 +- .../out/tools/vector-stores/__next._head.txt | 2 +- .../out/tools/vector-stores/__next._index.txt | 4 +- .../out/tools/vector-stores/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/usage.html | 2 +- litellm/proxy/_experimental/out/usage.txt | 10 +- .../out/usage/__next.!KGRhc2hib2FyZCk.txt | 4 +- ...__next.!KGRhc2hib2FyZCk.usage.__PAGE__.txt | 4 +- .../usage/__next.!KGRhc2hib2FyZCk.usage.txt | 2 +- .../_experimental/out/usage/__next._full.txt | 10 +- .../_experimental/out/usage/__next._head.txt | 2 +- .../_experimental/out/usage/__next._index.txt | 4 +- .../_experimental/out/usage/__next._tree.txt | 4 +- litellm/proxy/_experimental/out/users.html | 2 +- litellm/proxy/_experimental/out/users.txt | 10 +- .../out/users/__next.!KGRhc2hib2FyZCk.txt | 4 +- ...__next.!KGRhc2hib2FyZCk.users.__PAGE__.txt | 4 +- .../users/__next.!KGRhc2hib2FyZCk.users.txt | 2 +- .../_experimental/out/users/__next._full.txt | 10 +- .../_experimental/out/users/__next._head.txt | 2 +- .../_experimental/out/users/__next._index.txt | 4 +- .../_experimental/out/users/__next._tree.txt | 4 +- .../proxy/_experimental/out/virtual-keys.html | 2 +- .../proxy/_experimental/out/virtual-keys.txt | 10 +- .../virtual-keys/__next.!KGRhc2hib2FyZCk.txt | 4 +- ...!KGRhc2hib2FyZCk.virtual-keys.__PAGE__.txt | 4 +- .../__next.!KGRhc2hib2FyZCk.virtual-keys.txt | 2 +- .../out/virtual-keys/__next._full.txt | 10 +- .../out/virtual-keys/__next._head.txt | 2 +- .../out/virtual-keys/__next._index.txt | 4 +- .../out/virtual-keys/__next._tree.txt | 4 +- litellm/proxy/_types.py | 5 - litellm/proxy/auth/route_checks.py | 6 +- litellm/proxy/auth/user_api_key_auth.py | 59 ++- .../proxy/common_utils/http_parsing_utils.py | 22 +- .../pass_through_endpoints.py | 7 +- .../test_amazing_vertex_completion.py | 37 +- .../proxy/auth/test_user_api_key_auth.py | 160 ------- .../common_utils/test_http_parsing_utils.py | 27 +- .../guardrails/guardrail_garden_card.tsx | 42 +- .../guardrails/guardrail_garden_data.ts | 36 +- .../guardrails/guardrail_info_helpers.tsx | 6 +- .../src/components/survey/SurveyModal.tsx | 26 +- 500 files changed, 3046 insertions(+), 2910 deletions(-) create mode 100644 docs/my-website/blog/server_root_path/index.md create mode 100644 docs/my-website/docs/proxy/ui_store_model_db_setting.md create mode 100644 docs/my-website/img/release_notes/compliance_playground.png create mode 100644 docs/my-website/img/release_notes/guardrail_garden.png create mode 100644 docs/my-website/img/ui_store_model_in_db.png rename litellm/proxy/_experimental/out/_next/static/{sukHOXb2ncKGxa6LyXV8M => 62sKsiTJhIKKiZmdKo1av}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{sukHOXb2ncKGxa6LyXV8M => 62sKsiTJhIKKiZmdKo1av}/_clientMiddlewareManifest.json (100%) rename litellm/proxy/_experimental/out/_next/static/{sukHOXb2ncKGxa6LyXV8M => 62sKsiTJhIKKiZmdKo1av}/_ssgManifest.js (100%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00bcc8d30dd19793.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/00df334931105be9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/013791f8eba056fd.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/04b9c7b5c33ea26c.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/063c4474b4beb936.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/06aaedbe7d27898c.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/07e257472238fd0e.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0873952ac15e4eda.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0877ad95251adcc7.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0ae850c6a86fef44.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0e2a627a54136dda.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0eb4f11affd32b85.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/0f65c6f511745d11.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/10a902acb31b2e0d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/131c959876d0fbc6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/148ed2f1e722cc27.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/179f4b987bc9083f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1ab49d0a71eaa7f0.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1b40e5377564c6e9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1bda0a8545f524a8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1c3ccfb809d00076.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1df04fce056b1606.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1e3e256f7c177b58.js rename litellm/proxy/_experimental/out/_next/static/chunks/{cff5d03760926304.js => 1e3e6ea855e21aa3.js} (90%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/1ff47604985886e0.css delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/22e715061d511345.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/24b1d0970a71eaa1.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0a0f96889fbb9021.js => 278a1de8e6555996.js} (77%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2a96aa35a3c0aa80.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2b91e23827b21f65.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2b9358c932fd9753.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2ccb447933a8122b.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/2ce4aba43ddc02ec.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/31d797c1b30c0a76.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3232b8a775f194ea.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/338d41628ba80ec8.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/36f6bacb770de079.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/38efda5fb5457a02.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/3dad14bcec641ba8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/403c4d96324c23a6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/40cea13171651d2e.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4281af5566e202f8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4295f0690f1c5527.js rename litellm/proxy/_experimental/out/_next/static/chunks/{d9c5ec09d0df41c1.js => 457923c551f21385.js} (92%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/476e3c64fbdd0295.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/47812e8f19218c74.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4a0199c823d1ff8f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4ab1b6582817a6eb.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4bacf5b9194c12f5.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4cc34359818f7847.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/4da7cf3c63e7b9db.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/52f256b7c39350f9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/540b445b4cb775e3.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/55e0c41de154ca8e.js rename litellm/proxy/_experimental/out/_next/static/chunks/{0e3d841f0d8baf2e.js => 56cd14cefec1b147.js} (63%) rename litellm/proxy/_experimental/out/_next/static/chunks/{856949df41a6c0d3.js => 57d30d98b42689ea.js} (90%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/58a1502950d2f12a.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/58b9eb1766fba8e0.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/58daa1d381447b72.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/592a03684f0c75fd.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/5a9194d7fc126b21.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/5b42dfb88ddfa23d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/5c46c54ae5ab3d73.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/5d6c9ec8732873a6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6008d176e68995d6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6497ed335970f492.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/64b1f13d4ef36bcd.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6b76fc805db3ea11.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6c2eab534e6a69a5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6d587e6e43260fc9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6dfb975743c55a98.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/6f705707ca004fa6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/717233091bfa29a6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/720b47e35ef3d83a.js rename litellm/proxy/_experimental/out/_next/static/chunks/{e1fe71b9ff3d3857.js => 73697e4eb83777c8.js} (68%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/7417b5cecc8f4ba2.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/772d9e0b7b90b1e1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/7e2badb3d178f837.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/7e66968a1ed1e0c9.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/7f5b214481b0bc95.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/80cc92b61f21698a.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/811d7b3b40758701.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/814136f5b55e06b6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/81466417d229213f.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/82a75ea89bd8d55d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/83a5841d85931760.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/83d2edfc9086942f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/88d4acdde699779d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/89cba401d0979021.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/8bf5d2710ad7f6b1.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/8d3de418d4b67739.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/8e31c5afcd2ccfcd.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/8f205045de362d9f.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/8ffa484671f88254.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/90218b86957c5a75.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/90ee99692db4fdaa.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/91b2e5616fe775a8.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/92b07d01bfbc78ea.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/937c3b6cb00f6b79.js rename litellm/proxy/_experimental/out/_next/static/chunks/{65519b15ee9dfcd1.js => 93a33e3820a464ce.js} (66%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/956e975295cc6331.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/958b335e6da31445.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/975de62a103e2bc2.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/99d01a5f7d6db768.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/9f5ccd929375c1d6.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/9f8be55209f8aff2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/9ffb8ddd0c9a7c31.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a1ef280b7ad5ae6a.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a6cfcea694d68d1b.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a8281e1f02ce4cee.css delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a8ac8f0cd71dd2e6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a90c60a34861f1ec.js rename litellm/proxy/_experimental/out/_next/static/chunks/{5c18e240e0fdc6c4.js => a9600c08caec613f.js} (81%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/a98be772010c6af7.js rename litellm/proxy/_experimental/out/_next/static/chunks/{7dab95b327d13b84.js => a9b0f0942dfdb3ee.js} (94%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ab1b35ff5f0af938.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ac256ae3becff0a7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ac66c498c502cf01.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ad68dd123ab47eda.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/af8b8c7227c41b49.js rename litellm/proxy/_experimental/out/_next/static/chunks/{a7189ca9cface593.js => b023cd29f09b6fc7.js} (57%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b14f6d39cd6f12fc.js rename litellm/proxy/_experimental/out/_next/static/chunks/{dff6350cd6eb02b4.js => b172d3661e65f54b.js} (56%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b318061c3c041888.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b3caf393f01d0f98.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b5ab158fc8ad0c88.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b5bcd87b218a6bcd.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b65782e2ef5a469d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b7a98e208dfbbcc9.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/b7b291b407b8400f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ba1d40c8aeedbfd5.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/bbb93bd1b7edfa3f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/bbfde407e540e659.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/be706efe6db7c06c.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c19eccfe4b4f6856.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c2a897bcd410d954.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c46a2d7a0a0cab48.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c5f6f339440a93cb.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c6cd168c5215f7e7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c95c1ec38f9d4c79.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/c9af2deb434988d6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/cd958f5b81d510b6.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/cda0969cf986d041.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/cda9c71f326222ec.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/d0143a75ff364adb.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/d296e3f8663b2fcc.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/d4010df7b41ffdaa.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/d41ad237324aaa9a.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/d979defcb5b51fb7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/db289f8142125d7b.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/dd3c6f03e70836b7.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/de549aab31d7e497.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/dea8a22e13558d5a.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/e6df12b11e20fa72.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/e8e8ef5d40e83b74.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/eb216e95be4f4952.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ecfa5dc44961a613.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ee9da31e3fc0f75c.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/f3f9faa52461e16e.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/f788f211d4f3bff2.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/f94c765da6666d2c.js rename litellm/proxy/_experimental/out/_next/static/chunks/{5d085736c47d6c25.js => f9641e47d9945775.js} (90%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fac62984f95a8469.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fb981bf7548d9de3.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fd04bd81ed67693a.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fe1ed23b45deb0ac.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fea7bf620826260d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/fef260cdb9ba302d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ff105fb4146c7cee.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ff281977829cf637.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/ffd416b6dab7092c.js diff --git a/docs/my-website/blog/server_root_path/index.md b/docs/my-website/blog/server_root_path/index.md new file mode 100644 index 00000000000..d7925baf6b4 --- /dev/null +++ b/docs/my-website/blog/server_root_path/index.md @@ -0,0 +1,154 @@ +--- +slug: server-root-path-incident +title: "Incident Report: SERVER_ROOT_PATH regression broke UI routing" +date: 2026-02-21T10:00:00 +authors: + - name: Yuneng Jiang + title: SWE @ LiteLLM (Full Stack) + url: https://www.linkedin.com/in/yunengjiang/ + - name: Ishaan Jaff + title: "CTO, LiteLLM" + url: https://www.linkedin.com/in/reffajnaahsi/ + image_url: https://pbs.twimg.com/profile_images/1613813310264340481/lz54oEiB_400x400.jpg + - name: Krrish Dholakia + title: "CEO, LiteLLM" + url: https://www.linkedin.com/in/krish-d/ + image_url: https://pbs.twimg.com/profile_images/1298587542745358340/DZv3Oj-h_400x400.jpg +tags: [incident-report, ui, stability] +hide_table_of_contents: false +--- + +**Date:** January 22, 2026 +**Duration:** ~4 days (until fix merged January 26, 2026) +**Severity:** High +**Status:** Resolved + +> **Note:** This fix is available starting from LiteLLM `v1.81.3.rc.6` or higher. + +## Summary + +A PR ([`#19467`](https://github.com/BerriAI/litellm/pull/19467)) accidentally removed the `root_path=server_root_path` parameter from the FastAPI app initialization in `proxy_server.py`. This caused the proxy to ignore the `SERVER_ROOT_PATH` environment variable when serving the UI. Users who deploy LiteLLM behind a reverse proxy with a path prefix (e.g., `/api/v1` or `/llmproxy`) found that all UI pages returned 404 Not Found. + +- **LLM API calls:** No impact. API routing was unaffected. +- **UI pages:** All UI pages returned 404 for deployments using `SERVER_ROOT_PATH`. +- **Swagger/OpenAPI docs:** Broken when accessed through the configured root path. + +{/* truncate */} + +--- + +## Background + +Many LiteLLM deployments run behind a reverse proxy (e.g., Nginx, Traefik, AWS ALB) that routes traffic to LiteLLM under a path prefix. FastAPI's `root_path` parameter tells the application about this prefix so it can correctly serve static files, generate URLs, and handle routing. + +```mermaid +sequenceDiagram + participant User as User Browser + participant RP as Reverse Proxy + participant LP as LiteLLM Proxy + + User->>RP: GET /llmproxy/ui/ + RP->>LP: GET /ui/ (X-Forwarded-Prefix: /llmproxy) + + Note over LP: Before regression:
FastAPI root_path="/llmproxy"
→ Serves UI correctly + + Note over LP: After regression:
FastAPI root_path=""
→ UI assets resolve to wrong paths
→ 404 Not Found +``` + +The `root_path` parameter was present in `proxy_server.py` since early versions of LiteLLM. It was removed as a side effect of PR [#19467](https://github.com/BerriAI/litellm/pull/19467), which was intended to fix a different UI 404 issue. + +--- + +## Root cause + +PR [#19467](https://github.com/BerriAI/litellm/pull/19467) (`73d49f8`) removed the `root_path=server_root_path` line from the `FastAPI()` constructor in `proxy_server.py`: + +```diff + app = FastAPI( + docs_url=_get_docs_url(), + redoc_url=_get_redoc_url(), + title=_title, + description=_description, + version=version, +- root_path=server_root_path, + lifespan=proxy_startup_event, + ) +``` + +Without `root_path`, FastAPI treated all requests as if the application was mounted at `/`, causing path mismatches for any deployment using `SERVER_ROOT_PATH`. + +The regression went undetected because: + +1. **No automated test** verified that `root_path` was set on the FastAPI app. +2. **No manual test procedure** existed for `SERVER_ROOT_PATH` functionality. +3. **Default deployments** (without `SERVER_ROOT_PATH`) were unaffected, so most CI tests passed. + +--- + +## Remediation + +| # | Action | Status | Code | +| --- | ------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- | +| 1 | Restore `root_path=server_root_path` in FastAPI app initialization | ✅ Done | [`#19790`](https://github.com/BerriAI/litellm/pull/19790) (`5426b3c`) | +| 2 | Add unit tests for `get_server_root_path()` and FastAPI app initialization | ✅ Done | [`test_server_root_path.py`](https://github.com/BerriAI/litellm/blob/main/tests/proxy_unit_tests/test_server_root_path.py) | +| 3 | Add CI workflow that builds Docker image and tests UI routing with `SERVER_ROOT_PATH` on every PR | ✅ Done | [`test_server_root_path.yml`](https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml) | +| 4 | Document manual test procedure for `SERVER_ROOT_PATH` | ✅ Done | [Discussion #8495](https://github.com/BerriAI/litellm/discussions/8495) | + +--- + +## CI workflow details + +The new [`test_server_root_path.yml`](https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml) workflow runs on every PR against `main`. It: + +1. Builds the LiteLLM Docker image +2. Starts a container with `SERVER_ROOT_PATH` set (tests both `/api/v1` and `/llmproxy`) +3. Verifies the UI returns valid HTML at `{ROOT_PATH}/ui/` +4. Fails the workflow if the UI is unreachable + +```mermaid +flowchart TD + A["PR opened/updated"] --> B["Build Docker image"] + B --> C["Start container with SERVER_ROOT_PATH=/api/v1"] + B --> D["Start container with SERVER_ROOT_PATH=/llmproxy"] + C --> E["curl {ROOT_PATH}/ui/ → expect HTML"] + D --> F["curl {ROOT_PATH}/ui/ → expect HTML"] + E -->|"HTML found"| G["✅ Pass"] + E -->|"404 or no HTML"| H["❌ Fail Workflow"] + F -->|"HTML found"| G + F -->|"404 or no HTML"| H + + style G fill:#d4edda,stroke:#28a745 + style H fill:#f8d7da,stroke:#dc3545 +``` + +This prevents future regressions where changes to `proxy_server.py` accidentally break `SERVER_ROOT_PATH` support. + +--- + +## Timeline + +| Time (UTC) | Event | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Jan 22, 2026 04:20 | PR [#19467](https://github.com/BerriAI/litellm/pull/19467) merged, removing `root_path=server_root_path` | +| Jan 22–26 | Users on nightly builds report UI 404 errors when using `SERVER_ROOT_PATH` | +| Jan 26, 2026 17:48 | Fix PR [#19790](https://github.com/BerriAI/litellm/pull/19790) merged, restoring `root_path=server_root_path` | +| Feb 18, 2026 | CI workflow [`test_server_root_path.yml`](https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml) added to run on every PR | + +--- + +## Resolution steps for users + +For users still experiencing issues, update to the latest LiteLLM version: + +```bash +pip install --upgrade litellm +``` + +Verify your `SERVER_ROOT_PATH` is correctly set: + +```bash +# In your environment or docker-compose.yml +SERVER_ROOT_PATH="/your-prefix" +``` + +Then confirm the UI is accessible at `http://your-host:4000/your-prefix/ui/`. diff --git a/docs/my-website/docs/proxy/config_settings.md b/docs/my-website/docs/proxy/config_settings.md index 5c2d6a79a33..809478bb6da 100644 --- a/docs/my-website/docs/proxy/config_settings.md +++ b/docs/my-website/docs/proxy/config_settings.md @@ -758,7 +758,7 @@ router_settings: | LITELLM_CLI_JWT_EXPIRATION_HOURS | Expiration time in hours for CLI-generated JWT tokens. Default is 24 hours | LITELLM_DD_AGENT_HOST | Hostname or IP of DataDog agent for LiteLLM-specific logging. When set, logs are sent to agent instead of direct API | LITELLM_DEPLOYMENT_ENVIRONMENT | Environment name for the deployment (e.g., "production", "staging"). Used as a fallback when OTEL_ENVIRONMENT_NAME is not set. Sets the `environment` tag in telemetry data -| LITELLM_DETAILED_TIMING | When true, adds detailed per-phase timing headers to responses (x-litellm-timing-{pre-processing,llm-api,post-processing,message-copy}-ms). Default is false. See [latency overhead docs](../troubleshoot/latency_overhead.md) +| LITELLM_DETAILED_TIMING | When true, adds detailed per-phase timing headers to responses (`x-litellm-timing-{pre-processing,llm-api,post-processing,message-copy}-ms`). Default is false. See [latency overhead docs](../troubleshoot/latency_overhead.md) | LITELLM_DD_AGENT_PORT | Port of DataDog agent for LiteLLM-specific log intake. Default is 10518 | LITELLM_DD_LLM_OBS_PORT | Port for Datadog LLM Observability agent. Default is 8126 | LITELLM_DONT_SHOW_FEEDBACK_BOX | Flag to hide feedback box in LiteLLM UI diff --git a/docs/my-website/docs/proxy/ui_store_model_db_setting.md b/docs/my-website/docs/proxy/ui_store_model_db_setting.md new file mode 100644 index 00000000000..5f860137d0f --- /dev/null +++ b/docs/my-website/docs/proxy/ui_store_model_db_setting.md @@ -0,0 +1,92 @@ +import Image from '@theme/IdealImage'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Store Model in DB Settings + +Enable or disable storing model definitions in the database directly from the Admin UI—no config file edits or proxy restart required. This is especially useful for cloud deployments where updating the config is difficult or requires a long release process. + +## Overview + +Previously, the `store_model_in_db` setting had to be configured in `proxy_config.yaml` under `general_settings`. Changing it required editing the config and restarting the proxy, which was problematic for cloud users who don't have direct access to the config file or who want to avoid the downtime caused by restarts. + + + +**Store Model in DB Settings** lets you: + +- **Enable or disable storing models in the database** – Control whether model definitions are cached in your database (useful for reducing config file size and improving scalability) +- **Apply changes immediately** – No proxy restart needed; settings take effect for new model operations as soon as you save + +:::warning UI overrides config +Settings changed in the UI **override** the values in your config file. For example, if `store_model_in_db` is set to `false` in `general_settings`, enabling it in the UI will still persist model definitions to the database. Use the UI when you want runtime control without redeploying. +::: + +## How Store Model in DB Works + +When `store_model_in_db` is enabled, the LiteLLM proxy stores model definitions in the database instead of relying solely on your `proxy_config.yaml`. This provides several benefits: + +- **Reduced config size** – Move model definitions out of YAML for easier maintenance +- **Scalability** – Database storage scales better than large YAML files +- **Dynamic updates** – Models can be added or updated without editing config files +- **Persistence** – Model definitions persist across proxy instances and restarts + +The setting applies to all new model operations from the moment you save it. + +## How to Configure Store Model in DB in the UI + +### 1. Access Models + Endpoints Settings + +Navigate to the Admin UI (e.g. `http://localhost:4000/ui` or your `PROXY_BASE_URL/ui`) and go to the **Models + Endpoints** page. + +![](https://colony-recorder.s3.amazonaws.com/files/2026-02-22/55bc71f5-730f-4b2c-8539-8a4f46b8bd10/ascreenshot_0f7ba8f1c2694e94938996fd1b4adfcc_text_export.jpeg) + +### 2. Open Settings + +Click **Models + Endpoints** from the navigation menu. + +![](https://colony-recorder.s3.amazonaws.com/files/2026-02-22/55bc71f5-730f-4b2c-8539-8a4f46b8bd10/ascreenshot_fc2b9e4812a9480087f4eb350fa0a792_text_export.jpeg) + +### 3. Click the Settings Icon + +Look for the settings (gear) icon on the Models + Endpoints page to open the configuration panel. + +![](https://colony-recorder.s3.amazonaws.com/files/2026-02-22/7b394364-c281-4db8-8cad-ee322c76c935/ascreenshot_d7c8a6b234bc4e4d92aa7f09aefb13d3_text_export.jpeg) + +### 4. Enable or Disable Store Model in DB + +Toggle the **Store Model in DB** setting based on your preference: + +- **Enabled**: Model definitions will be stored in the database +- **Disabled**: Models are read from the config file only + +![](https://colony-recorder.s3.amazonaws.com/files/2026-02-22/54a263ec-ad67-4b16-ba9f-2be57c3e4cb8/ascreenshot_501abda2a6c847f79d085efce814265d_text_export.jpeg) + +### 5. Save Settings + +Click **Save Settings** to apply the change. No proxy restart is required; the new setting takes effect immediately for subsequent model operations. + +![](https://colony-recorder.s3.amazonaws.com/files/2026-02-22/7d13559a-d4e4-41f7-993b-cb20fbfa1f6e/ascreenshot_3245f3c5bd0d43cb96c5f5ff0ccb461d_text_export.jpeg) + +## Use Cases + +### Cloud and Managed Deployments + +When the proxy runs in a managed or cloud environment, config may be in a separate repo, require a long release cycle, or be controlled by another team. Using the UI lets you change the `store_model_in_db` setting without going through a deployment process. + +### Reducing Configuration Complexity + +For large deployments with hundreds of models, storing model definitions in the database reduces the size and complexity of your `proxy_config.yaml`, making it easier to maintain and version control. + +### Dynamic Model Management + +Enable `store_model_in_db` to support dynamic model additions and updates without editing your config file. Teams can manage models through the UI or API without needing to redeploy the proxy. + +### Zero-Downtime Updates + +Change the setting from the UI and have it take effect immediately—perfect for production environments where downtime must be minimized. + +## Related Documentation + +- [Admin UI Overview](./ui_overview.md) – General guide to the LiteLLM Admin UI +- [Models and Endpoints](./models_and_endpoints.md) – Managing models and API endpoints +- [Config Settings](./config_settings.md) – `store_model_in_db` in `general_settings` diff --git a/docs/my-website/img/release_notes/compliance_playground.png b/docs/my-website/img/release_notes/compliance_playground.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5c5dfd88477160d6c0174e657be3cf4f67e6c9 GIT binary patch literal 798714 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 z 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%0DhTS9|v_B|9SqTPpzSs^%5`* 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 z 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 -+v?kZ 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