Coverage for .venv/lib/python3.13/site-packages/litellm/proxy/guardrails/guardrail_hooks/straiker/__init__.py: 37%
36 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 typing import TYPE_CHECKING, Final, Literal
3from pydantic import BaseModel
5import litellm
6from litellm.types.guardrails import SupportedGuardrailIntegrations
8from .straiker import StraikerGuardrail
10if TYPE_CHECKING: 10 ↛ 11line 10 didn't jump to line 11 because the condition on line 10 was never true
11 from litellm.types.guardrails import Guardrail, LitellmParams
14class _V3Routing(BaseModel):
15 api_version: Literal["v1", "v3"] | None = None
16 agent_ref: str | None = None
17 client: str | None = None
18 format_hint: Literal["anthropic.messages", "openai.chat"] | None = None
21_OPTIONAL_INIT_FIELDS: Final = (
22 "timeout",
23 "max_retries",
24 "initial_backoff",
25 "max_backoff",
26 "unreachable_fallback",
27 "fail_on_error",
28 "max_payload_bytes",
29 "custom_headers",
30 "metadata",
31 "verbose",
32)
35def _get_config_value(litellm_params: "LitellmParams", optional_params: object, attribute_name: str) -> object:
36 if optional_params is not None:
37 if isinstance(optional_params, dict):
38 value = optional_params.get(attribute_name)
39 else:
40 value = getattr(optional_params, attribute_name, None)
41 if value is not None:
42 return value
43 return getattr(litellm_params, attribute_name, None)
46def initialize_guardrail(litellm_params: "LitellmParams", guardrail: "Guardrail"):
47 optional_params: Final = getattr(litellm_params, "optional_params", None)
48 api_key: Final = litellm_params.api_key
49 if not api_key:
50 raise ValueError("api_key is required for straiker")
52 api_base: Final = litellm_params.api_base or "https://api.prod.straiker.ai"
53 default_app: Final = getattr(litellm_params, "default_app", None) or getattr(litellm_params, "source", None)
54 source: Final = default_app if isinstance(default_app, str) and default_app else "LiteLLM Gateway"
55 kwargs: Final[dict[str, object]] = {
56 field: value
57 for field in _OPTIONAL_INIT_FIELDS
58 for value in [_get_config_value(litellm_params, optional_params, field)]
59 if value is not None
60 }
61 routing: Final = _V3Routing.model_validate(
62 {
63 field: _get_config_value(litellm_params, optional_params, field)
64 for field in ("api_version", "agent_ref", "client", "format_hint")
65 }
66 )
67 _callback: Final = StraikerGuardrail(
68 api_key=api_key,
69 api_base=api_base if isinstance(api_base, str) else "https://api.prod.straiker.ai",
70 source=source,
71 guardrail_name=guardrail.get("guardrail_name", "straiker"),
72 event_hook=litellm_params.mode,
73 default_on=litellm_params.default_on,
74 api_version=routing.api_version,
75 agent_ref=routing.agent_ref,
76 client=routing.client,
77 format_hint=routing.format_hint,
78 **kwargs,
79 )
81 litellm.logging_callback_manager.add_litellm_callback(_callback)
82 return _callback
85guardrail_initializer_registry: Final = {
86 SupportedGuardrailIntegrations.STRAIKER.value: initialize_guardrail,
87}
89guardrail_class_registry: Final = {
90 SupportedGuardrailIntegrations.STRAIKER.value: StraikerGuardrail,
91}