test3 / litellm /types /guardrails.py
DesertWolf's picture
Upload folder using huggingface_hub
447ebeb verified
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Literal, Optional, TypedDict, Union
from pydantic import BaseModel, ConfigDict, Field, SecretStr
from typing_extensions import Required, TypedDict
"""
Pydantic object defining how to set guardrails on litellm proxy
guardrails:
- guardrail_name: "bedrock-pre-guard"
litellm_params:
guardrail: bedrock # supported values: "aporia", "bedrock", "lakera"
mode: "during_call"
guardrailIdentifier: ff6ujrregl1q
guardrailVersion: "DRAFT"
default_on: true
"""
class SupportedGuardrailIntegrations(Enum):
APORIA = "aporia"
BEDROCK = "bedrock"
GURDRAILS_AI = "guardrails_ai"
LAKERA = "lakera"
LAKERA_V2 = "lakera_v2"
PRESIDIO = "presidio"
HIDE_SECRETS = "hide-secrets"
AIM = "aim"
PANGEA = "pangea"
LASSO = "lasso"
class Role(Enum):
SYSTEM = "system"
ASSISTANT = "assistant"
USER = "user"
default_roles = [Role.SYSTEM, Role.ASSISTANT, Role.USER]
class GuardrailItemSpec(TypedDict, total=False):
callbacks: Required[List[str]]
default_on: bool
logging_only: Optional[bool]
enabled_roles: Optional[List[Role]]
callback_args: Dict[str, Dict]
class GuardrailItem(BaseModel):
callbacks: List[str]
default_on: bool
logging_only: Optional[bool]
guardrail_name: str
callback_args: Dict[str, Dict]
enabled_roles: Optional[List[Role]]
model_config = ConfigDict(use_enum_values=True)
def __init__(
self,
callbacks: List[str],
guardrail_name: str,
default_on: bool = False,
logging_only: Optional[bool] = None,
enabled_roles: Optional[List[Role]] = default_roles,
callback_args: Dict[str, Dict] = {},
):
super().__init__(
callbacks=callbacks,
default_on=default_on,
logging_only=logging_only,
guardrail_name=guardrail_name,
enabled_roles=enabled_roles,
callback_args=callback_args,
)
# Define the TypedDicts
class LakeraCategoryThresholds(TypedDict, total=False):
prompt_injection: float
jailbreak: float
class PiiAction(str, Enum):
BLOCK = "BLOCK"
MASK = "MASK"
class PiiEntityCategory(str, Enum):
GENERAL = "General"
FINANCE = "Finance"
USA = "USA"
UK = "UK"
SPAIN = "Spain"
ITALY = "Italy"
POLAND = "Poland"
SINGAPORE = "Singapore"
AUSTRALIA = "Australia"
INDIA = "India"
FINLAND = "Finland"
class PiiEntityType(str, Enum):
# General
CREDIT_CARD = "CREDIT_CARD"
CRYPTO = "CRYPTO"
DATE_TIME = "DATE_TIME"
EMAIL_ADDRESS = "EMAIL_ADDRESS"
IBAN_CODE = "IBAN_CODE"
IP_ADDRESS = "IP_ADDRESS"
NRP = "NRP"
LOCATION = "LOCATION"
PERSON = "PERSON"
PHONE_NUMBER = "PHONE_NUMBER"
MEDICAL_LICENSE = "MEDICAL_LICENSE"
URL = "URL"
# USA
US_BANK_NUMBER = "US_BANK_NUMBER"
US_DRIVER_LICENSE = "US_DRIVER_LICENSE"
US_ITIN = "US_ITIN"
US_PASSPORT = "US_PASSPORT"
US_SSN = "US_SSN"
# UK
UK_NHS = "UK_NHS"
UK_NINO = "UK_NINO"
# Spain
ES_NIF = "ES_NIF"
ES_NIE = "ES_NIE"
# Italy
IT_FISCAL_CODE = "IT_FISCAL_CODE"
IT_DRIVER_LICENSE = "IT_DRIVER_LICENSE"
IT_VAT_CODE = "IT_VAT_CODE"
IT_PASSPORT = "IT_PASSPORT"
IT_IDENTITY_CARD = "IT_IDENTITY_CARD"
# Poland
PL_PESEL = "PL_PESEL"
# Singapore
SG_NRIC_FIN = "SG_NRIC_FIN"
SG_UEN = "SG_UEN"
# Australia
AU_ABN = "AU_ABN"
AU_ACN = "AU_ACN"
AU_TFN = "AU_TFN"
AU_MEDICARE = "AU_MEDICARE"
# India
IN_PAN = "IN_PAN"
IN_AADHAAR = "IN_AADHAAR"
IN_VEHICLE_REGISTRATION = "IN_VEHICLE_REGISTRATION"
IN_VOTER = "IN_VOTER"
IN_PASSPORT = "IN_PASSPORT"
# Finland
FI_PERSONAL_IDENTITY_CODE = "FI_PERSONAL_IDENTITY_CODE"
# Define mappings of PII entity types by category
PII_ENTITY_CATEGORIES_MAP = {
PiiEntityCategory.GENERAL: [
PiiEntityType.DATE_TIME,
PiiEntityType.EMAIL_ADDRESS,
PiiEntityType.IP_ADDRESS,
PiiEntityType.NRP,
PiiEntityType.LOCATION,
PiiEntityType.PERSON,
PiiEntityType.PHONE_NUMBER,
PiiEntityType.MEDICAL_LICENSE,
PiiEntityType.URL,
],
PiiEntityCategory.FINANCE: [
PiiEntityType.CREDIT_CARD,
PiiEntityType.CRYPTO,
PiiEntityType.IBAN_CODE,
],
PiiEntityCategory.USA: [
PiiEntityType.US_BANK_NUMBER,
PiiEntityType.US_DRIVER_LICENSE,
PiiEntityType.US_ITIN,
PiiEntityType.US_PASSPORT,
PiiEntityType.US_SSN,
],
PiiEntityCategory.UK: [PiiEntityType.UK_NHS, PiiEntityType.UK_NINO],
PiiEntityCategory.SPAIN: [PiiEntityType.ES_NIF, PiiEntityType.ES_NIE],
PiiEntityCategory.ITALY: [
PiiEntityType.IT_FISCAL_CODE,
PiiEntityType.IT_DRIVER_LICENSE,
PiiEntityType.IT_VAT_CODE,
PiiEntityType.IT_PASSPORT,
PiiEntityType.IT_IDENTITY_CARD,
],
PiiEntityCategory.POLAND: [PiiEntityType.PL_PESEL],
PiiEntityCategory.SINGAPORE: [PiiEntityType.SG_NRIC_FIN, PiiEntityType.SG_UEN],
PiiEntityCategory.AUSTRALIA: [
PiiEntityType.AU_ABN,
PiiEntityType.AU_ACN,
PiiEntityType.AU_TFN,
PiiEntityType.AU_MEDICARE,
],
PiiEntityCategory.INDIA: [
PiiEntityType.IN_PAN,
PiiEntityType.IN_AADHAAR,
PiiEntityType.IN_VEHICLE_REGISTRATION,
PiiEntityType.IN_VOTER,
PiiEntityType.IN_PASSPORT,
],
PiiEntityCategory.FINLAND: [PiiEntityType.FI_PERSONAL_IDENTITY_CODE],
}
class PiiEntityCategoryMap(TypedDict):
category: PiiEntityCategory
entities: List[PiiEntityType]
class GuardrailParamUITypes(str, Enum):
BOOL = "bool"
STR = "str"
class PresidioPresidioConfigModelUserInterface(BaseModel):
"""Configuration parameters for the Presidio PII masking guardrail on LiteLLM UI"""
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",
)
output_parse_pii: Optional[bool] = Field(
default=None,
description="When True, LiteLLM will replace the masked text with the original text in the response",
# extra param to let the ui know this is a boolean
json_schema_extra={"ui_type": GuardrailParamUITypes.BOOL},
)
presidio_language: Optional[str] = Field(
default="en",
description="Language code for Presidio PII analysis (e.g., 'en', 'de', 'es', 'fr')",
)
class PresidioConfigModel(PresidioPresidioConfigModelUserInterface):
"""Configuration parameters for the Presidio PII masking guardrail"""
pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] = Field(
default=None, description="Configuration for PII entity types and actions"
)
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 LakeraV2GuardrailConfigModel(BaseModel):
"""Configuration parameters for the Lakera AI v2 guardrail"""
api_key: Optional[str] = Field(
default=None, description="API key for the Lakera AI service"
)
api_base: Optional[str] = Field(
default=None, description="Base URL for the Lakera AI API"
)
project_id: Optional[str] = Field(
default=None, description="Project ID for the Lakera AI project"
)
payload: Optional[bool] = Field(
default=True, description="Whether to include payload in the response"
)
breakdown: Optional[bool] = Field(
default=True, description="Whether to include breakdown in the response"
)
metadata: Optional[Dict] = Field(
default=None, description="Additional metadata to include in the request"
)
dev_info: Optional[bool] = Field(
default=True,
description="Whether to include developer information in the response",
)
class LassoGuardrailConfigModel(BaseModel):
"""Configuration parameters for the Lasso guardrail"""
lasso_user_id: Optional[str] = Field(
default=None, description="User ID for the Lasso guardrail"
)
lasso_conversation_id: Optional[str] = Field(
default=None, description="Conversation ID for the Lasso guardrail"
)
class LitellmParams(
PresidioConfigModel,
BedrockGuardrailConfigModel,
LakeraV2GuardrailConfigModel,
LassoGuardrailConfigModel,
):
guardrail: str = Field(description="The type of guardrail integration to use")
mode: Union[str, List[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] = Field(
default=None,
description="Threshold configuration for Lakera guardrail categories",
)
# hide secrets params
detect_secrets_config: Optional[dict] = Field(
default=None, description="Configuration for detect-secrets guardrail"
)
# guardrails ai params
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] = 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",
)
# pangea params
pangea_input_recipe: Optional[str] = Field(
default=None, description="Recipe for input (LLM request)"
)
pangea_output_recipe: Optional[str] = Field(
default=None, description="Recipe for output (LLM response)"
)
class Guardrail(TypedDict, total=False):
guardrail_id: Optional[str]
guardrail_name: str
litellm_params: LitellmParams
guardrail_info: Optional[Dict]
created_at: Optional[datetime]
updated_at: Optional[datetime]
class guardrailConfig(TypedDict):
guardrails: List[Guardrail]
class GuardrailEventHooks(str, Enum):
pre_call = "pre_call"
post_call = "post_call"
during_call = "during_call"
logging_only = "logging_only"
class DynamicGuardrailParams(TypedDict):
extra_body: Dict[str, Any]
class GuardrailInfoLiteLLMParamsResponse(BaseModel):
"""The returned LiteLLM Params object for /guardrails/list"""
guardrail: str
mode: Union[str, List[str]]
default_on: Optional[bool] = False
pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] = None
def __init__(self, **kwargs):
default_on = kwargs.get("default_on")
if default_on is None:
default_on = False
super().__init__(**kwargs)
class GuardrailInfoResponse(BaseModel):
guardrail_id: Optional[str] = None
guardrail_name: str
litellm_params: Optional[GuardrailInfoLiteLLMParamsResponse] = None
guardrail_info: Optional[Dict] = None
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
guardrail_definition_location: Literal["config", "db"] = "config"
def __init__(self, **kwargs):
super().__init__(**kwargs)
class ListGuardrailsResponse(BaseModel):
guardrails: List[GuardrailInfoResponse]
class GuardrailUIAddGuardrailSettings(BaseModel):
supported_entities: List[PiiEntityType]
supported_actions: List[PiiAction]
supported_modes: List[GuardrailEventHooks]
pii_entity_categories: List[PiiEntityCategoryMap]
class PresidioPerRequestConfig(BaseModel):
"""
presdio params that can be controlled per request, api key
"""
language: Optional[str] = None
entities: Optional[List[PiiEntityType]] = None
class ApplyGuardrailRequest(BaseModel):
guardrail_name: str
text: str
language: Optional[str] = None
entities: Optional[List[PiiEntityType]] = None
class ApplyGuardrailResponse(BaseModel):
response_text: str
class PatchGuardrailLitellmParams(BaseModel):
default_on: Optional[bool] = None
pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] = None
class PatchGuardrailRequest(BaseModel):
guardrail_name: Optional[str] = None
litellm_params: Optional[PatchGuardrailLitellmParams] = None
guardrail_info: Optional[Dict[str, Any]] = None