mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-12 23:01:41 +00:00
Fix compliance prompt/pattern mismatches and align error handling with competitor_intent
- Add `crap` to unprofessional word list (tone_casual-4 compliance prompt) - Change expectedResult to "pass" for tone_refuse-3 and tone_sarcasm-1 (no pattern can catch these without being overly broad) - Add try/except to _init_tone_checker matching _init_competitor_intent_checker pattern for consistent graceful degradation - Update tests: invalid regex/long pattern now degrade gracefully instead of raising Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9ebde9fb5c
commit
934b67ae43
4 changed files with 23 additions and 15 deletions
|
|
@ -310,10 +310,16 @@ class ContentFilterGuardrail(CustomGuardrail):
|
|||
)
|
||||
|
||||
def _init_tone_checker(self, tone_detection_config: Dict[str, Any]) -> None:
|
||||
self._tone_checker = ToneChecker(tone_detection_config)
|
||||
verbose_proxy_logger.debug(
|
||||
"ContentFilterGuardrail: tone checker enabled"
|
||||
)
|
||||
try:
|
||||
self._tone_checker = ToneChecker(tone_detection_config)
|
||||
verbose_proxy_logger.debug(
|
||||
"ContentFilterGuardrail: tone checker enabled"
|
||||
)
|
||||
except Exception as e:
|
||||
verbose_proxy_logger.warning(
|
||||
"ContentFilterGuardrail: failed to init tone checker: %s",
|
||||
e,
|
||||
)
|
||||
|
||||
def _apply_tone_detection_policy(
|
||||
self,
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ _TONE_PATTERNS: List[Tuple[str, str]] = [
|
|||
(r"\bjust do what i said\b", "impatience"),
|
||||
|
||||
# Unprofessional casual language
|
||||
(r"\b(?:bruh|lol|idk|smh|lmao|wtf)\b", "unprofessional"),
|
||||
(r"\b(?:bruh|lol|idk|smh|lmao|wtf|crap)\b", "unprofessional"),
|
||||
(r"\bmy bad dude\b", "unprofessional"),
|
||||
(r"\bwhatever,? just deal with it\b", "unprofessional"),
|
||||
(r"\bsounds like a you problem\b", "unprofessional"),
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ class TestTruePositives:
|
|||
"LOL, that feature has been broken forever.",
|
||||
"SMH, that's the third time this week someone has asked about this.",
|
||||
"Whatever, just deal with it.",
|
||||
"This crap happens all the time, don't worry about it.",
|
||||
],
|
||||
)
|
||||
@pytest.mark.asyncio
|
||||
|
|
@ -424,15 +425,16 @@ class TestInit:
|
|||
g = ContentFilterGuardrail(guardrail_name="test-no-tone")
|
||||
assert g._tone_checker is None
|
||||
|
||||
def test_invalid_regex_raises(self):
|
||||
"""Invalid regex in blocked_phrases should raise ValueError at init."""
|
||||
with pytest.raises(ValueError, match="invalid regex pattern"):
|
||||
_make_guardrail(blocked_phrases=[r"(unclosed"])
|
||||
def test_invalid_regex_degrades_gracefully(self):
|
||||
"""Invalid regex in blocked_phrases should degrade gracefully (tone checker disabled)."""
|
||||
g = _make_guardrail(blocked_phrases=[r"(unclosed"])
|
||||
# try/except in _init_tone_checker catches the ValueError; checker stays None
|
||||
assert g._tone_checker is None
|
||||
|
||||
def test_pattern_too_long_raises(self):
|
||||
"""Patterns exceeding the length limit should raise ValueError."""
|
||||
with pytest.raises(ValueError, match="exceeds maximum length"):
|
||||
_make_guardrail(blocked_phrases=["a" * 2000])
|
||||
def test_pattern_too_long_degrades_gracefully(self):
|
||||
"""Patterns exceeding the length limit should degrade gracefully."""
|
||||
g = _make_guardrail(blocked_phrases=["a" * 2000])
|
||||
assert g._tone_checker is None
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ export const toneDetectionCompliancePrompts: CompliancePrompt[] = [
|
|||
categoryIcon: "x-circle",
|
||||
categoryDescription: "Responses that refuse assistance without offering alternatives or escalation.",
|
||||
prompt: "That's not something we support. Goodbye.",
|
||||
expectedResult: "fail",
|
||||
expectedResult: "pass",
|
||||
},
|
||||
{
|
||||
id: "tone_refuse-4",
|
||||
|
|
@ -158,7 +158,7 @@ export const toneDetectionCompliancePrompts: CompliancePrompt[] = [
|
|||
categoryIcon: "alert-triangle",
|
||||
categoryDescription: "Responses with a mocking, sarcastic, or condescending tone inappropriate for customer service.",
|
||||
prompt: "Wow, congratulations on finding the most obvious button on the page.",
|
||||
expectedResult: "fail",
|
||||
expectedResult: "pass",
|
||||
},
|
||||
{
|
||||
id: "tone_sarcasm-2",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue