Spaces:
Configuration error
Configuration error
# What is this? | |
## Unit Tests for guardrails config | |
import asyncio | |
import inspect | |
import os | |
import sys | |
import time | |
import traceback | |
import uuid | |
from datetime import datetime | |
import pytest | |
from pydantic import BaseModel | |
import litellm.litellm_core_utils | |
import litellm.litellm_core_utils.litellm_logging | |
sys.path.insert(0, os.path.abspath("../..")) | |
from typing import Any, List, Literal, Optional, Tuple, Union | |
from unittest.mock import AsyncMock, MagicMock, patch | |
import litellm | |
from litellm import Cache, completion, embedding | |
from litellm.integrations.custom_logger import CustomLogger | |
from litellm.types.utils import LiteLLMCommonStrings | |
class CustomLoggingIntegration(CustomLogger): | |
def __init__(self) -> None: | |
super().__init__() | |
def logging_hook( | |
self, kwargs: dict, result: Any, call_type: str | |
) -> Tuple[dict, Any]: | |
input: Optional[Any] = kwargs.get("input", None) | |
messages: Optional[List] = kwargs.get("messages", None) | |
if call_type == "completion": | |
# assume input is of type messages | |
if input is not None and isinstance(input, list): | |
input[0]["content"] = "Hey, my name is [NAME]." | |
if messages is not None and isinstance(messages, List): | |
messages[0]["content"] = "Hey, my name is [NAME]." | |
kwargs["input"] = input | |
kwargs["messages"] = messages | |
return kwargs, result | |
def test_guardrail_masking_logging_only(): | |
""" | |
Assert response is unmasked. | |
Assert logged response is masked. | |
""" | |
callback = CustomLoggingIntegration() | |
with patch.object(callback, "log_success_event", new=MagicMock()) as mock_call: | |
litellm.callbacks = [callback] | |
messages = [{"role": "user", "content": "Hey, my name is Peter."}] | |
response = completion( | |
model="gpt-3.5-turbo", messages=messages, mock_response="Hi Peter!" | |
) | |
assert response.choices[0].message.content == "Hi Peter!" # type: ignore | |
time.sleep(3) | |
mock_call.assert_called_once() | |
print(mock_call.call_args.kwargs["kwargs"]["messages"][0]["content"]) | |
assert ( | |
mock_call.call_args.kwargs["kwargs"]["messages"][0]["content"] | |
== "Hey, my name is [NAME]." | |
) | |
def test_guardrail_list_of_event_hooks(): | |
from litellm.integrations.custom_guardrail import CustomGuardrail | |
from litellm.types.guardrails import GuardrailEventHooks | |
cg = CustomGuardrail( | |
guardrail_name="custom-guard", event_hook=["pre_call", "post_call"] | |
) | |
data = {"model": "gpt-3.5-turbo", "metadata": {"guardrails": ["custom-guard"]}} | |
assert cg.should_run_guardrail(data=data, event_type=GuardrailEventHooks.pre_call) | |
assert cg.should_run_guardrail(data=data, event_type=GuardrailEventHooks.post_call) | |
assert not cg.should_run_guardrail( | |
data=data, event_type=GuardrailEventHooks.during_call | |
) | |
def test_guardrail_info_response(): | |
from litellm.types.guardrails import GuardrailInfoResponse, LitellmParams, GuardrailInfoLiteLLMParamsResponse | |
guardrail_info = GuardrailInfoResponse( | |
guardrail_name="aporia-pre-guard", | |
litellm_params=GuardrailInfoLiteLLMParamsResponse( | |
guardrail="aporia", | |
mode="pre_call", | |
), | |
guardrail_info={ | |
"guardrail_name": "aporia-pre-guard", | |
"litellm_params": { | |
"guardrail": "aporia", | |
"mode": "always_on", | |
}, | |
}, | |
) | |
assert guardrail_info.litellm_params.default_on == False | |