fixes - showing content filter on failure

This commit is contained in:
Ishaan Jaffer
2026-02-17 17:57:52 -08:00
parent 5a3a0210cb
commit a6f467e896
2 changed files with 76 additions and 0 deletions
@@ -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