Coverage for .venv/lib/python3.13/site-packages/litellm/proxy/guardrails/guardrail_hooks/typesafe/__init__.py: 33%
29 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:01 +0000
1from __future__ import annotations
3from typing import TYPE_CHECKING, Final
5from pydantic import BaseModel
7from litellm.types.guardrails import (
8 GuardrailEventHooks,
9 Mode,
10 SupportedGuardrailIntegrations,
11)
12from litellm.types.proxy.guardrails.guardrail_hooks.typesafe import (
13 TypeSafeGuardrailOptionalParams,
14)
16from .typesafe import TypeSafeGuardrail
18if TYPE_CHECKING: 18 ↛ 19line 18 didn't jump to line 19 because the condition on line 18 was never true
19 from litellm.types.guardrails import Guardrail, LitellmParams
22def _coerce_event_hook(
23 mode: str | list[str] | Mode,
24) -> GuardrailEventHooks | list[GuardrailEventHooks] | Mode:
25 if isinstance(mode, Mode):
26 return mode
27 if isinstance(mode, list):
28 return [ # mutable-ok: CustomGuardrail event_hook contract wants a list
29 GuardrailEventHooks(item) for item in mode
30 ]
31 return GuardrailEventHooks(mode)
34def _optional_params(litellm_params: LitellmParams) -> TypeSafeGuardrailOptionalParams:
35 value: Final = litellm_params.optional_params
36 if isinstance(value, TypeSafeGuardrailOptionalParams):
37 return value
38 if isinstance(value, BaseModel):
39 return TypeSafeGuardrailOptionalParams.model_validate(value.model_dump())
40 return TypeSafeGuardrailOptionalParams()
43def initialize_guardrail(litellm_params: LitellmParams, guardrail: Guardrail) -> TypeSafeGuardrail:
44 import litellm
46 optional_params: Final = _optional_params(litellm_params)
48 _callback: Final = TypeSafeGuardrail(
49 api_base=litellm_params.api_base,
50 api_key=litellm_params.api_key,
51 model=litellm_params.model,
52 relevance_threshold=optional_params.relevance_threshold,
53 min_chars_to_evaluate=optional_params.min_chars_to_evaluate,
54 max_result_chars_in_state=optional_params.max_result_chars_in_state,
55 guardrail_name=guardrail["guardrail_name"],
56 event_hook=_coerce_event_hook(litellm_params.mode),
57 default_on=litellm_params.default_on or False,
58 unreachable_fallback=(
59 litellm_params.unreachable_fallback if "unreachable_fallback" in litellm_params.model_fields_set else None
60 ),
61 )
62 litellm.logging_callback_manager.add_litellm_callback( # pyright: ignore[reportUnknownMemberType] # callback manager is untyped
63 _callback
64 )
65 return _callback
68guardrail_initializer_registry: Final = { # mutable-ok: guardrail_registry discovery checks isinstance(registry, dict)
69 SupportedGuardrailIntegrations.TYPESAFE.value: initialize_guardrail,
70}
72guardrail_class_registry: Final = { # mutable-ok: guardrail_registry discovery checks isinstance(registry, dict)
73 SupportedGuardrailIntegrations.TYPESAFE.value: TypeSafeGuardrail,
74}