Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions docs/my-website/docs/adding_provider/generic_guardrail_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The **Generic Guardrail API** lets you integrate with LiteLLM **instantly** by i

### Endpoint

Implement `POST /beta/litellm_basic_guardrail_api`
Implement `POST /beta/litellm_guardrail` (or `/v1/litellm_guardrail` for v1 API version)

### Request Format

Expand Down Expand Up @@ -87,13 +87,23 @@ litellm_settings:
guardrail: generic_guardrail_api
mode: pre_call # or post_call, during_call
api_base: https://your-guardrail-api.com
api_version: beta # optional: "beta" (default) or "v1"
api_key: os.environ/YOUR_GUARDRAIL_API_KEY # optional
additional_provider_specific_params:
# your custom parameters
threshold: 0.8
language: "en"
```

**Configuration Parameters:**
- `api_base`: Base URL of your guardrail API (required, can also be set via `GENERIC_GUARDRAIL_API_BASE` environment variable)
- `api_version`: API version to use - `"beta"` (default) or `"v1"` (optional)
- `beta`: Uses endpoint `/beta/litellm_guardrail`
- `v1`: Uses endpoint `/v1/litellm_guardrail`
- `api_key`: Authentication key for your guardrail API (optional)
- `mode`: When to apply the guardrail - `pre_call`, `post_call`, or `during_call`
- `additional_provider_specific_params`: Custom parameters to pass to your guardrail API

## Usage

Users apply your guardrail by name:
Expand Down Expand Up @@ -150,7 +160,7 @@ class GuardrailResponse(BaseModel):
texts: Optional[List[str]] = None
images: Optional[List[str]] = None

@app.post("/beta/litellm_basic_guardrail_api")
@app.post("/beta/litellm_guardrail")
async def apply_guardrail(request: GuardrailRequest):
# Your guardrail logic here
for text in request.texts:
Expand All @@ -161,6 +171,11 @@ async def apply_guardrail(request: GuardrailRequest):
)

return GuardrailResponse(action="NONE")

# If you want to support both beta and v1 versions:
@app.post("/v1/litellm_guardrail")
async def apply_guardrail_v1(request: GuardrailRequest):
return await apply_guardrail(request)
```

## When to Use This
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import TYPE_CHECKING
from typing import TYPE_CHECKING, Literal, cast

from litellm.types.guardrails import SupportedGuardrailIntegrations

Expand All @@ -11,6 +11,12 @@
def initialize_guardrail(litellm_params: "LitellmParams", guardrail: "Guardrail"):
import litellm

if litellm_params.api_version is not None and litellm_params.api_version not in [
"beta",
"v1",
]:
raise ValueError("Invalid API version. Please use 'beta' or 'v1'")

_generic_guardrail_api_callback = GenericGuardrailAPI(
api_base=litellm_params.api_base,
headers=getattr(litellm_params, "headers", None),
Expand All @@ -20,6 +26,7 @@ def initialize_guardrail(litellm_params: "LitellmParams", guardrail: "Guardrail"
guardrail_name=guardrail.get("guardrail_name", ""),
event_hook=litellm_params.mode,
default_on=litellm_params.default_on,
api_version=cast(Literal["beta", "v1"], litellm_params.api_version or "beta"),
)

litellm.logging_callback_manager.add_litellm_callback(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def __init__(
self,
headers: Optional[Dict[str, Any]] = None,
api_base: Optional[str] = None,
api_version: Optional[Literal["beta", "v1"]] = "beta",
additional_provider_specific_params: Optional[Dict[str, Any]] = None,
**kwargs,
):
Expand All @@ -69,9 +70,14 @@ def __init__(
)

# Append the endpoint path if not already present
if not base_url.endswith("/beta/litellm_basic_guardrail_api"):
endpoint = (
"beta/litellm_guardrail"
if api_version == "beta"
else "v1/litellm_guardrail"
)
if not base_url.endswith(endpoint):
base_url = base_url.rstrip("/")
self.api_base = f"{base_url}/beta/litellm_basic_guardrail_api"
self.api_base = f"{base_url}/{endpoint}"
else:
self.api_base = base_url

Expand Down
4 changes: 3 additions & 1 deletion litellm/types/guardrails.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
EnkryptAIGuardrailConfigs,
)
from litellm.types.proxy.guardrails.guardrail_hooks.generic_guardrail_api import (
GenericGuardrailAPIConfigModel,
GenericGuardrailAPIOptionalParams,
)
from litellm.types.proxy.guardrails.guardrail_hooks.grayswan import (
Expand Down Expand Up @@ -62,6 +63,7 @@ class SupportedGuardrailIntegrations(Enum):
LITELLM_CONTENT_FILTER = "litellm_content_filter"
PROMPT_SECURITY = "prompt_security"
GENERIC_GUARDRAIL_API = "generic_guardrail_api"
GENERIC_GUARDRAIL_API_V1 = "generic_guardrail_api_v1"


class Role(Enum):
Expand Down Expand Up @@ -527,7 +529,7 @@ class BaseLitellmParams(BaseModel): # works for new and patch update guardrails

experimental_use_latest_role_message_only: Optional[bool] = Field(
default=False,
description="When True, guardrails only receive the latest message for the relevant role (e.g., newest user input pre-call, newest assistant output post-call)",
description="When GuardrailConfigModelTrue, guardrails only receive the latest message for the relevant role (e.g., newest user input pre-call, newest assistant output post-call)",
)

# Lakera specific params
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ class GenericGuardrailAPIOptionalParams(BaseModel):
default=None,
description="Additional provider-specific parameters to send with the guardrail request",
)
api_version: Optional[Literal["beta", "v1"]] = Field(
default="beta",
description="API version to use - `beta` (default) or `v1`",
)


class GenericGuardrailAPIConfigModel(
Expand Down
Loading