mirror of
https://github.com/tiennm99/litellm.git
synced 2026-08-06 20:25:29 +00:00
fixes - showing content filter on failure
This commit is contained in:
@@ -352,6 +352,8 @@ def get_logging_payload( # noqa: PLR0915
|
||||
guardrail_information=(
|
||||
standard_logging_payload.get("guardrail_information", None)
|
||||
if standard_logging_payload is not None
|
||||
else metadata.get("standard_logging_guardrail_information", None)
|
||||
if metadata is not None
|
||||
else None
|
||||
),
|
||||
cold_storage_object_key=(
|
||||
|
||||
@@ -21,6 +21,7 @@ from litellm.litellm_core_utils.safe_json_dumps import safe_dumps
|
||||
from litellm.proxy.spend_tracking.spend_tracking_utils import (
|
||||
_get_proxy_server_request_for_spend_logs_payload,
|
||||
_get_response_for_spend_logs_payload,
|
||||
_get_spend_logs_metadata,
|
||||
_get_vector_store_request_for_spend_logs_payload,
|
||||
_sanitize_request_body_for_spend_logs_payload,
|
||||
_should_store_prompts_and_responses_in_spend_logs,
|
||||
@@ -957,3 +958,76 @@ def test_should_store_prompts_and_responses_in_spend_logs_case_insensitive_strin
|
||||
result = _should_store_prompts_and_responses_in_spend_logs()
|
||||
assert result is False, "Expected False (from env var) when key missing, got True"
|
||||
|
||||
|
||||
def test_get_spend_logs_metadata_guardrail_info_fallback_from_metadata():
|
||||
"""
|
||||
When standard_logging_payload is None (e.g. guardrail blocks before LLM call),
|
||||
guardrail_information should fall back to reading from metadata's
|
||||
standard_logging_guardrail_information field.
|
||||
"""
|
||||
guardrail_info = [
|
||||
{
|
||||
"guardrail_name": "content_filter",
|
||||
"guardrail_provider": "litellm",
|
||||
"guardrail_mode": "pre_call",
|
||||
"guardrail_status": "guardrail_intervened",
|
||||
"guardrail_response": "Content blocked",
|
||||
}
|
||||
]
|
||||
metadata = {
|
||||
"user_api_key": "test-key",
|
||||
"standard_logging_guardrail_information": guardrail_info,
|
||||
}
|
||||
|
||||
result = _get_spend_logs_metadata(
|
||||
metadata=metadata,
|
||||
guardrail_information=None,
|
||||
)
|
||||
# When guardrail_information param is None, should NOT fall back
|
||||
# (the caller is responsible for passing it)
|
||||
assert result["guardrail_information"] is None
|
||||
|
||||
|
||||
def test_get_logging_payload_guardrail_info_when_no_standard_logging_payload():
|
||||
"""
|
||||
When a guardrail blocks a request before the LLM call, the standard_logging_object
|
||||
is not set on request_data. In this case, get_logging_payload should still include
|
||||
guardrail_information from the metadata.
|
||||
|
||||
This is the bug fix for: guardrail failures not showing GuardrailViewer in the UI.
|
||||
"""
|
||||
guardrail_info = [
|
||||
{
|
||||
"guardrail_name": "content_filter",
|
||||
"guardrail_provider": "litellm",
|
||||
"guardrail_mode": "pre_call",
|
||||
"guardrail_status": "guardrail_intervened",
|
||||
"guardrail_response": "Content blocked",
|
||||
}
|
||||
]
|
||||
# Simulate request_data as it looks when a guardrail blocks before LLM call
|
||||
kwargs = {
|
||||
"model": "gpt-4",
|
||||
"litellm_call_id": "test-call-id",
|
||||
"litellm_params": {
|
||||
"metadata": {
|
||||
"user_api_key": "test-key",
|
||||
"standard_logging_guardrail_information": guardrail_info,
|
||||
},
|
||||
"proxy_server_request": {},
|
||||
},
|
||||
# No "standard_logging_object" key - this is the failure case
|
||||
}
|
||||
|
||||
with patch("litellm.proxy.proxy_server.master_key", "sk-master"):
|
||||
with patch("litellm.proxy.proxy_server.general_settings", {}):
|
||||
payload = get_logging_payload(
|
||||
kwargs=kwargs,
|
||||
response_obj={},
|
||||
start_time=datetime.datetime.now(tz=timezone.utc),
|
||||
end_time=datetime.datetime.now(tz=timezone.utc),
|
||||
)
|
||||
|
||||
metadata_result = json.loads(payload["metadata"])
|
||||
assert metadata_result["guardrail_information"] == guardrail_info
|
||||
|
||||
|
||||
Reference in New Issue
Block a user