mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-09 03:18:44 +00:00
* refactor: expose core private symbols with compatibility aliases Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * types: narrow core migration diagnostics Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: preserve runtime behavior in core symbol migration Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: preserve core private usage migration behavior Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: preserve private value rebinding compatibility Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * fix: restore optional imports and cover public helpers Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test: exempt router property from call coverage Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> * test: align recursive detector ignore names Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: mateo <mateo@berri.ai> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
from typing import List, Optional, Union
|
|
|
|
from litellm.types.guardrails import GuardrailEventHooks, Mode
|
|
|
|
|
|
class EnterpriseCustomGuardrailHelper:
|
|
@staticmethod
|
|
def _should_run_if_mode_by_tag(
|
|
data: dict,
|
|
event_hook: Optional[
|
|
Union[GuardrailEventHooks, List[GuardrailEventHooks], Mode]
|
|
],
|
|
event_type: Optional[GuardrailEventHooks] = None,
|
|
) -> Optional[bool]:
|
|
"""
|
|
Returns True if the guardrail should be run for this request and event_type.
|
|
|
|
Logic:
|
|
- If a request tag matches a Mode tag key, only run if event_type matches
|
|
the tag's value (the mode for that tag).
|
|
- If no request tag matches, fall back to default mode(s).
|
|
"""
|
|
from litellm.litellm_core_utils.litellm_logging import (
|
|
StandardLoggingPayloadSetup,
|
|
)
|
|
from litellm.proxy._types import CommonProxyErrors
|
|
from litellm.proxy.proxy_server import premium_user
|
|
|
|
if not premium_user:
|
|
raise Exception(
|
|
f"Setting tag based guardrail modes is only available in litellm-enterprise. {CommonProxyErrors.not_premium_user.value}."
|
|
)
|
|
|
|
if event_hook is None or not isinstance(event_hook, Mode):
|
|
return None
|
|
|
|
proxy_server_request = data.get("proxy_server_request", {})
|
|
|
|
request_tags = StandardLoggingPayloadSetup.get_request_tags(
|
|
litellm_params=data,
|
|
proxy_server_request=proxy_server_request,
|
|
)
|
|
|
|
# Check if any request tag matches a Mode tag key
|
|
matched_mode = None
|
|
if request_tags:
|
|
for tag in request_tags:
|
|
if tag in event_hook.tags:
|
|
matched_mode = event_hook.tags[tag]
|
|
break
|
|
|
|
if matched_mode is not None:
|
|
# Tag matched: only run if event_type matches the tag's mode value(s)
|
|
if event_type is not None:
|
|
if isinstance(matched_mode, list):
|
|
return event_type.value in matched_mode
|
|
return event_type.value == matched_mode
|
|
return True
|
|
|
|
# No tag matched: fall back to default mode(s)
|
|
if event_hook.default is not None:
|
|
if event_type is not None:
|
|
default_list = (
|
|
event_hook.default
|
|
if isinstance(event_hook.default, list)
|
|
else [event_hook.default]
|
|
)
|
|
return event_type.value in default_list
|
|
return False
|
|
|
|
return False
|