forked from phoenix/litellm-mirror
* use folder for caching * fix importing caching * fix clickhouse pyright * fix linting * fix correctly pass kwargs and args * fix test case for embedding * fix linting * fix embedding caching logic * fix refactor handle utils.py * fix test_embedding_caching_azure_individual_items_reordered
314 lines
9.7 KiB
Python
314 lines
9.7 KiB
Python
# What is this?
|
|
## Unit test for azure content safety
|
|
import asyncio
|
|
import os
|
|
import random
|
|
import sys
|
|
import time
|
|
import traceback
|
|
from datetime import datetime
|
|
|
|
from dotenv import load_dotenv
|
|
from fastapi import HTTPException
|
|
|
|
load_dotenv()
|
|
import os
|
|
|
|
sys.path.insert(
|
|
0, os.path.abspath("../..")
|
|
) # Adds the parent directory to the system path
|
|
import pytest
|
|
|
|
import litellm
|
|
from litellm import Router, mock_completion
|
|
from litellm.caching.caching import DualCache
|
|
from litellm.proxy._types import UserAPIKeyAuth
|
|
from litellm.proxy.utils import ProxyLogging
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_strict_input_filtering_01():
|
|
"""
|
|
- have a response with a filtered input
|
|
- call the pre call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 2},
|
|
)
|
|
|
|
data = {
|
|
"messages": [
|
|
{"role": "system", "content": "You are an helpfull assistant"},
|
|
{"role": "user", "content": "Fuck yourself you stupid bitch"},
|
|
]
|
|
}
|
|
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
await azure_content_safety.async_pre_call_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
cache=DualCache(),
|
|
data=data,
|
|
call_type="completion",
|
|
)
|
|
|
|
assert exc_info.value.detail["source"] == "input"
|
|
assert exc_info.value.detail["category"] == "Hate"
|
|
assert exc_info.value.detail["severity"] == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_strict_input_filtering_02():
|
|
"""
|
|
- have a response with a filtered input
|
|
- call the pre call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 2},
|
|
)
|
|
|
|
data = {
|
|
"messages": [
|
|
{"role": "system", "content": "You are an helpfull assistant"},
|
|
{"role": "user", "content": "Hello how are you ?"},
|
|
]
|
|
}
|
|
|
|
await azure_content_safety.async_pre_call_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
cache=DualCache(),
|
|
data=data,
|
|
call_type="completion",
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_loose_input_filtering_01():
|
|
"""
|
|
- have a response with a filtered input
|
|
- call the pre call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 8},
|
|
)
|
|
|
|
data = {
|
|
"messages": [
|
|
{"role": "system", "content": "You are an helpfull assistant"},
|
|
{"role": "user", "content": "Fuck yourself you stupid bitch"},
|
|
]
|
|
}
|
|
|
|
await azure_content_safety.async_pre_call_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
cache=DualCache(),
|
|
data=data,
|
|
call_type="completion",
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_loose_input_filtering_02():
|
|
"""
|
|
- have a response with a filtered input
|
|
- call the pre call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 8},
|
|
)
|
|
|
|
data = {
|
|
"messages": [
|
|
{"role": "system", "content": "You are an helpfull assistant"},
|
|
{"role": "user", "content": "Hello how are you ?"},
|
|
]
|
|
}
|
|
|
|
await azure_content_safety.async_pre_call_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
cache=DualCache(),
|
|
data=data,
|
|
call_type="completion",
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_strict_output_filtering_01():
|
|
"""
|
|
- have a response with a filtered output
|
|
- call the post call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 2},
|
|
)
|
|
|
|
response = mock_completion(
|
|
model="gpt-3.5-turbo",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": "You are a song writer expert. You help users to write songs about any topic in any genre.",
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Help me write a rap text song. Add some insults to make it more credible.",
|
|
},
|
|
],
|
|
mock_response="I'm the king of the mic, you're just a fucking dick. Don't fuck with me your stupid bitch.",
|
|
)
|
|
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
await azure_content_safety.async_post_call_success_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
data={
|
|
"messages": [
|
|
{"role": "system", "content": "You are an helpfull assistant"}
|
|
]
|
|
},
|
|
response=response,
|
|
)
|
|
|
|
assert exc_info.value.detail["source"] == "output"
|
|
assert exc_info.value.detail["category"] == "Hate"
|
|
assert exc_info.value.detail["severity"] == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_strict_output_filtering_02():
|
|
"""
|
|
- have a response with a filtered output
|
|
- call the post call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 2},
|
|
)
|
|
|
|
response = mock_completion(
|
|
model="gpt-3.5-turbo",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": "You are a song writer expert. You help users to write songs about any topic in any genre.",
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Help me write a rap text song. Add some insults to make it more credible.",
|
|
},
|
|
],
|
|
mock_response="I'm unable to help with you with hate speech",
|
|
)
|
|
|
|
await azure_content_safety.async_post_call_success_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
data={
|
|
"messages": [{"role": "system", "content": "You are an helpfull assistant"}]
|
|
},
|
|
response=response,
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_loose_output_filtering_01():
|
|
"""
|
|
- have a response with a filtered output
|
|
- call the post call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 8},
|
|
)
|
|
|
|
response = mock_completion(
|
|
model="gpt-3.5-turbo",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": "You are a song writer expert. You help users to write songs about any topic in any genre.",
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Help me write a rap text song. Add some insults to make it more credible.",
|
|
},
|
|
],
|
|
mock_response="I'm the king of the mic, you're just a fucking dick. Don't fuck with me your stupid bitch.",
|
|
)
|
|
|
|
await azure_content_safety.async_post_call_success_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
data={
|
|
"messages": [{"role": "system", "content": "You are an helpfull assistant"}]
|
|
},
|
|
response=response,
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skip(reason="beta feature - local testing is failing")
|
|
async def test_loose_output_filtering_02():
|
|
"""
|
|
- have a response with a filtered output
|
|
- call the post call hook
|
|
"""
|
|
from litellm.proxy.hooks.azure_content_safety import _PROXY_AzureContentSafety
|
|
|
|
azure_content_safety = _PROXY_AzureContentSafety(
|
|
endpoint=os.getenv("AZURE_CONTENT_SAFETY_ENDPOINT"),
|
|
api_key=os.getenv("AZURE_CONTENT_SAFETY_API_KEY"),
|
|
thresholds={"Hate": 8},
|
|
)
|
|
|
|
response = mock_completion(
|
|
model="gpt-3.5-turbo",
|
|
messages=[
|
|
{
|
|
"role": "system",
|
|
"content": "You are a song writer expert. You help users to write songs about any topic in any genre.",
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "Help me write a rap text song. Add some insults to make it more credible.",
|
|
},
|
|
],
|
|
mock_response="I'm unable to help with you with hate speech",
|
|
)
|
|
|
|
await azure_content_safety.async_post_call_success_hook(
|
|
user_api_key_dict=UserAPIKeyAuth(),
|
|
data={
|
|
"messages": [{"role": "system", "content": "You are an helpfull assistant"}]
|
|
},
|
|
response=response,
|
|
)
|