From dc16e47df640b0e66ec91c9c802be3d8b0869cd4 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 15 May 2025 21:22:56 -0700 Subject: [PATCH] [UI] Allow adding Bedrock, Presidio, Lakera, AIM guardrails on UI (#10874) * ui fix bedrock guard * polish: logo should appear after selecting provider * fix ui config bedrock * fix: refactor - use specific configs per provider * fix: refactor - use specific configs per provider * feat: ui, show provider specific params for guardrails * fix: updated type of LiteLLM params for guardrails * fix: updated type of LiteLLM params for guardrails * ui, use endpoint for adding presidio, bedrock guardrails * fix: linting error * add llama guard and secret detector on UI * add aim on ui * allow adding lakera AI on litellm ui * fix: fixes for params to init guardrails * test: test_guardrail_info_response * test: test_initialize_presidio_guardrail * fix: init guardrails * fix: init guardrails * add showSearch * working bedrock guard --- .../proxy/guardrails/guardrail_endpoints.py | 82 +++++++++- .../guardrail_hooks/bedrock_guardrails.py | 42 ++--- .../guardrails/guardrail_initializers.py | 117 ++++++++------ .../proxy/guardrails/guardrail_registry.py | 4 +- litellm/proxy/guardrails/init_guardrails.py | 26 ++- litellm/proxy/proxy_config.yaml | 13 +- litellm/types/guardrails.py | 131 +++++++++++---- .../test_guardrails_config.py | 4 +- .../proxy/guardrails/test_init_guardrails.py | 4 +- .../out/assets/logos/llm_guard.png | Bin 0 -> 48665 bytes .../public/assets/logos/aim_logo.jpeg | Bin 0 -> 3754 bytes .../public/assets/logos/lakeraai.jpeg | Bin 0 -> 2617 bytes .../public/assets/logos/litellm.jpg | Bin 0 -> 24694 bytes .../public/assets/logos/llm_guard.png | Bin 0 -> 48665 bytes .../public/assets/logos/secret_detect.png | Bin 0 -> 15590 bytes .../guardrails/add_guardrail_form.tsx | 116 +++++++++---- .../guardrails/guardrail_info_helpers.tsx | 17 +- .../guardrails/guardrail_provider_fields.tsx | 152 +++++++++++------- .../src/components/networking.tsx | 27 ++++ 19 files changed, 525 insertions(+), 210 deletions(-) rename tests/{local_testing => guardrails_tests}/test_guardrails_config.py (97%) create mode 100644 ui/litellm-dashboard/out/assets/logos/llm_guard.png create mode 100644 ui/litellm-dashboard/public/assets/logos/aim_logo.jpeg create mode 100644 ui/litellm-dashboard/public/assets/logos/lakeraai.jpeg create mode 100644 ui/litellm-dashboard/public/assets/logos/litellm.jpg create mode 100644 ui/litellm-dashboard/public/assets/logos/llm_guard.png create mode 100644 ui/litellm-dashboard/public/assets/logos/secret_detect.png diff --git a/litellm/proxy/guardrails/guardrail_endpoints.py b/litellm/proxy/guardrails/guardrail_endpoints.py index cb4f01e7195..80c25683cfc 100644 --- a/litellm/proxy/guardrails/guardrail_endpoints.py +++ b/litellm/proxy/guardrails/guardrail_endpoints.py @@ -2,7 +2,7 @@ CRUD ENDPOINTS FOR GUARDRAILS """ -from typing import Dict, List, Optional, cast +from typing import Any, Dict, List, Optional, Type, cast from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel @@ -12,6 +12,7 @@ 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, + BedrockGuardrailConfigModel, Guardrail, GuardrailEventHooks, GuardrailInfoResponse, @@ -19,6 +20,8 @@ from litellm.types.guardrails import ( ListGuardrailsResponse, PiiAction, PiiEntityType, + PresidioConfigModel, + SupportedGuardrailIntegrations, ) #### GUARDRAILS ENDPOINTS #### @@ -455,3 +458,80 @@ async def get_guardrail_ui_settings(): supported_modes=list(GuardrailEventHooks), pii_entity_categories=category_maps, ) + + +def _get_fields_from_model(model_class: Type[BaseModel]) -> List[Dict[str, Any]]: + """ + Get the fields from a Pydantic model + """ + fields = [] + for field_name, field in model_class.model_fields.items(): + # Get field metadata + description = field.description or field_name + + # Check if this field is in the required_fields class variable + required = field.is_required() + + fields.append( + { + "param": field_name, + "description": description, + "required": required, + } + ) + return fields + + +@router.get( + "/guardrails/ui/provider_specific_params", + tags=["Guardrails"], + dependencies=[Depends(user_api_key_auth)], +) +async def get_provider_specific_params(): + """ + Get provider-specific parameters for different guardrail types. + + Returns a dictionary mapping guardrail providers to their specific parameters, + including parameter names, descriptions, and whether they are required. + + Example Response: + ```json + { + "bedrock": [ + { + "param": "guardrailIdentifier", + "description": "The ID of your guardrail on Bedrock", + "required": true + }, + { + "param": "guardrailVersion", + "description": "The version of your Bedrock guardrail (e.g., DRAFT or version number)", + "required": true + } + ], + "presidio": [ + { + "param": "presidio_analyzer_api_base", + "description": "Base URL for the Presidio analyzer API", + "required": true + }, + { + "param": "presidio_anonymizer_api_base", + "description": "Base URL for the Presidio anonymizer API", + "required": true + } + ] + } + ``` + """ + # Get fields from the models + bedrock_fields = _get_fields_from_model(BedrockGuardrailConfigModel) + presidio_fields = _get_fields_from_model(PresidioConfigModel) + + # Return the provider-specific parameters + provider_params = { + SupportedGuardrailIntegrations.BEDROCK.value: bedrock_fields, + SupportedGuardrailIntegrations.PRESIDIO.value: presidio_fields, + } + + return provider_params diff --git a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py index 408a451464c..d3d3692dd35 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py +++ b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py @@ -64,6 +64,12 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): super().__init__(**kwargs) BaseAWSLLM.__init__(self) + verbose_proxy_logger.debug( + "Bedrock Guardrail initialized with guardrailIdentifier: %s, guardrailVersion: %s", + self.guardrailIdentifier, + self.guardrailVersion, + ) + def convert_to_bedrock_format( self, messages: Optional[List[AllMessageValues]] = None, @@ -74,9 +80,9 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): if messages: for message in messages: - message_text_content: Optional[List[str]] = ( - self.get_content_for_message(message=message) - ) + message_text_content: Optional[ + List[str] + ] = self.get_content_for_message(message=message) if message_text_content is None: continue for text_content in message_text_content: @@ -313,11 +319,11 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): ######################################################### ########## 2. Update the messages with the guardrail response ########## ######################################################### - data["messages"] = ( - self._update_messages_with_updated_bedrock_guardrail_response( - messages=new_messages, - bedrock_guardrail_response=bedrock_guardrail_response, - ) + data[ + "messages" + ] = self._update_messages_with_updated_bedrock_guardrail_response( + messages=new_messages, + bedrock_guardrail_response=bedrock_guardrail_response, ) ######################################################### @@ -367,11 +373,11 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): ######################################################### ########## 2. Update the messages with the guardrail response ########## ######################################################### - data["messages"] = ( - self._update_messages_with_updated_bedrock_guardrail_response( - messages=new_messages, - bedrock_guardrail_response=bedrock_guardrail_response, - ) + data[ + "messages" + ] = self._update_messages_with_updated_bedrock_guardrail_response( + messages=new_messages, + bedrock_guardrail_response=bedrock_guardrail_response, ) ######################################################### @@ -421,11 +427,11 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): ######################################################### ########## 2. Update the messages with the guardrail response ########## ######################################################### - data["messages"] = ( - self._update_messages_with_updated_bedrock_guardrail_response( - messages=new_messages, - bedrock_guardrail_response=bedrock_guardrail_response, - ) + data[ + "messages" + ] = self._update_messages_with_updated_bedrock_guardrail_response( + messages=new_messages, + bedrock_guardrail_response=bedrock_guardrail_response, ) ######################################################### diff --git a/litellm/proxy/guardrails/guardrail_initializers.py b/litellm/proxy/guardrails/guardrail_initializers.py index be2981a68f5..68b0dadc961 100644 --- a/litellm/proxy/guardrails/guardrail_initializers.py +++ b/litellm/proxy/guardrails/guardrail_initializers.py @@ -3,106 +3,117 @@ import litellm from litellm.types.guardrails import * -def initialize_aporia(litellm_params, guardrail): +def initialize_aporia( + litellm_params: LitellmParams, + guardrail: Guardrail, +): from litellm.proxy.guardrails.guardrail_hooks.aporia_ai import AporiaGuardrail _aporia_callback = AporiaGuardrail( - api_base=litellm_params["api_base"], - api_key=litellm_params["api_key"], - guardrail_name=guardrail["guardrail_name"], - event_hook=litellm_params["mode"], - default_on=litellm_params["default_on"], + api_base=litellm_params.api_base, + api_key=litellm_params.api_key, + guardrail_name=guardrail.get("guardrail_name", ""), + event_hook=litellm_params.mode, + default_on=litellm_params.default_on, ) litellm.logging_callback_manager.add_litellm_callback(_aporia_callback) -def initialize_bedrock(litellm_params, guardrail): +def initialize_bedrock(litellm_params: LitellmParams, guardrail: Guardrail): from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( BedrockGuardrail, ) _bedrock_callback = BedrockGuardrail( - guardrail_name=guardrail["guardrail_name"], - event_hook=litellm_params["mode"], - guardrailIdentifier=litellm_params["guardrailIdentifier"], - guardrailVersion=litellm_params["guardrailVersion"], - default_on=litellm_params["default_on"], - mask_request_content=litellm_params.get("mask_request_content", None), - mask_response_content=litellm_params.get("mask_response_content", None), + guardrail_name=guardrail.get("guardrail_name", ""), + event_hook=litellm_params.mode, + guardrailIdentifier=litellm_params.guardrailIdentifier, + guardrailVersion=litellm_params.guardrailVersion, + default_on=litellm_params.default_on, + mask_request_content=litellm_params.mask_request_content, + mask_response_content=litellm_params.mask_response_content, + aws_region_name=litellm_params.aws_region_name, + aws_access_key_id=litellm_params.aws_access_key_id, + aws_secret_access_key=litellm_params.aws_secret_access_key, + aws_session_token=litellm_params.aws_session_token, + aws_session_name=litellm_params.aws_session_name, + aws_profile_name=litellm_params.aws_profile_name, + aws_role_name=litellm_params.aws_role_name, + aws_web_identity_token=litellm_params.aws_web_identity_token, + aws_sts_endpoint=litellm_params.aws_sts_endpoint, + aws_bedrock_runtime_endpoint=litellm_params.aws_bedrock_runtime_endpoint, ) litellm.logging_callback_manager.add_litellm_callback(_bedrock_callback) -def initialize_lakera(litellm_params, guardrail): +def initialize_lakera(litellm_params: LitellmParams, guardrail: Guardrail): from litellm.proxy.guardrails.guardrail_hooks.lakera_ai import lakeraAI_Moderation _lakera_callback = lakeraAI_Moderation( - api_base=litellm_params["api_base"], - api_key=litellm_params["api_key"], - guardrail_name=guardrail["guardrail_name"], - event_hook=litellm_params["mode"], - category_thresholds=litellm_params.get("category_thresholds"), - default_on=litellm_params["default_on"], + api_base=litellm_params.api_base, + api_key=litellm_params.api_key, + guardrail_name=guardrail.get("guardrail_name", ""), + event_hook=litellm_params.mode, + category_thresholds=litellm_params.category_thresholds, + default_on=litellm_params.default_on, ) litellm.logging_callback_manager.add_litellm_callback(_lakera_callback) -def initialize_aim(litellm_params, guardrail): +def initialize_aim(litellm_params: LitellmParams, guardrail: Guardrail): from litellm.proxy.guardrails.guardrail_hooks.aim import AimGuardrail _aim_callback = AimGuardrail( - api_base=litellm_params["api_base"], - api_key=litellm_params["api_key"], - guardrail_name=guardrail["guardrail_name"], - event_hook=litellm_params["mode"], - default_on=litellm_params["default_on"], + api_base=litellm_params.api_base, + api_key=litellm_params.api_key, + guardrail_name=guardrail.get("guardrail_name", ""), + event_hook=litellm_params.mode, + default_on=litellm_params.default_on, ) litellm.logging_callback_manager.add_litellm_callback(_aim_callback) -def initialize_presidio(litellm_params, guardrail): +def initialize_presidio(litellm_params: LitellmParams, guardrail: Guardrail): from litellm.proxy.guardrails.guardrail_hooks.presidio import ( _OPTIONAL_PresidioPIIMasking, ) _presidio_callback = _OPTIONAL_PresidioPIIMasking( - guardrail_name=guardrail["guardrail_name"], - event_hook=litellm_params["mode"], - output_parse_pii=litellm_params["output_parse_pii"], - presidio_ad_hoc_recognizers=litellm_params["presidio_ad_hoc_recognizers"], - mock_redacted_text=litellm_params.get("mock_redacted_text") or None, - default_on=litellm_params["default_on"], - pii_entities_config=litellm_params.get("pii_entities_config"), - presidio_analyzer_api_base=litellm_params.get("presidio_analyzer_api_base"), - presidio_anonymizer_api_base=litellm_params.get("presidio_anonymizer_api_base"), + guardrail_name=guardrail.get("guardrail_name", ""), + event_hook=litellm_params.mode, + output_parse_pii=litellm_params.output_parse_pii, + presidio_ad_hoc_recognizers=litellm_params.presidio_ad_hoc_recognizers, + mock_redacted_text=litellm_params.mock_redacted_text, + default_on=litellm_params.default_on, + pii_entities_config=litellm_params.pii_entities_config, + presidio_analyzer_api_base=litellm_params.presidio_analyzer_api_base, + presidio_anonymizer_api_base=litellm_params.presidio_anonymizer_api_base, ) litellm.logging_callback_manager.add_litellm_callback(_presidio_callback) - if litellm_params["output_parse_pii"]: + if litellm_params.output_parse_pii: _success_callback = _OPTIONAL_PresidioPIIMasking( output_parse_pii=True, - guardrail_name=guardrail["guardrail_name"], + guardrail_name=guardrail.get("guardrail_name", ""), event_hook=GuardrailEventHooks.post_call.value, - presidio_ad_hoc_recognizers=litellm_params["presidio_ad_hoc_recognizers"], - default_on=litellm_params["default_on"], - presidio_analyzer_api_base=litellm_params.get("presidio_analyzer_api_base"), - presidio_anonymizer_api_base=litellm_params.get( - "presidio_anonymizer_api_base" - ), + presidio_ad_hoc_recognizers=litellm_params.presidio_ad_hoc_recognizers, + default_on=litellm_params.default_on, + presidio_analyzer_api_base=litellm_params.presidio_analyzer_api_base, + presidio_anonymizer_api_base=litellm_params.presidio_anonymizer_api_base, ) litellm.logging_callback_manager.add_litellm_callback(_success_callback) -def initialize_hide_secrets(litellm_params, guardrail): +def initialize_hide_secrets(litellm_params: LitellmParams, guardrail: Guardrail): from litellm_enterprise.enterprise_callbacks.secret_detection import ( _ENTERPRISE_SecretDetection, ) _secret_detection_object = _ENTERPRISE_SecretDetection( - detect_secrets_config=litellm_params.get("detect_secrets_config"), - event_hook=litellm_params["mode"], - guardrail_name=guardrail["guardrail_name"], - default_on=litellm_params["default_on"], + detect_secrets_config=litellm_params.detect_secrets_config, + event_hook=litellm_params.mode, + guardrail_name=guardrail.get("guardrail_name", ""), + default_on=litellm_params.default_on, ) litellm.logging_callback_manager.add_litellm_callback(_secret_detection_object) @@ -110,16 +121,16 @@ def initialize_hide_secrets(litellm_params, guardrail): def initialize_guardrails_ai(litellm_params, guardrail): from litellm.proxy.guardrails.guardrail_hooks.guardrails_ai import GuardrailsAI - _guard_name = litellm_params.get("guard_name") + _guard_name = litellm_params.guard_name if not _guard_name: raise Exception( "GuardrailsAIException - Please pass the Guardrails AI guard name via 'litellm_params::guard_name'" ) _guardrails_ai_callback = GuardrailsAI( - api_base=litellm_params.get("api_base"), + api_base=litellm_params.api_base, guard_name=_guard_name, guardrail_name=SupportedGuardrailIntegrations.GURDRAILS_AI.value, - default_on=litellm_params["default_on"], + default_on=litellm_params.default_on, ) litellm.logging_callback_manager.add_litellm_callback(_guardrails_ai_callback) diff --git a/litellm/proxy/guardrails/guardrail_registry.py b/litellm/proxy/guardrails/guardrail_registry.py index 6ad48521f0d..15c5d9d664a 100644 --- a/litellm/proxy/guardrails/guardrail_registry.py +++ b/litellm/proxy/guardrails/guardrail_registry.py @@ -71,7 +71,7 @@ class GuardrailRegistry: """ try: guardrail_name = guardrail.get("guardrail_name") - litellm_params: str = safe_dumps(guardrail.get("litellm_params", {})) + litellm_params: str = safe_dumps(dict(guardrail.get("litellm_params", {}))) guardrail_info: str = safe_dumps(guardrail.get("guardrail_info", {})) # Create guardrail in DB @@ -117,7 +117,7 @@ class GuardrailRegistry: """ try: guardrail_name = guardrail.get("guardrail_name") - litellm_params = guardrail.get("litellm_params", {}) + litellm_params: str = safe_dumps(dict(guardrail.get("litellm_params", {}))) guardrail_info = guardrail.get("guardrail_info", {}) # Update in DB diff --git a/litellm/proxy/guardrails/init_guardrails.py b/litellm/proxy/guardrails/init_guardrails.py index dd7a46388d9..2864f0d2684 100644 --- a/litellm/proxy/guardrails/init_guardrails.py +++ b/litellm/proxy/guardrails/init_guardrails.py @@ -120,11 +120,7 @@ class InitializeGuardrails: litellm_params_data = guardrail["litellm_params"] verbose_proxy_logger.debug("litellm_params= %s", litellm_params_data) - _litellm_params_kwargs = { - k: litellm_params_data.get(k) for k in LitellmParams.__annotations__.keys() - } - - litellm_params = LitellmParams(**_litellm_params_kwargs) # type: ignore + litellm_params = LitellmParams(**litellm_params_data) if ( "category_thresholds" in litellm_params_data @@ -133,17 +129,17 @@ class InitializeGuardrails: lakera_category_thresholds = LakeraCategoryThresholds( **litellm_params_data["category_thresholds"] ) - litellm_params["category_thresholds"] = lakera_category_thresholds + litellm_params.category_thresholds = lakera_category_thresholds - api_key: Optional[str] = litellm_params.get("api_key") - if api_key and api_key.startswith("os.environ/"): - litellm_params["api_key"] = str(get_secret(litellm_params["api_key"])) # type: ignore + if litellm_params.api_key and litellm_params.api_key.startswith("os.environ/"): + litellm_params.api_key = str(get_secret(litellm_params.api_key)) - api_base: Optional[str] = litellm_params.get("api_base") - if api_base and api_base.startswith("os.environ/"): - litellm_params["api_base"] = str(get_secret(litellm_params["api_base"])) # type: ignore + if litellm_params.api_base and litellm_params.api_base.startswith( + "os.environ/" + ): + litellm_params.api_base = str(get_secret(litellm_params.api_base)) - guardrail_type: Optional[str] = litellm_params.get("guardrail") + guardrail_type = litellm_params.guardrail if guardrail_type is None: raise ValueError("guardrail_type is required") @@ -206,13 +202,13 @@ class InitializeGuardrails: spec.loader.exec_module(module) # type: ignore _guardrail_class = getattr(module, _class_name) - mode: Optional[str] = litellm_params.get("mode") + mode = litellm_params.mode if mode is None: raise ValueError( f"mode is required for guardrail {guardrail_type} please set mode to one of the following: {', '.join(GuardrailEventHooks)}" ) - default_on: Optional[bool] = litellm_params.get("default_on") + default_on = litellm_params.default_on _guardrail_callback = _guardrail_class( guardrail_name=guardrail["guardrail_name"], event_hook=mode, diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index f58f2cc0ac3..999638d058f 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -2,9 +2,14 @@ model_list: - model_name: openai/gpt-4o litellm_params: model: openai/gpt-4o - api_key: os.environ/OPENAI_API_KEY + api_key: any_key + api_base: https://exampleopenaiendpoint-production.up.railway.app/ -litellm_settings: - callbacks: ["smtp_email"] - +guardrails: + - guardrail_name: "bedrock-pre-guard" + litellm_params: + guardrail: bedrock # supported values: "aporia", "bedrock", "lakera" + mode: "during_call" + guardrailIdentifier: ff6ujrregl1q + guardrailVersion: "DRAFT" \ No newline at end of file diff --git a/litellm/types/guardrails.py b/litellm/types/guardrails.py index 0d1c1329528..5e04f2e24bc 100644 --- a/litellm/types/guardrails.py +++ b/litellm/types/guardrails.py @@ -210,43 +210,118 @@ class PiiEntityCategoryMap(TypedDict): entities: List[PiiEntityType] -class LitellmParams(TypedDict, total=False): - guardrail: str - mode: str - api_key: Optional[str] - api_base: Optional[str] +class PresidioConfigModel(BaseModel): + """Configuration parameters for the Presidio PII masking guardrail""" + + presidio_analyzer_api_base: Optional[str] = Field( + default=None, + description="Base URL for the Presidio analyzer API", + ) + presidio_anonymizer_api_base: Optional[str] = Field( + default=None, + description="Base URL for the Presidio anonymizer API", + ) + pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] = Field( + default=None, description="Configuration for PII entity types and actions" + ) + output_parse_pii: Optional[bool] = Field( + default=None, description="Whether to parse PII in model outputs" + ) + presidio_ad_hoc_recognizers: Optional[str] = Field( + default=None, + description="Path to a JSON file containing ad-hoc recognizers for Presidio", + ) + mock_redacted_text: Optional[dict] = Field( + default=None, description="Mock redacted text for testing" + ) + + +class BedrockGuardrailConfigModel(BaseModel): + """Configuration parameters for the AWS Bedrock guardrail""" + + guardrailIdentifier: Optional[str] = Field( + default=None, description="The ID of your guardrail on Bedrock" + ) + guardrailVersion: Optional[str] = Field( + default=None, + description="The version of your Bedrock guardrail (e.g., DRAFT or version number)", + ) + aws_region_name: Optional[str] = Field( + default=None, description="AWS region where your guardrail is deployed" + ) + aws_access_key_id: Optional[str] = Field( + default=None, description="AWS access key ID for authentication" + ) + aws_secret_access_key: Optional[str] = Field( + default=None, description="AWS secret access key for authentication" + ) + aws_session_token: Optional[str] = Field( + default=None, description="AWS session token for temporary credentials" + ) + aws_session_name: Optional[str] = Field( + default=None, description="Name of the AWS session" + ) + aws_profile_name: Optional[str] = Field( + default=None, description="AWS profile name for credential retrieval" + ) + aws_role_name: Optional[str] = Field( + default=None, description="AWS role name for assuming roles" + ) + aws_web_identity_token: Optional[str] = Field( + default=None, description="Web identity token for AWS role assumption" + ) + aws_sts_endpoint: Optional[str] = Field( + default=None, description="AWS STS endpoint URL" + ) + aws_bedrock_runtime_endpoint: Optional[str] = Field( + default=None, description="AWS Bedrock runtime endpoint URL" + ) + + +class LitellmParams( + PresidioConfigModel, + BedrockGuardrailConfigModel, +): + guardrail: str = Field(description="The type of guardrail integration to use") + mode: str = Field( + description="When to apply the guardrail (pre_call, post_call, during_call, logging_only)" + ) + api_key: Optional[str] = Field( + default=None, description="API key for the guardrail service" + ) + api_base: Optional[str] = Field( + default=None, description="Base URL for the guardrail service API" + ) # Lakera specific params - category_thresholds: Optional[LakeraCategoryThresholds] - - # Bedrock specific params - guardrailIdentifier: Optional[str] - guardrailVersion: Optional[str] - - # Presidio params - output_parse_pii: Optional[bool] - presidio_ad_hoc_recognizers: Optional[str] - mock_redacted_text: Optional[dict] - # PII control params - pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] - presidio_analyzer_api_base: Optional[str] - presidio_anonymizer_api_base: Optional[str] + category_thresholds: Optional[LakeraCategoryThresholds] = Field( + default=None, + description="Threshold configuration for Lakera guardrail categories", + ) # hide secrets params - detect_secrets_config: Optional[dict] + detect_secrets_config: Optional[dict] = Field( + default=None, description="Configuration for detect-secrets guardrail" + ) # guardrails ai params - guard_name: Optional[str] - default_on: Optional[bool] + guard_name: Optional[str] = Field( + default=None, description="Name of the guardrail in guardrails.ai" + ) + default_on: Optional[bool] = Field( + default=None, description="Whether the guardrail is enabled by default" + ) ################## PII control params ################# ######################################################## - mask_request_content: Optional[ - bool - ] # will mask request content if guardrail makes any changes - mask_response_content: Optional[ - bool - ] # will mask response content if guardrail makes any changes + mask_request_content: Optional[bool] = Field( + default=None, + description="Will mask request content if guardrail makes any changes", + ) + mask_response_content: Optional[bool] = Field( + default=None, + description="Will mask response content if guardrail makes any changes", + ) class Guardrail(TypedDict, total=False): diff --git a/tests/local_testing/test_guardrails_config.py b/tests/guardrails_tests/test_guardrails_config.py similarity index 97% rename from tests/local_testing/test_guardrails_config.py rename to tests/guardrails_tests/test_guardrails_config.py index 66406ac5f4b..c2a90220431 100644 --- a/tests/local_testing/test_guardrails_config.py +++ b/tests/guardrails_tests/test_guardrails_config.py @@ -93,11 +93,11 @@ def test_guardrail_list_of_event_hooks(): def test_guardrail_info_response(): - from litellm.types.guardrails import GuardrailInfoResponse, LitellmParams + from litellm.types.guardrails import GuardrailInfoResponse, LitellmParams, GuardrailLiteLLMParamsResponse guardrail_info = GuardrailInfoResponse( guardrail_name="aporia-pre-guard", - litellm_params=LitellmParams( + litellm_params=GuardrailLiteLLMParamsResponse( guardrail="aporia", mode="pre_call", ), diff --git a/tests/litellm/proxy/guardrails/test_init_guardrails.py b/tests/litellm/proxy/guardrails/test_init_guardrails.py index 2d4e06c110d..782f9d69aee 100644 --- a/tests/litellm/proxy/guardrails/test_init_guardrails.py +++ b/tests/litellm/proxy/guardrails/test_init_guardrails.py @@ -36,7 +36,7 @@ def test_initialize_presidio_guardrail(): assert result["guardrail_name"] == "test_presidio_guardrail" assert ( - result["litellm_params"]["guardrail"] + result["litellm_params"].guardrail == SupportedGuardrailIntegrations.PRESIDIO.value ) - assert result["litellm_params"]["mode"] == "pre_call" + assert result["litellm_params"].mode == "pre_call" diff --git a/ui/litellm-dashboard/out/assets/logos/llm_guard.png b/ui/litellm-dashboard/out/assets/logos/llm_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..ed01c0f044eb2ec112becda5d5a02dbc75ffc1e0 GIT binary patch literal 48665 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 literal 0 HcmV?d00001 diff --git a/ui/litellm-dashboard/public/assets/logos/aim_logo.jpeg b/ui/litellm-dashboard/public/assets/logos/aim_logo.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..60fc2a9295c8e1b3556f98a6d859e302acb0cea1 GIT binary patch literal 3754 zcmb7G2UJtp*1ib|C7~n`nm~jAQkAZNARwXl5|9oWKq*7Vrvic$X-Y>7B14hT=MiBf zbP$jtFd&@)Lstv;m<_C?gaKfk0sl4D^i5FlJ^r3=U^uWk;~EB3a>Z1Q!Cyf#T%k zWM<>$;X?7Sqc~BgOh9xr8VHmL3S~mEz*$iL?{U%rAQ^!kpob2G0l-KQ9TIfX2?(5u z3Z?^{3jAX*GBD9W=%L`#W7NOx|2RIG2AJt+GzdBbO~W=ew9p@n8W6xYqbB$KX3D=zb|J497Pyenp75#I8_!;_mmbSJ?D{V zdWy02sIQa}zWR)C@M{RkXXw@FI-v~!uA~eWz!`RC+d6%7iQj-ak?B4YQQBLXn8-t( zk4F0tak-50E<5|8WTUBnyz|IwA^MEd6uzTXX8=H8P6Z_-O7J3ri^E@5PLpPK zM%rb7px~n-SQez`n}Ot0c#Pf9F$UXhad9#s!?L~6S4?oWMo8gj?Ugotm0c_$o1Vpe zax{SnNk34VOTU`%juUhR8~i$-S$s)PCtksVL)*qpNE))^&U=&pm=On?dgPJ|PqI3r z3vmo#7N!JvRV#;bmDFCoK_y^yl)#XyCL)6MbPxB;GLyLobD^&sYAqsKX8WaX+&u7D z+cGhA*rESy_0jo5VC*kGl{@+qe4MP9y=oYNs}Ub}0)VT!4!TPTGu6diRlG#l;h%Wx z)-Q5>-J}s>xo+HQ(r|EGp8lHsOigo}R6vCPg4p$FE6l{*=6^%W7Pc;^TUzOfcKt@} zlom)*r3>9#3*7@~+{KVc;{&i35vk^{xaFl6V{INAUP3(oEjm=vWsi&05<{u`HbZnt zsPQgQoTG5ow~F85XmTuz^)~xyRBByG#c!0a#_|NH9}OlaF50{tY+s<-AJRR}{T=*@ zdszT5V5+EKFH;ZgHzmZqh1d6GSS zYHJ6$K+QahlL`OyQ06q8kpCNIf8MtLANNX&KMjz?e*l300$>p|&j3T|5R4FpKY4*^ znE?qv5$r-7fdwdxu$;VtmRmqja8z0isY6giR?#A(efX-S|Gbi>w$+UXnbaSiM6Urp zvZx}xjV5s|hk2eKQy)CLEGiUR(q1rnodkKZsIfF1_t4iVe566}nUrQA2~~;NH-A;L zWQuOUk5@#K4+80S3tFun7bhAAa!d}b8_w6S&P1!b&W8Oarz5fcZoioOh;FYK(WZ<{ zG;f>6GqJjdQ9B}!ej<=00(ypSur*&0wPgs}T4Gq&4y;C1EbJq0la@_c%P+&(r)v+5 zf@6Kh((uN(9+FWb(KadRaXd3Fb*g)IYu#R)Y+KuVKaf8VpO4NA>;uZ>#W3c<`Y+4Vj+l1@wsknz&QGA}$=k8l1}*pRY} zI~S$qj_355?6q|biBJ>XA)%2~n|sLGwIW0%%eWl`WGGR86UfCIi5Lk_i9CgSt%YHg ziN}k(?8Y{!=9U=`ID*sz>?O;4IpVT9gLfWl=e-@3)f#p;BWz^%Evo#Ylp64IoOFI} zpnEsg9#c5L9hXKe%?J_;Z<_Ct4pkoUZI9z!esD7{b?oMa7LkqTuE$%SUpNfsQeOzG zWPI60lp0)gYjzu~s*)$2`_%g(-cXr|Z{|nY?1wIC&X;i=>Nw zCF{SDmpn#k_qOdU8m9fe zczI?iGlX2}-$p|v}e70cm1i!8!3c~>cQ7J zGc$}ITvSWYTX42h?2$;{6vbd>-=7U|bZ*cImfwucy5im9AeFq*G|nxHihA@c_7(fF z7sXyevFm(Pc~t0;+u;1SDVuGN?-Kfh_`~K)6&wPO5h5zfho)^0pcyqpnQdd+kNE#% z8oZEm(;;1Ih_Xknz3BBcNyZY%igx|UQM+2bkfzRd>597w5vXEM`S7`C;`~P7!^6uj z11?T@W6L&DPXHzHt&6wk=dCcXT%*l*vv>nlilSCUW(&zA70-*w~%8~H~E4NoNouqZVRen{H((Gbd-#&X~aoez|RyBd8pb^kv z)Z)xI%jz|VOx94u`Oe@{Es?Sl#Lj3|DMvM%9DJhb8HzZs ztG>Kp%Un`5u1R-45Q*z?=W;&i;+o#0fUe z60~jePcji&S3KXt!#}9Hze#vhz8msHxo5|r-qFJz|LIbG7~3haPL^Ma|Gi^n7kbUh z@QJ>~e^I-qbZs_9!_Pi~iF`)KG9l$DcymXSHU(62qLXtydQs`vb9=YOLdGk}eXx_0 zBB5sVoru0?SeATy(|&%T_I2N0@e{j2ECH-_LCpRt3Pqk_?z9vhSw8xF{a*6K!ECwZ z9$QN0Yb8WnXvDQI$9(%${+sr0%l9Y`g!D;$VZDu!E=uAc!f1`-b4iZIgf9v%tG6^j z#u*VYcg`$o1Up4}m^bd4PTm+(kt!Hv|VdnX@_BGtLeMmvP{qX%=s zpNJ3C1US@-+Hv{k>zhQa1hBk~)*CSO0Jt|cj-US3@d2kD3gYXK+J85dsitaQ*=S(p zt$t-vw=9jyGKIDjDH>9v_NjgC=HE(D+j=c6|K`7B_y_Di6v@*niuk)K`UgPtG@u}K zr;YC)O40f{q>!AJ1%Pmq4G@f?`fH{Y{MB%2AZX#_VUhacJpDQN&5vi+{6mz0b3i`Z zzJ~-fQ-Z>66Db)63BpRan#F}d3(ia3uatd8+ts|zx-!)wDwLmzvABIi4)Tz2AIa*`Uz`K98C(1Av^dzBpP58EKJH@mk6fmp?=FJDS z_=H*Rm#=PN6OpTB*-D3EGp{w@xI^NX?wDzUDO_3K-s7q~TvOWGBIGA*{Z#ujTv=Hx z%gb9CtD7WJGmZV*ite-i^Qf(hhZjSHzgnGVms$5F40Ke+JGtvP?i5zaY36E1?DeB_ z%-uv6q8^r~g^qzhB*AkGUBk}mRBOK?$!&B)A-Wm6-FJq`qGJP8?jQ?xB89jEe3f@wb~n1tImS^(YSTn-u-tOdknti-fpuAIZAr zF?CD{=UdVWS6vXsX=22vsYPD;M+EFm-^db6}3%sZpy`rhliuDdvxqs(8ze69UzXmV{y85~R2m%1e z_yGDCpbbDF5awYRjB(&dI2;Cpvmy{INHi-N&Bn^c#?HZoVdubdu(4rq7%VprFE1~e zlaC+A!_URT%fn0pLK!hII0_C&@vyV8^ZegNZvn7KpabZDf+7F}3qr9Vy%pHQD3xgd zlu_(ALm*jTC=ddNGTc1Ohy2s%qX3!#hG3u=#v8k${^|XXTPP>7XkFBxT*2>&gFkCw zns|zN*AB>1G{`(Mab+s|+yzX!NBtFJwHWChrFu%~!o`j?CIYlf3qH`V5;5}l3hA9n zsmJe}vvZ!S3>c+O!B5F|C&|Jy&9doRb!6HRw@-VC=kFJ7CZ`(Neo)Ca{hq6NQh!Wc=a6%H&UA;E9xubebSY@LXwWU%&oFeX&0N^ zY^Irr|H+tC9>4$~jL{|#{)00X00u`uK|TctMoJ#b#f#VQ#WCnZGDrpCkZrFR7CoD) zlFsS@k1Injxr-`LPTk^Y1B(=)m)xag2kh)k^8CjR9T0MFGD#`>;&aO)viyU`{F2XX zN$u!8&K#ub#0bIu!dychMkR1>OxUSJ_SnToBs;;e9;<-rkg&-1)HephvlC9JdY4$c zv0Zl|oA3|jVQX5&H9MGp6roC{2wywstIS~@kAEa`WGQbtwL%x-HdfguX!;` zs{khX)JAMlEnsW<#k}y)lb27Qu?%x;;!Yz!QCPJc-P{vW7a@|r6&dE3bw2Y^S7&>A z^Zrcl&Ryfl@@lSPM$w!Zo$)S=OC7<(j*>Dp)7{U}loiRGM(ht}e>BB+hfXL6s)GlA z0f77fXft}m{1LG*B;s2RCdO$CZpo3O(}+xFX!?pn<~dv&3(C+A@UDeI_T=*`nrr&Y60 z1>?#{WyN%$;9+@XK}2qzt+GGWi%6Dr^*&;8=GiL;X26!IhM+h0QdNLp=3HIGb;rL# zya#RQfb>`Lg86ji$CEm538AQ(k?gmD3k6yzN)D@hXwji30*zJ$&oM&Q__H^tJVDcs zDE=!gM1c-kmzAw-c)8)tl{@K3TPd12aXIhYxMGLURj<#k%HzZZ#n*?^ivws@`ZY!? zh`g-uf;`g0d=ByItP*nZxptq-c~6530FTioi*sd%pn=_2oe$$G>Wc5p@((`PQ>pio z(pyUhDEBM1OtU@oVfUhpFzT z*k+}n(y(*F?NUv@DLN&Z6o1+-Ue-J_+f|^LhUpfESo$NkTXzLc>yx-en-tRFe`8pAA0aRh3sOc?0LH?{EO=&rxgcp%!Z`G zR&~K$RL~Vx(>m3$uuS5Hc8oS>f zt#Oy20~uQ-K}E|p8;A1(5>;Vi?Y>wYr?UMGb%hm;?Twqih37|b7J2&Qev*v76yCFs zWznmp)w`ihFxplj&3*BNp6cX3z7ed6z8lzn zc74oYYLN<|{ej6#8Blbxj}EvDiXicZY7tk&%cM>bB-w+F-R-8XOT^W^g$v+m5J}F= z#q5E6r}L5plhp!-eEV&D^QzR`MwAQ2DV;X9QXHK)%K{r=t@NeA$zX@`hpc;gm1Gq7 z5+@vTQZk_>GqFTnt*{u+pkB{>!kDN`_^yKfkbjHt|ek$ho!x) z6lyblMpb2SJ?Zu^JJb`ycRX{{A!l! zL}i+DC+eC~%(ZXf5(C|0-||dzNIm{_&VTp*LcW;#hWT&$wgVtwn7ai6hyUE$AeJ#S zfQBY1TFS{cY00nR=g45zMml^E7<6$xOJdY2DE5{3^*wP`mJH9p-E_NmJS+(N9^p~m zSh0(BXbZPQ)2PUbS-6}E*vF}1!b2T1RFsxPbsM1zNmaEOSFgmSG^W1rO&&LBO{0RM z;rS2=)lqYoa|*WU1e2H)b)UH}{u>EzPHhuvp(xu$qPe#&KJQ&}NFO1Q%#WCFLbo4F^F!m~#NsjqZt;5=qOfoJvxEe8%T--Bb4~ekvK2@9!bxuDKQ^^n zlByX!mQkxZy<#oG;bNWWZnQCH8S-X|5<5_K`3-mP%lo3(7O}V`vX&mQnS0M&C6baS zt{Uoh3QJa}2qR=krrPno@&NA|ri^ znemz<&J$;8fi#$XY*Ns;GWQ%otVAXwqVe}x2*osdqaQWqsQB> tSNBPKiVpK}P#1@L@l`GF%WvRg36erISCliK$-9qI06ze5Qt1GFHsLiS}h$&HYtl1(vpQIRBM8?!_a*%U?DjYyK16e(n~ zol+WmLYYA%yBV7?%*>ka>i*yN|9Ri%y`S&-KhJTz$M?R+x42r%nptaI=XIUedH&Ad zd9JtvTne<&*2=~T;^BdygWw0^QlV(eFrRY}WN#1cf*?o;;^z^E_`nel_dKc9dA zKj;ci6!;wC-y|TuP1}5(gyU(!?E#WH*X}$NQaVu4Aa%5pwnO(!V9a{q&C)Wma>_eZ zRMmFr=^GgC-DhO+o28ZYK^xm+$DK|%ySTb}dYwIY-rMIw(3Rkj(6I1`*y}gq;%_D- zrlsG#myvn@K~_QGqoT*fPfDJ?cv)HXs`~Ytn#QK)mR8dH4{crDJ-vPX178NIqhsUW zCnkSP{iH7}E-f=wn5%2QkB+ADFl!gnY&ojGU5XQcvn9Z!j?Yw02fSkTFYR>@SY@BydlAWx8 zi`T|L)R>2po0MAZ@mmh2g7$D)fI*QR|90=dJpPJC}viuAHW4g}h`&zuZu30G-`lMr5}`$cSX=I_Is7EW3& ze&Ry3P2E2Ou-hWNIfQffzSAZfUk%3YT8kAUF26@}gb*p3-z;aMC|H?Ms7^L14*H<9 z`JCB!fA85k-J=Cg+FBW=HC*T&2J@LYn!EW2#dHeR{Spz%e(O+Lza2MFkD)8Q#m9QO zi}%pv6I7Hq^EJe1{e_H@XBP%JQ$6}a5B$%2rtg?Lg}lWG7h6W z(qMt|?1vR}IP8eMIOSH3f96VhG8IG$@K+U0vue0^ZD~6ZAB|uI`}KcfH{i6wK2k#p zG)?rc;K;Qr8EI)9uT8^dqDZ!@kxe(KdXv{fqVh(R<`!^9rH6ayAG0u@sy#|eSa;s| z1ggJ7#Mogpd`qqNh6k*j#o~PWkK!lLv)d5mmFa1Z86D?5^--h;E658+)cqPyI`rtm)5 zlIHVh=!ImKO?8Duv&XhB6Yaub-@)-If1e9C#_y!^Sg%q-2_G;iBb7U=>1URgat)*M zZpcU8o}9QJ+hmj48G$NOncYP1n;w1jmUHh>t@Xn%#JOX|Ib(?1-g)G`snIea$9G9I zRq41m!QCTD+MlU1zQwUcx22tWxx6Q1ew9cOkaWZzj@Z{J* zE$#SMHoqi=`Y2iMKBS-^)_20god3%9x=&>FqNHLUb(@Q1{~cuY@4as*^MZ8|7^cdS zlssg4_?ggXy%Q(L%$P*CwlWf{`Kb8jOzfu_mBV>wSX?M9#AJo=RB0Z2fAsRQ>hXKK zN{{2dUu*4Z=}eB$q{F=l!0Eo57FI2Y{y)88xZVG{0{LDceD)t)96ObM3VkC_HdE-j z!Ncu&#ZO6`lM96BX1Z*fY9^KrHt}U0|p_74fMBt7N z0PPU^pP>xli%(`vBL2lwKZ}?-s^EmZrS0=#X`_@6a*l;ZpY<9!UUDcp~JIyQxeq z{io?yR-Lo0+pjne^o{Uqit(GFUi)9Y^$gzCgN^yN-GRA63%*Zs(4nMzM857{S1)73 zAr+xe6@<|esTI69FUrV-?#d+-2Nn zNk>cQkLEn#%$C9+!pEpYrtu{VO6Y8H0l2`N3waSlaeazgXq^7I-H{HALNR=}iLj)d>q+x#7XO^%Gn2)C$6_wIk+!S*;4}B!X z+g|l&ifnnhc|xsl^=^)M{JLn&l?AmR?DusGzRT+1%g#W)J?JITm3-8)AHSR%`yCgG(TxmZma=R?|8;O1!7;V; z1A$3s&f5OY@l>!1hwtFAjP#?=Bf|155!^>J{aaMxtP(x6 z5x1^?vNC1O6mzn7>x(zOKCX9^H?{q2k-hWo()ALBjA4W32%m`!7m6)Y;X-Mu zd@O|m;y##iA5C-A5&_?|C!Slyc#jA%&#W|t+?h74(XJro$tTo(+$=m_Fa9Cs3m^Xy z`GES;g?}@!>e=+no9PY6rrt=`-B!U}Gn2L6J(SniMDFp^*0<_nNneZEifEecLfbb4 za}B4wFn2n|>vKg>iQ2CCV{ti~ZksniYti0(ELEVJ^UNeA3W2kcEDlqq!90#FuYtbv zKLzrShoKPROuAg0HFKDNf-^TAf5Kph@d zg{9;Xo_{n&fRl;$9fqtCF>j_LOBU(*wwIGxHF7C2t(dA920NbE-+>ii4;cv#R^#^7l9961J2WiHaKW-mr!s0un`$B7S844N+9c&|8{ z#50_QIAkLzLFVrGi+J8T+p@1GUAq9L+e*G|eK}k(wjF{!mz?QDF0|=7TY?J}NRK+O z6{aw3+}jn#37`js_2Rf5d}Zb};&}xX3PLP&4;yohwTf9AJKjARw|=M17TrfWwYN7L zn1}@=P0B*ZlOK-+^(y}}jK;(5`PbZ=8liC_$2W)W@z#$@6vKwa{J5r&gVH^pvhmzg z?Z6A_A(l2z%s-#haQKuuBrz%ymP+bmnzbDo^!~Vbtz#IYf~;_WBMTv<@r zx3q2#+r>9#FSc-@KY#p|l&x9C4%lZmh|XXsAa;w*d4SLtD3UW0S~)DNI1 zT1q+R3W%?}EB*E@6F0hB7Q2vg`=v!U?L~h49J!%pV|}9C=SZ&eM}ZI<8{;OQOa5Bp zcHYpA54!w^P(fHNW;Nq}^_$yM==HnZejd8V3httu?**1uj;c2whZi?fbJr{!Qy;qZ zm1OLaduz$@hE&qeFW9q_i1o|34|4$7%(1iOSOpme#2@f^8o;ZjZ3VY{n$LyO~UXwA? zWZU+U(rIMM-sc+O|(B9@F(BAQ& zEDnEmOP}qHI?@?a7cP{H+uFhcHmu=5m0eX$-=!o_M$dW$?>iwV%P+^Vr;%gL zc7C9;4Cr2t$rc~XgT8BPKL}WqQrRMb#ZMlmb(GHTNjt1n>^U3w^nScuy7=4g{cpY# z74>D79V7-FWOr!Pe+x&p`!=ih)@x3=Wu%r5o&4$PTPce^l(mq>G2F_9?gXPP=w>^? zL7o!(0J}N4__1}*k@7Z+R@*(}=mSRR#lfm&2)RzS4q=Tl%Y(BnIo2i8gm-I5m**`U%&oBOeA%*^c~hVq3AtsVd) zOI%w9cBAWqFZVujcfoX%eWAdVYeS$SNSIjkYW#j z%X_d3NeAJXFj_y7p$yyfuAT=z{3L?#fL4suB5~|O zG3@LUei#ZFKj`s!PX0Y&!gQ(Bd?CubG%0)R4j0m@@8RM6!a?FSO@D?QqB0KlsC)7E)&cr@q%NWCl z3#C6|g07zBYaCe%NF)v_T;+K4^!x?4{)fF3dj@Xk#w^5>H*=u@5*6kcnPWRmVPiDy z3YqH|3!TC;-j{8B}x?f=1l--dMk{zY%4k;5ktu%Zqy3$ zA>6`Cg&k{$-&~b-n6+~n9v`)z3d@HKP2OF;$M$fpz>$gaxb3*l7w0cIBFM5*6EK(jx!TP*$SJBvBLnbDYz!Cj zA;*cYW~n4!DUCWTu){y0$Z_H~=4VBf;UwdYzCUUpRh2EB9$GBR$Pk*~Obbn`1z(A7 zF|IgEofq^8HL6;AB>vlp_or?^;;uIvqu1}C91&a)007hr8F3t%GW!J+gPCIULEpj^ zRp>EK+Bgpsh%cXw>^i>M-P(Qd4LNhYV7x4{CDvHmXZ@MOHYREIQ39-ExQ>yHm%4DIz28q>f}DS>u*F3u5#d;x zAVMm`a3LFl`eGc>8m8Qa7w)2?F$`0nyKDC0`_a>njE;7R-TfCJL+`%^87y)FuxiMF z*>*n(%4}<{{OM)a(JJ&@`WvD-_JqW>EH<4}Q{|Z|_G4GrSJRKEd|^y(#2XE?PjV63 zm@}9sD0xOiwl9S=#}|J`prst*C1Ll?8T=aIMgd6%@mR-uzd$}6pK=c z}Ma_)8=}> z?&MH}>?u)g^j9g`auL3TnEGvp+^dQW2r-~`)6ih^w?h^$$^+z3t;BG)6isk{)r|uK zmd0M2cj||ze7#9{Y+^`zdvW_gzwLGhNwns|wcnk|7D-PRzB;b3s^K?iKSflb;K%h< zVjp}LBk;F~8@P}sKGpe1sq*6o)Yl~A`So>pdWz{&RBv(=rV!TvRO0zFcvD?)*#+C- zs;XO>cvSbM4NNX{&G~0Np0?Jg-}23igfR|S6;m&<*KJyJyK&BPEx^M=#f0P>nrj!~ zef4!@_IgXVJ;d_j$yBg7f9FD9NKM_O@bi?~tE_ud0g+|FDx77to%K&T%r^NLiHi8= zPo0Rk;+wSFv495vpF~DNqz(1f7J=Y1rt0`UGqo_RdH0-tlx54?qDKyTT@^e>^<>Yf zJcpcfBksv14_#dH6f$?;k;uS_ru%0sq8c2QOG7=Ry03h+3Ep58dhmCvG%Fc-Co3C@ zVlNvBVkrbcDJ0D#@S9 zVmZ=YwfuJ5NLwyDjZYL!Aw1_oH=}Y|w=5J8X{uc4!6X;DNcF$u-+=E@c=d)_veoXU zUhWynK|Xa6+|vj}mlKb3pN3sM*0a6)lAhmzj`rJW?iMdh-<_8gy?k&AOODF~%bC~h z@dN)YBO5M#a5>_2VH1UF8H7^bIm@ zzeYYSY#twu7uf7KbW?`KBvoBi#wBE)etMc#`J?y5U8e`k&`rmWeJX7;-UlqNdvRg} z5Kh7{7E${V!ML1o<&F(9KC%rtLku_r@e07E^}goF?Hs+ZfMtu?HRpNK4Sz0FRcCzq zDc_wSKS}&bS1cCQQh79Y*V}GvD0|;pX8h~8Dd+q(J%od?$OnmyF>+^2qG~?s`&C5j z8yC78#gs?dHUr;Ma7mp#oj!*uf(ugF3V;((Wzh^dcQw?3`x$m#?N=E_+d`dPVCDI8 zA@@Qq)NunYo@C1d`=p9x0_WmU4UCej27F)fKLb79d@C8C54^t`(U3?f!P1UgMKgEe zXIe4dLtIG2VRXspGyc&Av%&8gURvNUSlmQ$>5tbGJ11Cz!C05NGZV=zHL_qwSf%x>@X`pEAi)!+hk27psBw<4Y41bk(AT|c9*dYzyA z{#U!RG*j}WoL*J$6+bAIGW{UdwmGfd7b`zJT%D4I?)t!rM?S8TQD}Y>lPN0%4oV$J*;DqCvd-SxNEhh+S6^p&|g)i)kusDG4fP zV1;nonIr5I@eVvXrFf5LG>>6`niogW95l8&>K{BWK=R?4 z{|Q_M>kI_G@Pbv{N#IFA<7`|;cF8%jqxJBtbpUrvnOxxsB$oR#^$d~2tWgr@=9)i} zqdC1QOPJ0^Hf#XVL_MtX117Q39r++0&EV?poFM)syc}(19%%3I-Z-N44aE zkT@ocZBakuS0>ALpz7+HIcU)*Qt^+HjiL_A3>wKKu z>I)4-q+I*C)Eu`(mjBBO#wt5Tcq(%<@pu-|6PN*eg7J& zMpfb5kfCY~t>$FSfu&oA$(&^sF62f$TDnlm_#$ei?oxqP>vk4I2IbZ?rMVE!BXz+H zlXB7(=%FO6JJts1TPuw8ue_V6#5<6$8Zu@qcj6#*wm#Ec6oh`Mmn6>&=M1?h!5?h~ zVCew#v2RrXilhz>PBTJj_SM%-cy{=WIf%#GDX`0OYks#29OL9r1w)ly9b}8sW{eEu zzeizPLdoH9uv*q=_)uhb8)^3(Db0ppEfDQg^<-9JTIbMH1DC8ePUcVYv>mcOn=&uY z_TXf&<>{EwI1@|uODs}G8>5W(W#H{^mVu5bS zu>m@W@r#Uj-i* zaHy+YVfT8|q8cOJVxvcil0-^5{*@YybX|#)ZK58ynbo{$_u9*CO_pcmZ>AW@-c;gr z_zoj`aJ}E;nCi626U^+<*`Tp2FA4MHf!xEw8D>zwz=NttYx(y~|k4Wb=_etH17M9El*lU*cFa z-+G=C6Vac-tZu&Z>Rt$+s0^N16&~E58mfI{#KW4|f1gQg&GSePk0Z@x6RZ1(7g{H5 z8m2o|v-X}eemQGr8on-@{{~b0A)i^}^JTnvN!R?bPZ-5vXJCKp5STzgg>~nSfmKxlg?D^b}+~`7z*%hyx_*1(L%UrQT8+kXgx98#4a>mn?Pc==vv&!@ky&PG z?MIK-0&fC{@0eh3Jnay6uzsafa~v5_i2_xgIPxWMtoRVc>l z@cadK1!0Peh_!(GW&gl49Ig;J8uf$;ooHihoY}_IQI!^~AX`6+`mDPJ6kSyAd}Ap} z(<}x!zl4JAE2MY*xEbB#y-CV>GTc>0CLBi*e)e{$# z;`WFuD{R)6ab!XQLPf*dmsR-a`6w{Gzxxkh#;Vzp4vZVmIrw^h*N3mYq$A3UugK3B z9nO>Ybw72lX%jv}^=^EY!#&$4;S#JF&I6b-fM@P>ZWvkb>K5tKK`_(wrK_x2f`EB$ zi<@3@()}w;Ib)aTACIiC=ByE;RaskG42QX3LucfBJ~| zmdd*2z!SC;j&rMR{vcLFwR_`dQ0?U7mzy_uxtMu2Ax_6g0^2apmYhV^N709n^*88Q zC=fPDj^A?a)W4fHW=`Lbb57meR;GS!^`c8t(8h)g-cJU|f`Qr_PcG!*&vfNN09*a| zy&I-!q7hA^G)y64*5M?O-Vxd%_+|*hEiOBJG?jPI@K)r$?GAjOGuK>nB$Hll5xH62 zuvKO_O=mI-U@^^_HA99IrwCC;-V+ts+N=YS61Bem;$a@knzI}C9IrjPKdbHNyVRYG zJ-??b3A^q<>s|1jbk1m_-srpEQg%*cH~+HsLB5?qBR;Y#kAns%Yl+~l=P_UW8HvoR zELViAxPkMiezU{m4@JGMvZ|Bz!$!M*$h3|zJq+5Oo5TnaTChx`^T?6a(GivmTMJ;s zgX-f1rd~QD8BfB#z&FERN{`pLD$`ImyPYaxi^h5@FPLC+*J^0zI_AM{A4p`&5ZbX4e|Pu zh9>_T4GnVi|48EsK8OT2Ptyl|;~fE`9Z#Si0iiz6BY>q1NPvMHBQOZeelE1b7jWGI zL|~Ip*wKf;j`G<62HGzbNhj@>R$rR{7SaM9pReBy52QW@pt*65cqa>aL!@+!tQybX zLNk=6h-;T?^HEE}e{q73Ox1i)wqP(-{{{wgf`GdIFNirGRSlxj95i3u29^zO2rveS z0Q+FVL}#SysA^?)mDONm?Jf1m4R^>Nb~_T;>*}N#x0sv8Qon>UV(7$~uk>BA+xks5 zmAOx)uhyF9N!`ioqaH{zaJb~yLr<^07Nb5(W&(@LE>fZxfT%YBXyPNIWY_{j3n9-) zUOd?d%+OH+|H)^U_n)Q}Co$Oh7JAoxs>?EjO-k;+n~e!+Ggakd7Af@+EAdP{5`%?5 zNViUeDY=T6y7pHE)r#u0J9p}5hB8@)I|Hx2)aXi?uz_UU5RFg%vQ06l11L|Aw=6TZ zKYenhliuGjQi*92Nqy;ytnbsPx@xfFM$r1^=R}r7W7h#TI^)3p_mVsuJg`awBh`yO za)NP0N^U(=b4;_C0ZWEe`+V5kVS6~+yGe$#-0XLG3==rayJwlLwR6r++-5E!YlS=* z&q!w8Vx7WueA59stZs`wMb9WTD>B;lRiV!Rdd#5iwfnRA2dNg(E;~mJb)93QRQbAb zq5%5!&!Xs_O;}ztndWnJ>7->lKWTd&yX$#V&%2(ZoA?jd482k!MXY5a!cjE7cOx(Q zXIXS>Mi|pOPD7-@x#rxx3&qM0h%f!-RPH@UP=1tkPNnleA_ANO$e0XlVZIy{OaR9Z z^Dq^t(^Rr?lcKnerp31kLC2a?senI!IOBMe)yupFoLLWWN^fx;M25})JXO#ZjoInD z6pE}Dc6+zf-NM{4q{eqQSZGEEoOEolhSj-fa@u0>yHn&dWFoa4z<#0wX2UP^k9jc9+&w`UMaQEn&)pcy z&Q_DR?Y*+M>~xLnph{JSRWNyf$a^v4Xom~zApc~ekcWo%GX(~6s36_QX^gxIyo)r_ zMMP=V%SAeOXRI|+&dLPr78gsE4?Y1X+cKmZPy3CWIwHI*Qg)T{sjwwW?u~cawpVnC z=U&Km<5_+E0IAV3hvT@|+Y|R~I+KMLzNdBfaIlwt`7>)cjeW3$E&m3NuL@N#J-c-0{4?`*>^bEW}6~U(y)yh=>5GH zFFjL!74K=ed&9l0IjL?dcc=t(D;!2j84@B)YHn?8eYLYvT`RaccoF0AkuH{Y!&awP z!{GckU%D1`(E63bh970~FD5}e)E7L`jEc|PJTFzB@My4BjrX`+%zK9b7E(~Jije90 z&n)Ml_mgRs0nXoc^lv|xA|+~Fh^7%9q@sSW0j`a5lndz&gwGkC$24NbaVh5Xw!zj` zd71L@*PH3jtX#7vqYC9yP{*8hGFLB&xt--g^~pG|;js9Yi(+R$HCTmf+66={-MA2Q zt^I01{BPv#9EW`P0y>eXU=prCjKj(PsF&&2+h3~O7HNb?S#m zLzX@I0d7mAmJ0H=g5%p)KQbEWr(HdPX}#|sY0ZU99Khk*y3N5@5u2lr3;pq{_m4NV z7EYW`<3f$5EQb~5dD=_*D=swMFF&Rwg6om^A^jdF&DQYp-lBcd@ip&0rM&ukOW2`E z%cPq`M?{~0#Y`zzPIt3YoKV~1TEE5U?%yf{QUTcflv>h&S91;X9s6|Rh!$H7d*d_z z1w*|cFN&DMe9cY+@2JlRX%*lg&-Lu|GcM_B@^Od%lTMTarAry7H(37-< zJWn`zK=Rs&7Y9j6JFHx#o;L{!m@9Q}&s=LrbSI)09$2_i(gGtqP=_8T@eI z-oTlPYX_H%1#t2|BD}J`Rh=#TO{YI|(*Z%&91lkqOWbTQb>3GY2OFq-99xhC+cH0E zmatVpT*lFD8pM!Fe-Mv;2Q{6Nxck3&g8xGb1-`%yJ?Mob7YwKqApcP(P{scD=O8$1 z^7N8aX+9TvAJK%=p9Xlm)ko9Gi#Cda4r;A$g~pVNTNjGsm5L41(F-4xJu|JVggnuZTd_6 z42foKDX!BJF!p9HmuIW4n@_*k1Co1LjOjE>lrTPmh|M$4KMTV%WSF6J!^3{h!z@UB zRzL0ynFKOvb?;H28TNrAc z!#!)WdBTOL3N#Xj_acV2Sqs@tEYM;CDvm8rq8~$qPqOy7B0Y)_^W&p1tHH5jJ(UkC zvvW5s%l@8i|2j-WHe+;aWUte0P4eA6vZlWCTFlsV#%(Z;2^}ykBNK3k051TTb3L>P zy|f+#hwog7%*4nDRQ&1Sj14+%hDT*xH407~-N(N%KgQG&K7*kPs?2T!MUoO==BOF~ zPVRK%LK_2dUFf9%BNQUu1>)7S5RBGyW~{?dKBERr7BJprz#Xplfmd}>nXxb<^?!Ok zFUZ{U9j}XLWHU*HtqymBD6^Y=1kccZO8>;)4oc(z%oF<<{*KDi0H87z{Izx^rW}Bd zO+-pUJs@6V9K*UtrIXFJu@7{!uLg{n8ryaIC8uPp`BbJfo-Dy%4u6cA(0?~oEpI%T zi2aZ1CjR%cyz|M2Pz}V*05j|dDEbeU*XaK{mX`yZO$?a5wxecz@BsZ!pjlEqtIfiM z@i9s{_&QJ4zQ|+MEQk0ypCWf3!?yLJ6~k&rewqt-7&Mjg-F~;J9nNrIZ-SAdcWCkm z=@y!^t;d(+D=~*JL9Xy18fXOojx9KuX8XdL7+%a5#fZ2Abm8TX{ui4nPwn38t+{`A zT;tP*Egv&fCiW532(ut6?&Dmu0;yC7L>NPnH?6SUO2a25c_x>WSUPm%V&sdLC$&W~ z79~_fuq`LFTg`}Wka{PAid1G^qtB0$XVC}$iEssl@tDK5ANVb zllGbW^Bw`%0TNrzpT%oEhEMoKAjQP9_g840rk=}gQrx(B?EBSzK9<#N;JyKap@#}W z7lZRrGbDyCC!g#$3bhJITu?~cpv(M6Qxpi%~@7{s-j#r3$j|)gGS0CP`R%mm^`#aCw z7$K8!#i}yl@_Pq+PCkA>PHbv@E8CILWgj)UI3OP;hPiouvEZ%Ym~_k|CQMgxqJ8dq zPSVa0UE1?;QPV6ZwXv>^h%IzFe*J>=xpLTO)cbI<>(Q(}4Z>^i7D7j}s*=g1U{8Rh zB#%Uc=mYWXuOhyilP6sa>ru4w0=WCibU5nN{db5{XTS1T`?2O4m6&CFY(rKkqrS}F zSLw@_`Aw^f*A~<~-|;WEdzxs-;kQUEADnI)Ep4?qP>3~1ZNW2l#m{b|q{eIx!3ZJJ z1A{8Jv@*%BbFJ)i_}O(=h9@6ibp~%%&C1eWxP0mcFBVpe{hT!T(g+&V zN1ULqG?V##r3WWU121VQJ6YRL78H}4z0HpEj(!48CuF-Ec*svofi@$@22awc�R2V*J6MXq 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 F{u}R=q(uM# literal 0 HcmV?d00001 diff --git a/ui/litellm-dashboard/public/assets/logos/llm_guard.png b/ui/litellm-dashboard/public/assets/logos/llm_guard.png new file mode 100644 index 0000000000000000000000000000000000000000..ed01c0f044eb2ec112becda5d5a02dbc75ffc1e0 GIT binary patch literal 48665 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 literal 0 HcmV?d00001 diff --git a/ui/litellm-dashboard/public/assets/logos/secret_detect.png b/ui/litellm-dashboard/public/assets/logos/secret_detect.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e09d330775a2b0f17b2b629d2e5a935b934b9e GIT binary patch literal 15590 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 list of param descriptors +interface ProviderParam { + param: string; + description: string; + required: boolean; + default_value?: string; + options?: string[]; + type?: string; +} + +interface ProviderParamsResponse { + [provider: string]: ProviderParam[]; +} + const AddGuardrailForm: React.FC = ({ visible, onClose, @@ -48,22 +62,29 @@ const AddGuardrailForm: React.FC = ({ const [selectedEntities, setSelectedEntities] = useState([]); const [selectedActions, setSelectedActions] = useState<{[key: string]: string}>({}); const [currentStep, setCurrentStep] = useState(0); + const [providerParams, setProviderParams] = useState(null); - // Fetch guardrail settings when the component mounts + // Fetch guardrail UI settings + provider params on mount / accessToken change useEffect(() => { - const fetchGuardrailSettings = async () => { + if (!accessToken) return; + + const fetchData = async () => { try { - if (!accessToken) return; - - const data = await getGuardrailUISettings(accessToken); - setGuardrailSettings(data); + // Parallel requests for speed + const [uiSettings, providerParamsResp] = await Promise.all([ + getGuardrailUISettings(accessToken), + getGuardrailProviderSpecificParams(accessToken), + ]); + + setGuardrailSettings(uiSettings); + setProviderParams(providerParamsResp); } catch (error) { - console.error('Error fetching guardrail settings:', error); - message.error('Failed to load guardrail settings'); + console.error('Error fetching guardrail data:', error); + message.error('Failed to load guardrail configuration'); } }; - - fetchGuardrailSettings(); + + fetchData(); }, [accessToken]); const handleProviderChange = (value: string) => { @@ -109,10 +130,7 @@ const AddGuardrailForm: React.FC = ({ if (selectedProvider === 'PresidioPII') { fieldsToValidate.push('presidio_analyzer_api_base', 'presidio_anonymizer_api_base'); - } else if (selectedProvider === 'Bedrock') { - fieldsToValidate.push('config'); } - await form.validateFields(fieldsToValidate); } } @@ -193,18 +211,7 @@ const AddGuardrailForm: React.FC = ({ try { const configObj = JSON.parse(values.config); // For some guardrails, the config values need to be in litellm_params - // Especially for providers like Bedrock that need guardrailIdentifier and guardrailVersion - if (values.provider === 'Bedrock' && configObj) { - if (configObj.guardrail_id) { - guardrailData.litellm_params.guardrailIdentifier = configObj.guardrail_id; - } - if (configObj.guardrail_version) { - guardrailData.litellm_params.guardrailVersion = configObj.guardrail_version; - } - } else { - // For other providers, add the config to guardrail_info - guardrailData.guardrail_info = configObj; - } + guardrailData.guardrail_info = configObj; } catch (error) { message.error('Invalid JSON in configuration'); setLoading(false); @@ -212,6 +219,32 @@ const AddGuardrailForm: React.FC = ({ } } + /****************************** + * Add provider-specific params + * ---------------------------------- + * The backend exposes exactly which extra parameters a provider + * accepts via `/guardrails/ui/provider_specific_params`. + * Instead of copying every unknown form field, we fetch the list for + * the selected provider and ONLY pass those recognised params. + ******************************/ + + // Use pre-fetched provider params to copy recognised params + if (providerParams && selectedProvider) { + const providerKey = guardrail_provider_map[selectedProvider]?.toLowerCase(); + const providerSpecificParams = providerParams[providerKey] || []; + + const allowedParams = new Set( + providerSpecificParams.map((p) => p.param) + ); + + allowedParams.forEach((paramName) => { + const paramValue = values[paramName]; + if (paramValue !== undefined && paramValue !== null && paramValue !== '') { + guardrailData.litellm_params[paramName] = paramValue; + } + }); + } + if (!accessToken) { throw new Error("No access token available"); } @@ -252,13 +285,36 @@ const AddGuardrailForm: React.FC = ({ - {field.options?.map((option) => ( + {field.type === "select" && field.options ? ( + + ) : field.param.includes("password") || field.param.includes("secret") ? ( + ) : ( )} diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 5d12e0c026a..b4320d59f26 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -5096,3 +5096,30 @@ export const getGuardrailUISettings = async (accessToken: string) => { throw error; } }; + +export const getGuardrailProviderSpecificParams = async (accessToken: string) => { + try { + const url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/ui/provider_specific_params` : `/guardrails/ui/provider_specific_params`; + + const response = await fetch(url, { + method: "GET", + headers: { + [globalLitellmHeaderName]: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + const errorData = await response.text(); + handleError(errorData); + throw new Error("Failed to get guardrail provider specific parameters"); + } + + const data = await response.json(); + console.log("Guardrail provider specific params response:", data); + return data; + } catch (error) { + console.error("Failed to get guardrail provider specific parameters:", error); + throw error; + } +};